/** * Setup the rule. * * @since 1.0.0 */ public function prepare_obj() { if (MS_Rule_MemberRoles_Model::is_active()) { MS_Model_Rule::register_rule(self::RULE_ID, __CLASS__, __('User Roles', MS_TEXT_DOMAIN), 2); } $this->add_filter('ms_view_protectedcontent_define-' . self::RULE_ID, 'handle_render_callback', 10, 2); $this->add_filter('ms_rule_listtable-' . self::RULE_ID, 'return_listtable'); }
/** * Setup the rule. * * @since 1.0.0 */ public function prepare_obj() { if (MS_Rule_Post_Model::is_active()) { MS_Model_Rule::register_rule(self::RULE_ID, __CLASS__, __('Posts', 'membership2'), 11, true); } $this->add_filter('ms_view_protectedcontent_define-' . self::RULE_ID, 'handle_render_callback', 10, 2); $this->add_filter('ms_rule_listtable-' . self::RULE_ID, 'return_listtable'); }
/** * Setup the rule. * * @since 1.0.0 */ public function prepare_obj() { MS_Model_Rule::register_rule(self::RULE_ID, __CLASS__, __('BuddyPress', MS_TEXT_DOMAIN), 40); $this->add_filter('ms_view_protectedcontent_define-' . self::RULE_ID, 'handle_render_callback', 10, 2); }
/** * Get available tabs for Membership2 page. * * @since 1.0.0 * * @return array The tabs configuration. */ public function get_available_tabs() { static $Tabs = null; if (null === $Tabs) { $membership = $this->load_membership(); $membership_id = $membership->id; $is_base = $membership->is_base(); $settings = MS_Factory::load('MS_Model_Settings'); // First create a list including all possible tabs. $tabs = array(MS_Rule_Page::RULE_ID => true, MS_Rule_Post::RULE_ID => true, MS_Rule_Category::RULE_ID => true, MS_Rule_Content::RULE_ID => true, MS_Rule_Media::RULE_ID => true, MS_Rule_MenuItem::RULE_ID => true, MS_Rule_ReplaceMenu::RULE_ID => true, MS_Rule_ReplaceLocation::RULE_ID => true, MS_Rule_Shortcode::RULE_ID => true, MS_Rule_Url::RULE_ID => true, MS_Rule_Special::RULE_ID => true, MS_Rule_MemberCaps::RULE_ID => true, MS_Rule_MemberRoles::RULE_ID => true); // Now remove items from the list that are not available. // Optionally show "Posts" if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_POST_BY_POST)) { $tabs[MS_Rule_Post::RULE_ID] = false; } // Optionally show "Category" if (!MS_Model_Addon::is_enabled(MS_Addon_Category::ID)) { $tabs[MS_Rule_Category::RULE_ID] = false; } // Optionally show "Media" if (!MS_Model_Addon::is_enabled(MS_Addon_Mediafiles::ID)) { $tabs[MS_Rule_Media::RULE_ID] = false; } // Either "Menu Item" or "Menus" or "Menu Location" switch ($settings->menu_protection) { case 'menu': $tabs[MS_Rule_MenuItem::RULE_ID] = false; $tabs[MS_Rule_ReplaceLocation::RULE_ID] = false; break; case 'location': $tabs[MS_Rule_MenuItem::RULE_ID] = false; $tabs[MS_Rule_ReplaceMenu::RULE_ID] = false; break; case 'item': default: $tabs[MS_Rule_ReplaceMenu::RULE_ID] = false; $tabs[MS_Rule_ReplaceLocation::RULE_ID] = false; break; } // Maybe "Special Pages". if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_SPECIAL_PAGES)) { $tabs[MS_Rule_Special::RULE_ID] = false; } // Maybe "URLs" if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_URL_GROUPS)) { $tabs[MS_Rule_Url::RULE_ID] = false; } // Maybe "Shortcodes" if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_SHORTCODE)) { $tabs[MS_Rule_Shortcode::RULE_ID] = false; } // Maybe "Membercaps" if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MEMBERCAPS)) { if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MEMBERCAPS_ADV)) { $tabs[MS_Rule_MemberRoles::RULE_ID] = false; } else { $tabs[MS_Rule_MemberCaps::RULE_ID] = false; } } else { $tabs[MS_Rule_MemberRoles::RULE_ID] = false; $tabs[MS_Rule_MemberCaps::RULE_ID] = false; } lib2()->array->equip($_GET, 'page'); // Allow Add-ons to add or remove rule tabs $tabs = apply_filters('ms_controller_protection_tabs', $tabs, $membership_id); $page = sanitize_html_class($_GET['page'], MS_Controller_Plugin::MENU_SLUG . '-memberships'); $rule_titles = MS_Model_Rule::get_rule_type_titles(); $result = array(); foreach ($tabs as $rule_type => $state) { if (!$state) { continue; } $url = sprintf('%s?page=%s&tab=%s', admin_url('admin.php'), $page, $rule_type); // Try to keep the selected Membership and Status filter. if (!empty($_REQUEST['membership_id'])) { $url = esc_url_raw(add_query_arg(array('membership_id' => $_REQUEST['membership_id']), $url)); } if (!empty($_REQUEST['status'])) { $url = esc_url_raw(add_query_arg(array('status' => $_REQUEST['status']), $url)); } $result[$rule_type] = array('title' => $rule_titles[$rule_type], 'url' => $url); } $Tabs = apply_filters('ms_controller_protection_get_available_tabs', $result, $membership_id, $this); } return $Tabs; }
/** * Validate specific property before set. * * @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 'rule_type': if (in_array($value, MS_Model_Rule::get_rule_types())) { $this->{$property} = $value; } break; case 'dripped': if (is_array($value)) { $this->{$property} = $value; } break; default: $this->{$property} = $value; break; } } do_action('ms_rule__set_after', $property, $value, $this); }
/** * Setup the rule. * * @since 1.0.0 */ public function prepare_obj() { MS_Model_Rule::register_rule(self::RULE_ID, __CLASS__, __('bbPress', 'membership2'), 100); $this->add_filter('ms_view_protectedcontent_define-' . self::RULE_ID, 'handle_render_callback', 10, 2); }
/** * Register meta-information on a rule * * @since 1.0.0 * @param string $id ID of the rule. * @param string $class Name of the rule class, used to find Model-class. * @param string $title Rule Title for display. * @param int $priority Loading-priority (0 - 999), lower is earlier. */ public static function register_rule($id, $class, $title, $priority = 0, $dripped = false) { if (!is_array(self::$rule_meta)) { self::$rule_meta = array('title' => array(), 'class' => array(), 'model_class' => array(), 'order' => array(), 'dripped' => array()); } self::$rule_meta['title'][$id] = $title; self::$rule_meta['class'][$id] = $class; self::$rule_meta['model_class'][$id] = $class . '_Model'; if ($dripped) { self::$rule_meta['dripped'][] = $id; } $priority = min($priority, 999); $priority = max($priority, 0); $real_priority = $priority * 20; while (isset(self::$rule_meta['order'][$real_priority])) { $real_priority += 1; } self::$rule_meta['order'][$real_priority] = $id; }
/** * Echo a content list as tag-list. * * @since 1.0.0 * * @param array $contents List of content items to display. */ protected function content_box($rule) { static $row_items = 0; $rule_titles = MS_Model_Rule::get_rule_type_titles(); $title = $rule_titles[$rule->rule_type]; $contents = (array) $rule->get_contents(null, true); $membership_id = $this->data['membership']->id; $row_items += 1; $new_row = $row_items % 4 === 0; $show_sep = ($row_items - 1) % 4 === 0; if ($show_sep && $row_items > 1) { MS_Helper_Html::html_separator(); } ?> <div class="ms-part-4 ms-min-height"> <?php if (!$new_row) { MS_Helper_Html::html_separator('vertical'); } ?> <div class="ms-bold"> <?php printf('%s (%s):', $title, $rule->count_rules()); ?> </div> <div class="inside"> <ul class="ms-content-tag-list ms-group"> <?php foreach ($contents as $content) { if ($content->access) { MS_Helper_Html::content_tag($content); } } ?> </ul> <div class="ms-protection-edit-wrapper"> <?php $edit_url = MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule->rule_type, 'membership_id' => $membership_id)); MS_Helper_Html::html_element(array('id' => 'edit_' . $rule->rule_type, 'type' => MS_Helper_Html::TYPE_HTML_LINK, 'title' => $title, 'value' => sprintf(__('Edit %s Access', 'membership2'), $title), 'url' => $edit_url, 'class' => 'wpmui-field-button button')); ?> </div> </div> </div> <?php if ($new_row) { echo '</div><div class="ms-group">'; } }
/** * Get protection rules sorted. * * First one has priority over the last one. * These rules are used to determine access. * * @since 1.0.0 * @internal */ private function get_rules_hierarchy() { $rule_types = MS_Model_Rule::get_rule_types(); $rules = array(); $subscription = MS_Factory::load('MS_Model_Relationship', $this->subscription_id); foreach ($rule_types as $rule_type) { $rule = $this->get_rule($rule_type); if ($rule->rule_type != $rule_type) { // This means that the $rule_type was not found... continue; } // Sometimes the $subscription->id can be 0, which is intentional: // This is the case when the membership was auto-assigned to guest // or default membership. $rule->_subscription_id = $subscription->id; $rule->membership_id = $this->id; $rules[$rule_type] = $rule; } return apply_filters('ms_model_membership_get_rules_hierarchy', $rules, $this); }
/** * Load all the rules that are used by the plugin. * * Related Action Hooks: * - ms_init_done * * @since 1.0.0 */ public function setup_rules() { // Make sure we stick to the correct workflow. if (!did_action('ms_init_done')) { throw new Exception('setup_rules() is called too early.', 1); return; } do_action('ms_initialize_rules', $this); $rule_types = MS_Model_Rule::get_rule_types(); foreach ($this->member->subscriptions as $subscription) { foreach ($rule_types as $rule_type) { $rule = $subscription->get_membership()->get_rule($rule_type); } } }
/** * Echo a content list as 2-column table that show Content-Title and the * Available date. * Used by Dripped-Content view. * * @since 1.0.0 * * @param array $contents List of content items to display. */ protected function content_box($contents) { $row_class = ''; ksort($contents); $rule_titles = MS_Model_Rule::get_rule_type_titles(); $edit_url = MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule->rule_type)); $edit_link = array('id' => 'edit_dripped', 'type' => MS_Helper_Html::TYPE_HTML_LINK); ?> <table class="ms-list-table ms-list-date widefat"> <thead> <tr> <th class="col-icon"> </th> <th class="col-text"><?php _e('Rule', MS_TEXT_DOMAIN); ?> </th> <th class="col-text"><?php _e('Protected Item', MS_TEXT_DOMAIN); ?> </th> <th class="col-date"><?php _e('Access', MS_TEXT_DOMAIN); ?> </th> </tr> </thead> <tbody> <?php foreach ($contents as $id => $content) { $row_class = $row_class == 'alternate' ? '' : 'alternate'; ?> <tr class="<?php echo esc_attr($row_class . ' ' . $content->icon); ?> "> <td class="col-icon"> <i class="dashicons dashicons-<?php echo esc_attr($content->icon); ?> "></i> </td> <td class="col-text col-type"> <?php $edit_link['url'] = esc_url_raw(add_query_arg('tab', $content->type, $edit_url)); $edit_link['value'] = $rule_titles[$content->type]; MS_Helper_Html::html_element($edit_link); ?> </td> <td class="col-text"> <?php MS_Helper_Html::content_tag($content, 'span'); ?> </td> <td class="col-date"> <?php echo '' . $content->date; ?> </td> </tr> <?php } ?> </tbody> </table> <?php }
/** * Setup the rule. * * @since 1.0.0 */ public function prepare_obj() { MS_Model_Rule::register_rule(self::RULE_ID, __CLASS__, __('Shortcodes', MS_TEXT_DOMAIN), 70); $this->add_filter('ms_view_protectedcontent_define-' . self::RULE_ID, 'handle_render_callback', 10, 2); $this->add_filter('ms_rule_listtable-' . self::RULE_ID, 'return_listtable'); }
/** * Displays the inline-edit form used to edit the dripped content details. * * @since 1.0.0 */ protected function inline_edit() { $rule = $this->model; $membership = $this->membership; $field_action = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'action', 'value' => MS_Controller_Rule::AJAX_ACTION_UPDATE_DRIPPED); $field_rule = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'rule_type', 'value' => $this->model->rule_type); $field_item = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'item_id'); $field_offset = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'offset'); $field_number = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'number'); $field_filter = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'membership_id', 'value' => isset($_REQUEST['membership_id']) ? $_REQUEST['membership_id'] : ''); $field_id = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'membership_ids'); $field_type = array('type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'name' => 'dripped_type', 'class' => 'dripped_type', 'field_options' => MS_Model_Rule::get_dripped_types()); $field_date = array('type' => MS_Helper_Html::INPUT_TYPE_DATEPICKER, 'name' => 'date', 'placeholder' => __('Date', 'membership2') . '...'); $field_delay_unit = array('type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'name' => 'delay_unit', 'class' => 'ms-text-small', 'placeholder' => '0'); $field_delay_type = array('type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'name' => 'delay_type', 'field_options' => MS_Helper_Period::get_period_types('plural'), 'after' => __('after subscription', 'membership2')); ?> <div> <h4> <span class="lbl-name"></span> - <?php _e('Dripped Content Settings', 'membership2'); ?> </h4> </div> <fieldset> <div class="inline-edit-col"> <?php MS_Helper_Html::html_element($field_action); MS_Helper_Html::html_element($field_rule); MS_Helper_Html::html_element($field_item); MS_Helper_Html::html_element($field_offset); MS_Helper_Html::html_element($field_number); MS_Helper_Html::html_element($field_filter); ?> <div class="dynamic-form"></div> </div> </fieldset> <div class="dripped-form cf no-auto-init hidden"> <div class="drip-col col-1"> <span class="the-name ms-membership"></span> <?php MS_Helper_Html::html_element($field_id); ?> </div> <div class="drip-col col-2"> <?php MS_Helper_Html::html_element($field_type); ?> </div> <div class="drip-col col-3"> <div class="drip-option <?php echo esc_attr(MS_Model_Rule::DRIPPED_TYPE_INSTANTLY); ?> "> <?php _e('Instantly', 'membership2'); ?> </div> <div class="drip-option <?php echo esc_attr(MS_Model_Rule::DRIPPED_TYPE_SPEC_DATE); ?> "> <?php MS_Helper_Html::html_element($field_date); ?> </div> <div class="drip-option <?php echo esc_attr(MS_Model_Rule::DRIPPED_TYPE_FROM_REGISTRATION); ?> "> <?php MS_Helper_Html::html_element($field_delay_unit); MS_Helper_Html::html_element($field_delay_type); ?> </div> </div> </div> </div> <?php }
/** * Output details on which membership denied or allowed access to the * current page * * @since 1.0.0 * @param string $denied_url URL of the denied page (empty if not denied) * @param int $membership_id Membership_id * @param array $rules List of Rule_types */ protected function output_deciding_info($denied_url, $membership_id, $rules) { $membership = MS_Factory::load('MS_Model_Membership', $membership_id); $rule_title = MS_Model_Rule::get_rule_type_titles(); if (!empty($denied_url)) { ?> <div class="ms-sim-denied"> <?php printf(__('Access denied by %s', MS_TEXT_DOMAIN), '<b>' . esc_html($membership->name) . '</b>'); ?> </div> <ul class="ms-sim-rules"> <?php printf('<li><a href="%1$s">%1$s</a></li>', $denied_url); foreach ($rules as $rule_type) { printf('<li><a href="%1$s" target="_blank">%3$s %2$s</a></li>', MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule_type, 'membership_id' => $membership->id)), $rule_title[$rule_type], __('Denied by Rule:', MS_TEXT_DOMAIN)); } ?> <?php } elseif ($membership->is_valid()) { ?> <div class="ms-sim-allowed"> <?php printf(__('Access granted by %s', MS_TEXT_DOMAIN), '<b>' . esc_html($membership->name) . '</b>'); ?> </div> <ul class="ms-sim-rules"> <?php foreach ($rules as $rule_type) { printf('<li><a href="%1$s" target="_blank">%3$s %2$s</a></li>', MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule_type, 'membership_id' => $membership->id)), $rule_title[$rule_type], __('Allowed by Rule:', MS_TEXT_DOMAIN)); } ?> </ul> <?php } else { ?> <div class="ms-sim-public"> <?php _e('Unprotected', MS_TEXT_DOMAIN); ?> </div> <?php } }