| 1 |
<?php |
| 2 |
// @codingStandardsIgnoreFile |
| 3 |
/** |
| 4 |
* Query protection routines. |
| 5 |
* |
| 6 |
* Copyright: © 2009-2011 |
| 7 |
* {@link http://websharks-inc.com/ WebSharks, Inc.} |
| 8 |
* (coded in the USA) |
| 9 |
* |
| 10 |
* Released under the terms of the GNU General Public License. |
| 11 |
* You should have received a copy of the GNU General Public License, |
| 12 |
* along with this software. In the main directory, see: /licensing/ |
| 13 |
* If not, see: {@link http://www.gnu.org/licenses/}. |
| 14 |
* |
| 15 |
* @package s2Member\Queries |
| 16 |
* @since 3.5 |
| 17 |
*/ |
| 18 |
if(!defined('WPINC')) // MUST have WordPress. |
| 19 |
exit('Do not access this file directly.'); |
| 20 |
|
| 21 |
if(!class_exists('c_ws_plugin__s2member_querys')) |
| 22 |
{ |
| 23 |
/** |
| 24 |
* Query protection routines. |
| 25 |
* |
| 26 |
* @package s2Member\Queries |
| 27 |
* @since 3.5 |
| 28 |
*/ |
| 29 |
class c_ws_plugin__s2member_querys |
| 30 |
{ |
| 31 |
/** |
| 32 |
* The current WordPress query object reference. |
| 33 |
* |
| 34 |
* @package s2Member\Queries |
| 35 |
* @since 110912 |
| 36 |
* |
| 37 |
* @var null|object |
| 38 |
*/ |
| 39 |
public static $current_wp_query; |
| 40 |
|
| 41 |
/** |
| 42 |
* Forces query Filters *(on-demand)*. |
| 43 |
* |
| 44 |
* s2Member respects the query var: `suppress_filters`. |
| 45 |
* If you need to make a query without it being Filtered, use ``$wp_query->set ('suppress_filters', true);``. |
| 46 |
* |
| 47 |
* @package s2Member\Queries |
| 48 |
* @since 3.5 |
| 49 |
* |
| 50 |
* @attaches-to ``add_action('pre_get_posts');`` |
| 51 |
* |
| 52 |
* @param WP_Query $wp_query Expects ``$wp_query``. |
| 53 |
*/ |
| 54 |
public static function force_query_level_access($wp_query = NULL) |
| 55 |
{ |
| 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. |
| 58 |
|
| 59 |
c_ws_plugin__s2member_querys::query_level_access($wp_query, TRUE); |
| 60 |
|
| 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. |
| 63 |
} |
| 64 |
|
| 65 |
/** |
| 66 |
* Filter all WordPress queries. |
| 67 |
* |
| 68 |
* s2Member respects the query var: `suppress_filters`. |
| 69 |
* If you need to make a query without it being Filtered, use ``$wp_query->set ('suppress_filters', true);``. |
| 70 |
* |
| 71 |
* @package s2Member\Queries |
| 72 |
* @since 3.5 |
| 73 |
* |
| 74 |
* @attaches-to ``add_action('pre_get_posts');`` |
| 75 |
* |
| 76 |
* @param WP_Query $wp_query Expects ``$wp_query`` from the Filter. |
| 77 |
* @param bool $force Optional. Defaults to false. If true, we bypass all standard conditions. |
| 78 |
* However, s2Member will NEVER bypass `supress_filters`. |
| 79 |
* |
| 80 |
* @todo For improved reliability, modify other query vars associated with exclusions/inclusions. Like `tag_slug__in`? |
| 81 |
* See: {@link http://codex.wordpress.org/Class_Reference/WP_Query#Parameters WP_Query#Parameters} |
| 82 |
* |
| 83 |
* @todo Make it possible to force filtering, even when used in combination with Query Conditionals and ``get_posts()``, which auto-supresses. |
| 84 |
* Or, perhaps strengthen the existing ``$force`` parameter in this regard. |
| 85 |
* |
| 86 |
* @see Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4> |
| 87 |
*/ |
| 88 |
public static function query_level_access($wp_query = NULL, $force = FALSE) |
| 89 |
{ |
| 90 |
global $wpdb; // Global DB object reference. |
| 91 |
|
| 92 |
c_ws_plugin__s2member_querys::$current_wp_query = &$wp_query; |
| 93 |
|
| 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. |
| 96 |
|
| 97 |
if(is_object($wp_query) && !$wp_query->get('___s2_is_bbp_has_replies')) |
| 98 |
// Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4> |
| 99 |
c_ws_plugin__s2member_querys::_query_level_access_sys($wp_query); // Systematics. |
| 100 |
|
| 101 |
remove_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2); |
| 102 |
remove_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100); |
| 103 |
|
| 104 |
if(is_object($wpdb) && is_object($wp_query) && (($o = $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']) || $force)) |
| 105 |
{ |
| 106 |
if((!is_admin() || c_ws_plugin__s2member_querys::_is_admin_ajax_search($wp_query)) && !$wp_query->get('___s2_is_bbp_has_replies') /* See: <http://bit.ly/1obLpv4> */) |
| 107 |
{ |
| 108 |
$suppressing_filters = $wp_query->get('suppress_filters'); // Filter suppression on? |
| 109 |
|
| 110 |
if((!$suppressing_filters && $force) // Forcing this routine bypasses all of these other conditionals. Works with API function ``attach_s2member_query_filters()``. |
| 111 |
|| (!$suppressing_filters && in_array('all', $o) && !($wp_query->is_main_query() && $wp_query->is_singular())) // Don't create 404 errors. Allow Security Gate to handle these. |
| 112 |
|| (!$suppressing_filters && (in_array('all', $o) || in_array('searches', $o)) && $wp_query->is_search()) // Or, is this a search results query, possibly via AJAX: `admin-ajax.php`? |
| 113 |
|| (!$suppressing_filters && (in_array('all', $o) || in_array('feeds', $o)) && $wp_query->is_feed() && !$wp_query->is_comment_feed()) // Or, is this a feed; and it's NOT for comments? |
| 114 |
|| (!$suppressing_filters && (in_array('all', $o) || in_array('comment-feeds', $o)) && $wp_query->is_feed() && $wp_query->is_comment_feed()) // Or, is this a feed; and it IS indeed for comments? |
| 115 |
|| (($suppressing_filters !== 'n/a') && (in_array('all', $o) || in_array('nav-menus', $o)) && in_array('wp_get_nav_menu_items', ($callers = (isset($callers) ? $callers : c_ws_plugin__s2member_utilities::callers())))) |
| 116 |
) |
| 117 |
{ |
| 118 |
if(!$suppressing_filters && (in_array('all', $o) || in_array('comment-feeds', $o)) && $wp_query->is_feed() && $wp_query->is_comment_feed()) |
| 119 |
add_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2); |
| 120 |
|
| 121 |
if($suppressing_filters !== 'n/a' && (in_array('all', $o) || in_array('nav-menus', $o))) // Suppression irrelevant here. |
| 122 |
if(in_array('wp_get_nav_menu_items', ($callers = (isset($callers) ? $callers : c_ws_plugin__s2member_utilities::callers())))) |
| 123 |
add_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100); |
| 124 |
|
| 125 |
if((is_user_logged_in() && is_object($user = wp_get_current_user()) && !empty($user->ID) && ($user_id = $user->ID)) || !($user = FALSE)) |
| 126 |
{ |
| 127 |
$bbpress_restrictions_enable = apply_filters('ws_plugin__s2member_bbpress_restrictions_enable', TRUE); |
| 128 |
$bbpress_installed = c_ws_plugin__s2member_utils_conds::bbp_is_installed(); // bbPress is installed? |
| 129 |
$bbpress_forum_post_type = $bbpress_installed ? bbp_get_forum_post_type() : ''; // Acquire the current post type for forums. |
| 130 |
$bbpress_topic_post_type = $bbpress_installed ? bbp_get_topic_post_type() : ''; // Acquire the current post type for topics. |
| 131 |
|
| 132 |
if(!$user && ($_lwp = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'])) |
| 133 |
{ |
| 134 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), array($_lwp)))); |
| 135 |
$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')), array($_lwp)))); |
| 136 |
} |
| 137 |
if(!$user && ($_dep = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page'])) |
| 138 |
{ |
| 139 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), array($_dep)))); |
| 140 |
$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')), array($_dep)))); |
| 141 |
} |
| 142 |
if(is_array($_ccaps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_ccaps($user)) && !empty($_ccaps)) |
| 143 |
{ |
| 144 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_ccaps))); |
| 145 |
$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')), $_ccaps))); |
| 146 |
} |
| 147 |
if(is_array($_sps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_sp()) && !empty($_sps)) |
| 148 |
{ |
| 149 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_sps))); |
| 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 |
} |
| 152 |
unset($_lwp, $_dep, $_ccaps, $_sps); // A little housekeeping here. Ditch these temporary variables. |
| 153 |
|
| 154 |
for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Category Level Restrictions. |
| 155 |
{ |
| 156 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 157 |
{ |
| 158 |
$wp_query->set('category__in', array()); // Include no other Categories. |
| 159 |
$wp_query->set('category__not_in', ($_catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids())); |
| 160 |
$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 |
$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 |
break; // All Categories will be locked down. |
| 163 |
} |
| 164 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 165 |
{ |
| 166 |
foreach(($_catgs = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'])) as $_catg) |
| 167 |
$_catgs = array_merge($_catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids($_catg)); |
| 168 |
|
| 169 |
$wp_query->set('category__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('category__in')), $_catgs))); |
| 170 |
$wp_query->set('category__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('category__not_in')), $_catgs))); |
| 171 |
$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))))); |
| 172 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars))); |
| 173 |
} |
| 174 |
} |
| 175 |
unset($_catgs, $_catg, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 176 |
|
| 177 |
for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Tag Level Restrictions. |
| 178 |
{ |
| 179 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 180 |
{ |
| 181 |
$wp_query->set('tag__in', array()); // Include no other Tags. |
| 182 |
$wp_query->set('tag__not_in', ($_tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids())); |
| 183 |
$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 |
$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 |
break; // ALL Tags will be locked down. |
| 186 |
} |
| 187 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 188 |
{ |
| 189 |
$_tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags']); |
| 190 |
|
| 191 |
$wp_query->set('tag__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('tag__in')), $_tags))); |
| 192 |
$wp_query->set('tag__not_in', array_unique(array_merge(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('tag__not_in')), $_tags))); |
| 193 |
$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))))); |
| 194 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars))); |
| 195 |
} |
| 196 |
} |
| 197 |
unset($_tags, $_tag, $_singulars); // A little housekeeping here. Ditch these temporary variables. |
| 198 |
|
| 199 |
for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Post Level Restrictions. |
| 200 |
{ |
| 201 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 202 |
{ |
| 203 |
$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 |
$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 |
break; // ALL Posts will be locked down. |
| 206 |
} |
| 207 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 208 |
{ |
| 209 |
foreach(($_posts = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'])) as $_p) |
| 210 |
{ |
| 211 |
if(strpos($_p, 'all-') === 0 && preg_match('/^all-(.+?)$/', $_p, $_m)) // Protecting `all-` of a specific Post Type? |
| 212 |
if((is_array($_p_of_type = c_ws_plugin__s2member_utils_gets::get_all_post_ids($_m[1])) || (substr($_m[1], -1) === 's' && is_array($_p_of_type = c_ws_plugin__s2member_utils_gets::get_all_post_ids(substr($_m[1], 0, -1))))) && !empty($_p_of_type)) |
| 213 |
$_posts = array_merge($_posts, $_p_of_type); // Merge all Posts of this Post Type. |
| 214 |
} |
| 215 |
if($bbpress_restrictions_enable && $bbpress_installed) |
| 216 |
$_posts = array_merge($_posts, c_ws_plugin__s2member_utils_gets::get_all_child_post_ids($_posts, $bbpress_topic_post_type)); |
| 217 |
$_posts = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers($_posts)); // Force integers. |
| 218 |
|
| 219 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_posts))); |
| 220 |
$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))); |
| 221 |
} |
| 222 |
} |
| 223 |
unset($_posts, $_p, $_m, $_p_of_type); // A little housekeeping here. Ditch these temporary variables. |
| 224 |
|
| 225 |
for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Page Level Restrictions. |
| 226 |
{ |
| 227 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 228 |
{ |
| 229 |
$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 |
$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 |
break; // ALL Pages will be locked down. |
| 232 |
} |
| 233 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && (!$user || !current_user_can('access_s2member_level'.$n))) |
| 234 |
{ |
| 235 |
$_pages = c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'])); |
| 236 |
|
| 237 |
$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 |
$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 |
} |
| 240 |
} |
| 241 |
unset($_pages); // A little housekeeping here. Ditch these temporary variables. |
| 242 |
} |
| 243 |
$_hook = 'ws_plugin__s2member_during_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 244 |
{ 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 |
} |
| 246 |
} |
| 247 |
} |
| 248 |
$_hook = 'ws_plugin__s2member_after_query_level_access'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 249 |
{ 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. |
| 250 |
} |
| 251 |
|
| 252 |
/** |
| 253 |
* Always filters Systematics in search results & feeds. |
| 254 |
* |
| 255 |
* s2Member respects the query var: `suppress_filters`. |
| 256 |
* If you need to make a query without it being Filtered, use ``$wp_query->set ('suppress_filters', true);``. |
| 257 |
* |
| 258 |
* @package s2Member\Queries |
| 259 |
* @since 3.5 |
| 260 |
* |
| 261 |
* @param WP_Query $wp_query Expects ``$wp_query``. |
| 262 |
*/ |
| 263 |
public static function _query_level_access_sys($wp_query = NULL) |
| 264 |
{ |
| 265 |
global $wpdb; // Global DB object reference. |
| 266 |
|
| 267 |
$_hook = '_ws_plugin__s2member_before_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 268 |
{ 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. |
| 269 |
|
| 270 |
if(is_object($wpdb) && is_object($wp_query) && !($suppressing_filters = $wp_query->get('suppress_filters'))) |
| 271 |
if((!is_admin() && ($wp_query->is_search() || $wp_query->is_feed())) || c_ws_plugin__s2member_querys::_is_admin_ajax_search($wp_query)) |
| 272 |
{ |
| 273 |
$s = $systematics = array($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_options_page'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page']); |
| 274 |
$s = $systematics = c_ws_plugin__s2member_utils_arrays::force_integers($s); // Force integer values here. |
| 275 |
|
| 276 |
$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))); |
| 277 |
$wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $s))); |
| 278 |
|
| 279 |
$_hook = '_ws_plugin__s2member_during_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 280 |
{ 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. |
| 281 |
} |
| 282 |
$_hook = '_ws_plugin__s2member_after_query_level_access_sys'; if (isset($GLOBALS['wp_filter'][$_hook]) || isset($GLOBALS['wp_filter']['all'])) |
| 283 |
{ 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. |
| 284 |
} |
| 285 |
|
| 286 |
/** |
| 287 |
* Filters WordPress navigation menu items. |
| 288 |
* |
| 289 |
* @package s2Member\Queries |
| 290 |
* @since 110912 |
| 291 |
* |
| 292 |
* @attaches-to ``add_filter('wp_get_nav_menu_items');`` |
| 293 |
* |
| 294 |
* @param array $items Expects an array of items to be passed through by the Filter. |
| 295 |
* |
| 296 |
* @return array The revised array of ``$items``. |
| 297 |
*/ |
| 298 |
public static function _query_level_access_navs($items = array()) |
| 299 |
{ |
| 300 |
global $wpdb; // Global DB object reference. |
| 301 |
$wp_query = &c_ws_plugin__s2member_querys::$current_wp_query; |
| 302 |
|
| 303 |
if(is_array($items) && !empty($items) && is_object($wpdb) && is_object($wp_query) && $wp_query->get('suppress_filters') !== 'n/a') |
| 304 |
{ |
| 305 |
$x_post_ids = (array)$wp_query->get('post__not_in'); |
| 306 |
$x_post_ids = c_ws_plugin__s2member_utils_arrays::force_integers($x_post_ids); |
| 307 |
|
| 308 |
$x_taxonomy_ids = array_merge((array)$wp_query->get('category__not_in'), (array)$wp_query->get('tag__not_in')); |
| 309 |
$x_taxonomy_ids = c_ws_plugin__s2member_utils_arrays::force_integers($x_taxonomy_ids); |
| 310 |
|
| 311 |
foreach($items as $key => $item) // Filter through all navigational menu ``$items``. |
| 312 |
if(isset($item->ID, $item->object_id, $item->type) && (int)$item->ID !== (int)$item->object_id && in_array($item->type, array('post_type', 'category'), TRUE)) |
| 313 |
if(($item->type === 'post_type' && in_array($item->object_id, $x_post_ids)) || ($item->type === 'category' && in_array($item->object_id, $x_taxonomy_ids))) |
| 314 |
{ |
| 315 |
foreach($items as $child_key => $child_item) // Loop back through all ``$items``, looking for children. |
| 316 |
if(!empty($child_item->menu_item_parent) && (int)$child_item->menu_item_parent === (int)$item->ID) |
| 317 |
unset($items[$child_key]); // Remove this ``$child_item``, belonging to an excluded parent. |
| 318 |
unset($items[$key]); // Exclude the parent ``$item`` now. |
| 319 |
} |
| 320 |
} |
| 321 |
remove_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100); |
| 322 |
|
| 323 |
return apply_filters('_ws_plugin__s2member_query_level_access_navs', $items, get_defined_vars()); |
| 324 |
} |
| 325 |
|
| 326 |
/** |
| 327 |
* Filters ``$cwhere`` query portion. |
| 328 |
* |
| 329 |
* @package s2Member\Queries |
| 330 |
* @since 110912 |
| 331 |
* |
| 332 |
* @attaches-to ``add_filter('comment_feed_where');`` |
| 333 |
* |
| 334 |
* @param string $cwhere Expects the SQL `WHERE` portion to be passed through by the Filter. |
| 335 |
* @param WP_Query $wp_query Expects ``$wp_query`` from the Filter. |
| 336 |
* |
| 337 |
* @return string The revised ``$cwhere`` string. |
| 338 |
*/ |
| 339 |
public static function _query_level_access_coms($cwhere = '', $wp_query = NULL) |
| 340 |
{ |
| 341 |
global $wpdb; // Global DB object reference. |
| 342 |
|
| 343 |
if(is_string($cwhere) && is_object($wpdb) && is_object($wp_query) && !$wp_query->get('suppress_filters')) |
| 344 |
{ |
| 345 |
$x_terms = array_merge((array)$wp_query->get('category__not_in'), (array)$wp_query->get('tag__not_in')); |
| 346 |
$x_terms = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers($x_terms)); // Force integer values. |
| 347 |
$x_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($x_terms); // Singulars. |
| 348 |
|
| 349 |
$cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", (array)$wp_query->get('post__not_in'))."')"; |
| 350 |
$cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", $x_singulars)."')"; |
| 351 |
} |
| 352 |
remove_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2); |
| 353 |
|
| 354 |
return apply_filters('_ws_plugin__s2member_query_level_access_coms', $cwhere, get_defined_vars()); |
| 355 |
} |
| 356 |
|
| 357 |
/** |
| 358 |
* AJAX search via `admin-ajax.php`? |
| 359 |
* |
| 360 |
* @package s2Member\Queries |
| 361 |
* @since 110912 |
| 362 |
* |
| 363 |
* @param WP_Query $wp_query Expects ``$wp_query``. |
| 364 |
* |
| 365 |
* @return bool True if it's an AJAX search via `admin-ajax.php`, else false. |
| 366 |
*/ |
| 367 |
public static function _is_admin_ajax_search($wp_query = NULL) |
| 368 |
{ |
| 369 |
global $wpdb; // Global DB object reference. |
| 370 |
|
| 371 |
if(is_object($wpdb) && is_object($wp_query) && is_admin() && $wp_query->is_search()) |
| 372 |
if(defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['action']) && (did_action('wp_ajax_nopriv_'.$_REQUEST['action']) || did_action('wp_ajax_'.$_REQUEST['action']))) |
| 373 |
return apply_filters('_ws_plugin__s2member_is_admin_ajax_search', TRUE, get_defined_vars()); |
| 374 |
|
| 375 |
return apply_filters('_ws_plugin__s2member_is_admin_ajax_search', FALSE, get_defined_vars()); |
| 376 |
} |
| 377 |
|
| 378 |
/** |
| 379 |
* Filters WordPress Page queries that use wp_list_pages() |
| 380 |
* |
| 381 |
* @package s2Member\Queries |
| 382 |
* @since 130617 |
| 383 |
* |
| 384 |
* @attaches-to ``add_filter('wp_list_pages_excludes');`` |
| 385 |
* |
| 386 |
* @param array $excludes An array of any existing excludes. |
| 387 |
* |
| 388 |
* @return array The array of ``$excludes``. |
| 389 |
*/ |
| 390 |
public static function _query_level_access_list_pages($excludes = array()) |
| 391 |
{ |
| 392 |
if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'] |
| 393 |
|| (!in_array('all', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']) |
| 394 |
&& !in_array('pages', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'])) |
| 395 |
) return $excludes; // Not applicable. |
| 396 |
|
| 397 |
$systematics = array(); // Initialize. |
| 398 |
$systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page']; |
| 399 |
if(!is_user_logged_in()) $systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page']; |
| 400 |
$systematics = c_ws_plugin__s2member_utils_arrays::force_integers($systematics); // Force integer values here. |
| 401 |
$excludes = array_merge($excludes, $systematics); |
| 402 |
|
| 403 |
for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Here we need to exclude any Page not available to the current user. |
| 404 |
{ |
| 405 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && !current_user_can('access_s2member_level'.$n)) |
| 406 |
$excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(c_ws_plugin__s2member_utils_gets::get_all_page_ids())); |
| 407 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && !current_user_can('access_s2member_level'.$n)) |
| 408 |
$excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages']))); |
| 409 |
} |
| 410 |
return apply_filters('_ws_plugin__s2member_query_level_access_list_pages', $excludes, get_defined_vars()); |
| 411 |
} |
| 412 |
|
| 413 |
/** |
| 414 |
* Flags a WP Query has being a `bbp_has_replies()` query. |
| 415 |
* |
| 416 |
* @package s2Member\Queries |
| 417 |
* @since 140906 |
| 418 |
* |
| 419 |
* @attaches-to ``add_filter('bbp_has_replies_query');`` |
| 420 |
* |
| 421 |
* @param array $args Query arguments passed by the filter. |
| 422 |
* |
| 423 |
* @return array The array of ``$args``. |
| 424 |
* |
| 425 |
* @see Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4> |
| 426 |
*/ |
| 427 |
public static function _bbp_flag_has_replies($args) |
| 428 |
{ |
| 429 |
return array_merge($args, array('___s2_is_bbp_has_replies' => TRUE)); |
| 430 |
} |
| 431 |
} |
| 432 |
} |
| 433 |
|