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);
 }
示例#3
0
<?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']);
示例#4
0
 /**
  * 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;
 }
示例#6
0
        } 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';
            }
            ?>
示例#7
0
/**
 * 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;
     }
 }
示例#9
0
 /**
  * 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);
     }
 }
示例#10
0
 /**
  * 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
 }
示例#11
0
 /**
  * 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();
 }
示例#15
0
 /**
  * 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);
 }
示例#16
0
/**
 * 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;
}