PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / trunk
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions vtrunk
260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 120219 120301 All 187 releases
s2member / src / includes / classes / querys.inc.php

querys.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions trunk, at src/includes/classes/querys.inc.php

433 lines 26.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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