} if (!empty($account_page)) { $page_ids[] = $account_page; } $pages = get_pages(array('include' => $page_ids, 'post_status' => 'publish', 'sort_order' => 'ASC', 'sort_column' => 'menu_order')); $tabs = array(); if ($pages) { foreach ($pages as $page) { $tabs[] = array('page_id' => $page->ID, 'url' => get_permalink($page->ID), 'label' => $page->post_title); } } /** * @deprecated 1.2.0 */ if (empty($page_ids['student_courses_page'])) { $tabs[] = array('page_id' => 0, 'action' => 'courses', 'url' => ib_edu_get_endpoint_url('action', 'courses', get_permalink($page_ids['profile_page'])), 'label' => __('Courses', 'ib-educator')); } ?> <section class="section-content"> <div class="container clearfix"> <div class="short-fw-container"> <div id="post-<?php the_ID(); ?> " <?php post_class(); ?> > <?php educator_page_title('page');
</a></h2> </header> <section class="price"> <?php echo $ms->format_price($membership_meta['price'], $membership_meta['duration'], $membership_meta['period']); ?> </section> <section class="membership-summary"> <?php $continue_reading = get_theme_mod('continue_reading') ? sprintf(__('Continue reading %s', 'ib-educator'), the_title('<span class="screen-reader-text">', '</span>', false)) : ''; the_content($continue_reading); ?> </section> <footer class="membership-options post-meta"> <?php if (function_exists('ib_edu_purchase_link')) { echo ib_edu_purchase_link(array('object_id' => $membership_id, 'type' => 'membership')); } else { $purchase_url = ib_edu_get_endpoint_url('edu-membership', $membership_id, get_permalink(ib_edu_page_id('payment'))); echo '<a href="' . esc_url($purchase_url) . '">' . __('Purchase', 'ibeducator') . '</a>'; } ?> <?php echo educator_share('menu'); ?> </footer> </article>
<?php $invoice_url = ib_edu_get_endpoint_url('edu-thankyou', $payment->ID, get_permalink(ib_edu_page_id('payment'))); ?> <a href="<?php echo esc_url($invoice_url); ?> "><?php _e('Details', 'ibeducator'); ?> </a> <?php if ('pending' == $payment->payment_status) { ?> <form action="<?php echo esc_url(ib_edu_get_endpoint_url('edu-action', 'cancel-payment', get_permalink())); ?> " method="post"> <?php wp_nonce_field('ibedu_cancel_payment'); ?> <input type="hidden" name="payment_id" value="<?php echo absint($payment->ID); ?> "> <button type="submit" class="ib-edu-button"><?php _e('Cancel', 'ibeducator'); ?> </button> </form> <?php
<?php $statuses = $ms->get_statuses(); if (!empty($user_membership['status']) && array_key_exists($user_membership['status'], $statuses)) { echo esc_html($statuses[$user_membership['status']]); } ?> <div> <?php if (1 == ib_edu_get_option('pause_memberships', 'memberships')) { if ('active' == $user_membership['status']) { $pause_url = ib_edu_get_endpoint_url('edu-action', 'pause-membership', get_permalink()); $pause_url = add_query_arg('_wpnonce', wp_create_nonce('ib_educator_pause_membership'), $pause_url); echo ' <span class="pause-membership"><a class="ib-edu-button" href="' . esc_url($pause_url) . '">' . __('Pause', 'ibeducator') . '</a></span>'; } elseif ('paused' == $user_membership['status']) { $resume_url = ib_edu_get_endpoint_url('edu-action', 'resume-membership', get_permalink()); $resume_url = add_query_arg('_wpnonce', wp_create_nonce('ib_educator_resume_membership'), $resume_url); echo ' <span class="pause-membership"><a class="ib-edu-button" href="' . esc_url($resume_url) . '">' . __('Resume', 'ibeducator') . '</a></span>'; } } ?> </div> </td> </tr> <tr> <th><?php _e('Expiration Date', 'ibeducator'); ?> </th> <td>
} elseif ('ib_edu_membership' == $post->post_type) { $login_url = wp_login_url(ib_edu_get_endpoint_url('edu-membership', $post->ID, get_permalink())); } } echo '<p>' . esc_html__('Already have an account?', 'training') . ' <a href="' . esc_url($login_url) . '">' . esc_html__('Log in', 'training') . '</a></p>'; } // Output error messages. $errors = ib_edu_message('payment_errors'); $error_codes = $errors ? $errors->get_error_codes() : array(); if (!empty($error_codes)) { $messages = $errors->get_error_messages(); foreach ($messages as $message) { echo '<div class="ib-edu-message error">' . $message . '</div>'; } } $form_action = ib_edu_get_endpoint_url('edu-action', 'payment', get_permalink()); ?> <form id="ib-edu-payment-form" class="ib-edu-form" action="<?php echo esc_url($form_action); ?> " method="post"> <?php wp_nonce_field('ibedu_submit_payment'); /** * Hook into payment form output. * * @param null|WP_Error $errors * @param mixed $post */ do_action('ib_educator_register_form', $errors, $post); ?>
/** * Submit quiz. */ public static function submit_quiz() { if (empty($_POST)) { return; } $lesson_id = get_the_ID(); check_admin_referer('edr_submit_quiz_' . $lesson_id); $user_id = get_current_user_id(); if (!$user_id) { return; } $quizzes = Edr_Manager::get('edr_quizzes'); $questions = $quizzes->get_questions($lesson_id); if (empty($questions)) { return; } if (!isset($_POST['answers']) || !is_array($_POST['answers'])) { // No answers. ib_edu_message('quiz', 'empty-answers'); return; } else { foreach ($questions as $question) { if (empty($_POST['answers'][$question->ID])) { // Not all questions were answered. ib_edu_message('quiz', 'empty-answers'); return; } } } $entry = IB_Educator::get_instance()->get_entry(array('user_id' => $user_id, 'course_id' => ib_edu_get_course_id($lesson_id), 'entry_status' => 'inprogress')); $entry_id = $entry ? $entry->ID : 0; if (!$entry_id && 'ib_educator_lesson' == get_post_type()) { return; } $max_attempts_number = $quizzes->get_max_attempts_number($lesson_id); if (!is_numeric($max_attempts_number)) { $max_attempts_number = 1; } $attempts_number = $quizzes->get_attempts_number($lesson_id, $entry_id); // Check if the student exceeded the number of allowed attempts. if ($attempts_number >= $max_attempts_number) { return; } // Add initial grade data to the database. $grade_id = $quizzes->add_grade(array('lesson_id' => $lesson_id, 'entry_id' => $entry_id, 'user_id' => $user_id, 'grade' => 0, 'status' => 'pending')); if (!$grade_id) { return; } $user_answer = ''; $correct = 0; $automatic_grade = true; $choices = $quizzes->get_choices($lesson_id, true); // Check answers to the quiz questions. foreach ($questions as $question) { // Every question type needs a specific way to check for the valid answer. switch ($question->question_type) { // Multiple Choice Question. case 'multiplechoice': $user_answer = absint($_POST['answers'][$question->ID]); if (isset($choices[$question->ID]) && isset($choices[$question->ID][$user_answer])) { $choice = $choices[$question->ID][$user_answer]; $answer_data = apply_filters('edr_submit_answer_pre', array('question_id' => $question->ID, 'grade_id' => $grade_id, 'entry_id' => $entry_id, 'correct' => $choice->correct, 'choice_id' => $choice->ID), $question); $added = $quizzes->add_answer($answer_data); if (1 == $choice->correct) { ++$correct; } } break; // Written Answer Question. // Written Answer Question. case 'writtenanswer': // We cannot check written answers automatically. if ($automatic_grade) { $automatic_grade = false; } $user_answer = stripslashes($_POST['answers'][$question->ID]); if (empty($user_answer)) { continue; } $answer_data = apply_filters('edr_submit_answer_pre', array('question_id' => $question->ID, 'grade_id' => $grade_id, 'entry_id' => $entry_id, 'correct' => -1, 'answer_text' => $user_answer), $question); $added = $quizzes->add_answer($answer_data); break; } } if ($automatic_grade) { $quizzes->update_grade($grade_id, array('grade' => round($correct / count($questions) * 100), 'status' => 'approved')); } wp_redirect(ib_edu_get_endpoint_url('edu-message', 'quiz-submitted', get_permalink())); exit; }
echo '<div class="ib-edu-message success">' . __('Registration complete.', 'ib-educator') . '</div>'; } ?> <div class="login-form clearfix"> <?php $redirect_to = get_query_var('redirect_to'); if (empty($redirect_to)) { // Determine default redirect URL. $student_courses_page_id = ib_edu_page_id('student_courses'); if ($student_courses_page_id) { $redirect_to = get_permalink($student_courses_page_id); } else { $user_page_id = get_theme_mod('user_page'); if ($user_page_id) { $redirect_to = ib_edu_get_endpoint_url('action', 'courses', get_permalink($user_page_id)); } } } remove_filter('login_url', 'educator_login_url_filter', 10, 2); wp_login_form(array('id_submit' => 'submit-login-form', 'redirect' => $redirect_to)); add_filter('login_url', 'educator_login_url_filter', 10, 2); ?> <p class="lost-password-link"> <a href="<?php echo esc_url(wp_lostpassword_url(get_permalink())); ?> "><?php _e('Lost your password?', 'ib-educator'); ?>
case 'empty-answers': echo '<div class="ib-edu-message error">' . __('Please answer all questions before submitting the quiz.', 'ibeducator') . '</div>'; break; case 'quiz-submitted': echo '<div class="ib-edu-message success">' . __('Thank you. The quiz has been accepted.', 'ibeducator') . '</div>'; break; } } $max_attempts_number = $quizzes->get_max_attempts_number($lesson_id); if (!is_numeric($max_attempts_number)) { $max_attempts_number = 1; } $grade = $quizzes->get_grade($lesson_id, $entry_id); $attempts_number = $quizzes->get_attempts_number($lesson_id, $entry_id); $do_quiz = $attempts_number < $max_attempts_number; $form_action = ib_edu_get_endpoint_url('edu-action', 'submit-quiz', get_permalink()); if ($grade && $do_quiz) { $do_quiz = isset($_GET['try_again']) && 'true' == $_GET['try_again']; if ($do_quiz) { $form_action = add_query_arg('try_again', 'true', $form_action); } } $form_action .= '#ib-edu-quiz'; ?> <section id="ib-edu-quiz" class="<?php echo $grade ? 'ib-edu-quiz-complete' : 'ib-edu-quiz-inprogress'; ?> "> <?php if (!$do_quiz && $grade) {
/** * Get the membership price widget. * * @param int $membership_id * @return string */ public function get_price_widget($membership_id = null) { if (is_null($membership_id)) { $membership_id = get_the_ID(); } $output = apply_filters('ib_educator_membership_price_widget', null, $membership_id); if (!is_null($output)) { return $output; } $price = $this->get_price($membership_id); $payment_url = ib_edu_get_endpoint_url('edu-membership', $membership_id, get_permalink(ib_edu_page_id('payment'))); $output = '<div class="ib-edu-price-widget">'; $output .= '<span class="price">' . ib_edu_format_price($price) . '</span>'; $output .= '<a href="' . esc_url($payment_url) . '" class="ib-edu-button">' . __('Purchase', 'ibeducator') . '</a>'; $output .= '</div>'; return $output; }
/** * Submit quiz. */ public static function submit_quiz() { if (empty($_POST)) { return; } $lesson_id = get_the_ID(); $user_id = get_current_user_id(); $api = IB_Educator::get_instance(); // Verify nonce. check_admin_referer('ibedu_submit_quiz_' . $lesson_id); // Get questions. $questions = $api->get_questions(array('lesson_id' => $lesson_id)); if (!$questions) { return; } $num_questions = count($questions); $num_answers = 0; if (!isset($_POST['answers'])) { // The student has to submit the answers to all questions. ib_edu_message('quiz', 'empty-answers'); return; } elseif (is_array($_POST['answers'])) { // Count answers. foreach ($_POST['answers'] as $answer) { if (!empty($answer)) { ++$num_answers; } } if ($num_answers != $num_questions) { // Not all questions were answered. ib_edu_message('quiz', 'empty-answers'); return; } } // Get entry. $entry = $api->get_entry(array('user_id' => $user_id, 'course_id' => ib_edu_get_course_id($lesson_id), 'entry_status' => 'inprogress')); if (!$entry) { return; } if ($api->is_quiz_submitted($lesson_id, $entry->ID)) { // Quiz has been submitted already. return; } $user_answer = ''; $answered = 0; $correct = 0; $automatic_grade = true; $choices = $api->get_choices($lesson_id, true); // Check answers to the quiz questions. foreach ($questions as $question) { if (!isset($_POST['answers'][$question->ID])) { // Student has to submit an answer. continue; } // Every question type needs a specific way to check for the valid answer. switch ($question->question_type) { // Multiple Choice Question. case 'multiplechoice': $user_answer = absint($_POST['answers'][$question->ID]); if (isset($choices[$question->ID]) && isset($choices[$question->ID][$user_answer])) { $choice = $choices[$question->ID][$user_answer]; // Add answer to database. $added = $api->add_student_answer(array('question_id' => $question->ID, 'entry_id' => $entry->ID, 'correct' => $choice->correct, 'choice_id' => $choice->ID)); if (1 == $added) { ++$answered; } if (1 == $choice->correct) { ++$correct; } } break; // Written Answer Question. // Written Answer Question. case 'writtenanswer': // We cannot check written answers automatically. if ($automatic_grade) { $automatic_grade = false; } $user_answer = stripslashes($_POST['answers'][$question->ID]); if (empty($user_answer)) { continue; } // Add answer to database. $added = $api->add_student_answer(array('question_id' => $question->ID, 'entry_id' => $entry->ID, 'correct' => -1, 'answer_text' => $user_answer)); if (1 == $added) { ++$answered; } break; } } if ($answered == $num_questions) { $grade_data = array('lesson_id' => $lesson_id, 'entry_id' => $entry->ID); if ($automatic_grade) { $grade_data['grade'] = round($correct / $answered * 100); $grade_data['status'] = 'approved'; } else { $grade_data['grade'] = 0; $grade_data['status'] = 'pending'; } $api->add_quiz_grade($grade_data); wp_redirect(ib_edu_get_endpoint_url('edu-message', 'quiz-submitted', get_permalink())); exit; } }
?> <tr> <td><?php echo intval($entry->ID); ?> </td> <td><a class="title" href="<?php echo esc_url(get_permalink($course->ID)); ?> "><?php echo esc_html($course->post_title); ?> </a></td> <td> <form action="<?php echo esc_url(ib_edu_get_endpoint_url('edu-action', 'resume-entry', get_permalink())); ?> " method="post"> <?php wp_nonce_field('ib_educator_resume_entry'); ?> <input type="hidden" name="entry_id" value="<?php echo absint($entry->ID); ?> "> <button type="submit" class="ib-edu-button" <?php if (!$ms->membership_can_access($course->ID, $user_id)) { echo ' disabled="disabled"'; } ?> ><?php
/** * Send the membership expiration emails to users. */ public static function send_expiration_notifications() { global $wpdb; $days_notify = ib_edu_get_option('days_notify', 'memberships'); if (null === $days_notify) { $days_notify = 5; } else { $days_notify = absint($days_notify); } $expires_date = date('Y-m-d', strtotime('+ ' . $days_notify . ' days')); $tables = ib_edu_table_names(); $users = $wpdb->get_results($wpdb->prepare('SELECT u.ID, u.user_email, u.display_name, m.expiration, m.membership_id FROM ' . $tables['members'] . ' m INNER JOIN ' . $wpdb->users . ' u ON u.ID = m.user_id WHERE m.`expiration` LIKE %s AND m.`status` = %s', $expires_date . '%', 'active')); if (empty($users)) { return; } // Get memberships. $membership_ids = array(); foreach ($users as $user) { if (!in_array($user->membership_id, $membership_ids)) { $membership_ids[] = $user->membership_id; } } $memberships = get_posts(array('post_type' => 'ib_edu_membership', 'include' => $membership_ids, 'post_status' => 'publish', 'posts_per_page' => -1)); if ($memberships) { foreach ($memberships as $key => $membership) { $memberships[$membership->ID] = $membership; unset($memberships[$key]); } foreach ($users as $user) { ib_edu_send_notification($user->user_email, 'membership_renew', array(), array('student_name' => $user->display_name, 'membership' => isset($memberships[$user->membership_id]) ? $memberships[$user->membership_id]->post_title : '', 'expiration' => date_i18n(get_option('date_format'), strtotime($user->expiration)), 'membership_payment_url' => ib_edu_get_endpoint_url('edu-membership', $user->membership_id, get_permalink(ib_edu_page_id('payment'))))); } } }
/** * Output the form to the step 2 (pay page) of the payment page. */ public function pay_page() { $action_url = $this->get_option('test') ? $this->test_url : $this->live_url; $payment_id = absint(get_query_var('edu-pay')); if (!$payment_id) { return; } $user_id = get_current_user_id(); if (!$user_id) { return; } $payment = edr_get_payment($payment_id); // The payment must exist in the database // and it must belong to the current user. if (!$payment->ID || $user_id != $payment->user_id) { return; } if ('course' == $payment->payment_type) { $post = get_post($payment->course_id); } elseif ('membership' == $payment->payment_type) { $post = get_post($payment->object_id); } if (!$post) { return; } $amount = $payment->amount - $payment->tax; $return_url = ''; $payment_page_id = ib_edu_page_id('payment'); if ($payment_page_id) { $return_url = ib_edu_get_endpoint_url('edu-thankyou', $payment->ID ? $payment->ID : '', get_permalink($payment_page_id)); } echo '<form id="ib-edu-paypal-form" action="' . esc_url($action_url) . '" method="post">'; echo '<input type="hidden" name="cmd" value="_xclick">'; echo '<input type="hidden" name="charset" value="utf-8">'; echo '<input type="hidden" name="business" value="' . esc_attr($this->get_option('business_email')) . '">'; echo '<input type="hidden" name="return" value="' . esc_url($return_url) . '">'; echo '<input type="hidden" name="notify_url" value="' . esc_url(ib_edu_request_url('paypalipn')) . '">'; echo '<input type="hidden" name="currency_code" value="' . esc_attr(ib_edu_get_currency()) . '">'; echo '<input type="hidden" name="item_name" value="' . esc_attr($post->post_title) . '">'; echo '<input type="hidden" name="item_number" value="' . absint($payment->ID) . '">'; if ($payment->tax) { echo '<input type="hidden" name="tax" value="' . (double) $payment->tax . '">'; } echo '<input type="hidden" name="amount" value="' . (double) $amount . '">'; echo '<div id="paypal-form-buttons"><button type="submit">' . __('Continue', 'ibeducator') . '</button></div>'; echo '</form>'; echo '<div id="paypal-redirect-notice" style="display: none;">' . __('Redirecting to PayPal...', 'ibeducator') . '</div>'; echo '<script>(function() { function goToPayPal() { document.getElementById("paypal-form-buttons").style.display = "none"; document.getElementById("paypal-redirect-notice").style.display = "block"; document.getElementById("ib-edu-paypal-form").submit(); } if ( typeof jQuery === "undefined" ) { setTimeout(goToPayPal, 500); } else { jQuery(document).on("ready", function() { goToPayPal(); }); } })();</script>'; }
/** * Get the url to the "thank you" page. * * @param array $args * @return string */ public function get_redirect_url($args) { $redirect = ''; if (isset($args['value'])) { $redirect = ib_edu_get_endpoint_url('edu-thankyou', $args['value'], get_permalink(ib_edu_page_id('payment'))); } else { $redirect = ib_edu_get_endpoint_url('edu-thankyou', '', get_permalink(ib_edu_page_id('payment'))); } return $redirect; }
/** * Output the Stripe's payment dialog. * Step 2 in the payment process. */ public function pay_page() { $payment_id = absint(get_query_var('edu-pay')); if (!$payment_id) { return; } $user = wp_get_current_user(); if (0 == $user->ID) { return; } $payment = edr_get_payment($payment_id); if (!$payment->ID || $user->ID != $payment->user_id) { // The payment must exist and it must be associated with the current user. return; } if ('course' == $payment->payment_type) { $post = get_post($payment->course_id); } elseif ('membership' == $payment->payment_type) { $post = get_post($payment->object_id); } if (!$post) { return; } ?> <p id="ib-edu-payment-processing-msg"> <?php _e('The payment is getting processed...', 'ibeducator'); ?> </p> <script src="https://checkout.stripe.com/checkout.js"></script> <script> (function($) { var handler = StripeCheckout.configure({ key: <?php echo json_encode($this->get_option('publishable_key')); ?> , image: '', email: <?php echo json_encode($user->user_email); ?> , token: function(token) { $.ajax({ type: 'POST', cache: false, url: <?php echo json_encode(ib_edu_request_url('stripe_token')); ?> , data: { payment_id: <?php echo intval($payment->ID); ?> , token: token.id, _wpnonce: <?php echo json_encode(wp_create_nonce('ib_educator_stripe_token')); ?> }, success: function(response) { if (response === '1') { $('#ib-edu-payment-processing-msg').text(<?php echo json_encode(__('Redirecting to the payment summary page...', 'ibeducator')); ?> ); var redirectTo = <?php echo json_encode(ib_edu_get_endpoint_url('edu-thankyou', $payment->ID, get_permalink(ib_edu_page_id('payment')))); ?> ; document.location = redirectTo; } } }); } }); handler.open({ name: <?php echo json_encode(esc_html($post->post_title)); ?> , description: <?php echo json_encode(ib_edu_format_price($payment->amount, false, false)); ?> , currency: <?php echo json_encode(ib_edu_get_currency()); ?> , amount: <?php echo absint($payment->amount * 100); ?> }); $(window).on('popstate', function() { handler.close(); }); })(jQuery); </script> <?php }
function ib_edu_purchase_link($atts) { $atts = wp_parse_args($atts, array('object_id' => null, 'type' => null, 'text' => __('Purchase', 'ib-educator'), 'class' => array())); // Add default class. array_push($atts['class'], 'edu-purchase-link'); $html = apply_filters('ib_edu_pre_purchase_link', null, $atts); if (!is_null($html)) { return $html; } if ('membership' == $atts['type']) { $html = sprintf('<a href="%s" class="%s">%s</a>', esc_url(ib_edu_get_endpoint_url('edu-membership', $atts['object_id'], get_permalink(ib_edu_page_id('payment')))), esc_attr(implode(' ', $atts['class'])), $atts['text']); } return $html; }
if (!$quiz_submitted) { $answers = isset($_POST['answers']) && is_array($_POST['answers']) ? $_POST['answers'] : array(); } else { $answers = $api->get_student_answers($lesson_id, $entry->ID); if (!$answers) { $answers = array(); } } ?> <h3 class="ib-edu-quiz-title"><?php _e('Quiz', 'ibeducator'); ?> </h3> <form id="ib-edu-quiz-form" class="ib-edu-form" method="post" action="<?php echo esc_url(ib_edu_get_endpoint_url('edu-action', 'submit-quiz', get_permalink())); ?> "> <?php wp_nonce_field('ibedu_submit_quiz_' . $lesson_id); ?> <input type="hidden" name="submit_quiz" value="1"> <div class="ib-edu-questions"> <?php $choices = $api->get_choices($lesson_id, true); foreach ($questions as $question) { if ('multiplechoice' == $question->question_type) { // Multiple Choice Question. // Check if this question has the answer choices. if (!$choices || !isset($choices[$question->ID])) {
echo '<div class="ib-edu-message info">' . esc_html__('Your registration for this course is pending.', 'training') . '</div>'; break; case 'pending_payment': echo '<div class="ib-edu-message info">' . esc_html__('Your payment for this course is pending.', 'training') . '</div>'; break; default: //--------------- if ('closed' == ib_edu_registration($course_id)) { break; } $output = apply_filters('ib_educator_course_price_widget', null, $membership_access, $course_id, $user_id); if (null !== $output) { return $output; } if ($membership_access) { $register_url = ib_edu_get_endpoint_url('edu-action', 'join', get_permalink($course_id)); $output .= '<form class="space-20" action="' . esc_url($register_url) . '" method="post">'; $output .= '<input type="hidden" name="_wpnonce" value="' . wp_create_nonce('ib_educator_join') . '">'; $output .= '<input type="submit" class="ib-edu-button" value="' . esc_html__('Join', 'training') . '">'; $output .= '</form>'; } else { $output .= '<p class="space-top-30 text-center"><a href="' . esc_url($register_url) . '" class="ib-edu-button btn btn btn-success">' . esc_html__('join class now', 'training') . '</a></p>'; } echo trim($output); break; } ?> </div> </div> <?php