Exemple #1
0
 /**
  * Mark a lesson as started for user
  *
  * Will also start the lesson course for the user if the user hans't started taking it already.
  *
  * @since 1.6.0
  *
  * @param  integer $lesson_id ID of lesson
  * @param int| string $user_id default 0
  * @param bool $complete default false
  *
  * @return mixed boolean or comment_ID
  */
 public static function sensei_start_lesson($lesson_id = 0, $user_id = 0, $complete = false)
 {
     if (intval($user_id) == 0) {
         $user_id = get_current_user_id();
     }
     $activity_logged = false;
     if (intval($lesson_id) > 0) {
         $course_id = get_post_meta($lesson_id, '_lesson_course', true);
         if ($course_id) {
             $is_user_taking_course = Sensei_Utils::user_started_course($course_id, $user_id);
             if (!$is_user_taking_course) {
                 Sensei_Utils::user_start_course($user_id, $course_id);
             }
         }
         $metadata = array();
         $status = 'in-progress';
         // Note: When this action runs the lesson status may not yet exist
         do_action('sensei_user_lesson_start', $user_id, $lesson_id);
         if ($complete) {
             $has_questions = get_post_meta($lesson_id, '_quiz_has_questions', true);
             if ($has_questions) {
                 $status = 'passed';
                 // Force a pass
                 $metadata['grade'] = 0;
             } else {
                 $status = 'complete';
             }
         }
         // Check if user is already taking the lesson
         $activity_logged = Sensei_Utils::user_started_lesson($lesson_id, $user_id);
         if (!$activity_logged) {
             $metadata['start'] = current_time('mysql');
             $activity_logged = Sensei_Utils::update_lesson_status($user_id, $lesson_id, $status, $metadata);
         } else {
             // if users is already taking the lesson  and the status changes to complete update it
             $current_user_activity = get_comment($activity_logged);
             if ($status == 'complete' && $status != $current_user_activity->comment_approved) {
                 $comment = array();
                 $comment['comment_ID'] = $activity_logged;
                 $comment['comment_approved'] = $status;
                 wp_update_comment($comment);
             }
         }
         if ($complete) {
             // Run this *after* the lesson status has been created/updated
             do_action('sensei_user_lesson_end', $user_id, $lesson_id);
         }
     }
     return $activity_logged;
 }
