LLMS_Table_Quiz_Non_Attempts::get_results( array $args = array() )

Execute a query to retrieve results from the table.


Parameters Parameters

$args

(array) (Optional) Array of query args.

Default value: array()


Top ↑

Return Return

(void)


Top ↑

Source Source

File: includes/admin/reporting/tables/llms.table.quiz.non.attempts.php

	public function get_results( $args = array() ) {

		$this->title = __( 'Students Without Quiz Attempts', 'lifterlms' );

		$args = $this->clean_args( $args );

		$this->quiz_id = $args['quiz_id'];

		if ( isset( $args['page'] ) ) {
			$this->current_page = absint( $args['page'] );
		}

		$per         = apply_filters( 'llms_reporting_' . $this->id . '_per_page', 25 );
		$order       = isset( $args['order'] ) ? $args['order'] : $this->order;
		$this->order = in_array( $order, array( 'ASC', 'DESC' ), true ) ? $order : 'ASC';

		$this->orderby = isset( $args['orderby'] ) ? $args['orderby'] : $this->orderby;

		$this->filter   = isset( $args['filter'] ) ? $args['filter'] : $this->get_filter();
		$this->filterby = isset( $args['filterby'] ) ? $args['filterby'] : $this->get_filterby();

		if ( ! ( current_user_can( 'view_others_lifterlms_reports' ) || ( current_user_can( 'view_lifterlms_reports' ) && current_user_can( 'edit_post', $args['quiz_id'] ) ) ) ) {
			return;
		}

		$quiz = llms_get_post( $this->quiz_id );
		if ( ! $quiz ) {
			return;
		}

		$course = $quiz->get_course();
		if ( ! $course ) {
			return;
		}

		// Use a single optimized database query.
		global $wpdb;

		$search_sql = '';
		if ( isset( $args['search'] ) && ! empty( $args['search'] ) ) {
			$search_term = sanitize_text_field( $args['search'] );
			$search_sql  = $wpdb->prepare(
				'AND (
					u.user_login LIKE %s
					OR u.user_email LIKE %s
					OR u.display_name LIKE %s
					OR m_first.meta_value LIKE %s
					OR m_last.meta_value LIKE %s
				)',
				'%' . $search_term . '%',
				'%' . $search_term . '%',
				'%' . $search_term . '%',
				'%' . $search_term . '%',
				'%' . $search_term . '%'
			);
		}

		if ( 'any' !== $this->filter ) {
			$status_sql = $wpdb->prepare( 'AND upm.meta_value = %s', $this->filter );
		} else {
			$status_sql = "AND upm.meta_value IN ('enrolled', 'expired', 'cancelled')";
		}

		switch ( $this->orderby ) {
			case 'name':
				$order_sql = 'ORDER BY m_last.meta_value ' . $this->order . ', m_first.meta_value ' . $this->order;
				break;
			case 'id':
				$order_sql = 'ORDER BY u.ID ' . $this->order;
				break;
			case 'email':
				$order_sql = 'ORDER BY u.user_email ' . $this->order;
				break;
			default:
				$order_sql = 'ORDER BY u.display_name ' . $this->order;
		}

		$offset = ( $this->current_page - 1 ) * $per;

		$from_joins_where = "FROM {$wpdb->users} u
				INNER JOIN {$wpdb->prefix}lifterlms_user_postmeta upm
					ON u.ID = upm.user_id
					AND upm.post_id = %d
					AND upm.meta_key = '_status'
					{$status_sql}
				LEFT JOIN {$wpdb->usermeta} m_first
					ON u.ID = m_first.user_id
					AND m_first.meta_key = 'first_name'
				LEFT JOIN {$wpdb->usermeta} m_last
					ON u.ID = m_last.user_id
					AND m_last.meta_key = 'last_name'
				LEFT JOIN {$wpdb->prefix}lifterlms_quiz_attempts qa
					ON u.ID = qa.student_id
					AND qa.quiz_id = %d
				WHERE upm.updated_date = (
					SELECT MAX(upm2.updated_date)
					FROM {$wpdb->prefix}lifterlms_user_postmeta upm2
					WHERE upm2.user_id = u.ID
					AND upm2.post_id = %d
					AND upm2.meta_key = '_status'
				)
				AND qa.id IS NULL
				{$search_sql}";

		$prepare_args = array(
			$course->get( 'id' ),
			$this->quiz_id,
			$course->get( 'id' ),
		);

		$total_results = $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT(DISTINCT u.ID) {$from_joins_where}",
				$prepare_args
			)
		); // db call ok; no-cache ok.

		$results = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT DISTINCT
					u.ID as user_id,
					u.user_email,
					u.display_name,
					u.user_registered,
					m_first.meta_value as first_name,
					m_last.meta_value as last_name,
					upm.meta_value as enrollment_status,
					upm.updated_date as enrollment_date
				{$from_joins_where}
				{$order_sql}
				LIMIT %d, %d",
				array_merge( $prepare_args, array( $offset, $per ) )
			)
		);

		$this->max_pages    = ceil( $total_results / $per );
		$this->is_last_page = ( $this->current_page >= $this->max_pages );

		$this->tbody_data = array();
		if ( ! empty( $results ) ) {
			foreach ( $results as $result ) {
				$this->tbody_data[] = llms_get_student( $result->user_id );
			}
		}
	}


Top ↑

Changelog Changelog

Changelog
Version Description
9.1.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.