LLMS_Processor_Membership_Bulk_Enroll
Description Description
Handle background processing of average progress & average grade for LifterLMS Courses. This triggers a bg process which gets the current progress of all students in a course.
Progress is queued for recalculation when: students enroll students unenroll students complete lessons
Source Source
File: includes/processors/class.llms.processor.membership.bulk.enroll.php
class LLMS_Processor_Membership_Bulk_Enroll extends LLMS_Abstract_Processor {
/**
* Unique identifier for the processor
*
* @var string
*/
protected $id = 'membership_bulk_enroll';
/**
* WP Cron Hook for scheduling the bg process
*
* @var string
*/
private $schedule_hook = 'llms_membership_bulk_enroll';
/**
* Action triggered to queue all students who need to be enrolled
*
* @since 3.15.0
* @since 6.0.0 Don't access `LLMS_Student_Query` properties directly.
*
* @param int $membership_id WP Post ID of the membership.
* @param int $course_id WP Post ID of the course to enroll members into.
* @return void
*/
public function dispatch_enrollment( $membership_id, $course_id ) {
$this->log( sprintf( 'membership bulk enrollment dispatched for membership %1$d into course %2$d', $membership_id, $course_id ) );
// cancel process in case it's currently running
$this->cancel_process();
$args = array(
'post_id' => $membership_id,
'statuses' => 'enrolled',
'page' => 1,
'per_page' => 250,
);
$query = new LLMS_Student_Query( $args );
if ( $query->has_results() ) {
while ( $args['page'] <= $query->get_max_pages() ) {
$this->push_to_queue(
array(
'course_id' => $course_id,
'query_args' => $args,
'trigger' => sprintf( 'membership_%d', $membership_id ),
)
);
$args['page']++;
}
$this->save()->dispatch();
$this->log( sprintf( 'membership bulk enrollment started for membership %1$d into course %2$d', $membership_id, $course_id ) );
}
}
/**
* Initializer
*
* @return void
* @since 3.15.0
* @version 3.15.0
*/
protected function init() {
// for the cron
add_action( $this->schedule_hook, array( $this, 'dispatch_enrollment' ), 10, 2 );
// for LifterLMS actions which trigger bulk enrollment
$this->actions = array(
'llms_membership_do_bulk_course_enrollment' => array(
'arguments' => 2,
'callback' => 'schedule_enrollment',
'priority' => 10,
),
);
}
/**
* Schedule bulk enrollment
* This will schedule an event that will setup the queue of items for the background process
*
* @param int $membership_id WP Post ID of the membership
* @param int $course_id WP Post ID of the course to enroll members into
* @return void
* @since 3.15.0
* @version 3.15.0
*/
public function schedule_enrollment( $membership_id, $course_id ) {
$this->log( sprintf( 'membership bulk enrollment triggered for membership %1$d into course %2$d', $membership_id, $course_id ) );
$args = array( $membership_id, $course_id );
if ( ! wp_next_scheduled( $this->schedule_hook, $args ) ) {
wp_schedule_single_event( time(), $this->schedule_hook, $args );
$this->log( sprintf( 'membership bulk enrollment scheduled for membership %1$d into course %2$d', $membership_id, $course_id ) );
}
}
/**
* Execute calculation for each item in the queue until all students in the course have been polled.
*
* Stores the data in the postmeta table to be accessible via LLMS_Course.
*
* @since 3.15.0
* @since 6.0.0 Replaced access of LLMS_Student_Query::$found_results protected property with LLMS_Student_Query::has_results().
*
* @param array $item Array of processing data.
* @return boolean True to keep the item in the queue and process again.
* False to remove the item from the queue.
*/
public function task( $item ) {
$this->log( sprintf( 'membership bulk enrollment task started for membership %1$d into course %2$d', $item['query_args']['post_id'], $item['course_id'] ) );
$this->log( $item );
// ensure the item has all the data we need to process it
if ( ! is_array( $item ) || ! isset( $item['course_id'] ) || ! isset( $item['query_args'] ) || ! isset( $item['trigger'] ) ) {
return false;
}
// turn the course data processor off
$course_data_processor = llms()->processors()->get( 'course_data' );
if ( $course_data_processor ) {
$course_data_processor->disable();
}
$query = new LLMS_Student_Query( $item['query_args'] );
if ( $query->has_results() ) {
foreach ( $query->get_students() as $student ) {
$student->enroll( $item['course_id'], $item['trigger'] );
}
}
if ( $query->is_last_page() ) {
$this->log( sprintf( 'membership bulk enrollment completed for membership %1$d into course %2$d', $item['query_args']['post_id'], $item['course_id'] ) );
// turn the course data processor back on
if ( $course_data_processor ) {
$course_data_processor->add_actions();
}
// process the course data
do_action( 'llms_course_calculate_data', $item['course_id'] );
}
return false;
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- dispatch_enrollment — Action triggered to queue all students who need to be enrolled
- init — Initializer
- schedule_enrollment — Schedule bulk enrollment This will schedule an event that will setup the queue of items for the background process
- task — Execute calculation for each item in the queue until all students in the course have been polled.
Changelog Changelog
| Version | Description |
|---|---|
| 3.26.1 | Unknown. |
| 3.15.0 | Introduced. |