Exemple #2
0
 /**
  * If customer has purchased the course, update Sensei to indicate that they are taking the course.
  *
  * @since  1.0.0
  * @since 1.9.0 move to class Sensei_WC
  *
  * @param  int 			$course_id  (default: 0)
  * @param  array/Object $order_user (default: array()) Specific user's data.
  *
  * @return bool|int
  */
 public static function course_update($course_id = 0, $order_user = array())
 {
     global $current_user;
     if (!isset($current_user) || !$current_user->ID > 0) {
         return false;
     }
     $data_update = false;
     // Get the product ID
     $wc_post_id = get_post_meta(intval($course_id), '_course_woocommerce_product', true);
     // Check if in the admin
     if (is_admin()) {
         $user_login = $order_user['user_login'];
         $user_email = $order_user['user_email'];
         $user_url = $order_user['user_url'];
         $user_id = $order_user['ID'];
     } else {
         $user_login = $current_user->user_login;
         $user_email = $current_user->user_email;
         $user_url = $current_user->user_url;
         $user_id = $current_user->ID;
     }
     // End If Statement
     // This doesn't appear to be purely WooCommerce related. Should it be in a separate function?
     $course_prerequisite_id = (int) get_post_meta($course_id, '_course_prerequisite', true);
     if (0 < absint($course_prerequisite_id)) {
         $prereq_course_complete = Sensei_Utils::user_completed_course($course_prerequisite_id, intval($user_id));
         if (!$prereq_course_complete) {
             // Remove all course user meta
             return Sensei_Utils::sensei_remove_user_from_course($course_id, $user_id);
         }
     }
     $is_user_taking_course = Sensei_Utils::user_started_course(intval($course_id), intval($user_id));
     if (!$is_user_taking_course) {
         if (Sensei_WC::is_woocommerce_active() && Sensei_WC::has_customer_bought_product($user_id, $wc_post_id) && 0 < $wc_post_id) {
             $activity_logged = Sensei_Utils::user_start_course(intval($user_id), intval($course_id));
             $is_user_taking_course = false;
             if (true == $activity_logged) {
                 $is_user_taking_course = true;
             }
             // End If Statement
         }
         // End If Statement
     }
     // end if is user taking course
     return $is_user_taking_course;
 }
 /**
  * Activate single course if already purchases
  * @return void
  */
 public function activate_purchased_single_course()
 {
     global $post, $current_user;
     if (Sensei_WC::is_woocommerce_active()) {
         if (!is_user_logged_in()) {
             return;
         }
         if (!isset($post->ID)) {
             return;
         }
         $user_id = $current_user->ID;
         $course_id = $post->ID;
         $course_product_id = (int) get_post_meta($course_id, '_course_woocommerce_product', true);
         if (!$course_product_id) {
             return;
         }
         $user_course_status = Sensei_Utils::user_course_status(intval($course_id), $user_id);
         // Ignore course if already completed
         if (Sensei_Utils::user_completed_course($user_course_status)) {
             return;
         }
         // Ignore course if already started
         if ($user_course_status) {
             return;
         }
         // Get all user's orders
         $order_args = array('post_type' => 'shop_order', 'posts_per_page' => -1, 'post_status' => array('wc-processing', 'wc-completed'), 'meta_query' => array(array('key' => '_customer_user', 'value' => $user_id)), 'fields' => 'ids');
         $orders = get_posts($order_args);
         foreach ($orders as $order_post_id) {
             // Get course product IDs from order
             $order = new WC_Order($order_post_id);
             $items = $order->get_items();
             foreach ($items as $item) {
                 $product = wc_get_product($item['product_id']);
                 // handle product bundles
                 if (is_object($product) && $product->is_type('bundle')) {
                     $bundled_product = new WC_Product_Bundle($product->id);
                     $bundled_items = $bundled_product->get_bundled_items();
                     foreach ($bundled_items as $bundled_item) {
                         if ($bundled_item->product_id == $course_product_id) {
                             Sensei_Utils::user_start_course($user_id, $course_id);
                             return;
                         }
                     }
                 } else {
                     // handle regular products
                     if ($item['product_id'] == $course_product_id) {
                         Sensei_Utils::user_start_course($user_id, $course_id);
                         return;
                     }
                 }
             }
         }
     }
 }
 public function add_new_learners()
 {
     $result = false;
     if (!isset($_POST['add_learner_submit'])) {
         return $result;
     }
     if (!isset($_POST['add_learner_nonce']) || !wp_verify_nonce($_POST['add_learner_nonce'], 'add_learner_to_sensei')) {
         return $result;
     }
     if (!isset($_POST['add_user_id']) || '' == $_POST['add_user_id'] || !isset($_POST['add_post_type']) || !isset($_POST['add_course_id']) || !isset($_POST['add_lesson_id'])) {
         return $result;
     }
     $post_type = $_POST['add_post_type'];
     $user_id = absint($_POST['add_user_id']);
     $course_id = absint($_POST['add_course_id']);
     switch ($post_type) {
         case 'course':
             $result = Sensei_Utils::user_start_course($user_id, $course_id);
             // Complete each lesson if course is set to be completed
             if (isset($_POST['add_complete_course']) && 'yes' == $_POST['add_complete_course']) {
                 $lesson_ids = Sensei()->course->course_lessons($course_id, 'any', 'ids');
                 foreach ($lesson_ids as $id) {
                     Sensei_Utils::sensei_start_lesson($id, $user_id, true);
                 }
                 // Updates the Course status and it's meta data
                 Sensei_Utils::user_complete_course($course_id, $user_id);
                 do_action('sensei_user_course_end', $user_id, $course_id);
             }
             break;
         case 'lesson':
             $lesson_id = absint($_POST['add_lesson_id']);
             $complete = false;
             if (isset($_POST['add_complete_lesson']) && 'yes' == $_POST['add_complete_lesson']) {
                 $complete = true;
             }
             $result = Sensei_Utils::sensei_start_lesson($lesson_id, $user_id, $complete);
             // Updates the Course status and it's meta data
             Sensei_Utils::user_complete_course($course_id, $user_id);
             break;
     }
     // Set redirect URL after adding user to course/lesson
     $query_args = array('page' => $this->page_slug, 'view' => 'learners');
     if ($result) {
         if ($course_id) {
             $query_args['course_id'] = $course_id;
         }
         if ($lesson_id) {
             $query_args['lesson_id'] = $lesson_id;
         }
         $query_args['message'] = 'success';
     } else {
         $query_args['message'] = 'error';
     }
     $redirect_url = apply_filters('sensei_learners_add_learner_redirect_url', add_query_arg($query_args, admin_url('admin.php')));
     wp_safe_redirect(esc_url_raw($redirect_url));
     exit;
 }