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

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

374 lines 24.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Query protection routines.
4 *
5 * Copyright: © 2009-2011
6 * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7 * ( coded in the USA )
8 *
9 * Released under the terms of the GNU General Public License.
10 * You should have received a copy of the GNU General Public License,
11 * along with this software. In the main directory, see: /licensing/
12 * If not, see: {@link http://www.gnu.org/licenses/}.
13 *
14 * @package s2Member\Queries
15 * @since 3.5
16 */
17 if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18 exit ("Do not access this file directly.");
19 /**/
20 if (!class_exists ("c_ws_plugin__s2member_querys"))
21 {
22 /**
23 * Query protection routines.
24 *
25 * @package s2Member\Queries
26 * @since 3.5
27 */
28 class c_ws_plugin__s2member_querys
29 {
30 /**
31 * The current WordPress® query object reference.
32 *
33 * @package s2Member\Queries
34 * @since 110912
35 *
36 * @var null|obj
37 */
38 public static $current_wp_query;
39 /**
40 * Forces query Filters *( on-demand )*.
41 *
42 * s2Member respects the query var: `suppress_filters`.
43 * If you need to make a query without it being Filtered, use ``$wp_query->set ("suppress_filters", true);``.
44 *
45 * @package s2Member\Queries
46 * @since 3.5
47 *
48 * @attaches-to ``add_action("pre_get_posts");``
49 *
50 * @param obj $wp_query Expects ``$wp_query`` by reference.
51 * @return null
52 */
53 public static function force_query_level_access (&$wp_query = FALSE)
54 {
55 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
56 do_action ("ws_plugin__s2member_before_force_query_level_access", get_defined_vars ());
57 unset ($__refs, $__v); /* Unset defined __refs, __v. */
58 /**/
59 c_ws_plugin__s2member_querys::query_level_access ($wp_query, true);
60 /**/
61 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
62 do_action ("ws_plugin__s2member_after_force_query_level_access", get_defined_vars ());
63 unset ($__refs, $__v); /* Unset defined __refs, __v. */
64 /**/
65 return; /* For uniformity. */
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 obj $wp_query Expects ``$wp_query`` by reference, 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 * @return null
82 *
83 * @todo For improved reliability, modify other query vars associated with exclusions/inclusions. Like `tag_slug__in`?
84 * See: {@link http://codex.wordpress.org/Class_Reference/WP_Query#Parameters WP_Query#Parameters}
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 public static function query_level_access (&$wp_query = FALSE, $force = FALSE)
89 {
90 global $wpdb; /* Need this global DB object reference here. */
91 static $initial_query = true; /* Tracks the initial query. */
92 c_ws_plugin__s2member_querys::$current_wp_query = &$wp_query;
93 /**/
94 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
95 do_action ("ws_plugin__s2member_before_query_level_access", get_defined_vars ());
96 unset ($__refs, $__v); /* Unset defined __refs, __v. */
97 /**/
98 c_ws_plugin__s2member_querys::_query_level_access_sys ($wp_query); /* Systematics. */
99 /**/
100 remove_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
101 remove_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
102 /**/
103 if (is_object ($wpdb) && is_object ($wp_query) && (($o = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"]) || $force))
104 {
105 if (!is_admin () || c_ws_plugin__s2member_querys::_is_admin_ajax_search ($wp_query))
106 {
107 $suppressing_filters = $wp_query->get ("suppress_filters"); /* Filter suppression on? */
108 if (!$suppressing_filters && $force /* Forcing this routine bypasses all of these other conditionals. Works with API function ``attach_s2member_query_filters()``. */
109 || (!$suppressing_filters && in_array ("all", $o) && !($initial_query && $wp_query->is_singular ())) /* Don't create 404 errors. Allow Security Gate to handle these. */
110 || (!$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`? */
111 || (!$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? */
112 || (!$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? */
113 || (($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 ()))))/**/)
114 {
115 if (!$suppressing_filters && (in_array ("all", $o) || in_array ("comment-feeds", $o)) && $wp_query->is_feed () && $wp_query->is_comment_feed ())
116 add_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
117 /**/
118 if ($suppressing_filters !== "n/a" && (in_array ("all", $o) || in_array ("nav-menus", $o))) /* Suppression irrelevant here. */
119 if (in_array ("wp_get_nav_menu_items", ($callers = (isset ($callers) ? $callers : c_ws_plugin__s2member_utilities::callers ()))))
120 add_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
121 /**/
122 if ((is_user_logged_in () && is_object ($user = wp_get_current_user ()) && !empty ($user->ID) && ($user_id = $user->ID)) || !($user = false))
123 {
124 if (!$user && ($_lwp = (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]))
125 {
126 $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))));
127 $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))));
128 }
129 /**/
130 if (!$user && ($_dep = (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"]))
131 {
132 $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))));
133 $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))));
134 }
135 /**/
136 if (is_array ($_ccaps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_ccaps ($user)) && !empty ($_ccaps))
137 {
138 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_ccaps)));
139 $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)));
140 }
141 /**/
142 if (is_array ($_sps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_sp ()) && !empty ($_sps))
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")), $_sps)));
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")), $_sps)));
146 }
147 unset /* A little housekeeping here. Ditch these temporary variables. */ ($_lwp, $_dep, $_ccaps, $_sps);
148 /**/
149 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Category Level Restrictions. */
150 {
151 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
152 {
153 $wp_query->set ("category__in", array ()); /* Include no other Categories. */
154 $wp_query->set ("category__not_in", ($_catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids ()));
155 $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)))));
156 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_singulars)));
157 break; /* All Categories will be locked down. */
158 }
159 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
160 {
161 foreach (($_catgs = preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"])) as $_catg)
162 $_catgs = array_merge ($_catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids ($_catg));
163 /**/
164 $wp_query->set ("category__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("category__in")), $_catgs)));
165 $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)));
166 $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)))));
167 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_singulars)));
168 }
169 }
170 unset /* A little housekeeping here. Ditch these temporary variables. */ ($_catgs, $_catg, $_singulars);
171 /**/
172 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Tag Level Restrictions. */
173 {
174 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
175 {
176 $wp_query->set ("tag__in", array ()); /* Include no other Tags. */
177 $wp_query->set ("tag__not_in", ($_tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids ()));
178 $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)))));
179 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_singulars)));
180 break; /* ALL Tags will be locked down. */
181 }
182 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
183 {
184 $_tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"]);
185 /**/
186 $wp_query->set ("tag__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("tag__in")), $_tags)));
187 $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)));
188 $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)))));
189 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_singulars)));
190 }
191 }
192 unset /* A little housekeeping here. Ditch these temporary variables. */ ($_tags, $_tag, $_singulars);
193 /**/
194 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Post Level Restrictions. */
195 {
196 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
197 {
198 $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 ()))));
199 $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)));
200 break; /* ALL Posts will be locked down. */
201 }
202 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
203 {
204 foreach (($_posts = preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"])) as $_p)
205 if (strpos ($_p, "all-") === 0 && preg_match ("/^all-(.+)$/", $_p, $_m) /* Protecting `all-` of a specific Post Type? */)
206 if (is_array ($_p_of_type = c_ws_plugin__s2member_utils_gets::get_all_post_ids ($_m[1])) && !empty ($_p_of_type))
207 $_posts = array_merge /* Merge all Posts of this Post Type. */ ($_posts, $_p_of_type);
208 /**/
209 $_posts = array_unique ( /* Force integers. */c_ws_plugin__s2member_utils_arrays::force_integers ($_posts));
210 /**/
211 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $_posts)));
212 $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)));
213 }
214 }
215 unset /* A little housekeeping here. Ditch these temporary variables. */ ($_posts, $_p, $_m, $_p_of_type);
216 /**/
217 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Page Level Restrictions. */
218 {
219 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
220 {
221 $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 ()))));
222 $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)));
223 break; /* ALL Pages will be locked down. */
224 }
225 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
226 {
227 $_pages = c_ws_plugin__s2member_utils_arrays::force_integers (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"]));
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)));
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 }
232 }
233 unset /* A little housekeeping here. Ditch these temporary variables. */ ($_pages);
234 }
235 /**/
236 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
237 do_action ("ws_plugin__s2member_during_query_level_access", get_defined_vars ());
238 unset ($__refs, $__v); /* Unset defined __refs, __v. */
239 }
240 }
241 }
242 /**/
243 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
244 do_action ("ws_plugin__s2member_after_query_level_access", get_defined_vars ());
245 unset ($__refs, $__v); /* Unset defined __refs, __v. */
246 /**/
247 $initial_query = false; /* No longer. */
248 /**/
249 return; /* For uniformity. */
250 }
251 /**
252 * Always filters Systematics in search results & feeds.
253 *
254 * s2Member respects the query var: `suppress_filters`.
255 * If you need to make a query without it being Filtered, use ``$wp_query->set ("suppress_filters", true);``.
256 *
257 * @package s2Member\Queries
258 * @since 3.5
259 *
260 * @param obj $wp_query Expects ``$wp_query`` by reference.
261 * @return null
262 */
263 public static function _query_level_access_sys (&$wp_query = FALSE)
264 {
265 global $wpdb; /* Need this global DB object reference here. */
266 /**/
267 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
268 do_action ("_ws_plugin__s2member_before_query_level_access_sys", get_defined_vars ());
269 unset ($__refs, $__v); /* Unset defined __refs, __v. */
270 /**/
271 if (is_object ($wpdb) && is_object ($wp_query) && !($suppressing_filters = $wp_query->get ("suppress_filters")))
272 if ((!is_admin () && ($wp_query->is_search () || $wp_query->is_feed ())) || c_ws_plugin__s2member_querys::_is_admin_ajax_search ($wp_query))
273 {
274 $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"]);
275 $s = $systematics = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($s);
276 /**/
277 $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)));
278 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $s)));
279 /**/
280 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
281 do_action ("_ws_plugin__s2member_during_query_level_access_sys", get_defined_vars ());
282 unset ($__refs, $__v); /* Unset defined __refs, __v. */
283 }
284 /**/
285 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
286 do_action ("_ws_plugin__s2member_after_query_level_access_sys", get_defined_vars ());
287 unset ($__refs, $__v); /* Unset defined __refs, __v. */
288 /**/
289 return; /* For uniformity. */
290 }
291 /**
292 * Filters WordPress® navigation menu items.
293 *
294 * @package s2Member\Queries
295 * @since 110912
296 *
297 * @attaches-to ``add_filter("wp_get_nav_menu_items");``
298 *
299 * @param array $items Expects an array of items to be passed through by the Filter.
300 * @return array The revised array of ``$items``.
301 */
302 public static function _query_level_access_navs ($items = FALSE)
303 {
304 global $wpdb; /* Need this global DB object reference here. */
305 $wp_query = &c_ws_plugin__s2member_querys::$current_wp_query;
306 /**/
307 if (is_array ($items) && !empty ($items) && is_object ($wpdb) && is_object ($wp_query) && $wp_query->get ("suppress_filters") !== "n/a")
308 {
309 $x_ids = array_merge ((array)$wp_query->get ("post__not_in"), (array)$wp_query->get ("category__not_in"), (array)$wp_query->get ("tag__not_in"));
310 $x_ids = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($x_ids);
311 /**/
312 foreach ($items as $key => $item) /* Filter through all navigational menu ``$items``. We may need to exclude some of them. */
313 if (isset ($item->ID, $item->object_id) && /* And NOT defaulted to the ``$item->ID``. */ (int)$item->ID !== (int)$item->object_id)
314 if (in_array ($item->object_id, $x_ids)) /* If it is protected by query Filters, we need to exclude it. */
315 {
316 foreach ($items as $child_key => $child_item /* Loop back through all ``$items``, looking for children. */)
317 if (!empty ($child_item->menu_item_parent) && (int)$child_item->menu_item_parent === (int)$item->ID)
318 unset /* Remove this ``$child_item``, belonging to an excluded parent. */ ($items[$child_key]);
319 unset /* Exclude the parent ``$item`` now. */ ($items[$key]);
320 }
321 }
322 remove_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
323 return apply_filters ("_ws_plugin__s2member_query_level_access_navs", $items, get_defined_vars ());
324 }
325 /**
326 * Filters ``$cwhere`` query portion.
327 *
328 * @package s2Member\Queries
329 * @since 110912
330 *
331 * @attaches-to ``add_filter("comment_feed_where");``
332 *
333 * @param str $cwhere Expects the SQL `WHERE` portion to be passed through by the Filter.
334 * @param obj $wp_query Expects ``$wp_query`` by reference, from the Filter.
335 * @return str The revised ``$cwhere`` string.
336 */
337 public static function _query_level_access_coms ($cwhere = FALSE, &$wp_query = FALSE)
338 {
339 global $wpdb; /* Need this global DB object reference here. */
340 /**/
341 if (is_string ($cwhere) && is_object ($wpdb) && is_object ($wp_query) && !$wp_query->get ("suppress_filters"))
342 {
343 $x_terms = array_merge ((array)$wp_query->get ("category__not_in"), (array)$wp_query->get ("tag__not_in"));
344 $x_terms = array_unique (c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($x_terms));
345 $x_singulars = /* Singulars. */ c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms ($x_terms);
346 /**/
347 $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode ("','", (array)$wp_query->get ("post__not_in")) . "')";
348 $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode ("','", $x_singulars) . "')";
349 }
350 remove_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
351 return apply_filters ("_ws_plugin__s2member_query_level_access_coms", $cwhere, get_defined_vars ());
352 }
353 /**
354 * AJAX search via `admin-ajax.php`?
355 *
356 * @package s2Member\Queries
357 * @since 110912
358 *
359 * @param obj $wp_query Expects ``$wp_query`` by reference.
360 * @return bool True if it's an AJAX search via `admin-ajax.php`, else false.
361 */
362 public static function _is_admin_ajax_search (&$wp_query = FALSE)
363 {
364 global $wpdb; /* Need this global DB object reference here. */
365 /**/
366 if (is_object ($wpdb) && is_object ($wp_query) && is_admin () && $wp_query->is_search ())
367 if (defined ("DOING_AJAX") && DOING_AJAX && !empty ($_REQUEST["action"]) && (did_action ("wp_ajax_nopriv_" . $_REQUEST["action"]) || did_action ("wp_ajax_" . $_REQUEST["action"])))
368 return apply_filters ("_ws_plugin__s2member_is_admin_ajax_search", true, get_defined_vars ());
369 /**/
370 return apply_filters ("_ws_plugin__s2member_is_admin_ajax_search", false, get_defined_vars ());
371 }
372 }
373 }
374 ?>