/** * 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; }
/** * Save the user's answers feedback * * For this function you must supply all three parameters. If will return false one is left out. * The data will be saved on the lesson ID supplied. * * @since 1.7.5 * @access public * * @param array $answers_feedback{ * $type int $question_id * $type string $question_feedback * } * @param int $lesson_id * @param int $user_id * * @return false or int $feedback_saved */ public function save_user_answers_feedback($answers_feedback, $lesson_id, $user_id = 0) { // make sure the parameters are valid before continuing if (empty($lesson_id) || empty($user_id) || 'lesson' != get_post_type($lesson_id) || !get_userdata($user_id) || !is_array($answers_feedback)) { return false; } // check if the lesson is started before saving, if not start the lesson for the user if (!(0 < intval(Sensei_Utils::user_started_lesson($lesson_id, $user_id)))) { Sensei_Utils::sensei_start_lesson($lesson_id, $user_id); } // encode the feedback $encoded_answers_feedback = array(); foreach ($answers_feedback as $question_id => $feedback) { $encoded_answers_feedback[$question_id] = base64_encode($feedback); } // save the user data $feedback_saved = Sensei_Utils::add_user_data('quiz_answers_feedback', $lesson_id, $encoded_answers_feedback, $user_id); //Were the the question feedback save correctly? if (intval($feedback_saved) > 0) { // save transient to make retrieval faster in future $transient_key = 'sensei_answers_feedback_' . $user_id . '_' . $lesson_id; set_transient($transient_key, $encoded_answers_feedback, 10 * DAY_IN_SECONDS); } return $feedback_saved; }