sensei icon indicating copy to clipboard operation
sensei copied to clipboard

Show total time spent by student on a Course

Open Imran92 opened this issue 1 year ago • 0 comments

Is your feature request related to a problem? Please describe

Display the total hours and minutes that students have spent on a course.

Describe the solution you'd like

Find a proper place to show the asked value (for example, a report, or Courses -> [Course] -> Manage.

In case it helps, here's a hook that shows the total time spent by a student on all complete courses in the Reports -> Students table

add_filter( 'sensei_analysis_overview_columns', function( $columns, $instance ) {
	if ( ! $instance instanceof Sensei_Reports_Overview_List_Table_Students ) {
		return $columns;
	}

	$columns['sum_of_days'] = __( 'Total Days to Complete Courses', 'sensei-lms' );
	return $columns;
}, 10, 2 );

add_filter( 'sensei_analysis_overview_column_data', function( $column_data, $item, $instance ) {
	if ( ! $instance instanceof Sensei_Reports_Overview_List_Table_Students ) {
		return $column_data;
	}

	$completed_course_ids = Sensei_Utils::sensei_activity_ids(
		[
			'user_id' => $item->ID,
			'type'    => 'sensei_course_status',
			'status'  => 'complete',
		]
	);
	$column_data['sum_of_days'] = ( is_array( $completed_course_ids ) && count( $completed_course_ids ) > 0 ) ? get_sum_days_to_completion( $completed_course_ids, $item->ID ) : 0;
	return $column_data;
}, 10, 3 );

function get_sum_days_to_completion( array $course_ids, int $user_id ) : float {
    if ( empty( $course_ids ) ) {
        return 0;
    }
    global $wpdb;

    $query = "
	SELECT SUM( aggregated.days_to_completion )
    FROM (
        SELECT GREATEST( CEIL( TIMESTAMPDIFF(SECOND, STR_TO_DATE( {$wpdb->commentmeta}.meta_value, '%Y-%m-%d %H:%i:%s' ), {$wpdb->comments}.comment_date ) / 86400 ), 1 ) AS days_to_completion
        FROM {$wpdb->comments}
        LEFT JOIN {$wpdb->commentmeta} ON {$wpdb->comments}.comment_ID = {$wpdb->commentmeta}.comment_id
            AND {$wpdb->commentmeta}.meta_key = 'start'
        WHERE {$wpdb->comments}.comment_type = 'sensei_course_status'
            AND {$wpdb->comments}.comment_approved = 'complete'
            AND {$wpdb->comments}.comment_post_ID IN ( " . implode( ',', array_map( 'intval', $course_ids ) ) . " )
            AND {$wpdb->comments}.user_id = {$user_id}
        GROUP BY {$wpdb->comments}.comment_post_ID
    ) AS aggregated";

    // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching -- Performance improvement.
    return (float) $wpdb->get_var( $query );
}

Additional context

p1725367444476299-slack-C07418EJ0

Imran92 avatar Sep 04 '24 13:09 Imran92