/** * Get Member's Stripe Customer Object. * * @since 1.0.0 * @internal * * @param MS_Model_Member $member The member. */ public function find_customer($member) { $customer_id = $member->get_gateway_profile(self::ID, 'customer_id'); $customer = null; if (!empty($customer_id)) { $customer = M2_Stripe_Customer::retrieve($customer_id); // Seems like the customer was manually deleted on Stripe website. if (isset($customer->deleted) && $customer->deleted) { $customer = null; $member->set_gateway_profile(self::ID, 'customer_id', ''); } } return apply_filters('ms_gateway_stripe_find_customer', $customer, $member, $this); }
public function to_html() { $this->check_simulation(); // Search for orphaned relationships and delete them. MS_Model_Member::clean_db(); $listview = MS_Factory::create('MS_Helper_ListTable_Member'); $listview->prepare_items(); ob_start(); ?> <div class="wrap ms-wrap ms-member-list"> <?php MS_Helper_Html::settings_header(array('title' => __('Members', MS_TEXT_DOMAIN), 'title_icon_class' => 'wpmui-fa wpmui-fa-users', 'desc' => __('Here you can manage the Memberships of existing Users.', MS_TEXT_DOMAIN))); // Display a filter to switch between individual memberships. $this->membership_filter(); $listview->views(); $listview->search_box(); ?> <form method="post"> <?php $listview->display(); ?> </form> </div> <?php $html = ob_get_clean(); return $html; }
/** * Prepare html fields. * * @since 1.0.0 * * @return array */ function prepare_fields() { $invoice = $this->data['invoice']; $currency = MS_Plugin::instance()->settings->currency; $user_name = ''; $transaction_link = ''; $user_id = 0; $user_list = array(); if ($invoice->id) { $member = $invoice->get_member(); $user_id = $member->id; $user_name = $member->name; $transaction_link = sprintf('<a href="%s" target="_blank">%s</a>', MS_Controller_Plugin::get_admin_url('billing', array('show' => 'logs', 'invoice' => $invoice->id)), __('Show Transactions', 'membership2')); } else { $user_list = MS_Model_Member::get_usernames(null, MS_Model_Member::SEARCH_ALL_USERS); } $fields = array('link_transactions' => array('id' => 'link_transactions', 'title' => $transaction_link, 'type' => MS_Helper_Html::TYPE_HTML_TEXT, 'wrapper_class' => 'ms-transactions-link'), 'txt_user' => array('id' => 'txt_user', 'title' => __('Invoice for member', 'membership2'), 'type' => MS_Helper_Html::TYPE_HTML_TEXT, 'value' => sprintf('<a href="%s">%s</a>', MS_Controller_Plugin::get_admin_url('add-member', array('user_id' => $user_id)), $user_name)), 'txt_membership' => array('id' => 'txt_membership', 'title' => __('Payment for membership', 'membership2'), 'type' => MS_Helper_Html::TYPE_HTML_TEXT), 'txt_created' => array('id' => 'txt_created', 'title' => __('Invoice created on', 'membership2'), 'type' => MS_Helper_Html::TYPE_HTML_TEXT), 'txt_separator' => array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR), 'status' => array('id' => 'status', 'title' => __('Invoice status', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'field_options' => MS_Model_Invoice::get_status_types(true), 'value' => $invoice->status), 'user_id' => array('id' => 'user_id', 'title' => __('Invoice for member', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $invoice->user_id, 'field_options' => $user_list), 'membership_id' => array('id' => 'membership_id', 'title' => __('Payment for membership', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $invoice->membership_id, 'field_options' => $this->data['memberships']), 'amount' => array('id' => 'amount', 'title' => sprintf(__('Amount (%s)', 'membership2'), $currency), 'type' => MS_Helper_Html::INPUT_TYPE_NUMBER, 'value' => MS_Helper_Billing::format_price($invoice->amount), 'config' => array('step' => 'any', 'min' => 0)), 'discount' => array('id' => 'discount', 'title' => sprintf(__('Discount (%s)', 'membership2'), $currency), 'type' => MS_Helper_Html::INPUT_TYPE_NUMBER, 'value' => MS_Helper_Billing::format_price($invoice->discount), 'config' => array('step' => 'any', 'min' => 0)), 'due_date' => array('id' => 'due_date', 'title' => __('Due date', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_DATEPICKER, 'value' => $invoice->due_date), 'description' => array('id' => 'description', 'title' => __('Description', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'class' => 'widefat', 'value' => $invoice->description), 'notes' => array('id' => 'notes', 'title' => __('Notes', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_TEXT_AREA, 'class' => 'widefat', 'value' => $invoice->get_notes_desc()), 'invoice_id' => array('id' => 'invoice_id', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $invoice->id), '_wpnonce' => array('id' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce($this->data['action'])), 'action' => array('id' => 'action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $this->data['action']), 'separator' => array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR), 'execute' => array('id' => 'execute', 'title' => __('Execute status change actions on Save (add/remove membership)', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'value' => true), 'cancel' => array('id' => 'cancel', 'type' => MS_Helper_Html::TYPE_HTML_LINK, 'title' => __('Cancel', 'membership2'), 'value' => __('Cancel', 'membership2'), 'url' => esc_url_raw(remove_query_arg(array('action', 'invoice_id'))), 'class' => 'wpmui-field-button button'), 'submit' => array('id' => 'submit', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Save Changes', 'membership2'))); if ($invoice->id > 0) { $fields['user_id']['type'] = MS_Helper_Html::INPUT_TYPE_HIDDEN; $fields['membership_id']['type'] = MS_Helper_Html::INPUT_TYPE_HIDDEN; $fields['txt_membership']['value'] = $this->data['memberships'][$invoice->membership_id]; $fields['txt_created']['value'] = MS_Helper_Period::format_date($invoice->invoice_date); } else { unset($fields['txt_user']); unset($fields['txt_membership']); unset($fields['txt_created']); unset($fields['txt_separator']); } return apply_filters('ms_view_billing_edit_prepare_fields', $fields, $this); }
/** * Determines if the current user is permitted to even think about using * simulation. If not allowed, then most of this class will not be used. * * @since 1.0.0 * @return bool */ public static function can_simulate() { if (defined('DOING_CRON') && DOING_CRON) { // No simulation during cron jobs... return false; } if (MS_Model_Member::is_admin_user()) { return true; } return false; }
/** * Prepare html fields. * * @since 1.0.1.0 * * @return array */ function prepare_fields() { $member = $this->data['member']; $userlist = MS_Model_Member::get_usernames(null, MS_Model_Member::SEARCH_ALL_USERS); $log = $this->data['log']; $data_action = MS_Controller_Billing::AJAX_ACTION_TRANSACTION_LINK_DATA; $update_action = MS_Controller_Billing::AJAX_ACTION_TRANSACTION_UPDATE; $fields = array(); $member_id = 0; if ($member && $member->id) { $member_id = $member->id; } $fields['info'] = array('id' => array('type' => MS_Helper_Html::TYPE_HTML_TEXT, 'title' => __('Transaction ID', 'membership2'), 'value' => $log->id), 'gateway' => array('type' => MS_Helper_Html::TYPE_HTML_TEXT, 'title' => __('Payment Gateway', 'membership2'), 'value' => MS_Model_Gateway::get_name($log->gateway_id, true)), 'amount' => array('type' => MS_Helper_Html::TYPE_HTML_TEXT, 'title' => __('Transaction Amount', 'membership2'), 'value' => MS_Helper_Billing::format_price($log->amount)), 'details' => array('type' => MS_Helper_Html::TYPE_HTML_TEXT, 'title' => __('Transaction Details', 'membership2'), 'value' => $log->description), 'sep' => array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR, 'value' => 'vertical')); $fields['member'] = array('user_id' => array('id' => 'user_id', 'title' => __('1. Payment by user', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $member_id, 'field_options' => $userlist)); $fields['subscription'] = array('subscription_id' => array('id' => 'subscription_id', 'title' => __('2. Payment for subscription', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => 0, 'field_options' => array())); $fields['invoice'] = array('invoice_id' => array('id' => 'invoice_id', 'title' => __('3. Link payment with invoice', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => 0, 'field_options' => array(), 'after' => __('The selected Invoice will be marked as "paid"', 'membership2'))); $fields['buttons'] = array('nonce_link_data' => array('id' => 'nonce_link_data', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce($data_action)), 'nonce_update' => array('id' => 'nonce_update', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce($update_action)), 'log_id' => array('id' => 'log_id', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $log->id), 'cancel' => array('id' => 'cancel', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Cancel', 'membership2'), 'class' => 'wpmui-field-button button close'), 'submit' => array('id' => 'submit', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Save Transaction', 'membership2'))); return apply_filters('ms_view_billing_link_prepare_fields', $fields, $this); }
/** * Save coupon application. * * Saving the application to keep track of the application in gateway return. * Using COUPON_REDEMPTION_TIME to expire coupon application. * * This is a non-static function, as it saves the current object! * * @since 1.0.0 * @param MS_Model_Relationship $subscription The subscription to apply the coupon. */ public function save_application($subscription) { // Don't save empty invitations. if (empty($this->code)) { return false; } $membership = $subscription->get_membership(); $discount = $this->get_discount_value($subscription); $time = apply_filters('ms_addon_coupon_model_save_application_redemption_time', self::COUPON_REDEMPTION_TIME); // Grab the user account as we should be logged in by now. $user = MS_Model_Member::get_current_member(); $key = self::get_transient_name($user->id, $membership->id); $transient = apply_filters('ms_addon_coupon_model_transient_value', array('id' => $this->id, 'user_id' => $user->id, 'membership_id' => $membership->id, 'discount' => $discount, 'message' => $this->coupon_message)); MS_Factory::set_transient($key, $transient, $time); $this->save(); do_action('ms_addon_coupon_model_save_application', $subscription, $this); }
/** * Returns true only then, when the current user can edit menu items. * * Reasons why it might be denied: * - There are no menus where items can be added to. * - The user is no admin. * * @since 1.0.0 * @return bool */ public static function can_edit_menus() { $Can_Edit_Menus = null; if (null === $Can_Edit_Menus) { $Can_Edit_Menus = false; if (!MS_Plugin::is_network_wide()) { $menus = wp_get_nav_menus(); if (MS_Model_Member::is_admin_user() && !empty($menus)) { $Can_Edit_Menus = true; } } $Can_Edit_Menus = apply_filters('ms_model_pages_can_edit_menus', $Can_Edit_Menus); } return $Can_Edit_Menus; }
/** * Create membership column. * * @since 1.0.0 * * @param MS_Model_Member $member The member object. */ public function column_membership($member) { if (MS_Model_Member::is_admin_user($member->id)) { $html = '<b>' . __('Admin User', MS_TEXT_DOMAIN) . '</b>'; } else { $subscriptions = $member->get_membership_ids(); $visitor = array('id' => 'ms-empty-' . $member->id, 'type' => MS_Helper_Html::TYPE_HTML_TEXT, 'value' => __('(Visitor)'), 'after' => 'Edit', 'class' => 'ms-empty-note'); $list = array('id' => 'ms-memberships-' . $member->id, 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $subscriptions, 'field_options' => self::$memberships, 'multiple' => true, 'class' => 'ms-memberships', 'ajax_data' => array('action' => MS_Controller_Member::AJAX_ACTION_CHANGE_MEMBERSHIPS, 'member' => $member->id)); $html = sprintf('<div class="no-auto-init">%1$s%2$s</div>', MS_Helper_Html::html_element($visitor, true), MS_Helper_Html::html_element($list, true)); } return apply_filters('ms_helper_listtable_member_column_membership', $html, $member, $this); }
public function to_html() { ob_start(); ?> <div class="ms-account-wrapper"> <?php if (MS_Model_Member::is_logged_in()) { ?> <h2> <?php _e('Invoice', MS_TEXT_DOMAIN); ?> </h2> <table> <thead> <tr> <th class="ms-col-invoice-no"><?php _e('Invoice #', MS_TEXT_DOMAIN); ?> </th> <th class="ms-col-invoice-status"><?php _e('Status', MS_TEXT_DOMAIN); ?> </th> <th class="ms-col-invoice-total"><?php printf('%s (%s)', __('Total', MS_TEXT_DOMAIN), MS_Plugin::instance()->settings->currency); ?> </th> <th class="ms-col-invoice-title"><?php _e('Membership', MS_TEXT_DOMAIN); ?> </th> <th class="ms-col-invoice-due"><?php _e('Due date', MS_TEXT_DOMAIN); ?> </th> </tr> </thead> <tbody> <?php foreach ($this->data['invoices'] as $invoice) { $inv_membership = MS_Factory::load('MS_Model_Membership', $invoice->membership_id); $inv_classes = array('ms-invoice-' . $invoice->id, 'ms-subscription-' . $invoice->ms_relationship_id, 'ms-invoice-' . $invoice->status, 'ms-gateway-' . $invoice->gateway_id, 'ms-membership-' . $invoice->membership_id, 'ms-type-' . $inv_membership->type, 'ms-payment-' . $inv_membership->payment_type); ?> <tr class="<?php echo esc_attr(implode(' ', $inv_classes)); ?> "> <td class="ms-col-invoice-no"><?php printf('<a href="%s">%s</a>', get_permalink($invoice->id), $invoice->get_invoice_number()); ?> </td> <td class="ms-col-invoice-status"><?php echo esc_html($invoice->status_text()); ?> </td> <td class="ms-col-invoice-total"><?php echo esc_html(MS_Helper_Billing::format_price($invoice->total)); ?> </td> <td class="ms-col-invoice-title"><?php echo esc_html($inv_membership->name); ?> </td> <td class="ms-col-invoice-due"><?php echo esc_html(MS_Helper_Period::format_date($invoice->due_date, __('F j', MS_TEXT_DOMAIN))); ?> </td> </tr> <?php } ?> </tbody> </table> <?php } else { ?> <?php $redirect = esc_url_raw(add_query_arg(array())); $title = __('Your account', MS_TEXT_DOMAIN); echo do_shortcode("[ms-membership-login redirect='{$redirect}' title='{$title}']"); ?> <?php } ?> </div> <?php $html = ob_get_clean(); $html = apply_filters('ms_compact_code', $html); return $html; }
/** * Tries to auto-detect the currently displayed membership-ID. * * Use this function by calling the filter `ms_detect_membership_id` * * Detection logic: * 1. If a valid preferred value was specified then this value is used. * 2. Examine REQUEST data and look for membership/subscription/invoice. * 3. Check currently logged in user and use the top-priority subscription. * * @since 1.0.1.0 * @param int $preferred The preferred ID is only used if it is a valid ID. * @param bool $no_member_check If set to true the member subscriptions are * not checked, which means only REQUEST data is examined. * @param bool $ignore_system If set to true, then the return value will * never be a system-membership-ID (no auto-assigned membership). * @return int A valid Membership ID or 0 if all tests fail. */ public function autodetect_membership($preferred = 0, $no_member_check = false, $ignore_system = false) { $membership_id = 0; // Check 1: If the preferred value is correct use it. if ($preferred) { $membership = MS_Factory::load('MS_Model_Membership', $preferred); // Only use the membership_id if it's valid and not filtered by ignore_system. if ($membership->is_valid() && $membership->id == $preferred) { if (!$ignore_system || !$membership->is_system()) { $membership_id = $membership->id; } } } // Check 2: Examine the REQUEST parameters to find a valid ID. if (!$membership_id) { if (!$membership_id) { if (isset($_REQUEST['membership_id'])) { $membership_id = $_REQUEST['membership_id']; } elseif (isset($_REQUEST['subscription_id'])) { $sub_id = $_REQUEST['subscription_id']; $subscription = MS_Factory::load('MS_Model_Relationship', $sub_id); $membership_id = $subscription->membership_id; } elseif (isset($_REQUEST['ms_relationship_id'])) { $sub_id = $_REQUEST['ms_relationship_id']; $subscription = MS_Factory::load('MS_Model_Relationship', $sub_id); $membership_id = $subscription->membership_id; } elseif (isset($_REQUEST['invoice_id'])) { $inv_id = $_REQUEST['invoice_id']; $invoice = MS_Factory::load('MS_Model_Invoice', $inv_id); $membership_id = $invoice->membership_id; } $membership_id = intval($membership_id); } // Reset the membership_id if it's invalid or filtered by ignore_system. if ($membership_id) { $membership = MS_Factory::load('MS_Model_Membership', $membership_id); if (!$membership->is_valid()) { $membership_id = 0; } elseif ($membership->id != $membership_id) { $membership_id = 0; } elseif ($ignore_system && $membership->is_system) { $membership_id = 0; } } } // Check 3: Check subscriptions of the current user. if (!$no_member_check && !$membership_id && is_user_logged_in()) { $member = MS_Model_Member::get_current_member(); $subscription = $member->get_subscription('priority'); if ($subscription) { $membership_id = $subscription->membership_id; } // Reset the membership_id if it's invalid or filtered by ignore_system. if ($membership_id) { $membership = MS_Factory::load('MS_Model_Membership', $membership_id); if (!$membership->is_valid()) { $membership_id = 0; } elseif ($membership->id != $membership_id) { $membership_id = 0; } elseif ($ignore_system && $membership->is_system) { $membership_id = 0; } } } return apply_filters('ms_controller_membership_autodetect_membership', $membership_id, $preferred, $no_member_check); }
/** * Auto setup settings. * * Fires after a membership setup is completed. * This hook is executed every time a new membership is created. * * Related Action Hooks: * - ms_controller_membership_setup_completed * * @since 1.0.0 * * @param MS_Model_Membership $membership */ public function auto_setup_settings($membership) { $settings = $this->get_model(); // Create special pages. MS_Model_Pages::create_missing_pages(); $pg_prot_cont = MS_Model_Pages::get_page(MS_Model_Pages::MS_PAGE_PROTECTED_CONTENT); $pg_acco = MS_Model_Pages::get_page(MS_Model_Pages::MS_PAGE_ACCOUNT); $pg_regi = MS_Model_Pages::get_page(MS_Model_Pages::MS_PAGE_REGISTER); $pg_regi_comp = MS_Model_Pages::get_page(MS_Model_Pages::MS_PAGE_REG_COMPLETE); $pg_memb = MS_Model_Pages::get_page(MS_Model_Pages::MS_PAGE_MEMBERSHIPS); // Publish special pages. // Tip: Only pages must be published that are added to the menu. wp_publish_post($pg_acco->ID); if (!$membership->private) { wp_publish_post($pg_memb->ID); wp_publish_post($pg_regi->ID); } // Create new WordPress menu-items. MS_Model_Pages::create_menu(MS_Model_Pages::MS_PAGE_ACCOUNT); if (!$membership->private) { MS_Model_Pages::create_menu(MS_Model_Pages::MS_PAGE_MEMBERSHIPS); MS_Model_Pages::create_menu(MS_Model_Pages::MS_PAGE_REGISTER); } // Enable Membership2. $settings->plugin_enabled = true; $settings->save(); // Enable the "Allow user registration" setting of WordPress MS_Model_Member::allow_registration(); }
public function to_html() { $fields = $this->prepare_fields(); $subscription = $this->data['ms_relationship']; $invoice = $subscription->get_current_invoice(); $member = MS_Model_Member::get_current_member(); $gateway = $this->data['gateway']; // Stripe is using Ajax, so the URL is empty. $action_url = apply_filters('ms_gateway_stripe_view_button_form_action_url', ''); $row_class = 'gateway_' . $gateway->id; if (!$gateway->is_live_mode()) { $row_class .= ' sandbox-mode'; } ob_start(); ?> <form action="<?php echo esc_url($action_url); ?> " method="post"> <?php foreach ($fields as $field) { MS_Helper_Html::html_element($field); } ?> <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" data-key="<?php echo esc_attr($gateway->get_publishable_key()); ?> " data-amount="<?php echo esc_attr(ceil(abs($invoice->total * 100))); //amount in cents ?> " data-name="<?php echo esc_attr(bloginfo('name')); ?> " data-description="<?php echo esc_attr(strip_tags($invoice->short_description)); ?> " data-currency="<?php echo esc_attr($invoice->currency); ?> " data-panel-label="<?php echo esc_attr($gateway->pay_button_url); ?> " data-label="<?php echo esc_attr($gateway->pay_button_url); ?> " data-email="<?php echo esc_attr($member->email); ?> " > </script> </form> <?php $payment_form = apply_filters('ms_gateway_form', ob_get_clean(), $gateway, $invoice, $this); ob_start(); ?> <tr class="<?php echo esc_attr($row_class); ?> "> <td class="ms-buy-now-column" colspan="2"> <?php echo $payment_form; ?> </td> </tr> <?php $html = ob_get_clean(); $html = apply_filters('ms_gateway_button-' . $gateway->id, $html, $this); return $html; }
/** * Checks if the current user can access the specified attachment. * * @since 1.0.0 * @param int $attachment_id * @return bool */ public function can_access_file($attachment_id) { $access = false; if (MS_Model_Member::is_normal_admin()) { return true; } if (!MS_Model_Addon::is_enabled(MS_Addon_Mediafiles::ID)) { /* * Default protection mode: * Protect Attachments based on the parent post. */ $parent_id = get_post_field('post_parent', $attachment_id); if (!$parent_id) { $access = true; } else { $member = MS_Model_Member::get_current_member(); foreach ($member->subscriptions as $subscription) { $membership = $subscription->get_membership(); $access = $membership->has_access_to_post($parent_id); if ($access) { break; } } } } else { /* * Advanced protection mode (via Add-on): * Each Attachment can be protected individually. */ $member = MS_Model_Member::get_current_member(); foreach ($member->subscriptions as $subscription) { $rule = $subscription->get_membership()->get_rule(MS_Rule_Media::RULE_ID); $access = $rule->has_access($attachment_id); if ($access) { break; } } } return apply_filters('ms_rule_media_can_access_file', $access, $attachment_id); }
public function to_html() { ob_start(); ?> <div class="ms-account-wrapper"> <?php if (MS_Model_Member::is_logged_in()) { ?> <h2> <?php _e('Activity', MS_TEXT_DOMAIN); ?> </h2> <table> <thead> <tr> <th class="ms-col-activity-date"><?php _e('Date', MS_TEXT_DOMAIN); ?> </th> <th class="ms-col-activity-title"><?php _e('Activity', MS_TEXT_DOMAIN); ?> </th> </tr> </thead> <tbody> <?php foreach ($this->data['events'] as $event) { $ev_classes = array('ms-activity-topic-' . $event->topic, 'ms-activity-type-' . $event->type, 'ms-membership-' . $event->membership_id); ?> <tr class="<?php echo esc_attr(implode(' ', $ev_classes)); ?> "> <td class="ms-col-activity-date"><?php echo esc_html(MS_Helper_Period::format_date($event->post_modified, __('F j (H:i)', MS_TEXT_DOMAIN))); ?> </td> <td class="ms-col-activity-title"><?php echo esc_html($event->description); ?> </td> </tr> <?php } ?> </tbody> </table> <?php } else { $redirect = esc_url_raw(add_query_arg(array())); $title = __('Your account', MS_TEXT_DOMAIN); echo do_shortcode("[ms-membership-login redirect='{$redirect}' title='{$title}']"); } ?> </div> <?php $html = ob_get_clean(); $html = apply_filters('ms_compact_code', $html); return $html; }
/** * Returns HTML partial that contains the logout form * * @since 1.0.0 * * @return string */ private function logout_form() { if (!MS_Model_Member::is_logged_in()) { return ''; } $member = MS_Model_Member::get_current_member(); extract($this->data); if (empty($redirect_logout)) { $redirect_logout = home_url(); } $yourname = sprintf(__('You are logged in as %s.', MS_TEXT_DOMAIN), ucfirst($member->username)); $html = sprintf('%1$s <a class="login_button" href="%2$s">%3$s</a>', $yourname, wp_logout_url($redirect_logout), __('Logout', MS_TEXT_DOMAIN)); if (!empty($holder)) { $html = sprintf('<%1$s class="%2$s">%3$s</%1$s>', esc_attr($holder), esc_attr($holderclass), $html); } return $html; }
/** * Checks if the current user can access the specified attachment. * * @since 1.0.0 * @param int $attachment_id * @return bool */ public function can_access_file($attachment_id) { $access = false; if (MS_Model_Member::is_normal_admin()) { return true; } /* * Default protection mode: * Protect Attachments based on the parent post. */ $parent_id = get_post_field('post_parent', $attachment_id); if (!$parent_id) { $access = true; } else { $member = MS_Model_Member::get_current_member(); foreach ($member->subscriptions as $subscription) { $membership = $subscription->get_membership(); $access = $membership->has_access_to_post($parent_id); if ($access) { break; } } } return apply_filters('ms_rule_media_can_access_file', $access, $attachment_id); }
/** * Customize the Admin Toolbar. * * Related Action Hooks: * - wp_before_admin_bar_render * * @since 1.0.0 */ public function customize_toolbar() { if (MS_Model_Member::is_admin_user() && MS_Plugin::is_enabled() && !is_network_admin() && MS_Model_Simulate::can_simulate()) { if ($this->simulate->is_simulating()) { $this->add_detail_nodes(); } else { $this->add_test_membership_node(); } } else { if (!MS_Plugin::is_enabled()) { $this->add_unprotected_node(); } } }
/** * Completely whipe all Membership data from Database. * * Note: This function is not used currently... * * @since 1.0.0 */ private static function cleanup_db() { global $wpdb; $sql = array(); $trash_ids = array(); // Delete membership meta-data from users. $users = MS_Model_Member::get_members(); foreach ($users as $user) { $user->delete_all_membership_usermeta(); $user->save(); } // Determine IDs of Membership Pages. $page_types = MS_Model_Pages::get_page_types(); foreach ($page_types as $type => $name) { $page_id = MS_Model_Pages::get_setting($type); $trash_ids[] = $page_id; } /** * Delete all plugin settings. * Settings are saved by classes that extend MS_Model_option */ foreach (MS_Model_Gateway::get_gateways() as $option) { $option->delete(); } MS_Factory::load('MS_Model_Addon')->delete(); MS_Factory::load('MS_Model_Pages')->delete(); MS_Factory::load('MS_Model_Settings')->delete(); /** * Delete transient data * Transient data is saved by classed that extend MS_Model_Transient */ MS_Factory::load('MS_Model_Simulate')->delete(); /** * Delete all plugin content. * Content is saved by classes that extend MS_Model_CustomPostType */ $ms_posttypes = array(MS_Model_Communication::get_post_type(), MS_Model_Event::get_post_type(), MS_Model_Invoice::get_post_type(), MS_Model_Transactionlog::get_post_type(), MS_Model_Membership::get_post_type(), MS_Model_Relationship::get_post_type(), MS_Addon_Coupon_Model::get_post_type(), MS_Addon_Invitation_Model::get_post_type()); foreach ($ms_posttypes as $type) { $sql[] = $wpdb->prepare("DELETE FROM {$wpdb->posts} WHERE post_type = %s;", $type); } // Remove orphaned post-metadata. $sql[] = "\n\t\tDELETE FROM {$wpdb->postmeta}\n\t\tWHERE NOT EXISTS (\n\t\t\tSELECT 1 FROM {$wpdb->posts} tmp WHERE tmp.ID = post_id\n\t\t);\n\t\t"; // Clear all WP transient cache. $sql[] = "\n\t\tDELETE FROM {$wpdb->options}\n\t\tWHERE option_name LIKE '_transient_%';\n\t\t"; foreach ($sql as $s) { $wpdb->query($s); } // Move Membership pages to trash. foreach ($trash_ids as $id) { wp_delete_post($id, true); } // Clear all data from WP Object cache. wp_cache_flush(); // Redirect to the main page. wp_safe_redirect(MS_Controller_Plugin::get_admin_url()); exit; }
/** * Redirect user to account page. * * Only redirect when no previous redirect_to is set or when going to /wp-admin/. * * @since 1.0.0 * * @param string $redirect_to URL to redirect to. * @param string $request URL the user is coming from. * @param object $user Logged user's data. * @return string The redirect url. */ public function login_redirect($redirect_to, $request, $user) { if (!empty($user->ID) && !MS_Model_Member::is_admin_user($user->ID) && (empty($redirect_to) || admin_url() == $redirect_to)) { $redirect_to = MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_ACCOUNT); } return apply_filters('ms_controller_frontend_login_redirect', $redirect_to, $request, $user, $this); }
/** * Verify access to post. * * Verify membership rules hierarchy for specific post or CPT. * * @since 1.0.0 * @api * * @param int $post_id ID of specific post * @return boolean True if has access to current page. Default is false. */ public function has_access_to_post($post_id) { $has_access = null; if (MS_Model_Member::is_normal_admin()) { return true; } if (!empty($post_id)) { $post = get_post($post_id); if ('attachment' === $post->post_type) { $post_id = get_post_field('post_parent', $post_id); } } // If 'has access' is found in the hierarchy, it does have access. $rules = $this->get_rules_hierarchy(); foreach ($rules as $rule) { $rule->prepare_rule($subscription); // url groups have final decision if (MS_Rule_Url::RULE_ID == $rule->rule_type && $rule->has_rule_for_post($post_id)) { $has_access = $rule->has_access($post_id); break; } else { $rule_access = $rule->has_access($post_id); if (null !== $rule_access) { $has_access = $rule_access; } } if ($has_access) { break; } } if (null === $has_access) { // The post is not denied by any rule, so allow access. $has_access = true; } return apply_filters('ms_model_membership_has_access_to_post', $has_access, $this); }
/** * Main entry point: Handles the export action. * * This task will exit the current request as the result will be a download * and no HTML page that is displayed. * * @since 1.0.0 */ public function process() { $data = (object) array(); $data->source_key = self::KEY; $data->source = 'Membership2'; $data->plugin_version = MS_PLUGIN_VERSION; $data->export_time = date('Y-m-d H:i'); $data->notes = array(__('Exported data:', MS_TEXT_DOMAIN), __('- Memberships (without protection rules)', MS_TEXT_DOMAIN), __('- Members (including Stripe/Authorize payment settings)', MS_TEXT_DOMAIN), __('- Subscriptions (link between Members and Memberships)', MS_TEXT_DOMAIN), __('- Invoices', MS_TEXT_DOMAIN)); $data->memberships = array(); // Export the base membership (i.e. the Membership2 settings) $membership = MS_Model_Membership::get_base(); $data->memberships[] = $this->export_membership($membership->id); // Export all memberships. $memberships = MS_Model_Membership::get_memberships(array('post_parent' => 0)); foreach ($memberships as $membership) { $data->memberships[] = $this->export_membership($membership->id); } // Export the members. $members = MS_Model_Member::get_members(); $data->members = array(); foreach ($members as $member) { if (!$member->is_member) { continue; } $data->members[] = $this->export_member($member->id); } // Export plugin settings. $obj = array(); $data->settings = $this->export_settings(); // Export Coupons. $data->coupons = array(); lib2()->net->file_download(json_encode($data), 'membership2-export.json'); }
/** * Returns HTML partial that contains the logout form * * @since 1.0.0 * * @return string */ private function logout_form() { if (!MS_Model_Member::is_logged_in()) { return ''; } $member = MS_Model_Member::get_current_member(); extract($this->data); if (empty($redirect_logout)) { $redirect_logout = MS_Helper_Utility::home_url('/'); } $yourname = sprintf(__('You are logged in as %s.', 'membership2'), ucfirst($member->name)); $yourname = apply_filters('ms_shortcode_logout_message', $yourname, $member); $logout_text = apply_filters('ms_shortcode_logout_link_text', __('Logout', 'membership2'), $member); $redirect_logout = apply_filters('ms_shortcode_logout_redirect', $redirect_logout, $member); $html = sprintf('%1$s <a class="login_button" href="%2$s">%3$s</a>', $yourname, wp_logout_url($redirect_logout), $logout_text); if (!empty($holder)) { $html = sprintf('<%1$s class="%2$s">%3$s</%1$s>', esc_attr($holder), esc_attr($holderclass), $html); } return $html; }
/** * Determines the users country based on his IP address. * * @since 1.0.0 * @internal * * @param string $mode [declared|vat|card|auto] Either the country from user * settings or the auto-detected country. */ protected static function fetch_country($mode = 'declared') { $member = MS_Model_Member::get_current_member(); $country = false; $store_it = false; $non_auto_countries = array('declared', 'vat', 'card'); if (!in_array($mode, $non_auto_countries)) { $mode = 'auto'; } $auto_detect = 'auto' == $mode; $key = 'tax_' . $mode . '_country'; // If no country is stored use the API to determine it. if ($auto_detect) { try { $ip_info = lib3()->net->current_ip(); $data = (object) (array) self::taxamo()->locateGivenIP($ip_info->ip); $country = (object) array('code' => $data->country_code); // Store result in Session, not in DB. $store_it = true; $member = null; } catch (Exception $ex) { MS_Helper_Debug::log('Taxamo error: ' . $ex->getMessage()); } } else { // Try to get the stored country from user-meta or session (for guest) $country = self::get_tax_profile_value($member, $key); } // API did not return a valid resonse, use a dummy value. if (!$country) { $country = (object) array('code' => ''); } // Store result in user-deta or session. if ($store_it && self::set_tax_profile_value($member, $key, $country)) { $member->save(); } $country_names = self::get_country_codes('name'); if ($country->code && isset($country_names[$country->code])) { $country->name = $country_names[$country->code]; } else { $country->name = $country_names['XX']; } return $country; }
/** * Create new WP user. * * @since 1.0.0 * @internal * @throws Exception */ private function create_new_user() { // Check if the WordPress settings allow user registration. if (!MS_Model_Member::can_register()) { throw new Exception(__('Registration is currently not allowed.', 'membership2'), 1); return; } if (is_user_logged_in()) { throw new Exception(__('You cannot register a new account, because you are already logged in.', 'membership2'), 1); return; } $validation_errors = new WP_Error(); $required = array('username' => __('Username', 'membership2'), 'email' => __('Email address', 'membership2'), 'password' => __('Password', 'membership2'), 'password2' => __('Password confirmation', 'membership2')); /** * Filter the required field list to customize the fields that are * mandatory. * * @since 1.0.1.0 * @var array */ $required = apply_filters('ms_model_member_create_user_required_fields', $required); foreach ($required as $field => $message) { if (empty($this->{$field}) && empty($_POST[$field])) { $validation_errors->add($field, sprintf(__('Please ensure that the <span class="ms-bold">%s</span> information is completed.', 'membership2'), $message)); } } if ($this->password != $this->password2) { $validation_errors->add('passmatch', __('Please ensure the passwords match.', 'membership2')); } if (!validate_username($this->username)) { $validation_errors->add('usernamenotvalid', __('The username is not valid, sorry.', 'membership2')); } if (username_exists($this->username)) { $validation_errors->add('usernameexists', __('That username is already taken, sorry.', 'membership2')); } if (!is_email($this->email)) { $validation_errors->add('emailnotvalid', __('The email address is not valid, sorry.', 'membership2')); } if (email_exists($this->email)) { $validation_errors->add('emailexists', __('That email address is already taken, sorry.', 'membership2')); } // Check the multisite Email-Domain limitation for new registrations. if (is_multisite()) { $illegal_names = get_site_option('illegal_names'); $limited_domains = get_site_option('limited_email_domains'); $banned_domains = get_site_option('banned_email_domains'); $email_domain = substr(strrchr($this->email, '@'), 1); if ($illegal_names && is_array($illegal_names)) { if (in_array($this->username, $illegal_names)) { $validation_errors->add('illegalname', __('The username is not valid, sorry.', 'membership2')); } } if ($limited_domains && is_array($limited_domains)) { if (!in_array($email_domain, $limited_domains)) { $validation_errors->add('emaildomain', __('That email domain is not allowed for registration, sorry.', 'membership2')); } } if ($banned_domains && is_array($banned_domains)) { if (in_array($email_domain, $banned_domains)) { $validation_errors->add('emaildomain', __('That email domain is not allowed for registration, sorry.', 'membership2')); } } } $validation_errors = apply_filters('ms_model_membership_create_new_user_validation_errors', $validation_errors); // Compatibility with WangGuard $_POST['user_email'] = $this->email; $user_data = array('user_name' => $this->username, 'orig_username' => $this->username, 'user_email' => $this->email, 'errors' => $validation_errors); $user_data = apply_filters('wpmu_validate_user_signup', $user_data); if (is_wp_error($user_data)) { /* * Some plugins incorrectly return a WP_Error object as result of * the wpmu_validate_user_signup filter. */ $validation_errors = $user_data; } else { $validation_errors = $user_data['errors']; } $errors = $validation_errors->get_error_messages(); if (!empty($errors)) { throw new Exception(implode('<br/>', $errors)); } else { if (!$this->password) { /** * For some reason the user did not provide a password in the * registration form. We help out here by creating a password * for the little bugger and send him a password-reset email. * * So: Generate a STRONG password for the new user. * * Important: This password should be sent to the user via the * Email template "User Account Created" */ $this->password = wp_generate_password(24); $this->password2 = $this->password; } $user_id = wp_create_user($this->username, $this->password, $this->email); if (is_wp_error($user_id)) { $validation_errors->add('userid', $user_id->get_error_message()); throw new Exception(implode('<br/>', $validation_errors->get_error_messages())); } $this->id = $user_id; } do_action('ms_model_member_create_new_user', $this); }
/** * Verify access to the current content. * * @since 1.0.0 * * @param string $id The content id to verify access. * @param bool $admin_has_access Default true: Admin will always have access, * no matter how protection is set up. False will ignore the * admin status and check protection rules normaly. * * @return boolean TRUE if has access, FALSE otherwise. */ public function has_access($id, $admin_has_access = true) { if ($admin_has_access && MS_Model_Member::is_normal_admin()) { return true; } /* * $access will be one of these: * - TRUE .. Access explicitly granted * - FALSE .. Access explicitly denied * - NULL .. Access implicitly allowed (i.e. "not-denied") */ $access = $this->get_rule_value($id); if ($this->is_base_rule) { /* * Base rule .. * - The meaning of TRUE/FALSE is inverted * - NULL is always "allowed" */ $access = !$access; } else { // Apply dripped-content rules if neccessary. if ($access && $this->has_dripped_rules($id)) { if (!empty($this->_subscription_id)) { $subscription = MS_Factory::load('MS_Model_Relationship', $this->_subscription_id); $start_date = $subscription->start_date; } else { $start_date = null; } $avail_date = $this->get_dripped_avail_date($id, $start_date); $now = MS_Helper_Period::current_date(); $access = strtotime($now) >= strtotime($avail_date); } if (MS_Model_Rule::RULE_VALUE_UNDEFINED === $access) { // NULL .. "not-denied" is translated to "allowed" $access = true; } } // At this point $access can either be TRUE or FALSE, not NULL! $access = (bool) $access; return apply_filters('ms_rule_has_access', $access, $id, $this->rule_type, $this); }
/** * Get a simple array of capabilties (e.g. for display in select lists) * * @since 1.0.0 * @global array $menu * * @return array { * @type string $id The id. * @type string $name The name. * } */ public function get_capabilities($args = null) { if (null === $this->_content_array) { $this->_content_array = array(); $member = MS_Model_Member::get_current_member(); $capslist = $member->wp_user->allcaps; $ignored_caps = array('level_10' => 1, 'level_9' => 1, 'level_8' => 1, 'level_7' => 1, 'level_6' => 1, 'level_5' => 1, 'level_4' => 1, 'level_3' => 1, 'level_2' => 1, 'level_1' => 1, 'level_0' => 1, 'administrator' => 1); $capslist = array_diff_assoc($capslist, $ignored_caps); $capslist = array_keys($capslist); /** * Exclude certain capabilities for security reasons. * * @since 1.0.0 * @var array */ $exclude = apply_filters('ms_rule_membercaps_model_exclude', array(MS_Plugin::instance()->controller->capability, 'edit_plugins', 'delete_plugins', 'edit_files', 'edit_users', 'delete_users', 'remove_users', 'promote_users', 'list_users')); $capslist = array_diff($capslist, $exclude); $this->_content_array = array_combine($capslist, $capslist); // Make sure the rule_value only contains valid items. $rule_value = array_intersect_key($this->rule_value, $this->_content_array); $this->rule_value = lib2()->array->get($rule_value); // If not visitor membership, just show Membership2 if (!$this->get_membership()->is_base()) { $this->_content_array = array_intersect_key($this->_content_array, $this->rule_value); } $this->_content_array = apply_filters('ms_rule_membercaps_model_get_content_array', $this->_content_array, $this); } $contents = $this->_content_array; // Search the shortcode-tag... if (!empty($args['s'])) { foreach ($contents as $key => $name) { if (false === stripos($name, $args['s'])) { unset($contents[$key]); } } } $filter = self::get_exclude_include($args); if (is_array($filter->include)) { $contents = array_intersect($contents, $filter->include); } elseif (is_array($filter->exclude)) { $contents = array_diff($contents, $filter->exclude); } // Pagination if (!empty($args['posts_per_page'])) { $total = $args['posts_per_page']; $offset = !empty($args['offset']) ? $args['offset'] : 0; $contents = array_slice($contents, $offset, $total); } return $contents; }
/** * Prepare the fields that are displayed in the form. * * @since 1.0.1.0 * @return array */ protected function get_fields() { $comm = $this->data['comm']; $membership = false; $membership_id = 0; if (isset($this->data['membership'])) { $membership = $this->data['membership']; if ($membership instanceof MS_Model_Membership) { $membership_id = $membership->id; } else { $membership = false; } } lib2()->array->equip($comm, 'type', 'enabled', 'period', 'subject', 'description', 'cc_enabled', 'cc_email'); $action = MS_Controller_Communication::AJAX_ACTION_UPDATE_COMM; $nonce = wp_create_nonce($action); $comm_titles = MS_Model_Communication::get_communication_type_titles($membership); $key_active = __('Send Email', MS_TEXT_DOMAIN); $key_inactive = __('No Email', MS_TEXT_DOMAIN); $key_skip = __('Use default template', MS_TEXT_DOMAIN); $titles = array($key_active => array(), $key_inactive => array(), $key_skip => array()); foreach ($comm_titles as $type => $title) { $tmp_comm = MS_Model_Communication::get_communication($type, $membership, true); if ($membership && !$tmp_comm->override) { $titles[$key_skip][$type] = $title; } elseif ($tmp_comm->enabled) { $titles[$key_active][$type] = $title; } else { $titles[$key_inactive][$type] = $title; } } $fields = array('comm_type' => array('id' => 'comm_type', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $comm->type, 'field_options' => $titles), 'switch_comm_type' => array('id' => 'switch_comm_type', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Load Template', MS_TEXT_DOMAIN)), 'override' => array('id' => 'override', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'value' => $comm->override, 'before' => __('Use default template', MS_TEXT_DOMAIN), 'after' => __('Define custom template', MS_TEXT_DOMAIN), 'wrapper_class' => 'ms-block ms-tcenter', 'class' => 'override-slider', 'ajax_data' => array('type' => $comm->type, 'field' => 'override', 'action' => $action, '_wpnonce' => $nonce, 'membership_id' => $membership_id)), 'membership_id' => array('id' => 'membership_id', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership_id), 'type' => array('id' => 'type', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $comm->type), 'enabled' => array('id' => 'enabled', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'value' => $comm->enabled, 'class' => 'state-slider', 'before' => ' <i class="wpmui-fa wpmui-fa-ban"></i>', 'after' => '<i class="wpmui-fa wpmui-fa-envelope"></i> ', 'ajax_data' => array('type' => $comm->type, 'field' => 'enabled', 'action' => $action, '_wpnonce' => $nonce, 'membership_id' => $membership_id)), 'period_unit' => array('id' => 'period_unit', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'title' => __('Period after/before', MS_TEXT_DOMAIN), 'value' => $comm->period['period_unit']), 'period_type' => array('id' => 'period_type', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $comm->period['period_type'], 'field_options' => MS_Helper_Period::get_period_types('plural')), 'subject' => array('id' => 'subject', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'title' => apply_filters('ms_translation_flag', __('Message Subject', MS_TEXT_DOMAIN), 'communication-subject'), 'value' => $comm->subject, 'class' => 'ms-comm-subject widefat'), 'email_body' => array('id' => 'email_body', 'type' => MS_Helper_Html::INPUT_TYPE_WP_EDITOR, 'title' => apply_filters('ms_translation_flag', '', 'communication-body'), 'value' => $comm->description, 'field_options' => array('media_buttons' => false, 'editor_class' => 'wpmui-ajax-update')), 'cc_enabled' => array('id' => 'cc_enabled', 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'title' => __('Send copy to Administrator', MS_TEXT_DOMAIN), 'value' => $comm->cc_enabled, 'class' => 'ms-inline-block'), 'cc_email' => array('id' => 'cc_email', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $comm->cc_email, 'field_options' => MS_Model_Member::get_admin_user_emails()), 'save_email' => array('id' => 'save_email', 'value' => __('Save Changes', MS_TEXT_DOMAIN), 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT), 'action' => array('id' => 'action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'save_comm'), 'nonce' => array('id' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce('save_comm')), 'load_action' => array('id' => 'load_action', 'name' => 'action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 'load_action'), 'load_nonce' => array('id' => '_wpnonce1', 'name' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce('load_action'))); if (!$membership instanceof MS_Model_Membership) { unset($fields['override']); unset($fields['membership_id']); } return apply_filters('ms_view_settings_prepare_email_fields', $fields); }
/** * This list has no views. * * @since 1.0.2.0 * * @return array */ public function get_views() { $views = array(); $args = array(); $count = 0; $views['label'] = array('label' => __('Subscription Status:', 'membership2')); if (empty($_REQUEST['membership_id'])) { // All users $url = esc_url_raw(add_query_arg('status', 'all')); $views['all'] = array('url' => $url, 'label' => __('All users', 'membership2')); } else { $args['membership_id'] = $_REQUEST['membership_id']; } // Active, Trial, Cancelled $url = esc_url_raw(remove_query_arg('status')); $args['subscription_status'] = MS_Model_Relationship::STATUS_ACTIVE; $count = MS_Model_Member::get_members_count($args); $views['active'] = array('url' => $url, 'label' => __('Active subscription', 'membership2'), 'count' => $count); // Cancelled $url = esc_url_raw(add_query_arg('status', MS_Model_Relationship::STATUS_CANCELED)); $args['subscription_status'] = MS_Model_Relationship::STATUS_CANCELED; $count = MS_Model_Member::get_members_count($args); $views['cancelled'] = array('url' => $url, 'label' => __('Cancelled', 'membership2'), 'count' => $count); // Trial if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_TRIAL)) { $url = esc_url_raw(add_query_arg('status', MS_Model_Relationship::STATUS_TRIAL)); $args['subscription_status'] = MS_Model_Relationship::STATUS_TRIAL; $count = MS_Model_Member::get_members_count($args); $views['trial'] = array('url' => $url, 'label' => __('Trial', 'membership2'), 'count' => $count); } // Expired, Trial-Expired $url = esc_url_raw(add_query_arg('status', 'expired')); $args['subscription_status'] = 'expired'; $count = MS_Model_Member::get_members_count($args); $views['expired'] = array('url' => $url, 'label' => __('Expired', 'membership2'), 'count' => $count); return $views; }
/** * Verify if current user can perform management actions. * * @since 1.0.0 * * @return boolean True if can, false otherwise. */ public function is_admin_user() { $is_admin_user = MS_Model_Member::is_admin_user(); return apply_filters('ms_controller_is_admin_user', $is_admin_user); }
/** * Returns a URL to trigger the specified membership action. * * The URL can be used in a link or a form with only a submit button. * * @since 1.0.0 * @param string $action * @return string The URL. */ protected function get_action_url($membership, $action, $step) { if (empty($this->data['member'])) { $member = MS_Model_Member::get_current_member(); } else { $member = $this->data['member']; } if (is_numeric($membership)) { $membership = MS_Factory::load('MS_Model_Membership', $membership); } $membership->_move_from = $member->cancel_ids_on_subscription($membership->id); $fields = $this->prepare_fields($membership->id, $action, $step, $membership->_move_from); if (is_user_logged_in()) { $current = MS_Model_Pages::MS_PAGE_MEMBERSHIPS; } else { $current = MS_Model_Pages::MS_PAGE_REGISTER; } $url = MS_Model_Pages::get_page_url($current); if ($action == MS_Helper_Membership::MEMBERSHIP_ACTION_SIGNUP) { // Only add the membership_id to the URL. $url = esc_url_raw(add_query_arg('membership_id', $membership->id, $url)); } else { $url = esc_url_raw(add_query_arg('_wpnonce', wp_create_nonce($action), $url)); foreach ($fields as $field) { $url = esc_url_raw(add_query_arg($field['id'], $field['value'], $url)); } } return apply_filters('ms_view_shortcode_membershipsignup_action_url', $url, $action, $membership, $this); }