| @@ -52,17 +52,15 @@ | ||
| 52 | 52 | * @param WP_Query $wp_query Expects ``$wp_query``. |
| 53 | 53 | */ |
| 54 | 54 | public static function force_query_level_access($wp_query = NULL) |
| 55 | 55 | { |
| 56 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 57 | - do_action('ws_plugin__s2member_before_force_query_level_access', get_defined_vars()); | |
| 58 | - unset($__refs, $__v); // Housekeeping. | |
| 56 | + $_hook = 'ws_plugin__s2member_before_force_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 57 | + { 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. | |
| 59 | 58 | |
| 60 | 59 | c_ws_plugin__s2member_querys::query_level_access($wp_query, TRUE); |
| 61 | 60 | |
| 62 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 63 | - do_action('ws_plugin__s2member_after_force_query_level_access', get_defined_vars()); | |
| 64 | - unset($__refs, $__v); // Housekeeping. | |
| 61 | + $_hook = 'ws_plugin__s2member_after_force_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 62 | + { 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. | |
| 65 | 63 | } |
| 66 | 64 | |
| 67 | 65 | /** |
| 68 | 66 | * Filter all WordPress queries. |
| @@ -92,11 +90,10 @@ | ||
| 92 | 90 | global $wpdb; // Global DB object reference. |
| 93 | 91 | |
| 94 | 92 | c_ws_plugin__s2member_querys::$current_wp_query = &$wp_query; |
| 95 | 93 | |
| 96 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 97 | - do_action('ws_plugin__s2member_before_query_level_access', get_defined_vars()); | |
| 98 | - unset($__refs, $__v); // Housekeeping. | |
| 94 | + $_hook = 'ws_plugin__s2member_before_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 95 | + { 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. | |
| 99 | 96 | |
| 100 | 97 | if(is_object($wp_query) && !$wp_query->get('___s2_is_bbp_has_replies')) |
| 101 | 98 | // Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4> |
| 102 | 99 | c_ws_plugin__s2member_querys::_query_level_access_sys($wp_query); // Systematics. |
| @@ -153,11 +150,13 @@ | ||
| 153 | 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))); |
| 154 | 151 | } |
| 155 | 152 | unset($_lwp, $_dep, $_ccaps, $_sps); // A little housekeeping here. Ditch these temporary variables. |
| 156 | 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(); | |
| 157 | 156 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Category Level Restrictions. |
| 158 | 157 | { |
| 159 | - 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))))) | |
| 160 | 159 | { |
| 161 | 160 | $wp_query->set('category__in', array()); // Include no other Categories. |
| 162 | 161 | $wp_query->set('category__not_in', ($_catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids())); |
| 163 | 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))))); |
| @@ -163,9 +162,9 @@ | ||
| 163 | 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))))); |
| 164 | 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))); |
| 165 | 164 | break; // All Categories will be locked down. |
| 166 | 165 | } |
| 167 | - 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))))) | |
| 168 | 167 | { |
| 169 | 168 | foreach(($_catgs = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'])) as $_catg) |
| 170 | 169 | $_catgs = array_merge($_catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids($_catg)); |
| 171 | 170 | |
| @@ -178,9 +177,9 @@ | ||
| 178 | 177 | unset($_catgs, $_catg, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 179 | 178 | |
| 180 | 179 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Tag Level Restrictions. |
| 181 | 180 | { |
| 182 | - 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))))) | |
| 183 | 182 | { |
| 184 | 183 | $wp_query->set('tag__in', array()); // Include no other Tags. |
| 185 | 184 | $wp_query->set('tag__not_in', ($_tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids())); |
| 186 | 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))))); |
| @@ -186,9 +185,9 @@ | ||
| 186 | 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))))); |
| 187 | 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))); |
| 188 | 187 | break; // ALL Tags will be locked down. |
| 189 | 188 | } |
| 190 | - 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))))) | |
| 191 | 190 | { |
| 192 | 191 | $_tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags']); |
| 193 | 192 | |
| 194 | 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))); |
| @@ -200,15 +199,15 @@ | ||
| 200 | 199 | unset($_tags, $_tag, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 201 | 200 | |
| 202 | 201 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Post Level Restrictions. |
| 203 | 202 | { |
| 204 | - 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))))) | |
| 205 | 204 | { |
| 206 | 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())))); |
| 207 | 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))); |
| 208 | 207 | break; // ALL Posts will be locked down. |
| 209 | 208 | } |
| 210 | - 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))))) | |
| 211 | 210 | { |
| 212 | 211 | foreach(($_posts = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'])) as $_p) |
| 213 | 212 | { |
| 214 | 213 | if(strpos($_p, 'all-') === 0 && preg_match('/^all-(.+?)$/', $_p, $_m)) // Protecting `all-` of a specific Post Type? |
| @@ -226,15 +225,15 @@ | ||
| 226 | 225 | unset($_posts, $_p, $_m, $_p_of_type); // A little housekeeping here. Ditch these temporary variables. |
| 227 | 226 | |
| 228 | 227 | for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Page Level Restrictions. |
| 229 | 228 | { |
| 230 | - 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))))) | |
| 231 | 230 | { |
| 232 | 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())))); |
| 233 | 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))); |
| 234 | 233 | break; // ALL Pages will be locked down. |
| 235 | 234 | } |
| 236 | - 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))))) | |
| 237 | 236 | { |
| 238 | 237 | $_pages = c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'])); |
| 239 | 238 | |
| 240 | 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))); |
| @@ -240,19 +239,17 @@ | ||
| 240 | 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))); |
| 241 | 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))); |
| 242 | 241 | } |
| 243 | 242 | } |
| 244 | - 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. | |
| 245 | 244 | } |
| 246 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 247 | - do_action('ws_plugin__s2member_during_query_level_access', get_defined_vars()); | |
| 248 | - unset($__refs, $__v); // Housekeeping. | |
| 245 | + $_hook = 'ws_plugin__s2member_during_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 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. | |
| 249 | 247 | } |
| 250 | 248 | } |
| 251 | 249 | } |
| 252 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 253 | - do_action('ws_plugin__s2member_after_query_level_access', get_defined_vars()); | |
| 254 | - unset($__refs, $__v); // Housekeeping. | |
| 250 | + $_hook = 'ws_plugin__s2member_after_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 251 | + { 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. | |
| 255 | 252 | } |
| 256 | 253 | |
| 257 | 254 | /** |
| 258 | 255 | * Always filters Systematics in search results & feeds. |
| @@ -268,11 +265,10 @@ | ||
| 268 | 265 | public static function _query_level_access_sys($wp_query = NULL) |
| 269 | 266 | { |
| 270 | 267 | global $wpdb; // Global DB object reference. |
| 271 | 268 | |
| 272 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 273 | - do_action('_ws_plugin__s2member_before_query_level_access_sys', get_defined_vars()); | |
| 274 | - unset($__refs, $__v); // Housekeeping. | |
| 269 | + $_hook = '_ws_plugin__s2member_before_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 270 | + { 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. | |
| 275 | 271 | |
| 276 | 272 | if(is_object($wpdb) && is_object($wp_query) && !($suppressing_filters = $wp_query->get('suppress_filters'))) |
| 277 | 273 | if((!is_admin() && ($wp_query->is_search() || $wp_query->is_feed())) || c_ws_plugin__s2member_querys::_is_admin_ajax_search($wp_query)) |
| 278 | 274 | { |
| @@ -281,15 +277,13 @@ | ||
| 281 | 277 | |
| 282 | 278 | $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')), $s))); |
| 283 | 279 | $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $s))); |
| 284 | 280 | |
| 285 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 286 | - do_action('_ws_plugin__s2member_during_query_level_access_sys', get_defined_vars()); | |
| 287 | - unset($__refs, $__v); // Housekeeping. | |
| 281 | + $_hook = '_ws_plugin__s2member_during_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 282 | + { 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. | |
| 288 | 283 | } |
| 289 | - foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v; | |
| 290 | - do_action('_ws_plugin__s2member_after_query_level_access_sys', get_defined_vars()); | |
| 291 | - unset($__refs, $__v); // Housekeeping. | |
| 284 | + $_hook = '_ws_plugin__s2member_after_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) | |
| 285 | + { 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. | |
| 292 | 286 | } |
| 293 | 287 | |
| 294 | 288 | /** |
| 295 | 289 | * Filters WordPress navigation menu items. |