passed ) ) { self::on_quiz_submitted( (int) $old->user_id, (int) $old->quiz_id, $result ); } } public static function on_quiz_submitted( $user_id, $quiz_id, $result ) { if ( ! empty( $result['passed'] ) && Settings::get( 'email_quiz_result', 1 ) ) { self::send_quiz_result_email( $user_id, $quiz_id, $result ); } } /** * Send one of the plugin's emails through accessnow_slms_email_{$type}. Public, so an add-on's * emails go through the same filter (with its own type). * * @param string $type 'enrollment', 'completion', 'quiz_result' or 'admin_enrollment'. * @param array $email to, subject, message, headers. * @param array $context IDs the email is about (user_id, course_id, quiz_id, result). * @return bool Whether it was sent. */ public static function send( $type, array $email, array $context ) { $email = wp_parse_args( $email, array( 'headers' => array() ) ); /** * Filters one of the plugin's emails before it is sent. Return false to not send it. * * The dynamic part is the email type: accessnow_slms_email_enrollment, * accessnow_slms_email_completion, accessnow_slms_email_quiz_result and * accessnow_slms_email_admin_enrollment. * * @since 1.0.0 * * @param array|false $email { * @type string|string[] $to Recipient(s). * @type string $subject Subject. * @type string $message Plain-text body. * @type string|string[] $headers Extra headers. * } * @param array $context user_id, and course_id or quiz_id (plus result for quiz_result). */ $email = apply_filters( "accessnow_slms_email_{$type}", $email, $context ); if ( ! is_array( $email ) || empty( $email['to'] ) ) { return false; } return wp_mail( $email['to'], (string) $email['subject'], (string) $email['message'], $email['headers'] ); } public static function send_enrollment_email( $user_id, $course_id ) { $user = get_userdata( $user_id ); $course = get_post( $course_id ); if ( ! $user || ! $course ) { return; } /* translators: %s: course title. */ $subject = sprintf( __( 'You have been enrolled in: %s', 'accessnow-lms' ), $course->post_title ); $message = sprintf( /* translators: 1: student name, 2: course title, 3: course URL. */ __( "Hi %1\$s,\n\nYou have been enrolled in the course \"%2\$s\".\n\nVisit the course: %3\$s\n\nHappy learning!", 'accessnow-lms' ), $user->display_name, $course->post_title, get_permalink( $course_id ) ); self::send( 'enrollment', array( 'to' => $user->user_email, 'subject' => $subject, 'message' => $message, ), array( 'user_id' => (int) $user_id, 'course_id' => (int) $course_id, ) ); } /** * Congratulate a student on completing a course, linking to their certificate when there is one. * * @param int $user_id User ID. * @param int $course_id Course ID. * @param object|null $certificate Certificate row; looked up from the student's latest one if omitted. */ public static function send_completion_email( $user_id, $course_id, $certificate = null ) { $user = get_userdata( $user_id ); $course = get_post( $course_id ); if ( ! $user || ! $course ) { return; } if ( ! $certificate ) { foreach ( Certificates::get_user_certificates( $user_id ) as $candidate ) { if ( (int) $candidate->course_id === (int) $course_id ) { $certificate = $candidate; // Newest first. break; } } } $link = $certificate ? Certificates::get_certificate_url( $certificate->certificate_code ) : get_permalink( $course_id ); /* translators: %s: course title. */ $subject = sprintf( __( 'Congratulations! You completed: %s', 'accessnow-lms' ), $course->post_title ); $message = sprintf( /* translators: 1: student name, 2: course title, 3: certificate URL. */ __( "Hi %1\$s,\n\nCongratulations on completing the course \"%2\$s\"!\n\nView your certificate: %3\$s\n\nKeep learning!", 'accessnow-lms' ), $user->display_name, $course->post_title, $link ); self::send( 'completion', array( 'to' => $user->user_email, 'subject' => $subject, 'message' => $message, ), array( 'user_id' => (int) $user_id, 'course_id' => (int) $course_id, ) ); } public static function send_quiz_result_email( $user_id, $quiz_id, $grade_result ) { $user = get_userdata( $user_id ); $quiz = get_post( $quiz_id ); if ( ! $user || ! $quiz ) { return; } $status = $grade_result['passed'] ? __( 'Passed', 'accessnow-lms' ) : __( 'Failed', 'accessnow-lms' ); /* translators: 1: quiz title, 2: Passed or Failed. */ $subject = sprintf( __( 'Quiz Result: %1$s - %2$s', 'accessnow-lms' ), $quiz->post_title, $status ); $message = sprintf( /* translators: 1: student name, 2: quiz title, 3: score percentage, 4: Passed or Failed. */ __( "Hi %1\$s,\n\nYou completed the quiz \"%2\$s\".\n\nScore: %3\$s%%\nStatus: %4\$s\n\nKeep going!", 'accessnow-lms' ), $user->display_name, $quiz->post_title, $grade_result['percentage'], $status ); self::send( 'quiz_result', array( 'to' => $user->user_email, 'subject' => $subject, 'message' => $message, ), array( 'user_id' => (int) $user_id, 'quiz_id' => (int) $quiz_id, 'result' => $grade_result, ) ); } public static function notify_admin_enrollment( $user_id, $course_id ) { $user = get_userdata( $user_id ); $course = get_post( $course_id ); if ( ! $user || ! $course ) { return; } $admin_email = get_option( 'admin_email' ); /* translators: 1: student name, 2: course title. */ $subject = sprintf( __( 'New enrollment: %1$s in %2$s', 'accessnow-lms' ), $user->display_name, $course->post_title ); $message = sprintf( /* translators: 1: student name, 2: course title. */ __( '%1$s has enrolled in the course "%2$s".', 'accessnow-lms' ), $user->display_name, $course->post_title ); self::send( 'admin_enrollment', array( 'to' => $admin_email, 'subject' => $subject, 'message' => $message, ), array( 'user_id' => (int) $user_id, 'course_id' => (int) $course_id, ) ); } }