/**
  * 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);
 }