• LifterLMS
  • Knowledge Base
  • Academy
  • Blog
  • Podcast
  • Contributors
  • My Account

LifterLMS LifterLMS

  • Code Reference
  • REST API
  • LLMS-CLI
  • Changelog Subscribe

Code Reference

Skip to content
Filter by type:
Search
Browse: Home / Code Reference / Classes / LLMS_Query_User_Postmeta

LLMS_Query_User_Postmeta

LifterLMS User Postmeta Query

Contents

  • Source
  • Related
    • Uses
  • Methods
  • Changelog
  • User Contributed Notes

Source #Source

File: includes/class.llms.query.user.postmeta.php

	/**
	 * Identify the extending query
	 *
	 * @var  string
	 */
	protected $id = 'user_postmeta';

	/**
	 * Retrieve default arguments for a student query
	 *
	 * @return   array
	 * @since    3.15.0
	 * @version  3.15.0
	 */
	protected function get_default_args() {

		$args = array(
			'include_post_children' => true,
			'query'                 => array(),
			'query_compare'         => 'OR',
			'post_id'               => array(),
			'sort'                  => array(
				'updated_date' => 'DESC',
				'meta_id'      => 'ASC',
			),
			'types'                 => array(),
			'user_id'               => array(),
		);

		$args = wp_parse_args( $args, parent::get_default_args() );

		return apply_filters( $this->get_filter( 'default_args' ), $args );

	}

	/**
	 * Retrieve an array of LLMS_User_Postmetas for the given set of results
	 *
	 * @return   array
	 * @since    3.15.0
	 * @version  3.15.0
	 */
	public function get_metas() {

		$metas   = array();
		$results = $this->get_results();

		if ( $results ) {

			foreach ( $results as $result ) {
				$metas[] = new LLMS_User_Postmeta( $result->meta_id );
			}
		}

		if ( $this->get( 'suppress_filters' ) ) {
			return $metas;
		}

		return apply_filters( $this->get_filter( 'get_metas' ), $metas );

	}

	/**
	 * Parses data passed to $statuses
	 * Convert strings to array and ensure resulting array contains only valid statuses
	 * If no valid statuses, returns to the default
	 *
	 * @return   void
	 * @since    3.15.0
	 * @since 7.5.0 Added 'Favorites' event.
	 */
	protected function parse_args() {

		// Sanitize post & user ids.
		foreach ( array( 'post_id', 'user_id' ) as $key ) {

			$this->arguments[ $key ] = $this->sanitize_id_array( $this->arguments[ $key ] );

		}

		if ( $this->arguments['include_post_children'] ) {

			foreach ( $this->arguments['post_id'] as $id ) {

				if ( 'course' !== get_post_type( $id ) ) {
					continue;
				}

				$course                     = llms_get_post( $id );
				$this->arguments['post_id'] = array_merge(
					$this->arguments['post_id'],
					$this->sanitize_id_array( $course->get_sections( 'ids' ) ),
					$this->sanitize_id_array( $course->get_lessons( 'ids' ) ),
					$this->sanitize_id_array( $course->get_quizzes() )
				);

			}
		}

		if ( $this->arguments['types'] ) {

			$all_events = array(
				'completion'  => array(
					'key'   => '_is_complete',
					'value' => 'yes',
				),
				'status'      => array(
					'compare' => 'IS NOT NULL',
					'key'     => '_status',
				),
				'achievement' => array(
					'compare' => 'IS NOT NULL',
					'key'     => '_achievement_earned',
				),
				'certificate' => array(
					'compare' => 'IS NOT NULL',
					'key'     => '_certificate_earned',
				),
				'email'       => array(
					'compare' => 'IS NOT NULL',
					'key'     => '_email_sent',
				),
				'purchase'    => array(
					'compare' => 'LIKE',
					'key'     => '_enrollment_trigger',
					'value'   => 'order_%',
				),
				'favorites'   => array(
					'key'     => '_favorite',
					'compare' => 'IS NOT NULL',
				),
			);

			if ( is_string( $this->arguments['types'] ) && 'all' === $this->arguments['types'] ) {

				$this->arguments['query'] = array_values( $all_events );

			} else {

				$this->arguments['query'] = array();

				if ( ! is_array( $this->arguments['types'] ) ) {
					$this->arguments['types'] = array( $this->arguments['types'] );
				}

				foreach ( $this->arguments['types'] as $type ) {
					if ( ! isset( $all_events[ $type ] ) ) {
						continue;
					}
					$this->arguments['query'][] = $all_events[ $type ];
				}
			}
		}

		if ( $this->arguments['query'] ) {

			foreach ( $this->arguments['query'] as $i => &$query ) {

				// Ensure that each query has a compare operator.
				$query = wp_parse_args(
					$query,
					array(
						'compare' => '=',
						'key'     => '',
						'value'   => '',
					)
				);

				$operators = array( '=', '!=', 'LIKE', 'IN', 'NOT IN', 'IS NOT NULL' );
				if ( ! in_array( $query['compare'], $operators ) ) {
					unset( $this->arguments['query'][ $i ] );
				}
			}
		}

		if ( ! in_array( $this->arguments['query_compare'], array( 'AND', 'OR' ) ) ) {
			$this->arguments['query_compare'] = 'OR';
		}

	}

	/**
	 * Prepare the SQL for the query.
	 *
	 * @since 3.15.0
	 * @since 6.0.0 Renamed from `preprare_query()`.
	 *
	 * @return string
	 */
	protected function prepare_query() {

		global $wpdb;

		$vars = array();

		$vars[] = $this->get_skip();
		$vars[] = $this->get( 'per_page' );

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
		$sql = $wpdb->prepare(
			"SELECT SQL_CALC_FOUND_ROWS meta_id
			 FROM {$wpdb->prefix}lifterlms_user_postmeta
			 {$this->sql_where()}
			 {$this->sql_orderby()}
			 LIMIT %d, %d;",
			$vars
		);
		// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

		return $sql;

	}

	/**
	 * SQL "where" clause for the query
	 *
	 * @return   string
	 * @since    3.15.0
	 * @version  3.15.0
	 */
	protected function sql_where() {

		global $wpdb;

		$sql = 'WHERE 1';

		foreach ( array( 'post_id', 'user_id' ) as $key ) {

			$ids = $this->get( $key );
			if ( $ids ) {
				$prepared = implode( ',', $ids );
				$sql     .= " AND {$key} IN ({$prepared})";
			}
		}

		if ( $this->get( 'query' ) ) {

			$sql .= ' AND ( ';

			foreach ( $this->get( 'query' ) as $i => $query ) {

				if ( 0 !== $i ) {
					$sql .= " {$this->get( 'query_compare' )} ";
				}

				// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

				switch ( $query['compare'] ) {

					case '=':
					case '!=':
					case 'LIKE':
						$sql .= $wpdb->prepare( "( meta_key = %s AND meta_value {$query['compare']} %s )", $query['key'], $query['value'] );
						break;

					case 'IN':
					case 'NOT IN':
						$query['value'] = array_map( array( $this, 'escape_and_quote_string' ), $query['value'] );
						$vals           = implode( ',', $query['value'] );
						$sql           .= $wpdb->prepare( "( meta_key = %s AND meta_value {$query['compare']} ( {$vals} ) )", $query['key'] );
						break;

					case 'IS NOT NULL':
						$sql .= $wpdb->prepare( "( meta_key = %s AND meta_value {$query['compare']} )", $query['key'] );
						break;

				}

				// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

			}

			$sql .= ' )';

		}

		return apply_filters( $this->get_filter( 'where' ), $sql, $this );

Expand full source code Collapse full source code View on GitHub


Top ↑

Related #Related

Uses #Uses

Uses
Uses Description
includes/abstracts/abstract.llms.database.query.php: LLMS_Database_Query

Database Query abstract class.


Top ↑

Methods #Methods

  • get_default_args — Retrieve default arguments for a student query
  • get_metas — Retrieve an array of LLMS_User_Postmetas for the given set of results
  • parse_args — Parses data passed to $statuses Convert strings to array and ensure resulting array contains only valid statuses If no valid statuses, returns to the default
  • prepare_query — Prepare the SQL for the query.
  • preprare_query — Prepare the SQL for the query.
  • sql_where — SQL "where" clause for the query

Top ↑

Changelog #Changelog

Changelog
Version Description
3.15.0 Introduced.

Top ↑

User Contributed Notes #User Contributed Notes

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

© 2014 - 2025 LifterLMS · Privacy Policy · Terms and Conditions

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.