LLMS_REST_Enrollments_Controller::get_objects_query( array $query_args, WP_REST_Request $request = null )
Get enrollments query.
Parameters Parameters
- $query_args
-
(array) (Required) Array of collection arguments.
- $request
-
(WP_REST_Request) (Optional) Full details about the request.
Default value: null
Return Return
(stdClass) An object with two fields: 'items' an array of OBJECT result of the query; 'found_results' the total found items.
Source Source
File: libraries/lifterlms-rest/includes/server/class-llms-rest-enrollments-controller.php
unset( $query_args['orderby'] );
break;
}
}
$query_args['is_students_route'] = $request ? false !== stristr( $request->get_route(), '/students/' ) : true;
return $query_args;
}
/**
* Get enrollments query.
*
* @since 1.0.0-beta.1
* @since 1.0.0-beta.4 Enrollment's post_id and student_id casted to integer.
* @since 1.0.0-beta.10 Added subquery to retrieve the enrollments trigger.
* @since 1.0.0-beta.18 Fixed wrong trigger retrieved when multiple trigger were present for the same user,post pair.
*
* @param array $query_args Array of collection arguments.
* @param WP_REST_Request $request Optional. Full details about the request. Default null.
* @return stdClass An object with two fields: 'items' an array of OBJECT result of the query; 'found_results' the total found items.
*/
protected function get_objects_query( $query_args, $request = null ) {
global $wpdb;
// Maybe limit the query results depending on the page param.
if ( isset( $query_args['page'] ) ) {
$skip = $query_args['page'] > 1 ? ( $query_args['page'] - 1 ) * $query_args['per_page'] : 0;
$limit = $wpdb->prepare(
'LIMIT %d, %d',
array(
$skip,
$query_args['per_page'],
)
);
} else {
$limit = $wpdb->prepare(
'LIMIT %d',
$query_args['per_page']
);
}
/**
* List enrollments of the current student_id or post_id.
* Depends on the endpoint route.
*/
if ( $query_args['is_students_route'] ) {
$id_column = 'user_id';
} else {
$id_column = 'post_id';
}
/**
* Filter the enrollments by user_id or post_id param
*/
if ( isset( $query_args['student'] ) ) {
$filter = sprintf( ' AND upm.user_id IN ( %s )', implode( ', ', $query_args['student'] ) );
} elseif ( isset( $query_args['post'] ) ) {
$filter = sprintf( ' AND upm.post_id IN ( %s )', implode( ', ', $query_args['post'] ) );
} else {
$filter = '';
}
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
$updated_date_status = $wpdb->prepare(
"(
SELECT DISTINCT user_id, post_id, updated_date, meta_value
FROM {$wpdb->prefix}lifterlms_user_postmeta as upm
WHERE upm.{$id_column} = %d
$filter AND upm.meta_key = '_status'
AND upm.updated_date = (
SELECT MAX( upm2.updated_date )
FROM {$wpdb->prefix}lifterlms_user_postmeta AS upm2
WHERE upm2.meta_key = '_status'
AND upm2.post_id = upm.post_id
AND upm2.user_id = upm.user_id
)
)",
array(
$query_args['id'],
)
);
// Trigger.
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
$trigger = $wpdb->prepare(
"(
SELECT DISTINCT user_id, post_id, meta_value
FROM {$wpdb->prefix}lifterlms_user_postmeta as upm
WHERE upm.{$id_column} = %d
$filter AND upm.meta_key = '_enrollment_trigger'
AND upm.updated_date = (
SELECT MAX( upm2.updated_date )
FROM {$wpdb->prefix}lifterlms_user_postmeta AS upm2
WHERE upm2.meta_key = '_enrollment_trigger'
AND upm2.post_id = upm.post_id
AND upm2.user_id = upm.user_id
)
)",
array(
$query_args['id'],
)
);
if ( isset( $query_args['status'] ) ) {
$filter .= $wpdb->prepare( ' AND upm2.meta_value = %s', $query_args['status'] );
}
if ( isset( $query_args['orderby'], $query_args['order'] ) ) {
$order = sprintf( 'ORDER BY %1$s %2$s', esc_sql( $query_args['orderby'] ), esc_sql( $query_args['order'] ) );
} else {
$order = '';
}
$query = new stdClass();
$select_found_rows = empty( $query_args['no_found_rows'] ) ? esc_sql( 'SQL_CALC_FOUND_ROWS' ) : '';
// the query.
$query->items = $wpdb->get_results(
$wpdb->prepare(
"
SELECT {$select_found_rows} DISTINCT upm.post_id AS post_id, upm.user_id as student_id, upm.updated_date as date_created, upm2.updated_date as date_updated, upm2.meta_value as status, upm3.meta_value as etrigger
FROM {$wpdb->prefix}lifterlms_user_postmeta AS upm
JOIN {$updated_date_status} as upm2 ON upm.post_id = upm2.post_id AND upm.user_id = upm2.user_id
JOIN {$trigger} as upm3 ON upm.post_id = upm3.post_id AND upm.user_id = upm3.user_id
WHERE upm.meta_key = '_start_date'
AND upm.{$id_column} = %d
{$filter}
{$order}
{$limit};
",
Expand full source code Collapse full source code View on GitHub
Changelog Changelog
| Version | Description |
|---|---|
| 1.0.0-beta.4 | Enrollment's post_id and student_id casted to integer. |
| 1.0.0-beta.18 | Fixed wrong trigger retrieved when multiple trigger were present for the same user,post pair. |
| 1.0.0-beta.10 | Added subquery to retrieve the enrollments trigger. |
| 1.0.0-beta.1 | Introduced. |