/**
  * If WooCommerce is activated and the customer has purchased the course, update Sensei to indicate that they are taking the course.
  * @access public
  * @since  1.0.0
  * @param  int 			$course_id  (default: 0)
  * @param  array/Object $order_user (default: array()) Specific user's data.
  * @return void
  */
 public function woocommerce_course_update($course_id = 0, $order_user = array())
 {
     global $current_user;
     if (!isset($current_user)) {
         return;
     }
     $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 = WooThemes_Sensei_Utils::user_completed_course($course_prerequisite_id, intval($user_id));
         if (!$prereq_course_complete) {
             // Remove all course user meta
             return WooThemes_Sensei_Utils::sensei_remove_user_from_course($course_id, $user_id);
         }
     }
     $is_user_taking_course = WooThemes_Sensei_Utils::user_started_course(intval($course_id), intval($user_id));
     if (!$is_user_taking_course) {
         if (WooThemes_Sensei_Utils::sensei_is_woocommerce_activated() && WooThemes_Sensei_Utils::sensei_customer_bought_product($user_email, $user_id, $wc_post_id) && 0 < $wc_post_id) {
             $activity_logged = WooThemes_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
     }
     return $is_user_taking_course;
 }
 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 = WooThemes_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) {
                     WooThemes_Sensei_Utils::sensei_start_lesson($id, $user_id, true);
                 }
                 // Updates the Course status and it's meta data
                 WooThemes_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 = WooThemes_Sensei_Utils::sensei_start_lesson($lesson_id, $user_id, $complete);
             // Updates the Course status and it's meta data
             WooThemes_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;
 }
Exemple #3
0
 /**
  * This tests Sensei_Courses::get_completion_percentage
  * @since 1.8.0
  */
 public function testGetCompletionPercentage()
 {
     //does the function exist?
     $this->assertTrue(method_exists('WooThemes_Sensei_Course', 'get_completion_percentage'), 'The course class get_completion_percentage function does not exist.');
     // setup the test
     $test_user_id = wp_create_user('testGetCompletionPercentage', 'testGetCompletionPercentage', '*****@*****.**');
     $test_lessons = $this->factory->get_lessons();
     $test_course_id = $this->factory->get_random_course_id();
     remove_all_actions('sensei_user_course_start');
     WooThemes_Sensei_Utils::user_start_course($test_user_id, $test_course_id);
     // add lessons to the course
     foreach ($test_lessons as $lesson_id) {
         add_post_meta($lesson_id, '_lesson_course', intval($test_course_id));
     }
     // complete 3 lessons and check if the correct percentage returns
     $i = 0;
     for ($i = 0; $i < 3; $i++) {
         WooThemes_Sensei_Utils::update_lesson_status($test_user_id, $test_lessons[$i], 'complete');
     }
     $expected_percentage = 3 / count($test_lessons) * 100;
     $this->assertEquals($expected_percentage, Sensei()->course->get_completion_percentage($test_course_id, $test_user_id), 'Course completed percentage is not accurate');
     // complete all lessons
     foreach ($test_lessons as $lesson_id) {
         WooThemes_Sensei_Utils::update_lesson_status($test_user_id, $lesson_id, 'complete');
     }
     //all lessons should no be completed
     $this->assertEquals(100, Sensei()->course->get_completion_percentage($test_course_id, $test_user_id), 'Course completed percentage is not accurate');
 }
 /**
  * Activate single course if already purchases
  * @return void
  */
 public function activate_purchased_single_course()
 {
     global $post, $current_user;
     if (WooThemes_Sensei_Utils::sensei_is_woocommerce_activated()) {
         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 = WooThemes_Sensei_Utils::user_course_status(intval($course_id), $user_id);
         // Ignore course if already completed
         if (WooThemes_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 ($product->is_type('bundle')) {
                     $bundled_product = new WC_Product_Bundle($product->id);
                     $bundled_items = $bundled_product->get_bundled_items();
                     foreach ($bundled_items as $item) {
                         if ($item->product_id == $course_product_id) {
                             WooThemes_Sensei_Utils::user_start_course($user_id, $course_id);
                             return;
                         }
                     }
                 } else {
                     // handle regular products
                     if ($item['product_id'] == $course_product_id) {
                         WooThemes_Sensei_Utils::user_start_course($user_id, $course_id);
                         return;
                     }
                 }
             }
         }
     }
 }
 /**
  * Marked lesson as started for user
  * @param  integer $lesson_id ID of lesson
  * @return mixed boolean or comment_ID
  */
 public static function sensei_start_lesson($lesson_id = 0, $user_id = 0, $complete = false)
 {
     global $woothemes_sensei;
     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 = WooThemes_Sensei_Utils::user_started_course($course_id, $user_id);
             if (!$is_user_taking_course) {
                 WooThemes_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'] = 100;
             } else {
                 $status = 'complete';
             }
         }
         // Check if user is already taking the lesson
         $activity_logged = WooThemes_Sensei_Utils::user_started_lesson($lesson_id, $user_id);
         if (!$activity_logged) {
             $metadata['start'] = current_time('mysql');
             $activity_logged = WooThemes_Sensei_Utils::update_lesson_status($user_id, $lesson_id, $status, $metadata);
         }
         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;
 }