| @@ -150,11 +150,13 @@ | ||
| 150 | 150 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), $_sps))); |
| 151 | 151 | } |
| 152 | 152 | unset($_lwp, $_dep, $_ccaps, $_sps); // A little housekeeping here. Ditch these temporary variables. |
| 153 | 153 | |
| 154 | + //260914.2132 Cache each Level capability result only for this query pass; Category/Tag/Post/Page restrictions can otherwise repeat the same `current_user_can()` check, while empty restriction settings still short-circuit without checking it. | |
| 155 | + $_level_access = array(); | |
| 154 | 156 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Category Level Restrictions. |
| 155 | 157 | { |
| 156 | - if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 158 | + if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] === 'all' && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 157 | 159 | { |
| 158 | 160 | $wp_query->set('category__in', array()); // Include no other Categories. |
| 159 | 161 | $wp_query->set('category__not_in', ($_catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids())); |
| 160 | 162 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), ($_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($_catgs))))); |
| @@ -160,9 +162,9 @@ | ||
| 160 | 162 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), ($_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($_catgs))))); |
| 161 | 163 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars))); |
| 162 | 164 | break; // All Categories will be locked down. |
| 163 | 165 | } |
| 164 | - else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 166 | + else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 165 | 167 | { |
| 166 | 168 | foreach(($_catgs = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'])) as $_catg) |
| 167 | 169 | $_catgs = array_merge($_catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids($_catg)); |
| 168 | 170 | |
| @@ -175,9 +177,9 @@ | ||
| 175 | 177 | unset($_catgs, $_catg, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 176 | 178 | |
| 177 | 179 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Tag Level Restrictions. |
| 178 | 180 | { |
| 179 | - if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 181 | + if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] === 'all' && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 180 | 182 | { |
| 181 | 183 | $wp_query->set('tag__in', array()); // Include no other Tags. |
| 182 | 184 | $wp_query->set('tag__not_in', ($_tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids())); |
| 183 | 185 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), ($_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($_tags))))); |
| @@ -183,9 +185,9 @@ | ||
| 183 | 185 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), ($_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($_tags))))); |
| 184 | 186 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars))); |
| 185 | 187 | break; // ALL Tags will be locked down. |
| 186 | 188 | } |
| 187 | - else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 189 | + else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 188 | 190 | { |
| 189 | 191 | $_tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags']); |
| 190 | 192 | |
| 191 | 193 | $wp_query->set('tag__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('tag__in')), $_tags))); |
| @@ -197,15 +199,15 @@ | ||
| 197 | 199 | unset($_tags, $_tag, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 198 | 200 | |
| 199 | 201 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Post Level Restrictions. |
| 200 | 202 | { |
| 201 | - if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 203 | + if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] === 'all' && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 202 | 204 | { |
| 203 | 205 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), ($_posts = c_ws_plugin__s2member_utils_gets::get_all_post_ids())))); |
| 204 | 206 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), $_posts))); |
| 205 | 207 | break; // ALL Posts will be locked down. |
| 206 | 208 | } |
| 207 | - else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 209 | + else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 208 | 210 | { |
| 209 | 211 | foreach(($_posts = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'])) as $_p) |
| 210 | 212 | { |
| 211 | 213 | if(strpos($_p, 'all-') === 0 && preg_match('/^all-(.+?)$/', $_p, $_m)) // Protecting `all-` of a specific Post Type? |
| @@ -223,15 +225,15 @@ | ||
| 223 | 225 | unset($_posts, $_p, $_m, $_p_of_type); // A little housekeeping here. Ditch these temporary variables. |
| 224 | 226 | |
| 225 | 227 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Page Level Restrictions. |
| 226 | 228 | { |
| 227 | - if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 229 | + if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 228 | 230 | { |
| 229 | 231 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), ($_pages = c_ws_plugin__s2member_utils_gets::get_all_page_ids())))); |
| 230 | 232 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), $_pages))); |
| 231 | 233 | break; // ALL Pages will be locked down. |
| 232 | 234 | } |
| 233 | - else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && (!$user || !current_user_can('access_s2member_level'.$n))) | |
| 235 | + else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && (!$user || !(isset($_level_access[$n]) ? $_level_access[$n] : ($_level_access[$n] = (bool)current_user_can('access_s2member_level'.$n))))) | |
| 234 | 236 | { |
| 235 | 237 | $_pages = c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'])); |
| 236 | 238 | |
| 237 | 239 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_pages))); |
| @@ -237,9 +239,9 @@ | ||
| 237 | 239 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_pages))); |
| 238 | 240 | $wp_query->set('post__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__not_in')), $_pages))); |
| 239 | 241 | } |
| 240 | 242 | } |
| 241 | - unset($_pages); // A little housekeeping here. Ditch these temporary variables. | |
| 243 | + unset($_pages, $_level_access); //260914.2132 Keep the per-pass Level capability cache out of the legacy `get_defined_vars()` hook context below. | |
| 242 | 244 | } |
| 243 | 245 | $_hook = 'ws_plugin__s2member_during_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 244 | 246 | { foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; do_action($_hook, get_defined_vars()); } unset($_hook, $__refs, $__v); //260901 Vars by reference. |
| 245 | 247 | } |