public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_CptItem::RULE_ID); $rule_listtable = new MS_Rule_CptItem_ListTable($rule); $rule_listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Choose Custom Post Types you want to protect', MS_TEXT_DOMAIN), 'desc' => ''), MS_Rule_CptItem::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Posts', MS_TEXT_DOMAIN)); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_CptItem::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
/** * Initialize the rule object. * * @since 4.6 */ protected function init() { global $wpdb; $this->filename = basename(__FILE__); // 'pc_subscription' rule. $this->add_rule('pc_subscription', __('For Members (Membership 2)', PO_LANG), __('Only shows the PopUp if the user has subscribed to a certain Membership (Membership2 plugin).', PO_LANG), 'pc_unsubscription', 25); // 'pc_unsubscription' rule. $this->add_rule('pc_unsubscription', __('For Non-Members (Membership 2)', PO_LANG), __('Only shows the PopUp if the user has not yet subscribed to a certain Membership (Membership2 plugin).', PO_LANG), 'pc_subscription', 25); // -- Initialize rule. /** * Note we're not using the M2 API yet, because it was introduced only * a few releases back and some people that use older version of M2/PC * will have problems if we do. * * @todo replace with official API function anytime in 2016 * * $this->is_active = false; * if ( apply_filters( 'ms_active', false ) ) { * $this->is_active = true; * $this->memberships = MS_Plugin::$api->list_memberships( true ); * } * */ $this->is_active = class_exists('MS_Plugin'); if (!$this->is_active) { return; } $args = array('include_base' => false, 'include_guest' => true); $list = MS_Model_Membership::get_memberships($args); $this->memberships = $list; }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_Adminside::RULE_ID); $rule_listtable = new MS_Rule_Adminside_ListTable($rule); $rule_listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Protect Admin Side pages', 'membership2'), 'desc' => array(__('Note that WordPress also restricts access to pages before Content Protection is applied.', 'membership2'), __('Tip: Combine with the <b>User Role</b> rules to grant your members additional permission if required!', 'membership2'))), MS_Rule_Adminside::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Adminside::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_Page::RULE_ID); $rule_listtable = new MS_Rule_Page_ListTable($rule); $rule_listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Apply protection to Pages and and grant access to members', 'membership2'), 'desc' => __('All pages that do not have Content Protection applied are visible to Everyone', 'membership2')), MS_Rule_Page::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Pages', 'membership2')); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Page::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_MemberRoles::RULE_ID); $rule_listtable = new MS_Rule_MemberRoles_ListTable($rule); $rule_listtable->prepare_items(); $header_data['title'] = __('Assign WordPress User Roles to your Members', MS_TEXT_DOMAIN); $header_data['desc'] = array(__('When assigning a Membership to any role, then this role will be added to all members of that Membership. You can even assign multiple roles to a single Membership.', MS_TEXT_DOMAIN), __('For security reasons the Administrator role cannot be assigned to a Membership.', MS_TEXT_DOMAIN)); $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_MemberRoles::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Capability', MS_TEXT_DOMAIN)); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MemberRoles::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_Content::RULE_ID); // This fixes the list-title generated by MS_Helper_ListTable_Rule. unset($_GET['status']); $rule_listtable = new MS_Rule_Content_ListTable($rule); $rule_listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Comments & More Tag', MS_TEXT_DOMAIN), 'desc' => __('Decide how to protect Comments and More Tag contents.', MS_TEXT_DOMAIN)), MS_Rule_Content::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Pages', MS_TEXT_DOMAIN)); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Content::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_Category::RULE_ID); $rule_listtable = new MS_Rule_Category_ListTable($rule); $rule_listtable->prepare_items(); $header_data = array(); $header_data['title'] = __('Choose which Categories you want to protect', 'membership2'); $header_data['desc'] = ''; $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_Category::RULE_ID, $this); ob_start(); ?> <div class="ms-settings "> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Categories', 'membership2'), 'search-cat'); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Category::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_MemberCaps::RULE_ID); $rule_listtable = new MS_Rule_MemberCaps_ListTable($rule); $rule_listtable->prepare_items(); $header_data = array(); $header_data['title'] = __('Assign WordPress Capabilities to your Members', 'membership2'); $header_data['desc'] = array(__('Fine-tune member permissions by assigning certain Capabilities to each Membership. All Members of that Membership are granted the specified Capabilities.', 'membership2'), __('Important: All users that are not inside these Memberships will be striped of any Protected Capability!', 'membership2'), __('You should only use these rules if you know what you are doing! Granting the wrong capabilities makes your website prone to abuse. For a bit of security we already removed the most critical Capabilities from this list.', 'membership2')); $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_MemberCaps::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $rule_listtable->views(); $rule_listtable->search_box(__('Capability', 'membership2')); ?> <form action="" method="post"> <?php $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MemberCaps::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_ReplaceMenu::RULE_ID); // This fixes the list-title generated by MS_Helper_ListTable_Rule. unset($_GET['status']); $listtable = new MS_Rule_ReplaceMenu_ListTable($rule); $listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Replace Menus', 'membership2'), 'desc' => __('Replace or protect WordPress menus.', 'membership2')), MS_Rule_ReplaceMenu::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $listtable->views(); $listtable->search_box(); ?> <form action="" method="post"> <?php $listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_ReplaceMenu::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
/** * Prepares fields for the edit form. * * @since 1.0.1.0 * @return array */ protected function get_fields() { $args = array('include_guest' => false); $memberships = MS_Model_Membership::get_memberships($args); $membership = $this->data['membership']; $action = MS_Controller_Membership::AJAX_ACTION_UPDATE_MEMBERSHIP; $nonce = wp_create_nonce($action); $fields = array(); /* * The value of "allow_val" is negated, because the radio-slider is * reversed. So allow_val == false means that upgrading is allowed. * * This is just a UI tweak, the function ->update_allowed() returns true * when upgrading is allowed. */ $list = array(); $list['guest'] = array('allow' => __('Users without Membership can subscribe', 'membership2'), 'allow_val' => !$membership->update_allowed('guest')); foreach ($memberships as $item) { if ($item->id == $membership->id) { continue; } $list[$item->id] = array('allow' => sprintf(__('Members of %s can subscribe', 'membership2'), $item->get_name_tag()), 'allow_val' => !$membership->update_allowed($item->id)); if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MULTI_MEMBERSHIPS)) { $list[$item->id]['replace'] = sprintf(__('Cancel %s on subscription', 'membership2'), $item->get_name_tag()); $list[$item->id]['replace_val'] = $membership->update_replaces($item->id); } } foreach ($list as $id => $data) { $fields[] = array('id' => 'deny_update[' . $id . ']', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => $data['allow'], 'value' => $data['allow_val'], 'before' => __('Allow', 'membership2'), 'after' => __('Deny', 'membership2'), 'class' => 'reverse', 'wrapper_class' => 'ms-block inline-label ms-allow', 'ajax_data' => array(1)); if (!empty($data['replace'])) { if (MS_Addon_Prorate::is_active()) { $after_label = __('Cancel and Pro-Rate', 'membership2'); } else { $after_label = __('Cancel', 'membership2'); } $fields[] = array('id' => 'replace_update[' . $id . ']', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => $data['replace'], 'value' => $data['replace_val'], 'before' => __('Keep', 'membership2'), 'after' => $after_label, 'class' => 'reverse', 'wrapper_class' => 'ms-block inline-label ms-update-replace', 'ajax_data' => array(1)); } $fields[] = array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR); } foreach ($fields as $key => $field) { if (!empty($field['ajax_data'])) { if (!empty($field['ajax_data']['action'])) { continue; } if (!isset($fields[$key]['ajax_data']['field'])) { $fields[$key]['ajax_data']['field'] = $fields[$key]['id']; } $fields[$key]['ajax_data']['_wpnonce'] = $nonce; $fields[$key]['ajax_data']['action'] = $action; $fields[$key]['ajax_data']['membership_id'] = $membership->id; } } return $fields; }
public function prepare_items() { $this->_column_headers = array($this->get_columns(), $this->get_hidden_columns(), $this->get_sortable_columns()); $args = array(); if (!empty($_REQUEST['orderby']) && !empty($_REQUEST['order'])) { $args['orderby'] = $_REQUEST['orderby']; $args['order'] = $_REQUEST['order']; } // Prepare order by statement. if (!empty($args['orderby']) && property_exists('MS_Model_Membership', $args['orderby'])) { $args['meta_key'] = $args['orderby']; $args['orderby'] = 'meta_value'; } $this->items = apply_filters('membership_helper_listtable_membership_items', MS_Model_Membership::get_memberships($args)); }
public function column_membership($item) { $html = ''; $is_any = true; foreach ($item->membership_id as $id) { if (MS_Model_Membership::is_valid_membership($id)) { $is_any = false; $membership = MS_Factory::load('MS_Model_Membership', $id); $html .= sprintf('<span class="ms-bold">%s</span><br />', $membership->name); } } if ($is_any) { $html = sprintf('<span class="ms-low">%s</span>', __('Any', 'membership2')); } return $html; }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Rule_Url::RULE_ID); $listtable = new MS_Rule_Url_ListTable($rule); $listtable->prepare_items(); if ($listtable->list_shows_base_items()) { $add_fields = array('url' => array('id' => 'url_value', 'title' => __('Add new URL Address', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'class' => 'ms-text-medium'), 'url_add' => array('id' => 'url_add', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Protect this URL', 'membership2'), 'button_type' => 'button'), 'url_action' => array('name' => 'rule_action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => MS_Rule_Url::ACTION_ADD), 'url_nonce' => array('name' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce(MS_Rule_Url::ACTION_ADD))); } $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('URL Restriction', 'membership2'), 'desc' => array(__('Specify URLs that you want to protect.', 'membership2'), __('e.g. <b>example.com/protectme/</b> will protect all URLs that contain <b>example.com/protectme/</b>, including any child page.', 'membership2')), 'class' => ''), MS_Rule_Url::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); ?> <form action="" method="post"> <?php if ($listtable->list_shows_base_items()) { foreach ($add_fields as $field) { MS_Helper_Html::html_element($field); } } ?> </form> <?php $listtable->views(); $listtable->search_box(); ?> <form action="" method="post"> <?php $listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Url::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
/** * Display a filter to select the current membership * * @since 1.0.0 */ public function membership_filter() { $memberships = MS_Model_Membership::get_membership_names(array('active' => true, 'include_guest' => false)); $url = esc_url_raw(remove_query_arg(array('membership_id', 'paged'))); $links = array(); $links['all'] = array('label' => __('All', MS_TEXT_DOMAIN), 'url' => $url); foreach ($memberships as $id => $name) { if (empty($name)) { $name = __('(No Name)', MS_TEXT_DOMAIN); } $filter_url = esc_url_raw(add_query_arg(array('membership_id' => $id), $url)); $links['ms-' . $id] = array('label' => esc_html($name), 'url' => $filter_url); } ?> <div class="wp-filter"> <ul class="filter-links"> <?php foreach ($links as $key => $item) { $is_current = MS_Helper_Utility::is_current_url($item['url']); $class = $is_current ? 'current' : ''; ?> <li> <a href="<?php echo esc_url($item['url']); ?> " class="<?php echo esc_attr($class); ?> "> <?php echo esc_html($item['label']); ?> </a> </li> <?php } ?> </ul> </div> <?php }
public function to_html() { $membership = MS_Model_Membership::get_base(); $menus = $membership->get_rule(MS_Rule_MenuItem::RULE_ID)->get_menu_array(); $menu_ids = array_keys($menus); $menu_id = reset($menu_ids); if (isset($_REQUEST['menu_id'])) { $menu_id = $_REQUEST['menu_id']; } // This fixes the list-title generated by MS_Helper_ListTable_Rule. unset($_GET['status']); $rule_menu = $membership->get_rule(MS_Rule_MenuItem::RULE_ID); $rule_listtable = new MS_Rule_MenuItem_ListTable($rule_menu, $menus, $menu_id); $fields['rule_menu'] = array('id' => 'rule_menu', 'name' => 'rule', 'value' => 'menu', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN); $menu_url = esc_url_raw(add_query_arg(array('menu_id' => $menu_id))); $rule_listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Menu Items', MS_TEXT_DOMAIN), 'desc' => __('Protect individual menu items.', MS_TEXT_DOMAIN)), MS_Rule_MenuItem::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); ?> <form id="ms-menu-form" method="post" action="<?php echo '' . $menu_url; ?> "> <?php MS_Helper_Html::html_element($fields['rule_menu']); $rule_listtable->views(); $rule_listtable->display(); do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MenuItem::RULE_ID, $this); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
/** * Prepares fields for the edit form. * * @since 1.0.1.0 * @return array */ protected function get_fields() { $membership = $this->data['membership']; $action = MS_Controller_Membership::AJAX_ACTION_UPDATE_MEMBERSHIP; $nonce = wp_create_nonce($action); $fields = array(); // Prepare the form fields. $fields['name'] = array('id' => 'name', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'title' => apply_filters('ms_translation_flag', __('Name:', MS_TEXT_DOMAIN), 'membership-name'), 'value' => $membership->name, 'ajax_data' => array(1)); $fields['description'] = array('id' => 'description', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT_AREA, 'title' => apply_filters('ms_translation_flag', __('Description:', MS_TEXT_DOMAIN), 'membership-name'), 'value' => $membership->description, 'ajax_data' => array(1)); $fields['active'] = array('id' => 'active', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This membership is active', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-active', 'value' => $membership->active, 'ajax_data' => array(1)); $fields['public'] = array('id' => 'public', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This membership is public', MS_TEXT_DOMAIN), 'desc' => __('Users can see it listed on your site and can register for it', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-public', 'value' => $membership->public, 'ajax_data' => array(1)); $fields['paid'] = array('id' => 'is_paid', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This is a paid membership', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-paid', 'value' => $membership->is_paid, 'ajax_data' => array(1)); $priority_list = array(); $args = array('include_guest' => 0); $count = MS_Model_Membership::get_membership_count($args); for ($i = 1; $i <= $count; $i += 1) { $priority_list[$i] = $i; } $priority_list[$membership->priority] = $membership->priority; $fields['priority'] = array('id' => 'priority', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'title' => __('Membership order', MS_TEXT_DOMAIN), 'desc' => __('This defines the display order on the Membership Page.', MS_TEXT_DOMAIN), 'class' => 'ms-priority', 'before' => __('Order', MS_TEXT_DOMAIN), 'value' => $membership->priority, 'field_options' => $priority_list, 'ajax_data' => array(1)); if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MULTI_MEMBERSHIPS)) { $fields['priority']['desc'] .= '<br>' . __('It also controlls which Protection Message is used in case a member has multiple memberships (the lowest value wins)', MS_TEXT_DOMAIN); } foreach ($fields as $key => $field) { if (!empty($field['ajax_data'])) { if (!empty($field['ajax_data']['action'])) { continue; } if (!isset($fields[$key]['ajax_data']['field'])) { $fields[$key]['ajax_data']['field'] = $fields[$key]['id']; } $fields[$key]['ajax_data']['_wpnonce'] = $nonce; $fields[$key]['ajax_data']['action'] = $action; $fields[$key]['ajax_data']['membership_id'] = $membership->id; } } return $fields; }
public function to_html() { $membership = MS_Model_Membership::get_base(); $rule = $membership->get_rule(MS_Addon_Bbpress_Rule::RULE_ID); $listtable = new MS_Addon_Bbpress_Rule_Listtable($rule); $listtable->prepare_items(); $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('bbPress', MS_TEXT_DOMAIN), 'desc' => __('Protect the following bbPress content to members only.', MS_TEXT_DOMAIN)), MS_Addon_Bbpress_Rule::RULE_ID, $this); ob_start(); ?> <div class="ms-settings"> <?php MS_Helper_Html::settings_tab_header($header_data); $listtable->views(); ?> <form action="" method="post"> <?php $listtable->display(); ?> </form> </div> <?php MS_Helper_Html::settings_footer(); return ob_get_clean(); }
/** * Returns a list of post_ids to exclude or include to fullfil the specified * Membership/Status filter. * * @since 1.0.0 * @param array $args * @return array { * List of post_ids to exclude or include * * array $include * array $exclude * } */ public function get_exclude_include($args) { // Filter for Membership and Protection status via 'exclude'/'include' $include = array(); $exclude = array(); $base_rule = $this; $child_rule = $this; if (!$this->is_base_rule) { $base_rule = MS_Model_Membership::get_base()->get_rule($this->rule_type); } if (!empty($args['membership_id'])) { $child_membership = MS_Factory::load('MS_Model_Membership', $args['membership_id']); $child_rule = $child_membership->get_rule($this->rule_type); } $base_items = array_keys($base_rule->rule_value, true); $child_items = array_keys($child_rule->rule_value, true); $status = !empty($args['rule_status']) ? $args['rule_status'] : null; switch ($status) { case MS_Model_Rule::FILTER_PROTECTED: if (!empty($args['membership_id'])) { $include = array_intersect($child_items, $base_items); } else { $include = $child_items; } if (empty($include)) { $include = array(-1); } break; case MS_Model_Rule::FILTER_NOT_PROTECTED: if (!empty($args['membership_id'])) { $include = array_diff($base_items, $child_items); if (empty($include) && empty($exclude)) { $include = array(-1); } } else { $exclude = $child_items; if (empty($include) && empty($exclude)) { $exclude = array(-1); } } break; default: // If not visitor membership, just show all Membership2 if (!$child_rule->is_base_rule) { $include = $base_items; } break; } /** * Allow rules/Add-ons to modify the exclude/include list. * * @since 1.0.0 */ $exclude = array_unique(apply_filters('ms_rule_exclude_items-' . $this->rule_type, $exclude, $args)); $include = array_unique(apply_filters('ms_rule_include_items-' . $this->rule_type, $include, $args)); $res = (object) array('include' => null, 'exclude' => null); if (!empty($include)) { $res->include = $include; } elseif (!empty($exclude)) { $res->exclude = $exclude; } elseif (!empty($args['membership_id'])) { $res->include = array(-1); } return $res; }
/** * Processes a form submit and changes the rule values, if valid form data * is found. * * @since 1.0.0 */ private function process_form() { $action = false; if (isset($_POST['rule_action'])) { $action = $_POST['rule_action']; if (!$this->verify_nonce($action)) { $action = false; } } elseif (isset($_GET['rule_action'])) { $action = $_GET['rule_action']; if (!$this->verify_nonce($action, 'GET')) { $action = false; } } if (empty($action)) { return; } $redirect = false; switch ($action) { case self::ACTION_ADD: lib3()->array->strip_slashes($_POST, 'url_value'); $url = $_POST['url_value']; $base = MS_Model_Membership::get_base(); $rule = $base->get_rule(self::RULE_ID); $rule->add_url($url); $base->set_rule(self::RULE_ID, $rule); $base->save(); $redirect = true; break; case self::ACTION_DELETE: $id = $_REQUEST['item']; $base = MS_Model_Membership::get_base(); $rule = $base->get_rule(self::RULE_ID); $rule->delete_url($id); $base->set_rule(self::RULE_ID, $rule); $base->save(); $redirect = true; break; } if ($redirect) { $target = esc_url_raw(remove_query_arg(array('_wpnonce', 'item', 'rule_action'))); wp_safe_redirect($target); exit; } }
/** * Bulk actions options. * * @since 1.0.0 * * @param array { * @type string $action The action name. * @type mixed $desciption The action description. * } */ public function get_bulk_actions() { $protect_key = __('Add Membership', MS_TEXT_DOMAIN); $unprotect_key = __('Drop Membership', MS_TEXT_DOMAIN); $bulk_actions = array('drop-all' => __('Drop all Memberships', MS_TEXT_DOMAIN), $protect_key => array(), $unprotect_key => array()); $args = array('include_guest' => 0); $memberships = MS_Model_Membership::get_membership_names($args); $txt_add = __('Add: %s', MS_TEXT_DOMAIN); $txt_rem = __('Drop: %s', MS_TEXT_DOMAIN); foreach ($memberships as $id => $name) { $bulk_actions[$protect_key]['add-' . $id] = sprintf($txt_add, $name); $bulk_actions[$unprotect_key]['drop-' . $id] = sprintf($txt_rem, $name); } return apply_filters('ms_helper_listtable_member_get_bulk_actions', $bulk_actions, $this); }
/** * Adds a special membership that represents the search index. * * @since 1.0.1.0 */ protected function create_membership() { $this->membership = MS_Model_Membership::_get_system_membership(self::MEMBERSHIP_TYPE, true); }
/** * 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 a list of supported payment types. * * @since 1.0.0 * @return array Payment types, index is the type-key / value the label. */ public function supported_payment_types() { static $Payment_Types = array(); if (!isset($Payment_Types[$this->id])) { $Payment_Types[$this->id] = MS_Model_Membership::get_payment_types(); foreach ($this->unsupported_payment_types as $remove) { unset($Payment_Types[$this->id][$remove]); } } return $Payment_Types[$this->id]; }
/** * Get available tabs for Membership2 page. * * @since 1.0.0 * * @return array The tabs configuration. */ public function get_edit_tabs() { static $Tabs = null; if (null === $Tabs) { $membership = $this->load_membership(); $args = array('include_guest' => false); $count = MS_Model_Membership::get_membership_count($args); $Tabs = array(self::TAB_DETAILS => array('title' => __('Details', 'membership2')), self::TAB_TYPE => array('title' => __('Membership Type', 'membership2')), self::TAB_PAYMENT => array('title' => __('Payment options', 'membership2')), self::TAB_UPGRADE => array('title' => __('Upgrade paths', 'membership2')), self::TAB_MESSAGES => array('title' => __('Protection Messages', 'membership2')), self::TAB_EMAILS => array('title' => __('Automated Email Responses', 'membership2'))); if ($membership->is_system()) { unset($Tabs[self::TAB_TYPE]); unset($Tabs[self::TAB_PAYMENT]); unset($Tabs[self::TAB_EMAILS]); unset($Tabs[self::TAB_UPGRADE]); } elseif ($membership->is_free) { $Tabs[self::TAB_PAYMENT]['title'] = __('Access options', 'membership2'); } if ($count < 2) { unset($Tabs[self::TAB_UPGRADE]); } // Allow Add-ons to add or remove rule tabs $Tabs = apply_filters('ms_controller_membership_tabs', $Tabs); foreach ($Tabs as $key => $tab) { if (!empty($Tabs['key']['url'])) { continue; } $url = sprintf('%1$s?page=%2$s&step=%3$s&tab=%4$s&membership_id=%5$s', admin_url('admin.php'), esc_attr($_REQUEST['page']), MS_Controller_Membership::STEP_EDIT, $key, $membership->id); $Tabs[$key]['url'] = $url; } } return $Tabs; }
/** * Prepare the HTML fields that can be displayed * * @since 1.0.0 * * @return array */ protected function prepare_fields($data) { // List of known Membership types; used to display the nice-name $ms_types = MS_Model_Membership::get_types(); $ms_paytypes = MS_Model_Membership::get_payment_types(); // Prepare the "Memberships" table $memberships = array(array(__('Membership name', 'membership2'), __('Membership Type', 'membership2'), __('Payment Type', 'membership2'), __('Description', 'membership2'))); foreach ($data->memberships as $item) { if (!isset($ms_types[$item->type])) { $item->type = MS_Model_Membership::TYPE_STANDARD; } switch ($item->pay_type) { case 'recurring': $payment_type = MS_Model_Membership::PAYMENT_TYPE_RECURRING; break; case 'finite': $payment_type = MS_Model_Membership::PAYMENT_TYPE_FINITE; break; case 'date': $payment_type = MS_Model_Membership::PAYMENT_TYPE_DATE_RANGE; break; default: $payment_type = MS_Model_Membership::PAYMENT_TYPE_PERMANENT; break; } $memberships[] = array($item->name, $ms_types[$item->type], $ms_paytypes[$payment_type], $item->description); } // Prepare the "Members" table $members = array(array(__('Username', 'membership2'), __('Email', 'membership2'), __('Subscriptions', 'membership2'), __('Invoices', 'membership2'))); foreach ($data->members as $item) { $inv_count = 0; if (isset($item->subscriptions) && is_array($item->subscriptions)) { foreach ($item->subscriptions as $registration) { $inv_count += count($registration->invoices); } } $members[] = array($item->username, $item->email, count($item->subscriptions), $inv_count); } $settings = array(); foreach ($data->settings as $setting => $value) { switch ($setting) { case 'addons': $model = MS_Factory::load('MS_Model_Addon'); $list = $model->get_addon_list(); $code = ''; foreach ($value as $addon => $state) { if ($state) { $code .= __('Activate: ', 'membership2'); } else { $code .= __('Dectivate: ', 'membership2'); } $code .= $list[$addon]->name . '<br/>'; } $settings[] = array(__('Add-Ons', 'membership2'), $code); break; } } if (empty($settings)) { $settings[] = array('', __('(No settings are changed)', 'membership2')); } // Prepare the return value. $fields = array(); // Export-Notes $notes = ''; if (isset($data->notes)) { if (is_scalar($data->notes)) { $notes = array($data->notes); } $in_sub = false; $notes = '<ul class="ms-import-notes">'; foreach ($data->notes as $line => $text) { $is_sub = strpos($text, '- ') === 0; if ($in_sub != $is_sub) { $in_sub = $is_sub; if ($is_sub) { $notes .= '<ul>'; } else { $notes .= '</ul>'; } } if ($in_sub) { $text = substr($text, 2); } $notes .= '<li>' . $text; } $notes .= '</ul>'; } $fields['details'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => array(array(__('Data source', 'membership2'), $data->source . '   <small>' . sprintf(__('exported on %1$s', 'membership2'), $data->export_time) . '</small>'), array(__('Content', 'membership2'), sprintf(_n('%1$s Membership', '%1$s Memberships', count($data->memberships), 'membership2'), '<b>' . count($data->memberships) . '</b>') . ' / ' . sprintf(_n('%1$s Member', '%1$s Members', count($data->members), 'membership2'), '<b>' . count($data->members) . '</b>'))), 'field_options' => array('head_col' => true, 'head_row' => false, 'col_class' => array('preview-label', 'preview-data'))); if (!empty($notes)) { $fields['details']['value'][] = array(__('Please note', 'membership2'), $notes); } $batchsizes = array(10 => __('Small (10 items)'), 30 => __('Normal (30 items)'), 100 => __('Big (100 items)')); $fields['batchsize'] = array('id' => 'batchsize', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'title' => __('Batch size for import', 'membership2'), 'desc' => __('Big batches will be processed faster but may result in PHP Memory errors.', 'membership2'), 'value' => 30, 'field_options' => $batchsizes, 'class' => 'sel-batchsize'); $fields['clear_all'] = array('id' => 'clear_all', 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'title' => __('Replace current content with import data (removes existing Memberships/Members before importing data)', 'membership2'), 'class' => 'widefat'); $fields['memberships'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $memberships, 'field_options' => array('head_col' => false, 'head_row' => true, 'col_class' => array('preview-name', 'preview-type', 'preview-pay-type', 'preview-desc'))); $fields['members'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $members, 'field_options' => array('head_col' => false, 'head_row' => true, 'col_class' => array('preview-name', 'preview-email', 'preview-count', 'preview-count'))); $fields['settings'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $settings, 'field_options' => array('head_col' => true, 'head_row' => false)); $fields['sep'] = array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR); $fields['back'] = array('type' => MS_Helper_Html::TYPE_HTML_LINK, 'class' => 'wpmui-field-button button', 'value' => __('Cancel', 'membership2'), 'url' => $_SERVER['REQUEST_URI']); $fields['skip'] = array('type' => MS_Helper_Html::TYPE_HTML_LINK, 'class' => 'wpmui-field-button button', 'value' => __('Skip', 'membership2'), 'url' => MS_Controller_Plugin::get_admin_url(false, array('skip_import' => 1))); $fields['import'] = array('id' => 'btn-import', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Import', 'membership2'), 'button_value' => MS_Controller_Import::AJAX_ACTION_IMPORT, 'button_type' => 'submit'); $fields['download'] = array('id' => 'btn-download', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Download as Export File', 'membership2'), 'class' => 'button-link'); return $fields; }
/** * Sets up the 'Billing' navigation and list page. * * @since 1.0.0 */ public function admin_page() { $this->print_admin_message(); // Action view page request $isset = array('action', 'invoice_id'); if (self::validate_required($isset, 'GET', false) && 'edit' == $_GET['action']) { $invoice_id = !empty($_GET['invoice_id']) ? $_GET['invoice_id'] : 0; $data['invoice'] = MS_Factory::load('MS_Model_Invoice', $_GET['invoice_id']); $data['action'] = $_GET['action']; $data['memberships'] = MS_Model_Membership::get_membership_names(array('include_guest' => 0)); $view = MS_Factory::create('MS_View_Billing_Edit'); $view->data = apply_filters('ms_view_billing_edit_data', $data); $view->render(); } else { $view = MS_Factory::create('MS_View_Billing_List'); $view->render(); } }
/** * Returns the ListTable object for this rule. * * @since 1.0.0 * * @return MS_Helper_ListTable */ public function return_listtable($empty) { $base = MS_Model_Membership::get_base(); $rule = $base->get_rule(self::RULE_ID); return new MS_Rule_MemberRoles_ListTable($rule); }
/** * Add 'Test Memberships' node. * * @since 1.0.0 * */ private function add_test_membership_node() { global $wp_admin_bar; $base_id = MS_Model_Membership::get_base()->id; if ($base_id) { $link_url = self::get_simulation_url($base_id); $wp_admin_bar->add_node(apply_filters('ms_controller_adminbar_add_test_membership_node', array('id' => 'ms-test-memberships', 'title' => __('Test Memberships', 'membership2'), 'href' => $link_url, 'meta' => array('class' => 'ms-test-memberships', 'title' => __('Membership Simulation Menu', 'membership2'), 'tabindex' => '1')))); } }
/** * Set specific property. * * @since 1.0.0 * * @param string $property The name of a property to associate. * @param mixed $value The value of a property. */ public function __set($property, $value) { if (property_exists($this, $property)) { switch ($property) { case 'code': $value = sanitize_text_field(preg_replace('/[^a-zA-Z0-9\\s]/', '', $value)); $this->{$property} = strtoupper($value); $this->name = $this->{$property}; break; case 'discount': $this->{$property} = floatval($value); break; case 'discount_type': if (self::is_valid_discount_type($value)) { $this->{$property} = $value; } break; case 'start_date': $this->{$property} = $this->validate_date($value); break; case 'expire_date': $this->{$property} = $this->validate_date($value); if (strtotime($this->{$property}) < strtotime($this->start_date)) { $this->{$property} = null; } break; case 'membership_id': $value = lib3()->array->get($value); foreach ($value as $ind => $id) { if (!MS_Model_Membership::is_valid_membership($id)) { unset($value[$ind]); } } if (empty($value)) { $this->{$property} = array(0); } else { $this->{$property} = array_values($value); } break; case 'max_uses': case 'used': $this->{$property} = absint($value); break; default: if (property_exists($this, $property)) { $this->{$property} = $value; } break; } } do_action('ms_addon_coupon_model__set_after', $property, $value, $this); }
/** * Get signup process step (multi step form). * * @since 1.0.0 * * @return string The current signup step after validation. */ private function get_signup_step() { static $Valid_Steps = null; static $Login_Steps = null; if (empty($Valid_Steps)) { $Valid_Steps = apply_filters('ms_controller_frontend_signup_steps', array(self::STEP_CHOOSE_MEMBERSHIP, self::STEP_REGISTER_FORM, self::STEP_REGISTER_FORM_ALT, self::STEP_REGISTER_SUBMIT, self::STEP_PAYMENT_TABLE, self::STEP_GATEWAY_FORM, self::STEP_PROCESS_PURCHASE)); // These steps are only available to logged-in users. $Login_Steps = apply_filters('ms_controller_frontend_signup_steps_private', array(self::STEP_PAYMENT_TABLE, self::STEP_GATEWAY_FORM, self::STEP_PROCESS_PURCHASE)); } lib2()->array->equip_request('step', 'membership_id'); if (in_array($_REQUEST['step'], $Valid_Steps)) { $step = $_REQUEST['step']; } else { // Initial step $step = self::STEP_CHOOSE_MEMBERSHIP; } if (self::STEP_PAYMENT_TABLE == $step) { if (!MS_Model_Membership::is_valid_membership($_REQUEST['membership_id'])) { $step = self::STEP_CHOOSE_MEMBERSHIP; } } if (self::STEP_CHOOSE_MEMBERSHIP == $step && !empty($_GET['membership_id'])) { $step = self::STEP_PAYMENT_TABLE; } if (!MS_Model_Member::is_logged_in() && in_array($step, $Login_Steps)) { $step = self::STEP_REGISTER_FORM_ALT; } return apply_filters('ms_controller_frontend_get_signup_step', $step, $this); }