PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 111105
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v111105
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 / includes / classes / querys.inc.php

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

368 lines 23.3 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 */
86 public static function query_level_access (&$wp_query = FALSE, $force = FALSE)
87 {
88 global $wpdb; /* Need this global DB object reference here. */
89 static $initial_query = true; /* Tracks the initial query. */
90 c_ws_plugin__s2member_querys::$current_wp_query = &$wp_query;
91 /**/
92 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
93 do_action ("ws_plugin__s2member_before_query_level_access", get_defined_vars ());
94 unset ($__refs, $__v); /* Unset defined __refs, __v. */
95 /**/
96 c_ws_plugin__s2member_querys::_query_level_access_sys ($wp_query); /* Systematics. */
97 /**/
98 remove_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
99 remove_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
100 /**/
101 if (is_object ($wpdb) && is_object ($wp_query) && (($o = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"]) || $force))
102 {
103 if (!is_admin () || c_ws_plugin__s2member_querys::_is_admin_ajax_search ($wp_query))
104 {
105 $suppressing_filters = $wp_query->get ("suppress_filters"); /* Filter suppression on? */
106 if (!$suppressing_filters && $force /* Forcing this routine bypasses all of these other conditionals. Works with API function ``attach_s2member_query_filters()``. */
107 || (!$suppressing_filters && in_array ("all", $o) && !($initial_query && $wp_query->is_singular ())) /* Don't create 404 errors. Allow Security Gate to handle these. */
108 || (!$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`? */
109 || (!$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? */
110 || (!$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? */
111 || (($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 ()))))/**/)
112 {
113 if (!$suppressing_filters && (in_array ("all", $o) || in_array ("comment-feeds", $o)) && $wp_query->is_feed () && $wp_query->is_comment_feed ())
114 add_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
115 /**/
116 if ($suppressing_filters !== "n/a" && (in_array ("all", $o) || in_array ("nav-menus", $o))) /* Suppression irrelevant here. */
117 if (in_array ("wp_get_nav_menu_items", ($callers = (isset ($callers) ? $callers : c_ws_plugin__s2member_utilities::callers ()))))
118 add_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
119 /**/
120 if ((is_user_logged_in () && is_object ($user = wp_get_current_user ()) && ($user_id = $user->ID)) || !($user = false))
121 {
122 if (!$user && ($lwp = (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]))
123 {
124 $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))));
125 $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))));
126 }
127 /**/
128 if (!$user && ($dep = (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"]))
129 {
130 $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))));
131 $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))));
132 }
133 /**/
134 if (is_array ($ccaps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_ccaps ($user)) && !empty ($ccaps))
135 {
136 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $ccaps)));
137 $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)));
138 }
139 /**/
140 if (is_array ($sps = c_ws_plugin__s2member_utils_gets::get_unavailable_singular_ids_with_sp ()) && !empty ($sps))
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")), $sps)));
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")), $sps)));
144 }
145 /**/
146 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Category Level Restrictions. */
147 {
148 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
149 {
150 $wp_query->set ("category__in", array ()); /* Include no other Categories. */
151 $wp_query->set ("category__not_in", ($catgs = c_ws_plugin__s2member_utils_gets::get_all_category_ids ()));
152 $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)))));
153 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $singulars)));
154 break; /* All Categories will be locked down. */
155 }
156 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
157 {
158 foreach (($catgs = preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_catgs"])) as $catg)
159 $catgs = array_merge ($catgs, c_ws_plugin__s2member_utils_gets::get_all_child_category_ids ($catg));
160 /**/
161 $wp_query->set ("category__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("category__in")), $catgs)));
162 $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)));
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 }
166 }
167 /**/
168 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Tag Level Restrictions. */
169 {
170 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
171 {
172 $wp_query->set ("tag__in", array ()); /* Include no other Tags. */
173 $wp_query->set ("tag__not_in", ($tags = c_ws_plugin__s2member_utils_gets::get_all_tag_ids ()));
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 ($tags)))));
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 break; /* ALL Tags will be locked down. */
177 }
178 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
179 {
180 $tags = c_ws_plugin__s2member_utils_gets::get_tags_converted_to_ids ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_ptags"]);
181 /**/
182 $wp_query->set ("tag__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("tag__in")), $tags)));
183 $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)));
184 $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)))));
185 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $singulars)));
186 }
187 }
188 /**/
189 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Post Level Restrictions. */
190 {
191 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
192 {
193 $wp_query->set ("post__in", array ()); /* Include no other Posts. */
194 $wp_query->set ("post__not_in", c_ws_plugin__s2member_utils_gets::get_all_post_ids ());
195 break; /* ALL Posts will be locked down. */
196 }
197 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
198 {
199 foreach (($posts = preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_posts"])) as $p)
200 if (strpos ($p, "all-") === 0 && preg_match ("/^all-(.+)$/", $p, $m) /* Protecting `all-` of a specific Post Type? */)
201 if (is_array ($p_of_type = c_ws_plugin__s2member_utils_gets::get_all_post_ids ($m[1])) && !empty ($p_of_type))
202 $posts = array_merge /* Merge all Posts of this Post Type. */ ($posts, $p_of_type);
203 unset /* A little housekeeping here. */ ($p, $m, $p_of_type);
204 /**/
205 $posts = array_unique ( /* Force integers. */c_ws_plugin__s2member_utils_arrays::force_integers ($posts));
206 /**/
207 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $posts)));
208 $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)));
209 }
210 }
211 /**/
212 for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) /* Page Level Restrictions. */
213 {
214 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] === "all" && (!$user || !current_user_can ("access_s2member_level" . $n)))
215 {
216 $wp_query->set ("post__in", array ()); /* Include no other Posts. */
217 $wp_query->set ("post__not_in", c_ws_plugin__s2member_utils_gets::get_all_page_ids ());
218 break; /* ALL Pages will be locked down. */
219 }
220 else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] && (!$user || !current_user_can ("access_s2member_level" . $n)))
221 {
222 $pages = c_ws_plugin__s2member_utils_arrays::force_integers (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"]));
223 /**/
224 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $pages)));
225 $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)));
226 }
227 }
228 }
229 /**/
230 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
231 do_action ("ws_plugin__s2member_during_query_level_access", get_defined_vars ());
232 unset ($__refs, $__v); /* Unset defined __refs, __v. */
233 }
234 }
235 }
236 /**/
237 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
238 do_action ("ws_plugin__s2member_after_query_level_access", get_defined_vars ());
239 unset ($__refs, $__v); /* Unset defined __refs, __v. */
240 /**/
241 $initial_query = false; /* No longer. */
242 /**/
243 return; /* For uniformity. */
244 }
245 /**
246 * Always filters Systematics in search results & feeds.
247 *
248 * s2Member respects the query var: `suppress_filters`.
249 * If you need to make a query without it being Filtered, use ``$wp_query->set ("suppress_filters", true);``.
250 *
251 * @package s2Member\Queries
252 * @since 3.5
253 *
254 * @param obj $wp_query Expects ``$wp_query`` by reference.
255 * @return null
256 */
257 public static function _query_level_access_sys (&$wp_query = FALSE)
258 {
259 global $wpdb; /* Need this global DB object reference here. */
260 /**/
261 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
262 do_action ("_ws_plugin__s2member_before_query_level_access_sys", get_defined_vars ());
263 unset ($__refs, $__v); /* Unset defined __refs, __v. */
264 /**/
265 if (is_object ($wpdb) && is_object ($wp_query) && !($suppressing_filters = $wp_query->get ("suppress_filters")))
266 if ((!is_admin () && ($wp_query->is_search () || $wp_query->is_feed ())) || c_ws_plugin__s2member_querys::_is_admin_ajax_search ($wp_query))
267 {
268 $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"]);
269 $s = $systematics = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($s);
270 /**/
271 $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)));
272 $wp_query->set ("post__in", array_unique (array_diff (c_ws_plugin__s2member_utils_arrays::force_integers ((array)$wp_query->get ("post__in")), $s)));
273 /**/
274 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
275 do_action ("_ws_plugin__s2member_during_query_level_access_sys", get_defined_vars ());
276 unset ($__refs, $__v); /* Unset defined __refs, __v. */
277 }
278 /**/
279 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
280 do_action ("_ws_plugin__s2member_after_query_level_access_sys", get_defined_vars ());
281 unset ($__refs, $__v); /* Unset defined __refs, __v. */
282 /**/
283 return; /* For uniformity. */
284 }
285 /**
286 * Filters WordPress® navigation menu items.
287 *
288 * @package s2Member\Queries
289 * @since 110912
290 *
291 * @attaches-to ``add_filter("wp_get_nav_menu_items");``
292 *
293 * @param array $items Expects an array of items to be passed through by the Filter.
294 * @return array The revised array of ``$items``.
295 */
296 public static function _query_level_access_navs ($items = FALSE)
297 {
298 global $wpdb; /* Need this global DB object reference here. */
299 $wp_query = &c_ws_plugin__s2member_querys::$current_wp_query;
300 /**/
301 if (is_array ($items) && !empty ($items) && is_object ($wpdb) && is_object ($wp_query) && $wp_query->get ("suppress_filters") !== "n/a")
302 {
303 $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"));
304 $x_ids = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($x_ids);
305 /**/
306 foreach ($items as $key => $item) /* Filter through all navigational menu ``$items``. We may need to exclude some of them. */
307 if (isset ($item->ID, $item->object_id) && /* And NOT defaulted to the ``$item->ID``. */ (int)$item->ID !== (int)$item->object_id)
308 if (in_array ($item->object_id, $x_ids)) /* If it is protected by query Filters, we need to exclude it. */
309 {
310 foreach ($items as $child_key => $child_item /* Loop back through all ``$items``, looking for children. */)
311 if (!empty ($child_item->menu_item_parent) && (int)$child_item->menu_item_parent === (int)$item->ID)
312 unset /* Remove this ``$child_item``, belonging to an excluded parent. */($items[$child_key]);
313 unset /* Exclude the parent ``$item`` now. */($items[$key]);
314 }
315 }
316 remove_filter ("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
317 return apply_filters ("_ws_plugin__s2member_query_level_access_navs", $items, get_defined_vars ());
318 }
319 /**
320 * Filters ``$cwhere`` query portion.
321 *
322 * @package s2Member\Queries
323 * @since 110912
324 *
325 * @attaches-to ``add_filter("comment_feed_where");``
326 *
327 * @param str $cwhere Expects the SQL `WHERE` portion to be passed through by the Filter.
328 * @param obj $wp_query Expects ``$wp_query`` by reference, from the Filter.
329 * @return str The revised ``$cwhere`` string.
330 */
331 public static function _query_level_access_coms ($cwhere = FALSE, &$wp_query = FALSE)
332 {
333 global $wpdb; /* Need this global DB object reference here. */
334 /**/
335 if (is_string ($cwhere) && is_object ($wpdb) && is_object ($wp_query) && !$wp_query->get ("suppress_filters"))
336 {
337 $x_terms = array_merge ((array)$wp_query->get ("category__not_in"), (array)$wp_query->get ("tag__not_in"));
338 $x_terms = array_unique (c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */ ($x_terms));
339 $x_singulars = /* Singulars. */ c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms ($x_terms);
340 /**/
341 $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode ("','", (array)$wp_query->get ("post__not_in")) . "')";
342 $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode ("','", $x_singulars) . "')";
343 }
344 remove_filter ("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
345 return apply_filters ("_ws_plugin__s2member_query_level_access_coms", $cwhere, get_defined_vars ());
346 }
347 /**
348 * AJAX search via `admin-ajax.php`?
349 *
350 * @package s2Member\Queries
351 * @since 110912
352 *
353 * @param obj $wp_query Expects ``$wp_query`` by reference.
354 * @return bool True if it's an AJAX search via `admin-ajax.php`, else false.
355 */
356 public static function _is_admin_ajax_search (&$wp_query = FALSE)
357 {
358 global $wpdb; /* Need this global DB object reference here. */
359 /**/
360 if (is_object ($wpdb) && is_object ($wp_query) && is_admin () && $wp_query->is_search ())
361 if (defined ("DOING_AJAX") && DOING_AJAX && !empty ($_REQUEST["action"]) && (did_action ("wp_ajax_nopriv_" . $_REQUEST["action"]) || did_action ("wp_ajax_" . $_REQUEST["action"])))
362 return apply_filters ("_ws_plugin__s2member_is_admin_ajax_search", true, get_defined_vars ());
363 /**/
364 return apply_filters ("_ws_plugin__s2member_is_admin_ajax_search", false, get_defined_vars ());
365 }
366 }
367 }
368 ?>