PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260829
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260829
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 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 260829, at src/includes/classes/querys.inc.php

441 lines 25.4 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 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.
59
60 c_ws_plugin__s2member_querys::query_level_access($wp_query, TRUE);
61
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.
65 }
66
67 /**
68 * Filter all WordPress queries.
69 *
70 * s2Member respects the query var: `suppress_filters`.
71 * If you need to make a query without it being Filtered, use ``$wp_query->set ('suppress_filters', true);``.
72 *
73 * @package s2Member\Queries
74 * @since 3.5
75 *
76 * @attaches-to ``add_action('pre_get_posts');``
77 *
78 * @param WP_Query $wp_query Expects ``$wp_query`` from the Filter.
79 * @param bool $force Optional. Defaults to false. If true, we bypass all standard conditions.
80 * However, s2Member will NEVER bypass `supress_filters`.
81 *
82 * @todo For improved reliability, modify other query vars associated with exclusions/inclusions. Like `tag_slug__in`?
83 * See: {@link http://codex.wordpress.org/Class_Reference/WP_Query#Parameters WP_Query#Parameters}
84 *
85 * @todo Make it possible to force filtering, even when used in combination with Query Conditionals and ``get_posts()``, which auto-supresses.
86 * Or, perhaps strengthen the existing ``$force`` parameter in this regard.
87 *
88 * @see Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4>
89 */
90 public static function query_level_access($wp_query = NULL, $force = FALSE)
91 {
92 global $wpdb; // Global DB object reference.
93
94 c_ws_plugin__s2member_querys::$current_wp_query = &$wp_query;
95
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.
99
100 if(is_object($wp_query) && !$wp_query->get('___s2_is_bbp_has_replies'))
101 // Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4>
102 c_ws_plugin__s2member_querys::_query_level_access_sys($wp_query); // Systematics.
103
104 remove_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2);
105 remove_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100);
106
107 if(is_object($wpdb) && is_object($wp_query) && (($o = $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']) || $force))
108 {
109 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> */)
110 {
111 $suppressing_filters = $wp_query->get('suppress_filters'); // Filter suppression on?
112
113 if((!$suppressing_filters && $force) // Forcing this routine bypasses all of these other conditionals. Works with API function ``attach_s2member_query_filters()``.
114 || (!$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.
115 || (!$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`?
116 || (!$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?
117 || (!$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?
118 || (($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()))))
119 )
120 {
121 if(!$suppressing_filters && (in_array('all', $o) || in_array('comment-feeds', $o)) && $wp_query->is_feed() && $wp_query->is_comment_feed())
122 add_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2);
123
124 if($suppressing_filters !== 'n/a' && (in_array('all', $o) || in_array('nav-menus', $o))) // Suppression irrelevant here.
125 if(in_array('wp_get_nav_menu_items', ($callers = (isset($callers) ? $callers : c_ws_plugin__s2member_utilities::callers()))))
126 add_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100);
127
128 if((is_user_logged_in() && is_object($user = wp_get_current_user()) && !empty($user->ID) && ($user_id = $user->ID)) || !($user = FALSE))
129 {
130 $bbpress_restrictions_enable = apply_filters('ws_plugin__s2member_bbpress_restrictions_enable', TRUE);
131 $bbpress_installed = c_ws_plugin__s2member_utils_conds::bbp_is_installed(); // bbPress is installed?
132 $bbpress_forum_post_type = $bbpress_installed ? bbp_get_forum_post_type() : ''; // Acquire the current post type for forums.
133 $bbpress_topic_post_type = $bbpress_installed ? bbp_get_topic_post_type() : ''; // Acquire the current post type for topics.
134
135 if(!$user && ($_lwp = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page']))
136 {
137 $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))));
138 $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))));
139 }
140 if(!$user && ($_dep = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page']))
141 {
142 $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))));
143 $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))));
144 }
145 if(is_array($_ccaps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_ccaps($user)) && !empty($_ccaps))
146 {
147 $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_ccaps)));
148 $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)));
149 }
150 if(is_array($_sps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_sp()) && !empty($_sps))
151 {
152 $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_sps)));
153 $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 }
155 unset($_lwp, $_dep, $_ccaps, $_sps); // A little housekeeping here. Ditch these temporary variables.
156
157 for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Category Level Restrictions.
158 {
159 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n)))
160 {
161 $wp_query->set('category__in', array()); // Include no other Categories.
162 $wp_query->set('category__not_in', ($_catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids()));
163 $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 $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 break; // All Categories will be locked down.
166 }
167 else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'] && (!$user || !current_user_can('access_s2member_level'.$n)))
168 {
169 foreach(($_catgs = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_catgs'])) as $_catg)
170 $_catgs = array_merge($_catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids($_catg));
171
172 $wp_query->set('category__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('category__in')), $_catgs)));
173 $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)));
174 $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)))));
175 $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars)));
176 }
177 }
178 unset($_catgs, $_catg, $_singulars); // A little housekeeping here. Ditch these temporary variables.
179
180 for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Tag Level Restrictions.
181 {
182 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n)))
183 {
184 $wp_query->set('tag__in', array()); // Include no other Tags.
185 $wp_query->set('tag__not_in', ($_tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids()));
186 $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 $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 break; // ALL Tags will be locked down.
189 }
190 else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags'] && (!$user || !current_user_can('access_s2member_level'.$n)))
191 {
192 $_tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_ptags']);
193
194 $wp_query->set('tag__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('tag__in')), $_tags)));
195 $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)));
196 $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)))));
197 $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_singulars)));
198 }
199 }
200 unset($_tags, $_tag, $_singulars); // A little housekeeping here. Ditch these temporary variables.
201
202 for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Post Level Restrictions.
203 {
204 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n)))
205 {
206 $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 $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 break; // ALL Posts will be locked down.
209 }
210 else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'] && (!$user || !current_user_can('access_s2member_level'.$n)))
211 {
212 foreach(($_posts = preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_posts'])) as $_p)
213 {
214 if(strpos($_p, 'all-') === 0 && preg_match('/^all-(.+?)$/', $_p, $_m)) // Protecting `all-` of a specific Post Type?
215 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))
216 $_posts = array_merge($_posts, $_p_of_type); // Merge all Posts of this Post Type.
217 }
218 if($bbpress_restrictions_enable && $bbpress_installed)
219 $_posts = array_merge($_posts, c_ws_plugin__s2member_utils_gets::get_all_child_post_ids($_posts, $bbpress_topic_post_type));
220 $_posts = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers($_posts)); // Force integers.
221
222 $wp_query->set('post__in', array_unique(array_diff(c_ws_plugin__s2member_utils_arrays::force_integers((array)$wp_query->get('post__in')), $_posts)));
223 $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)));
224 }
225 }
226 unset($_posts, $_p, $_m, $_p_of_type); // A little housekeeping here. Ditch these temporary variables.
227
228 for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Page Level Restrictions.
229 {
230 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && (!$user || !current_user_can('access_s2member_level'.$n)))
231 {
232 $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 $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 break; // ALL Pages will be locked down.
235 }
236 else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && (!$user || !current_user_can('access_s2member_level'.$n)))
237 {
238 $_pages = c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages']));
239
240 $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 $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 }
243 }
244 unset($_pages); // A little housekeeping here. Ditch these temporary variables.
245 }
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.
249 }
250 }
251 }
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.
255 }
256
257 /**
258 * Always filters Systematics in search results & feeds.
259 *
260 * s2Member respects the query var: `suppress_filters`.
261 * If you need to make a query without it being Filtered, use ``$wp_query->set ('suppress_filters', true);``.
262 *
263 * @package s2Member\Queries
264 * @since 3.5
265 *
266 * @param WP_Query $wp_query Expects ``$wp_query``.
267 */
268 public static function _query_level_access_sys($wp_query = NULL)
269 {
270 global $wpdb; // Global DB object reference.
271
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.
275
276 if(is_object($wpdb) && is_object($wp_query) && !($suppressing_filters = $wp_query->get('suppress_filters')))
277 if((!is_admin() && ($wp_query->is_search() || $wp_query->is_feed())) || c_ws_plugin__s2member_querys::_is_admin_ajax_search($wp_query))
278 {
279 $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']);
280 $s = $systematics = c_ws_plugin__s2member_utils_arrays::force_integers($s); // Force integer values here.
281
282 $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 $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
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.
288 }
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.
292 }
293
294 /**
295 * Filters WordPress navigation menu items.
296 *
297 * @package s2Member\Queries
298 * @since 110912
299 *
300 * @attaches-to ``add_filter('wp_get_nav_menu_items');``
301 *
302 * @param array $items Expects an array of items to be passed through by the Filter.
303 *
304 * @return array The revised array of ``$items``.
305 */
306 public static function _query_level_access_navs($items = array())
307 {
308 global $wpdb; // Global DB object reference.
309 $wp_query = &c_ws_plugin__s2member_querys::$current_wp_query;
310
311 if(is_array($items) && !empty($items) && is_object($wpdb) && is_object($wp_query) && $wp_query->get('suppress_filters') !== 'n/a')
312 {
313 $x_post_ids = (array)$wp_query->get('post__not_in');
314 $x_post_ids = c_ws_plugin__s2member_utils_arrays::force_integers($x_post_ids);
315
316 $x_taxonomy_ids = array_merge((array)$wp_query->get('category__not_in'), (array)$wp_query->get('tag__not_in'));
317 $x_taxonomy_ids = c_ws_plugin__s2member_utils_arrays::force_integers($x_taxonomy_ids);
318
319 foreach($items as $key => $item) // Filter through all navigational menu ``$items``.
320 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))
321 if(($item->type === 'post_type' && in_array($item->object_id, $x_post_ids)) || ($item->type === 'category' && in_array($item->object_id, $x_taxonomy_ids)))
322 {
323 foreach($items as $child_key => $child_item) // Loop back through all ``$items``, looking for children.
324 if(!empty($child_item->menu_item_parent) && (int)$child_item->menu_item_parent === (int)$item->ID)
325 unset($items[$child_key]); // Remove this ``$child_item``, belonging to an excluded parent.
326 unset($items[$key]); // Exclude the parent ``$item`` now.
327 }
328 }
329 remove_filter('wp_get_nav_menu_items', 'c_ws_plugin__s2member_querys::_query_level_access_navs', 100);
330
331 return apply_filters('_ws_plugin__s2member_query_level_access_navs', $items, get_defined_vars());
332 }
333
334 /**
335 * Filters ``$cwhere`` query portion.
336 *
337 * @package s2Member\Queries
338 * @since 110912
339 *
340 * @attaches-to ``add_filter('comment_feed_where');``
341 *
342 * @param string $cwhere Expects the SQL `WHERE` portion to be passed through by the Filter.
343 * @param WP_Query $wp_query Expects ``$wp_query`` from the Filter.
344 *
345 * @return string The revised ``$cwhere`` string.
346 */
347 public static function _query_level_access_coms($cwhere = '', $wp_query = NULL)
348 {
349 global $wpdb; // Global DB object reference.
350
351 if(is_string($cwhere) && is_object($wpdb) && is_object($wp_query) && !$wp_query->get('suppress_filters'))
352 {
353 $x_terms = array_merge((array)$wp_query->get('category__not_in'), (array)$wp_query->get('tag__not_in'));
354 $x_terms = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers($x_terms)); // Force integer values.
355 $x_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($x_terms); // Singulars.
356
357 $cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", (array)$wp_query->get('post__not_in'))."')";
358 $cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", $x_singulars)."')";
359 }
360 remove_filter('comment_feed_where', 'c_ws_plugin__s2member_querys::_query_level_access_coms', 100, 2);
361
362 return apply_filters('_ws_plugin__s2member_query_level_access_coms', $cwhere, get_defined_vars());
363 }
364
365 /**
366 * AJAX search via `admin-ajax.php`?
367 *
368 * @package s2Member\Queries
369 * @since 110912
370 *
371 * @param WP_Query $wp_query Expects ``$wp_query``.
372 *
373 * @return bool True if it's an AJAX search via `admin-ajax.php`, else false.
374 */
375 public static function _is_admin_ajax_search($wp_query = NULL)
376 {
377 global $wpdb; // Global DB object reference.
378
379 if(is_object($wpdb) && is_object($wp_query) && is_admin() && $wp_query->is_search())
380 if(defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['action']) && (did_action('wp_ajax_nopriv_'.$_REQUEST['action']) || did_action('wp_ajax_'.$_REQUEST['action'])))
381 return apply_filters('_ws_plugin__s2member_is_admin_ajax_search', TRUE, get_defined_vars());
382
383 return apply_filters('_ws_plugin__s2member_is_admin_ajax_search', FALSE, get_defined_vars());
384 }
385
386 /**
387 * Filters WordPress Page queries that use wp_list_pages()
388 *
389 * @package s2Member\Queries
390 * @since 130617
391 *
392 * @attaches-to ``add_filter('wp_list_pages_excludes');``
393 *
394 * @param array $excludes An array of any existing excludes.
395 *
396 * @return array The array of ``$excludes``.
397 */
398 public static function _query_level_access_list_pages($excludes = array())
399 {
400 if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']
401 || (!in_array('all', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'])
402 && !in_array('pages', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']))
403 ) return $excludes; // Not applicable.
404
405 $systematics = array(); // Initialize.
406 $systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page'];
407 if(!is_user_logged_in()) $systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'];
408 $systematics = c_ws_plugin__s2member_utils_arrays::force_integers($systematics); // Force integer values here.
409 $excludes = array_merge($excludes, $systematics);
410
411 for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) // Here we need to exclude any Page not available to the current user.
412 {
413 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] === 'all' && !current_user_can('access_s2member_level'.$n))
414 $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(c_ws_plugin__s2member_utils_gets::get_all_page_ids()));
415 else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_pages'] && !current_user_can('access_s2member_level'.$n))
416 $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'])));
417 }
418 return apply_filters('_ws_plugin__s2member_query_level_access_list_pages', $excludes, get_defined_vars());
419 }
420
421 /**
422 * Flags a WP Query has being a `bbp_has_replies()` query.
423 *
424 * @package s2Member\Queries
425 * @since 140906
426 *
427 * @attaches-to ``add_filter('bbp_has_replies_query');``
428 *
429 * @param array $args Query arguments passed by the filter.
430 *
431 * @return array The array of ``$args``.
432 *
433 * @see Workaround for bbPress and the `s` key. See: <http://bit.ly/1obLpv4>
434 */
435 public static function _bbp_flag_has_replies($args)
436 {
437 return array_merge($args, array('___s2_is_bbp_has_replies' => TRUE));
438 }
439 }
440 }
441