LLMS_Student_Bulk_Enroll
Bulk Enrollment class
Contents
Source Source
File: includes/admin/class.llms.student.bulk.enroll.php
class LLMS_Student_Bulk_Enroll { /** * Admin notices * * @var string[] * @since 3.19.4 */ public $admin_notices = array(); /** * Product (Course/Membership) ID * * @var int */ public $product_id = 0; /** * Product Post Title * * @var string */ public $product_title = ''; /** * User IDs * * @var int */ public $user_ids = array(); /** * Constructor * * @since 3.20.0 * @version 3.20.0 */ public function __construct() { // Hook into extra ui on users table to display product selection. add_action( 'manage_users_extra_tablenav', array( $this, 'display_product_selection_for_bulk_users' ) ); // Hook into users table screen to process bulk enrollment. add_action( 'admin_head-users.php', array( $this, 'maybe_enroll_users_in_product' ) ); // Display enrollment results as notices. add_action( 'admin_notices', array( $this, 'display_notices' ) ); } /** * Displays ui for selecting product to bulk enroll users into * * @param string $which * @since 3.20.0 * @version 3.20.0 */ public function display_product_selection_for_bulk_users( $which ) { // The attributes need to be different for top and bottom of the table. $id = 'bottom' === $which ? 'llms_bulk_enroll_product2' : 'llms_bulk_enroll_product'; $submit = 'bottom' === $which ? 'llms_bulk_enroll2' : 'llms_bulk_enroll'; ?> <div class="alignleft actions"> <label class="screen-reader-text" for="_llms_bulk_enroll_product"> <?php _e( 'Choose Course/Membership', 'lifterlms' ); ?> </label> <select id="<?php echo $id; ?>" class="llms-posts-select2 llms-bulk-enroll-product" data-post-type="llms_membership,course" name="<?php echo $id; ?>" style="min-width:200px;max-width:auto;"> </select> <input type="submit" name="<?php echo $submit; ?>" id="<?php echo $submit; ?>" class="button" value="<?php esc_attr_e( 'Enroll', 'lifterlms' ); ?>"> </div> <?php } /** * Conditionally enrolls multiple users into a product * * @return void * @since 3.20.0 * @version 3.20.0 */ public function maybe_enroll_users_in_product() { // Verify bulk enrollment request. $do_bulk_enroll = $this->_bottom_else_top( 'llms_bulk_enroll' ); // Bail if this is not a bulk enrollment request. if ( empty( $do_bulk_enroll ) ) { return; } // Get the product (course/membership) to enroll users in. $this->product_id = $this->_bottom_else_top( 'llms_bulk_enroll_product', FILTER_VALIDATE_INT ); if ( empty( $this->product_id ) ) { $message = __( 'Please select a Course or Membership to enroll users into!', 'lifterlms' ); $this->generate_notice( 'error', $message ); return; } // Get the product title for notices. $this->product_title = get_the_title( $this->product_id ); // Get all the user ids to enroll. $this->user_ids = filter_input( INPUT_GET, 'users', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY ); if ( empty( $this->user_ids ) ) { $message = sprintf( __( 'Please select users to enroll into <em>%s</em>.', 'lifterlms' ), $this->product_title ); $this->generate_notice( 'error', $message ); return; } $this->enroll_users_in_product(); } /** * Retrieves submitted inputs * * @param string $param The input key * @param mixed $validation Validation filter constant * @return mixed The submitted input value * @since 3.20.0 * @version 3.20.0 */ private function _bottom_else_top( $param, $validation = FILTER_DEFAULT ) { $return_val = false; // Get the value of the input displayed at the bottom of users table. $bottom_value = filter_input( INPUT_GET, $param . '2', $validation ); // Get the value of input displayed at the top of users table. $top_value = filter_input( INPUT_GET, $param, $validation ); // Prefer top over bottom, just like WordPress does. if ( ! empty( $bottom_value ) ) { $return_val = $bottom_value; } if ( ! empty( $top_value ) ) { $return_val = $top_value; } return $return_val; } /** * Enrolls multiple users into a product * * @since 3.20.0 * @version 3.20.0 */ private function enroll_users_in_product() { // Get user information from user ids. $users = $this->get_users( $this->user_ids ); // Bail if for some reason, no users are found (because they were deleted in the bg?). if ( empty( $users ) ) { $message = sprintf( __( 'No such users found. Cannot enroll into <em>%s</em>.', 'lifterlms' ), $this->product_title ); $this->generate_notice( 'error', $message ); return; } // Create manual enrollment trigger. $trigger = 'admin_' . get_current_user_id(); foreach ( $users as $user ) { $this->enroll( $user, $trigger ); } } /** * Get user details from user IDs * @param array $user_ids WP user IDs * @return array User details * @since 3.20.0 * @version 3.21.0 */ private function get_users( $user_ids ) { // Prepare query arguments. $user_query_args = array( 'include' => $user_ids, // We need display names for notices. 'fields' => array( 'ID', 'display_name' ), ); $user_query = new WP_User_Query( $user_query_args ); $results = $user_query->get_results(); return empty( $results ) ? false : $results; } /** * Enrolls a user into the selected product * * @param WP_User $user User object * @param string $trigger Enrollment trigger string * @since 3.20.0 * @version 3.20.0 */ private function enroll( $user, $trigger ) { // Enroll into LifterLMS product. $enrolled = llms_enroll_student( $user->ID, $this->product_id, $trigger ); // Figure out notice type based on enrollment success. $type = ( ! $enrolled ) ? 'error' : 'success'; // Figure out notice message string based on notice type. $success_fail_string = ( ! $enrolled ) ? __( 'Failed to enroll <em>%1$1s</em> into <em>%2$2s</em>.', 'lifterlms' ) : __( 'Successfully enrolled <em>%1$1s</em> into <em>%2$2s</em>.', 'lifterlms' ); // Get formatted message with username and product title. $message = sprintf( $success_fail_string, $user->display_name, $this->product_title ); // Generate a notice for display. $this->generate_notice( $type, $message ); } /** * Generates admin notice markup * * @param string $type Type of notice 'error' or 'success' * @param string $message Notice message * @since 3.20.0 * @version 3.20.0 */ public function generate_notice( $type, $message ) { ob_start(); ?> <div class="notice notice-<?php echo $type; ?> is-dismissible"> <p><?php echo $message; ?></p> </div> <?php $notice = ob_get_clean(); $this->admin_notices[] = $notice; } /** * Displays all generated notices * * @return void * @since 3.20.0 * @version 3.20.0 */ public function display_notices() { if ( empty( $this->admin_notices ) ) { return; } echo implode( "\n", $this->admin_notices ); } }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- _bottom_else_top — Retrieves submitted inputs
- display_notices — Displays all generated notices
- display_product_selection_for_bulk_users — Displays ui for selecting product to bulk enroll users into
- enroll — Enrolls a user into the selected product
- enroll_users_in_product — Enrolls multiple users into a product
- generate_notice — Generates admin notice markup
- get_users — Get user details from user IDs
- maybe_enroll_users_in_product — Conditionally enrolls multiple users into a product
Changelog Changelog
Version | Description |
---|---|
3.30.3 | Explicitly define class properties. |
3.20.0 | Introduced. |