/** * Use a special template for our membership pages. * * Recognized templates are: * m2-memberships.php * m2-protected-content.php * m2-account.php * m2-register.php * m2-registration-complete.php * * Note that certain pages receive a membership-ID when they are loaded * (like the m2-registration-complete or m2-register pages). * You can even specify special pages for each membership. * * Example: * m2-register-100.php (register form for membership 100) * m2-registration-complete-100.php (thank you page for membership 100) * * @since 1.0.1.0 * @see filter page_template * * @param string $template The default template path to filter. * @return string The custom template path. */ public function custom_page_template($default_template) { $template = ''; // Checks for invoice single template. if ($type = MS_Model_Pages::is_membership_page()) { $membership_id = apply_filters('ms_detect_membership_id', 0, true, true); if ($membership_id) { $template = get_query_template('m2', 'm2-' . $type . '-' . $membership_id . '.php'); } if (!$template) { $template = get_query_template('m2', 'm2-' . $type . '.php'); } } if (!$template) { $template = $default_template; } return $template; }
/** * Adds CSS and JS for Membership special pages used in the front end. * * @since 1.0.0 * * @return void */ public function enqueue_scripts() { do_action('ms_controller_frontend_enqueue_scripts', $this->get_signup_step(), $this->get_action(), $this); $is_ms_page = MS_Model_Pages::is_membership_page(); $is_profile = self::ACTION_EDIT_PROFILE == $this->get_action() && MS_Model_Pages::is_membership_page(null, MS_Model_Pages::MS_PAGE_ACCOUNT); if ($is_ms_page) { $data = array('ms_init' => array('shortcode'), 'cancel_msg' => __('Are you sure you want to cancel?', MS_TEXT_DOMAIN)); lib2()->ui->css('ms-styles'); lib2()->ui->js('jquery-validate'); lib2()->ui->js('ms-public'); MS_Controller_Plugin::translate_jquery_validator(); if ($is_profile) { $data['ms_init'][] = 'frontend_profile'; } lib2()->ui->data('ms_data', $data); } }
/** * This filter is called by WordPress when the page-listtable is created to * display all available Posts/Pages. We use this filter to add a note * to all pages that are special membership pages. * * @since 1.0.0 * @param array $states * @param WP_Post $post * @return array */ public function post_states($states, $post) { if ('page' == $post->post_type) { if (MS_Model_Pages::is_membership_page($post->ID)) { $url = MS_Controller_Plugin::get_admin_url('settings'); $states['membership2'] = sprintf('<a style="%2$s" href="%3$s">%1$s</a>', __('Membership2 Page', 'membership2'), 'background:#aaa;color:#fff;padding:1px 4px;border-radius:4px;font-size:0.8em', $url); } } return $states; }
/** * Close comments for membership special pages. * * Related Action Hooks: * - the_content * * @since 1.0.0 * * @param string $content The content to filter. */ public function check_special_page($content) { if (MS_Model_Pages::is_membership_page()) { add_filter('comments_open', '__return_false', 100); } return apply_filters('ms_rule_content_model_check_special_page', $content, $this); }
/** * Membership metabox callback function for displaying the UI. * * @since 1.0.0 * * @param object $post The current post object. */ public function membership_metabox($post) { $data = array(); if (MS_Model_Pages::is_membership_page()) { $data['special_page'] = true; } else { $all_memberships = MS_Model_Membership::get_memberships(); $base = MS_Model_Membership::get_base(); $data['base_id'] = $base->id; // Find the post-type of the current post. if ('attachment' == $post->post_type) { $parent_id = $post->post_parent; $post_type = get_post_type($parent_id); } else { $post_type = $post->post_type; } // Get the base protection rule and check if post is protected. $rule = $this->get_rule($base, $post_type); $data['is_protected'] = !$rule->has_access($post->ID, false); $data['rule_type'] = $rule->rule_type; // Check each membership to see if the post is protected. foreach ($all_memberships as $membership) { if ($membership->is_base) { continue; } $rule = $this->get_rule($membership, $post_type); $data['access'][$membership->id]['has_access'] = $rule->get_rule_value($post->ID); $data['access'][$membership->id]['name'] = $membership->name; } } $data['post_id'] = $post->ID; $data['read_only'] = $this->is_read_only($post->post_type); $view = MS_Factory::create('MS_View_Metabox'); $view->data = apply_filters('ms_view_membership_metabox_data', $data, $this); $view->render(); }
/** * Checks member permissions and protects current page. * * Related Action Hooks: * - template_redirect * * @since 1.0.0 */ public function protect_current_page() { do_action('ms_model_plugin_protect_current_page_before', $this); // Admin user has access to everything if ($this->member->is_normal_admin()) { return; } $access = $this->get_access_info(); if (!$access['has_access']) { MS_Model_Pages::create_missing_pages(); $no_access_page_url = MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_PROTECTED_CONTENT, false); $current_page_url = MS_Helper_Utility::get_current_url(); // Don't (re-)redirect the protection page. if (!MS_Model_Pages::is_membership_page(null, MS_Model_Pages::MS_PAGE_PROTECTED_CONTENT)) { $no_access_page_url = esc_url_raw(add_query_arg(array('redirect_to' => urlencode($current_page_url)), $no_access_page_url)); $no_access_page_url = apply_filters('ms_model_plugin_protected_content_page', $no_access_page_url); wp_safe_redirect($no_access_page_url); exit; } } do_action('ms_model_plugin_protect_current_page_after', $this); }
/** * Verify access to the current page. * * @since 1.0.0 * * @param int $id The page_id to verify access. * @return bool|null True if has access, false otherwise. * Null means: Rule not relevant for current page. */ public function has_access($id, $admin_has_access = true) { $has_access = null; if (empty($id)) { $id = $this->get_current_page_id(); } else { $post = get_post($id); if (!is_a($post, 'WP_Post') || 'page' != $post->post_type) { $id = 0; } } if (!empty($id)) { $has_access = false; // Membership special pages has access if (MS_Model_Pages::is_membership_page($id)) { $has_access = true; } else { $has_access = parent::has_access($id, $admin_has_access); } } return apply_filters('ms_rule_page_model_has_access', $has_access, $id, $this); }