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

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