public function testUpdateSplittedTerms() { // Remove split_shared_term to prevent automatic categories update for memberships. remove_action('split_shared_term', array('IB_Educator_Main', 'split_shared_term')); // Split shared term. $new_term = wp_update_term($this->terms['term3']['term_id'], 'ib_educator_category', array('name' => 'Edu')); // Update shared terms for use in memberships. $install = new IB_Educator_Install(); $install->update_1_4_4(); $ms = IB_Educator_Memberships::get_instance(); $meta = $ms->get_membership_meta($this->posts[0]); // The term_id stored in the membership's categories setting should be updated. $this->assertEquals(array($new_term['term_id'], $this->terms['term4']['term_id']), $meta['categories']); }
/** * Process payment. * * @return array */ public function process_payment($object_id, $user_id = 0, $payment_type = 'course', $atts = array()) { if (!$user_id) { $user_id = get_current_user_id(); } if (!$user_id) { return array('status' => '', 'redirect' => home_url('/')); } // Add payment. $payment = IB_Educator_Payment::get_instance(); $payment->user_id = $user_id; $payment->payment_type = $payment_type; $payment->payment_status = 'complete'; $payment->payment_gateway = $this->get_id(); $payment->amount = 0.0; $payment->currency = ib_edu_get_currency(); if ('course' == $payment_type) { $payment->course_id = $object_id; $payment->amount = ib_edu_get_course_price($object_id); } elseif ('membership' == $payment_type) { $payment->object_id = $object_id; $ms = IB_Educator_Memberships::get_instance(); $payment->amount = $ms->get_price($object_id); } if (!empty($atts['ip'])) { $payment->ip = $atts['ip']; } if (0.0 == $payment->amount) { $payment->save(); if ($payment->ID) { if ('course' == $payment->payment_type) { // Setup course entry. $entry = IB_Educator_Entry::get_instance(); $entry->course_id = $object_id; $entry->user_id = $user_id; $entry->payment_id = $payment->ID; $entry->entry_status = 'inprogress'; $entry->entry_date = date('Y-m-d H:i:s'); $entry->save(); } elseif ('membership' == $payment->payment_type) { // Setup membership. $ms->setup_membership($user_id, $object_id); } } } return array('status' => 'complete', 'redirect' => get_permalink($object_id), 'payment' => $payment); }
<?php $ms = IB_Educator_Memberships::get_instance(); $membership_id = get_the_ID(); $membership_meta = $ms->get_membership_meta($membership_id); $post_count = get_query_var('ibeducator_post_count'); $classes = array(); if ($post_count % 2 == 0) { $classes[] = 'second'; } if ($post_count % 3 == 0) { $classes[] = 'third'; } ?> <article <?php post_class($classes); ?> > <header class="membership-title"> <h2><a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a></h2> </header> <section class="price"> <?php echo $ms->format_price($membership_meta['price'], $membership_meta['duration'], $membership_meta['period']);
/** * Get payment info table. * * @param WP_Post $object * @param array $args * @return string */ public static function payment_info($object, $args = array()) { // Get price. if (!isset($args['price'])) { if ('ib_educator_course' == $object->post_type) { $args['price'] = ib_edu_get_course_price($object->ID); } elseif ('ib_edu_membership' == $object->post_type) { $args['price'] = IB_Educator_Memberships::get_instance()->get_price($object->ID); } } // Get tax data. $tax_enabled = ib_edu_get_option('enable', 'taxes'); if ($tax_enabled) { $edu_tax = IB_Educator_Tax::get_instance(); $tax_data = $edu_tax->calculate_tax($edu_tax->get_tax_class_for($object->ID), $args['price'], $args['country'], $args['state']); } else { $tax_data = array('taxes' => array(), 'subtotal' => $args['price'], 'tax' => 0.0, 'total' => $args['price']); } // Items list. $output = '<table class="edu-payment-table">'; $output .= '<thead><tr><th>' . __('Item', 'ibeducator') . '</th><th>' . __('Price', 'ibeducator') . '</th></tr></thead>'; if ('ib_educator_course' == $object->post_type) { $output .= '<tbody><tr><td>'; if (ib_edu_get_option('payment_lecturer', 'settings')) { $output .= sprintf(__('%s with %s', 'ibeducator'), '<a href="' . esc_url(get_permalink($object->ID)) . '" target="_blank">' . esc_html($object->post_title) . '</a>', esc_html(get_the_author_meta('display_name', $object->post_author))); } else { $output .= '<a href="' . esc_url(get_permalink($object->ID)) . '" target="_blank">' . esc_html($object->post_title) . '</a>'; } $output .= '<input type="hidden" id="payment-object-id" name="course_id" value="' . intval($object->ID) . '"></td>'; $output .= '<td>' . ib_edu_format_price($tax_data['subtotal'], false) . '</td></tr></tbody>'; } elseif ('ib_edu_membership' == $object->post_type) { $output .= '<tbody><tr><td>' . esc_html($object->post_title); $output .= '<input type="hidden" id="payment-object-id" name="membership_id" value="' . intval($object->ID) . '"></td>'; $ms = IB_Educator_Memberships::get_instance(); $membership_meta = $ms->get_membership_meta($object->ID); $output .= '<td>' . $ms->format_price($tax_data['subtotal'], $membership_meta['duration'], $membership_meta['period']) . '</td></tr></tbody>'; } $output .= '</table>'; // Summary. $output .= '<dl class="edu-payment-summary edu-dl">'; if ($tax_data['tax'] > 0.0) { $output .= '<dt class="payment-subtotal">' . __('Subtotal', 'ibeducator') . '</dt><dd>' . ib_edu_format_price($tax_data['subtotal'], false) . '</dd>'; foreach ($tax_data['taxes'] as $tax) { $output .= '<dt class="payment-tax">' . esc_html($tax->name) . '</dt><dd>' . ib_edu_format_price($tax->amount, false) . '</dd>'; } } $output .= '<dt class="payment-total">' . __('Total', 'ibeducator') . '</dt><dd>' . ib_edu_format_price($tax_data['total'], false) . '</dd>'; $output .= '</dl>'; return $output; }
/** * Add payment. */ public function addPayment($input) { $data = array('user_id' => $input['user_id'], 'payment_type' => $input['payment_type'], 'payment_gateway' => 'paypal', 'payment_status' => $input['payment_status'], 'currency' => 'USD'); if ('course' == $input['payment_type']) { $data['course_id'] = $input['course_id']; $data['amount'] = ib_edu_get_course_price($input['course_id']); } elseif ('membership' == $input['payment_type']) { $data['object_id'] = $input['object_id']; $ms = IB_Educator_Memberships::get_instance(); $data['amount'] = $ms->get_price($input['object_id']); } $payment = $this->api->add_payment($data); return $payment->ID; }
} else { $args['country'] = ib_edu_get_location('country'); } // Get state. if (isset($_POST['billing_state'])) { $args['state'] = $_POST['billing_state']; } elseif (!empty($billing['state'])) { $args['state'] = $billing['state']; } else { $args['state'] = ib_edu_get_location('state'); } // Get price. if ('ib_educator_course' == $post->post_type) { $args['price'] = ib_edu_get_course_price($post->ID); } elseif ('ib_edu_membership' == $post->post_type) { $args['price'] = IB_Educator_Memberships::get_instance()->get_price($post->ID); } // Output payment summary. echo '<div id="edu-payment-info" class="edu-payment-info">' . IB_Educator_Account::payment_info($post, $args) . '</div>'; // Payment gateways. $gateways = IB_Educator_Main::get_gateways(); ?> <?php if ($args['price'] && !empty($gateways)) { ?> <div class="ib-edu-form-field<?php if (in_array('empty_payment_method', $error_codes)) { echo ' error'; } ?>
/** * Find out whether to collect billing data or not. * * @param mixed $object * @return bool */ function ib_edu_collect_billing_data($object) { if (is_numeric($object)) { $object = get_post($object); } $result = false; if ($object) { $price = null; if ('ib_edu_membership' == $object->post_type) { $price = IB_Educator_Memberships::get_instance()->get_price($object->ID); } elseif ('ib_educator_course' == $object->post_type) { $price = ib_edu_get_course_price($object->ID); } if ($price && ib_edu_get_option('enable', 'taxes')) { $result = true; } } return $result; }
/** * Edit member action. */ public static function edit_member() { if (count($_POST)) { // Verify nonce. check_admin_referer('ib_educator_edit_member'); // Capability check. if (!current_user_can('manage_educator')) { return; } $ms = IB_Educator_Memberships::get_instance(); $member_id = isset($_GET['id']) ? intval($_GET['id']) : 0; $data = array(); $errors = array(); if (isset($_POST['user_id'])) { $data['user_id'] = intval($_POST['user_id']); } if (isset($_POST['membership_id'])) { $data['membership_id'] = intval($_POST['membership_id']); } if (isset($_POST['membership_status'])) { $data['status'] = sanitize_text_field($_POST['membership_status']); } $date_regex = '/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/'; if (isset($_POST['expiration'])) { if (preg_match($date_regex, $_POST['expiration'])) { $data['expiration'] = $_POST['expiration']; } else { $data['expiration'] = '0000-00-00 00:00:00'; } } if (isset($_POST['paused'])) { if (preg_match($date_regex, $_POST['paused'])) { $data['paused'] = $_POST['paused']; } else { $data['paused'] = '0000-00-00 00:00:00'; } } // UNIQUE memberships only. if (!$member_id && !empty($data['user_id'])) { $user_membership = $ms->get_user_membership($data['user_id']); if (!empty($user_membership)) { $errors[] = 'member_exists'; } } if (!empty($errors)) { ib_edu_message('edit_member_errors', $errors); return; } $user_membership = $member_id ? $ms->get_user_membership($member_id) : null; $data['ID'] = $user_membership ? $user_membership['ID'] : 0; $data['ID'] = $ms->update_user_membership($data); if ('expired' == $data['status']) { $ms->pause_membership_entries($data['user_id']); } wp_redirect(admin_url('admin.php?page=ib_educator_members&edu-action=edit-member&id=' . intval($data['user_id']) . '&edu-message=saved')); exit; } }
/** * Resume the user's membership. */ public static function resume_membership() { if (1 != ib_edu_get_option('pause_memberships', 'memberships')) { return; } if (!isset($_GET['_wpnonce']) || !wp_verify_nonce($_GET['_wpnonce'], 'ib_educator_resume_membership')) { return; } // Get the current user id. $user_id = get_current_user_id(); if (!$user_id) { return; } $ms = IB_Educator_Memberships::get_instance(); $user_membership = $ms->get_user_membership($user_id); if ($user_membership && 'paused' == $user_membership['status']) { $ms->resume_membership($user_id); } }
/** * Output courses filter block. */ function educator_courses_filter($args = array()) { $output = '<div id="courses-filter" class="clearfix">'; // get current membership id. $membership_id = get_query_var('membership_id'); // Categories filter. $terms = get_terms(array('ib_educator_category')); if (!empty($terms) && !is_wp_error($terms)) { $current_category = get_query_var('ib_educator_category'); $current_category_name = ''; foreach ($terms as $term) { if ($term->slug == $current_category) { $current_category_name = $term->name; break; } } if (empty($current_category_name)) { $current_category_name = __('Category', 'ib-educator'); } $output .= '<div class="drop-down"><a href="#"><span class="text">' . esc_html($current_category_name) . '</span><span class="icon"></span></a><ul>'; // Reset link. if (isset($args['category_same_page'])) { $permalink = get_permalink(); } else { $permalink = get_post_type_archive_link('ib_educator_course'); } if ($membership_id) { $permalink = add_query_arg('membership_id', $membership_id, $permalink); } $output .= '<li><a href="' . esc_url($permalink) . '">' . __('All', 'ib-educator') . '</a></li>'; // Term links. foreach ($terms as $term) { if (isset($args['category_same_page'])) { $term_permalink = add_query_arg('ib_educator_category', $term->slug, $permalink); } else { $term_permalink = get_term_link($term); } if ($membership_id) { $term_permalink = add_query_arg('membership_id', $membership_id, $term_permalink); } $output .= '<li><a href="' . esc_url($term_permalink) . '">' . esc_html($term->name) . '</a></li>'; } $output .= '</ul></div>'; } if (class_exists('IB_Educator_Memberships') && apply_filters('edutheme_memberships_filter', true)) { $memberships = IB_Educator_Memberships::get_instance()->get_memberships(); if (!empty($memberships)) { $title = ''; foreach ($memberships as $membership) { if ($membership_id == $membership->ID) { $title = $membership->post_title; } } if (empty($title)) { $title = __('Membership', 'ib-educator'); } if ($memberships) { $output .= '<div class="drop-down"><a href="#"><span class="text">' . esc_html($title) . '</span><span class="icon"></span></a><ul>'; $permalink = is_ssl() ? 'https' : 'http'; $permalink .= '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; if (get_option('permalink_structure')) { $permalink = preg_replace('/\\/page\\/[0-9]+/i', '', $permalink); } else { $permalink = remove_query_arg('paged', $permalink); } $output .= '<li><a href="' . esc_url(remove_query_arg('membership_id', $permalink)) . '">' . __('All', 'ib-educator') . '</a></li>'; foreach ($memberships as $membership) { $m_permalink = add_query_arg('membership_id', $membership->ID, $permalink); $output .= '<li><a href="' . esc_url($m_permalink) . '">' . esc_html($membership->post_title) . '</a></li>'; } $output .= '</ul></div>'; } } } // Number of courses. $num_courses = 0; if (isset($args['num_courses'])) { $num_courses = $args['num_courses']; } elseif (isset($GLOBALS['wp_query']->found_posts)) { $num_courses = $GLOBALS['wp_query']->found_posts; } if ($num_courses) { $output .= '<div class="courses-num">' . sprintf(__('%d course(s)', 'ib-educator'), intval($num_courses)) . '</div>'; } $output .= '</div>'; echo $output; // sanitized above }
/** * Setup payment item (e.g. course, membership). * * @param IB_Educator_Payment $payment */ public function setup_payment_item($payment) { if ('course' == $payment->payment_type) { // Setup course entry. $entry = $this->get_entry(array('payment_id' => $payment->ID)); if (!$entry) { $entry = IB_Educator_Entry::get_instance(); $entry->course_id = $payment->course_id; $entry->user_id = $payment->user_id; $entry->payment_id = $payment->ID; $entry->entry_status = 'inprogress'; $entry->entry_date = date('Y-m-d H:i:s'); $entry->save(); // Send notification email to the student. $student = get_user_by('id', $payment->user_id); $course = get_post($payment->course_id, OBJECT, 'display'); if ($student && $course) { ib_edu_send_notification($student->user_email, 'student_registered', array('course_title' => $course->post_title), array('student_name' => $student->display_name, 'course_title' => $course->post_title, 'course_excerpt' => $course->post_excerpt)); } } } elseif ('membership' == $payment->payment_type) { // Setup membership. $ms = IB_Educator_Memberships::get_instance(); $ms->setup_membership($payment->user_id, $payment->object_id); $student = get_user_by('id', $payment->user_id); $membership = $ms->get_membership($payment->object_id); if ($student && $membership) { $user_membership = $ms->get_user_membership($student->ID); $membership_meta = $ms->get_membership_meta($membership->ID); $expiration = $user_membership ? $user_membership['expiration'] : 0; ib_edu_send_notification($student->user_email, 'membership_register', array(), array('student_name' => $student->display_name, 'membership' => $membership->post_title, 'expiration' => $expiration ? date_i18n(get_option('date_format'), $expiration) : __('None', 'ibeducator'), 'price' => $ms->format_price($membership_meta['price'], $membership_meta['duration'], $membership_meta['period'], false))); } } }
/** * Output the price column on the memberships admin page. * * @param string $column_name * @param int $post_id */ public static function memberships_column_output($column_name, $post_id) { if ('price' == $column_name) { $ms = IB_Educator_Memberships::get_instance(); $membership_meta = $ms->get_membership_meta($post_id); echo $ms->format_price($membership_meta['price'], $membership_meta['duration'], $membership_meta['period']); } }
/** * Create payment. * * @param int $object_id ID of the object the payment is to be associated with. * @param int $user_id * @param string $payment_type * @return IB_Educator_Payment */ public function create_payment($object_id, $user_id, $payment_type, $atts = array()) { $payment = IB_Educator_Payment::get_instance(); $payment->user_id = $user_id; $payment->payment_type = $payment_type; $payment->payment_status = 'pending'; $payment->payment_gateway = $this->get_id(); $payment->currency = ib_edu_get_currency(); if ('course' == $payment_type) { $payment->course_id = $object_id; $payment->amount = ib_edu_get_course_price($object_id); } elseif ('membership' == $payment_type) { $payment->object_id = $object_id; $payment->amount = IB_Educator_Memberships::get_instance()->get_price($object_id); } $tax_data = null; if (ib_edu_collect_billing_data($object_id)) { // Save billing data. $billing = get_user_meta($user_id, '_ib_educator_billing', true); if (!is_array($billing)) { $billing = array(); } $payment->first_name = get_user_meta($user_id, 'first_name', true); $payment->last_name = get_user_meta($user_id, 'last_name', true); $payment->address = isset($billing['address']) ? $billing['address'] : ''; $payment->address_2 = isset($billing['address_2']) ? $billing['address_2'] : ''; $payment->city = isset($billing['city']) ? $billing['city'] : ''; $payment->state = isset($billing['state']) ? $billing['state'] : ''; $payment->postcode = isset($billing['postcode']) ? $billing['postcode'] : ''; $payment->country = isset($billing['country']) ? $billing['country'] : ''; // Calculate tax. $edu_tax = IB_Educator_Tax::get_instance(); $tax_data = $edu_tax->calculate_tax($edu_tax->get_tax_class_for($object_id), $payment->amount, $payment->country, $payment->state); $payment->tax = $tax_data['tax']; $payment->amount = $tax_data['total']; } if (!empty($atts['ip'])) { $payment->ip = $atts['ip']; } $payment->save(); // Save tax data. if ($tax_data) { foreach ($tax_data['taxes'] as $tax) { $payment->update_line(array('object_id' => $tax->ID, 'line_type' => 'tax', 'amount' => $tax->amount, 'name' => $tax->name)); } } return $payment; }
/** * Test if plugin sends membership expiration notifications to students. */ public function testMembershipExpirationNotification() { add_filter('wp_mail', array($this, 'wp_mail_expiration_notification')); $ms = IB_Educator_Memberships::get_instance(); $user = wp_insert_user(array('user_login' => 'expired3', 'user_email' => '*****@*****.**', 'user_pass' => '123456', 'role' => 'student')); $membership = $this->addMembership(array('price' => 100, 'period' => 'months', 'duration' => 1, 'categories' => array($this->categories[0]))); $ms->setup_membership($user, $membership); $in5days = strtotime('+ 5 days', strtotime(date('Y-m-d 23:59:59'))); $ms->update_user_membership($user, array('expiration' => date('Y-m-d H:i:s', $in5days))); $_SERVER['SERVER_NAME'] = 'localhost'; IB_Educator_Memberships_Run::send_expiration_notifications(); }
/** * Save membership meta box. * * @param int $post_id * @param WP_Post $post * @param boolean $update */ public static function save_membership_meta_box($post_id, $post, $update) { if (!isset($_POST['ib_edu_membership_nonce'])) { return; } if (!wp_verify_nonce($_POST['ib_edu_membership_nonce'], 'ib_edu_membership')) { return; } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if ('ib_edu_membership' != get_post_type($post_id) || !current_user_can('edit_ib_edu_membership', $post_id)) { return; } $ms = IB_Educator_Memberships::get_instance(); $meta = $ms->get_membership_meta($post_id); // Price. if (isset($_POST['_ib_educator_price'])) { $meta['price'] = (double) $_POST['_ib_educator_price']; } // Duration. if (isset($_POST['_ib_educator_duration'])) { $meta['duration'] = intval($_POST['_ib_educator_duration']); } // Period. if (isset($_POST['_ib_educator_period']) && array_key_exists($_POST['_ib_educator_period'], $ms->get_periods())) { $meta['period'] = $_POST['_ib_educator_period']; } // Categories. if (isset($_POST['_ib_educator_categories']) && is_array($_POST['_ib_educator_categories'])) { $meta['categories'] = array_map('absint', $_POST['_ib_educator_categories']); } update_post_meta($post_id, '_ib_educator_membership', $meta); self::save_tax_data($post_id); }
/** * Output courses on the author page. * * @param WP_Query $query * @return WP_Query */ function educator_author_page_posts($query) { if (!is_admin() && $query->is_main_query()) { if (is_author()) { $view = get_query_var('view'); switch ($view) { case 'courses': $post_type = 'ib_educator_course'; break; default: $post_type = 'post'; } $query->set('post_type', $post_type); } elseif (is_post_type_archive('ib_educator_course') || is_tax('ib_educator_category')) { $membership_id = get_query_var('membership_id'); if ($membership_id) { $ms = IB_Educator_Memberships::get_instance(); $meta = $ms->get_membership_meta($membership_id); if (!empty($meta['categories'])) { $query->set('tax_query', array(array('taxonomy' => 'ib_educator_category', 'field' => 'id', 'terms' => $meta['categories'], 'operator' => 'IN'))); } } } } return $query; }