From 070415bf31e70c8d3dbda34bdee7340ce72c6298 Mon Sep 17 00:00:00 2001 From: Nikita Sinelnikov Date: Tue, 27 Jul 2021 13:07:30 +0300 Subject: [PATCH] - changed form labels and tooltips for clear description; - fixed repeated queries for getting excluded post IDs; --- includes/admin/assets/css/um-admin-forms.css | 6 +- includes/admin/core/class-admin-metabox.php | 301 +++++++++--------- .../templates/access/restrict_content.php | 140 ++++---- includes/core/class-access.php | 219 +++++++------ 4 files changed, 344 insertions(+), 322 deletions(-) diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css index d6bd77a3..36692707 100644 --- a/includes/admin/assets/css/um-admin-forms.css +++ b/includes/admin/assets/css/um-admin-forms.css @@ -227,6 +227,10 @@ textarea.um-forms-field.um-small-field { font-style: italic; } +.um-form-field .description { + clear: both; +} + .um-form-fields-section { float:left; @@ -397,4 +401,4 @@ textarea.um-forms-field.um-small-field { width: 20px; text-align: left; margin: 0 10px 0 0; -} \ No newline at end of file +} diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 6807c543..17c01d0d 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -234,7 +234,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { add_meta_box( 'um-admin-restrict-content', - __( 'UM Content Restriction', 'ultimate-member' ), + __( 'Ultimate Member: Content Restriction', 'ultimate-member' ), array( &$this, 'restrict_content_cb' ), $current_screen->id, 'normal', @@ -355,8 +355,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { * */ function um_category_access_fields_create() { - $data = array(); - /** * UM hook * @@ -388,103 +386,104 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { */ $fields = apply_filters( 'um_admin_category_access_settings_fields', array( array( - 'id' => '_um_custom_access_settings', - 'type' => 'checkbox', - 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'label' => __( 'Restrict access to this term and its posts?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this term and its posts. Affects only posts that do not have individual Restriction Content settings', 'ultimate-member' ), + 'value' => 0, ), array( - 'id' => '_um_accessible', - 'type' => 'select', - 'label' => __( 'Who can access this content?', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, - 'options' => array( - '0' => __( 'Everyone', 'ultimate-member' ), - '1' => __( 'Logged out users', 'ultimate-member' ), - '2' => __( 'Logged in users', 'ultimate-member' ), + 'id' => '_um_accessible', + 'type' => 'select', + 'label' => __( 'Who can access this term and its posts?', 'ultimate-member' ), + 'value' => '0', + 'options' => array( + '0' => __( 'Everyone', 'ultimate-member' ), + '1' => __( 'Logged out users', 'ultimate-member' ), + '2' => __( 'Logged in users', 'ultimate-member' ), ), - 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + 'conditional' => array( '_um_custom_access_settings', '=', '1' ), ), array( - 'id' => '_um_access_roles', - 'type' => 'multi_checkbox', - 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'options' => UM()->roles()->get_roles( false ), - 'columns' => 3, - 'conditional' => array( '_um_accessible', '=', '2' ) + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'label' => __( 'Select which roles can access this term and its posts', 'ultimate-member' ), + 'description' => __( 'Leave empty if you want to display a term for all logged in users', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles( false ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ), ), array( - 'id' => '_um_access_hide_from_queries', - 'type' => 'checkbox', - 'label' => __( 'Hide from queries', 'ultimate-member' ), - 'description' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', - 'conditional' => array( '_um_accessible', '!=', '0' ) + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'label' => __( 'Would you like to exclude term\'s post from WP Query when users haven\'t access?', 'ultimate-member' ), + 'description' => __( 'Recommended to be enabled. Restricted post will be hidden by exclusion from WP Query. The safest and most effective method that hides post and its comments from all requests, RSS feeds, etc. on your site', 'ultimate-member' ), + 'value' => 1, + 'conditional' => array( '_um_accessible', '!=', '0' ), ), array( - 'id' => '_um_noaccess_action', - 'type' => 'select', - 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), - 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, - 'options' => array( - '0' => __( 'Show access restricted message', 'ultimate-member' ), - '1' => __( 'Redirect user', 'ultimate-member' ), + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'label' => __( 'What happens when users without access tries to view the term\'s post?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the term\'s post', 'ultimate-member' ), + 'value' => '0', + 'options' => array( + '0' => __( 'Show access restricted message', 'ultimate-member' ), + '1' => __( 'Redirect user', 'ultimate-member' ), ), - 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ) + 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ), ), array( - 'id' => '_um_restrict_by_custom_message', - 'type' => 'select', - 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), - 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', - 'options' => array( - '0' => __( 'Global default message (default)', 'ultimate-member' ), - '1' => __( 'Custom message', 'ultimate-member' ), + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this term\'s post?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the term\'s post', 'ultimate-member' ), + 'value' => '0', + 'options' => array( + '0' => __( 'Global default message', 'ultimate-member' ), + '1' => __( 'Custom message', 'ultimate-member' ), ), - 'conditional' => array( '_um_noaccess_action', '=', '0' ) + 'conditional' => array( '_um_noaccess_action', '=', '0' ), ), array( - 'id' => '_um_restrict_custom_message', - 'type' => 'wp_editor', - 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), - 'description' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', - 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'description' => __( 'You may replace global restrict message here', 'ultimate-member' ), + 'value' => '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ), ), array( - 'id' => '_um_access_redirect', - 'type' => 'select', - 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), - 'description' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', - 'conditional' => array( '_um_noaccess_action', '=', '1' ), - 'options' => array( - '0' => __( 'Login page', 'ultimate-member' ), - '1' => __( 'Custom URL', 'ultimate-member' ), + 'id' => '_um_access_redirect', + 'type' => 'select', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'description' => __( 'Select redirect to page when user hasn\'t access to the term\'s post', 'ultimate-member' ), + 'value' => '0', + 'conditional' => array( '_um_noaccess_action', '=', '1' ), + 'options' => array( + '0' => __( 'Login page', 'ultimate-member' ), + '1' => __( 'Custom URL', 'ultimate-member' ), ), ), array( 'id' => '_um_access_redirect_url', 'type' => 'text', 'label' => __( 'Redirect URL', 'ultimate-member' ), - 'description' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', - 'conditional' => array( '_um_access_redirect', '=', '1' ) + 'description' => __( 'Set full URL where do you want to redirect the user', 'ultimate-member' ), + 'value' => '', + 'conditional' => array( '_um_access_redirect', '=', '1' ), ), - ), $data, 'create' ); + ), array(), 'create' ); - UM()->admin_forms( array( - 'class' => 'um-restrict-content um-third-column', - 'prefix_id' => 'um_content_restriction', - 'without_wrapper' => true, - 'div_line' => true, - 'fields' => $fields - ) )->render_form(); + UM()->admin_forms( + array( + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'without_wrapper' => true, + 'div_line' => true, + 'fields' => $fields, + ) + )->render_form(); wp_nonce_field( basename( __FILE__ ), 'um_admin_save_taxonomy_restrict_content_nonce' ); } @@ -538,111 +537,101 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { */ $fields = apply_filters( 'um_admin_category_access_settings_fields', array( array( - 'id' => '_um_custom_access_settings', - 'type' => 'checkbox', - 'class' => 'form-field', - 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'label' => __( 'Restrict access to this term and its posts?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this term and its posts. Affects only posts that do not have individual Restriction Content settings', 'ultimate-member' ), + 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, ), array( - 'id' => '_um_accessible', - 'type' => 'select', - 'class' => 'form-field', - 'label' => __( 'Who can access this content?', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, - 'options' => array( - '0' => __( 'Everyone', 'ultimate-member' ), - '1' => __( 'Logged out users', 'ultimate-member' ), - '2' => __( 'Logged in users', 'ultimate-member' ), + 'id' => '_um_accessible', + 'type' => 'select', + 'label' => __( 'Who can access this term and its posts?', 'ultimate-member' ), + 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : '0', + 'options' => array( + '0' => __( 'Everyone', 'ultimate-member' ), + '1' => __( 'Logged out users', 'ultimate-member' ), + '2' => __( 'Logged in users', 'ultimate-member' ), ), - 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + 'conditional' => array( '_um_custom_access_settings', '=', '1' ), ), array( - 'id' => '_um_access_roles', - 'type' => 'multi_checkbox', - 'class' => 'form-field', - 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), - 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => $_um_access_roles_value, - 'options' => UM()->roles()->get_roles( false ), - 'columns' => 3, - 'conditional' => array( '_um_accessible', '=', '2' ) + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'label' => __( 'Select which roles can access this term and its posts', 'ultimate-member' ), + 'description' => __( 'Leave empty if you want to display a term for all logged in users', 'ultimate-member' ), + 'value' => $_um_access_roles_value, + 'options' => UM()->roles()->get_roles( false ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ), ), array( - 'id' => '_um_access_hide_from_queries', - 'type' => 'checkbox', - 'class' => 'form-field', - 'label' => __( 'Hide from queries', 'ultimate-member' ), - 'description' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', - 'conditional' => array( '_um_accessible', '!=', '0' ) + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'label' => __( 'Would you like to exclude term\'s post from WP Query when users haven\'t access?', 'ultimate-member' ), + 'description' => __( 'Recommended to be enabled. Restricted post will be hidden by exclusion from WP Query. The safest and most effective method that hides post and its comments from all requests, RSS feeds, etc. on your site', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', + 'conditional' => array( '_um_accessible', '!=', '0' ), ), array( - 'id' => '_um_noaccess_action', - 'type' => 'select', - 'class' => 'form-field', - 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), - 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, - 'options' => array( - '0' => __( 'Show access restricted message', 'ultimate-member' ), - '1' => __( 'Redirect user', 'ultimate-member' ), + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'label' => __( 'What happens when users without access tries to view the term\'s post?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the term\'s post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : '0', + 'options' => array( + '0' => __( 'Show access restricted message', 'ultimate-member' ), + '1' => __( 'Redirect user', 'ultimate-member' ), ), - 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ) + 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ), ), array( - 'id' => '_um_restrict_by_custom_message', - 'type' => 'select', - 'class' => 'form-field', - 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), - 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', - 'options' => array( - '0' => __( 'Global default message (default)', 'ultimate-member' ), - '1' => __( 'Custom message', 'ultimate-member' ), + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this term\'s post?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the term\'s post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', + 'options' => array( + '0' => __( 'Global default message', 'ultimate-member' ), + '1' => __( 'Custom message', 'ultimate-member' ), ), - 'conditional' => array( '_um_noaccess_action', '=', '0' ) + 'conditional' => array( '_um_noaccess_action', '=', '0' ), ), array( - 'id' => '_um_restrict_custom_message', - 'type' => 'wp_editor', - 'class' => 'form-field', - 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), - 'description' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', - 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'description' => __( 'You may replace global restrict message here', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ), ), array( - 'id' => '_um_access_redirect', - 'type' => 'select', - 'class' => 'form-field', - 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), - 'description' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', - 'conditional' => array( '_um_noaccess_action', '=', '1' ), - 'options' => array( - '0' => __( 'Login page', 'ultimate-member' ), - '1' => __( 'Custom URL', 'ultimate-member' ), + 'id' => '_um_access_redirect', + 'type' => 'select', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'description' => __( 'Select redirect to page when user hasn\'t access to the term\'s post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', + 'options' => array( + '0' => __( 'Login page', 'ultimate-member' ), + '1' => __( 'Custom URL', 'ultimate-member' ), ), + 'conditional' => array( '_um_noaccess_action', '=', '1' ), ), array( - 'id' => '_um_access_redirect_url', - 'type' => 'text', - 'class' => 'form-field', - 'label' => __( 'Redirect URL', 'ultimate-member' ), - 'description' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', - 'conditional' => array( '_um_access_redirect', '=', '1' ) + 'id' => '_um_access_redirect_url', + 'type' => 'text', + 'label' => __( 'Redirect URL', 'ultimate-member' ), + 'description' => __( 'Set full URL where do you want to redirect the user', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', + 'conditional' => array( '_um_access_redirect', '=', '1' ), ), ), $data, 'edit' ); UM()->admin_forms( array( - 'class' => 'um-restrict-content um-third-column', - 'prefix_id' => 'um_content_restriction', - 'without_wrapper' => true, - 'fields' => $fields + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'without_wrapper' => true, + 'fields' => $fields, ) )->render_form(); wp_nonce_field( basename( __FILE__ ), 'um_admin_save_taxonomy_restrict_content_nonce' ); diff --git a/includes/admin/templates/access/restrict_content.php b/includes/admin/templates/access/restrict_content.php index 5392ff5c..aa8bd866 100644 --- a/includes/admin/templates/access/restrict_content.php +++ b/includes/admin/templates/access/restrict_content.php @@ -1,10 +1,12 @@
- ID ) ) { + ID ) ) { $data = get_post_meta( $object->ID, 'um_content_restriction', true ); } else { $data = array(); @@ -48,94 +50,93 @@ if ( ! defined( 'ABSPATH' ) ) exit; */ $fields = apply_filters( 'um_admin_access_settings_fields', array( array( - 'id' => '_um_custom_access_settings', - 'type' => 'checkbox', - 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), - 'tooltip' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'label' => __( 'Restrict access to this post?', 'ultimate-member' ), + 'tooltip' => __( 'Activate individual content restriction settings for this post. Then ignore all terms restriction content settings if they exists.', 'ultimate-member' ), + 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, ), array( - 'id' => '_um_accessible', - 'type' => 'select', - 'label' => __( 'Who can access this content?', 'ultimate-member' ), - 'tooltip' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, - 'options' => array( + 'id' => '_um_accessible', + 'type' => 'select', + 'label' => __( 'Who can access this post?', 'ultimate-member' ), + 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, + 'options' => array( '0' => __( 'Everyone', 'ultimate-member' ), '1' => __( 'Logged out users', 'ultimate-member' ), '2' => __( 'Logged in users', 'ultimate-member' ), ), - 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + 'conditional' => array( '_um_custom_access_settings', '=', '1' ), ), array( - 'id' => '_um_access_roles', - 'type' => 'multi_checkbox', - 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), - 'tooltip' => __( 'Activate content restriction for this post', 'ultimate-member' ), - 'value' => $_um_access_roles_value, - 'options' => UM()->roles()->get_roles( false ), - 'columns' => 3, - 'conditional' => array( '_um_accessible', '=', '2' ) + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'label' => __( 'Select which roles can access this post', 'ultimate-member' ), + 'tooltip' => __( 'Leave empty if you want to display a post for all logged in users', 'ultimate-member' ), + 'value' => $_um_access_roles_value, + 'options' => UM()->roles()->get_roles( false ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ), ), array( - 'id' => '_um_access_hide_from_queries', - 'type' => 'checkbox', - 'label' => __( 'Hide from queries', 'ultimate-member' ), - 'tooltip' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', - 'conditional' => array( '_um_accessible', '!=', '0' ) + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'label' => __( 'Would you like to exclude post from WP Query when users haven\'t access?', 'ultimate-member' ), + 'tooltip' => __( 'Recommended to be enabled. Restricted post will be hidden by exclusion from WP Query. The safest and most effective method that hides post and its comments from all requests, RSS feeds, etc. on your site', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', + 'conditional' => array( '_um_accessible', '!=', '0' ), ), array( - 'id' => '_um_noaccess_action', - 'type' => 'select', - 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), - 'tooltip' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, - 'options' => array( + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'label' => __( 'What happens when users without access tries to view the post?', 'ultimate-member' ), + 'tooltip' => __( 'Action when users without access tries to view the post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, + 'options' => array( '0' => __( 'Show access restricted message', 'ultimate-member' ), '1' => __( 'Redirect user', 'ultimate-member' ), ), - 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ) + 'conditional' => array( '_um_access_hide_from_queries', '=', '0' ), ), array( - 'id' => '_um_restrict_by_custom_message', - 'type' => 'select', - 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), - 'tooltip' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', - 'options' => array( - '0' => __( 'Global default message (default)', 'ultimate-member' ), + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), + 'tooltip' => __( 'Action when users without access tries to view the post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', + 'options' => array( + '0' => __( 'Global default message', 'ultimate-member' ), '1' => __( 'Custom message', 'ultimate-member' ), ), - 'conditional' => array( '_um_noaccess_action', '=', '0' ) + 'conditional' => array( '_um_noaccess_action', '=', '0' ), ), array( - 'id' => '_um_restrict_custom_message', - 'type' => 'wp_editor', - 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), - 'tooltip' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', - 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'tooltip' => __( 'You may replace global restrict message here', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ), ), array( - 'id' => '_um_access_redirect', - 'type' => 'select', - 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), - 'tooltip' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', - 'conditional' => array( '_um_noaccess_action', '=', '1' ), - 'options' => array( + 'id' => '_um_access_redirect', + 'type' => 'select', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'tooltip' => __( 'Select redirect to page when user hasn\'t access to post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', + 'options' => array( '0' => __( 'Login page', 'ultimate-member' ), '1' => __( 'Custom URL', 'ultimate-member' ), ), + 'conditional' => array( '_um_noaccess_action', '=', '1' ), ), array( - 'id' => '_um_access_redirect_url', - 'type' => 'text', - 'label' => __( 'Redirect URL', 'ultimate-member' ), - 'tooltip' => __( 'Changed global restrict message', 'ultimate-member' ), - 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', - 'conditional' => array( '_um_access_redirect', '=', '1' ) + 'id' => '_um_access_redirect_url', + 'type' => 'text', + 'label' => __( 'Redirect URL', 'ultimate-member' ), + 'tooltip' => __( 'Set full URL where do you want to redirect the user', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', + 'conditional' => array( '_um_access_redirect', '=', '1' ), ), ), $data, $object, $post_type_object ); @@ -151,10 +152,13 @@ if ( ! defined( 'ABSPATH' ) ) exit; // ); // } - UM()->admin_forms( array( - 'class' => 'um-restrict-content um-third-column', - 'prefix_id' => 'um_content_restriction', - 'fields' => $fields - ) )->render_form(); ?> + UM()->admin_forms( + array( + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'fields' => $fields, + ) + )->render_form(); + ?>
diff --git a/includes/core/class-access.php b/includes/core/class-access.php index fac7225f..cafdc931 100644 --- a/includes/core/class-access.php +++ b/includes/core/class-access.php @@ -43,6 +43,11 @@ if ( ! class_exists( 'um\core\Access' ) ) { private $ignore_exclude = false; + /** + * @var bool|array + */ + private $exclude_posts = false; + /** * Access constructor. @@ -1264,137 +1269,157 @@ if ( ! class_exists( 'um\core\Access' ) ) { /** - * get array with restricted posts + * Get array with restricted posts * * @param bool $in_query * * @return array */ function exclude_posts_array( $in_query = true ) { - $exclude_posts = array(); - if ( current_user_can( 'administrator' ) ) { - return $exclude_posts; + if ( false !== $this->exclude_posts ) { + return $this->exclude_posts; } + $this->exclude_posts = array(); + if ( current_user_can( 'administrator' ) ) { + return $this->exclude_posts; + } + +/* $user_key = is_user_logged_in() ? 'logged_in_' . get_current_user_id() : 'not_logged_in'; + $cache_key = 'um_restrictions:post_ids' . $user_key; + + $exclude_posts_cache = wp_cache_get( $cache_key, 'ultimate-member' ); + + if ( false !== $exclude_posts_cache ) { + $exclude_posts = $exclude_posts_cache; + } else {*/ global $wpdb; - $posts = $wpdb->get_col("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'um_content_restriction'"); - foreach ( $posts as $post ) { - // handle every post privacy setting based on post type maybe it's inactive for now - // if individual restriction is enabled then get post terms restriction settings - $content_restriction = $this->get_post_privacy_settings( $post ); + $posts = $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'um_content_restriction'" ); + if ( ! empty( $posts ) ) { + foreach ( $posts as $post ) { + // handle every post privacy setting based on post type maybe it's inactive for now + // if individual restriction is enabled then get post terms restriction settings + $content_restriction = $this->get_post_privacy_settings( $post ); - if ( ! empty( $content_restriction['_um_custom_access_settings'] ) && $content_restriction['_um_accessible'] != '0' && ( false === $in_query || ! empty( $content_restriction['_um_access_hide_from_queries'] ) ) ) { - if ( $this->is_restricted( $post ) ) { - array_push( $exclude_posts, $post ); + if ( ! empty( $content_restriction['_um_custom_access_settings'] ) && $content_restriction['_um_accessible'] != '0' && + ( false === $in_query || ! empty( $content_restriction['_um_access_hide_from_queries'] ) ) ) { + if ( $this->is_restricted( $post ) ) { + array_push( $this->exclude_posts, $post ); + } } } } - // exclude all posts without individual restriction settings in the restricted terms $restricted_taxonomies = UM()->options()->get( 'restricted_access_taxonomy_metabox' ); - $terms = $wpdb->get_results("SELECT tm.term_id AS term_id, tm.meta_value AS meta_value, tt.taxonomy AS taxonomy FROM {$wpdb->termmeta} tm LEFT JOIN {$wpdb->term_taxonomy} tt ON tt.term_id = tm.term_id WHERE tm.meta_key = 'um_content_restriction'", ARRAY_A ); + if ( ! empty( $restricted_taxonomies ) ) { + $terms = $wpdb->get_results( "SELECT tm.term_id AS term_id, tm.meta_value AS meta_value, tt.taxonomy AS taxonomy FROM {$wpdb->termmeta} tm LEFT JOIN {$wpdb->term_taxonomy} tt ON tt.term_id = tm.term_id WHERE tm.meta_key = 'um_content_restriction'", ARRAY_A ); - if ( ! empty( $terms ) ) { - foreach ( $terms as $term ) { + if ( ! empty( $terms ) ) { + foreach ( $terms as $term ) { - if ( empty( $restricted_taxonomies[ $term['taxonomy'] ] ) ) { - continue; - } - - $meta_value = maybe_unserialize( $term['meta_value'] ); - - $is_restricted = false; - - if ( ! empty( $meta_value['_um_custom_access_settings'] ) ) { - - //post is private - if ( '0' == $meta_value['_um_accessible'] ) { + if ( empty( $restricted_taxonomies[ $term['taxonomy'] ] ) ) { continue; - } elseif ( '1' == $meta_value['_um_accessible'] ) { - //if post for not logged in users and user is not logged in - if ( ! is_user_logged_in() ) { - continue; - } else { - $is_restricted = true; - } + } - } elseif ( '2' == $meta_value['_um_accessible'] ) { - //if post for logged in users and user is not logged in - if ( is_user_logged_in() ) { - $custom_restrict = $this->um_custom_restriction( $meta_value ); - if ( empty( $meta_value['_um_access_roles'] ) || false === array_search( '1', $meta_value['_um_access_roles'] ) ) { - if ( $custom_restrict ) { - continue; + $meta_value = maybe_unserialize( $term['meta_value'] ); + + $is_restricted = false; + + if ( ! empty( $meta_value['_um_custom_access_settings'] ) ) { + + //post is private + if ( '0' == $meta_value['_um_accessible'] ) { + continue; + } elseif ( '1' == $meta_value['_um_accessible'] ) { + //if post for not logged in users and user is not logged in + if ( ! is_user_logged_in() ) { + continue; + } else { + $is_restricted = true; + } + + } elseif ( '2' == $meta_value['_um_accessible'] ) { + //if post for logged in users and user is not logged in + if ( is_user_logged_in() ) { + $custom_restrict = $this->um_custom_restriction( $meta_value ); + if ( empty( $meta_value['_um_access_roles'] ) || false === array_search( '1', $meta_value['_um_access_roles'] ) ) { + if ( $custom_restrict ) { + continue; + } else { + $is_restricted = true; + } } else { - $is_restricted = true; + $user_can = $this->user_can( get_current_user_id(), $meta_value['_um_access_roles'] ); + + if ( isset( $user_can ) && $user_can && $custom_restrict ) { + continue; + } else { + $is_restricted = true; + } } } else { - $user_can = $this->user_can( get_current_user_id(), $meta_value['_um_access_roles'] ); + $is_restricted = true; + } + } + } - if ( isset( $user_can ) && $user_can && $custom_restrict ) { - continue; - } else { - $is_restricted = true; + if ( $is_restricted && ( false === $in_query || ! empty( $meta_value['_um_access_hide_from_queries'] ) ) ) { + $posts = get_posts( + array( + 'fields' => 'ids', + 'post_status' => 'any', + 'numberposts' => -1, + 'tax_query' => array( + array( + 'taxonomy' => $term['taxonomy'], + 'field' => 'id', + 'terms' => $term['term_id'], + ), + ), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'relation' => 'AND', + array( + 'key' => 'um_content_restriction', + 'value' => 's:26:"_um_custom_access_settings";s:1:"1"', + 'compare' => 'NOT LIKE', + ), + array( + 'key' => 'um_content_restriction', + 'value' => 's:26:"_um_custom_access_settings";b:1', + 'compare' => 'NOT LIKE', + ), + ), + array( + 'key' => 'um_content_restriction', + 'compare' => 'NOT EXISTS', + ), + ), + ) + ); + + if ( ! empty( $posts ) ) { + foreach ( $posts as $post_id ) { + if ( $this->is_restricted( $post_id ) ) { + array_push( $this->exclude_posts, $post_id ); } } - } else { - $is_restricted = true; } } + } - - if ( $is_restricted && ( false === $in_query || ! empty( $meta_value['_um_access_hide_from_queries'] ) ) ) { - $posts = get_posts( - array( - 'fields' => 'ids', - 'post_status' => 'any', - 'numberposts' => -1, - 'tax_query' => array( - array( - 'taxonomy' => $term['taxonomy'], - 'field' => 'id', - 'terms' => $term['term_id'], - ), - ), - 'meta_query' => array( - 'relation' => 'OR', - array( - 'relation' => 'AND', - array( - 'key' => 'um_content_restriction', - 'value' => 's:26:"_um_custom_access_settings";s:1:"1"', - 'compare' => 'NOT LIKE', - ), - array( - 'key' => 'um_content_restriction', - 'value' => 's:26:"_um_custom_access_settings";b:1', - 'compare' => 'NOT LIKE', - ), - ), - array( - 'key' => 'um_content_restriction', - 'compare' => 'NOT EXISTS', - ), - ), - ) - ); - - if ( ! empty( $posts ) ) { - foreach ( $posts as $post_id ) { - if ( $this->is_restricted( $post_id ) ) { - array_push( $exclude_posts, $post_id ); - } - } - } - } - } } - return array_unique( $exclude_posts ); + $this->exclude_posts = array_unique( $this->exclude_posts ); + /*wp_cache_set( $cache_key, $exclude_posts, 'ultimate-member' ); + }*/ + + return $this->exclude_posts; }