s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) - Version 121201

Version Description

= v121201 = Maintenance release. Upgrade immediately.

Download this release

Release Info

Developer PriMoThemes
Plugin Icon 128x128 s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members)
Version 121201
Comparing to
See all releases

Code changes from version 121023 to 121201

includes/classes/querys.inc.php CHANGED
@@ -14,10 +14,10 @@
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.
@@ -50,17 +50,17 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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
  }
@@ -85,164 +85,164 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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
  /**/
@@ -260,31 +260,31 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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
  }
@@ -299,28 +299,31 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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.
@@ -334,21 +337,21 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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`?
@@ -359,15 +362,15 @@ if (!class_exists ("c_ws_plugin__s2member_querys"))
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
  }
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.
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
  }
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
  /**/
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
  }
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_post_ids = (array)$wp_query->get("post__not_in");
310
+ $x_post_ids = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */($x_post_ids);
311
  /**/
312
+ $x_taxonomy_ids = array_merge((array)$wp_query->get("category__not_in"), (array)$wp_query->get("tag__not_in"));
313
+ $x_taxonomy_ids = c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */($x_taxonomy_ids);
314
+ /**/
315
+ foreach($items as $key => $item) /* Filter through all navigational menu ``$items``. */
316
+ 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))
317
+ if(($item->type === "post_type" && in_array($item->object_id, $x_post_ids)) || ($item->type === "category" && in_array($item->object_id, $x_taxonomy_ids)))
318
  {
319
+ foreach($items as $child_key => $child_item /* Loop back through all ``$items``, looking for children. */)
320
+ if(!empty($child_item->menu_item_parent) && (int)$child_item->menu_item_parent === (int)$item->ID)
321
+ unset /* Remove this ``$child_item``, belonging to an excluded parent. */($items[$child_key]);
322
+ unset /* Exclude the parent ``$item`` now. */($items[$key]);
323
  }
324
  }
325
+ remove_filter("wp_get_nav_menu_items", "c_ws_plugin__s2member_querys::_query_level_access_navs", 100);
326
+ return apply_filters("_ws_plugin__s2member_query_level_access_navs", $items, get_defined_vars());
327
  }
328
  /**
329
  * Filters ``$cwhere`` query portion.
337
  * @param obj $wp_query Expects ``$wp_query`` by reference, from the Filter.
338
  * @return str The revised ``$cwhere`` string.
339
  */
340
+ public static function _query_level_access_coms($cwhere = FALSE, &$wp_query = FALSE)
341
  {
342
  global $wpdb; /* Need this global DB object reference here. */
343
  /**/
344
+ if(is_string($cwhere) && is_object($wpdb) && is_object($wp_query) && !$wp_query->get("suppress_filters"))
345
  {
346
+ $x_terms = array_merge((array)$wp_query->get("category__not_in"), (array)$wp_query->get("tag__not_in"));
347
+ $x_terms = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers /* Force integer values here. */($x_terms));
348
+ $x_singulars = /* Singulars. */ c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($x_terms);
349
  /**/
350
+ $cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", (array)$wp_query->get("post__not_in"))."')";
351
+ $cwhere .= " AND `".$wpdb->comments."`.`comment_post_ID` NOT IN('".implode("','", $x_singulars)."')";
352
  }
353
+ remove_filter("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
354
+ return apply_filters("_ws_plugin__s2member_query_level_access_coms", $cwhere, get_defined_vars());
355
  }
356
  /**
357
  * AJAX search via `admin-ajax.php`?
362
  * @param obj $wp_query Expects ``$wp_query`` by reference.
363
  * @return bool True if it's an AJAX search via `admin-ajax.php`, else false.
364
  */
365
+ public static function _is_admin_ajax_search(&$wp_query = FALSE)
366
  {
367
  global $wpdb; /* Need this global DB object reference here. */
368
  /**/
369
+ if(is_object($wpdb) && is_object($wp_query) && is_admin() && $wp_query->is_search())
370
+ if(defined("DOING_AJAX") && DOING_AJAX && !empty($_REQUEST["action"]) && (did_action("wp_ajax_nopriv_".$_REQUEST["action"]) || did_action("wp_ajax_".$_REQUEST["action"])))
371
+ return apply_filters("_ws_plugin__s2member_is_admin_ajax_search", true, get_defined_vars());
372
  /**/
373
+ return apply_filters("_ws_plugin__s2member_is_admin_ajax_search", false, get_defined_vars());
374
  }
375
  }
376
  }
includes/classes/roles-caps.inc.php CHANGED
@@ -46,15 +46,23 @@ if(!class_exists("c_ws_plugin__s2member_roles_caps"))
46
  {
47
  c_ws_plugin__s2member_roles_caps::unlink_roles();
48
  /**/
49
- if(function_exists("bbp_get_caps_for_role"))
50
- foreach(bbp_get_caps_for_role("subscriber") as $bbp_cap)
51
- $bbp_caps[$bbp_cap] = true;
 
 
 
 
 
 
 
 
52
  /**/
53
  if(0 === 0) /* Subscriber Role is required by s2Member. */
54
  {
55
  $caps = array("read" => true, "level_0" => true);
56
  $caps = array_merge($caps, array("access_s2member_level0" => true));
57
- $caps = (!empty($bbp_caps)) ? array_merge($caps, $bbp_caps) : $caps;
58
  /**/
59
  if(!($role = &get_role("subscriber")))
60
  {
@@ -70,7 +78,7 @@ if(!class_exists("c_ws_plugin__s2member_roles_caps"))
70
  {
71
  for($i = 0, $caps = array("read" => true, "level_0" => true); $i <= $n; $i++)
72
  $caps = array_merge($caps, array("access_s2member_level".$i => true));
73
- $caps = (!empty($bbp_caps)) ? array_merge($caps, $bbp_caps) : $caps;
74
  /**/
75
  if(!($role = &get_role("s2member_level".$n)))
76
  {
@@ -82,7 +90,12 @@ if(!class_exists("c_ws_plugin__s2member_roles_caps"))
82
  $role->add_cap($cap);
83
  }
84
  /**/
85
- foreach(array("administrator", "editor", "author", "contributor", "bbp_moderator") as $role)
 
 
 
 
 
86
  {
87
  if(($role = &get_role($role)))
88
  for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
@@ -95,6 +108,31 @@ if(!class_exists("c_ws_plugin__s2member_roles_caps"))
95
  return; /* Return for uniformity. */
96
  }
97
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  * Unlinks Roles/Capabilities.
99
  *
100
  * @package s2Member\Roles_Caps
@@ -114,7 +152,12 @@ if(!class_exists("c_ws_plugin__s2member_roles_caps"))
114
  for($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["max_levels"]; $n++)
115
  remove_role("s2member_level".$n);
116
  /**/
117
- foreach(array("administrator", "editor", "author", "contributor", "bbp_moderator") as $role)
 
 
 
 
 
118
  {
119
  if(($role = &get_role($role)))
120
  for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["max_levels"]; $n++)
46
  {
47
  c_ws_plugin__s2member_roles_caps::unlink_roles();
48
  /**/
49
+ if(function_exists("bbp_get_dynamic_roles") /* bbPress® v2.2+ integration. */)
50
+ {
51
+ foreach(bbp_get_caps_for_role(bbp_get_participant_role()) as $bbp_participant_cap => $bbp_participant_cap_is)
52
+ if($bbp_participant_cap_is /* Is this capability enabled? */)
53
+ $bbp_participant_caps[$bbp_participant_cap] = true;
54
+ }
55
+ else if(function_exists("bbp_get_caps_for_role") /* bbPress® < v2.2 integration. */)
56
+ {
57
+ foreach(bbp_get_caps_for_role(bbp_get_participant_role()) as $bbp_participant_cap)
58
+ $bbp_participant_caps[$bbp_participant_cap] = true;
59
+ }
60
  /**/
61
  if(0 === 0) /* Subscriber Role is required by s2Member. */
62
  {
63
  $caps = array("read" => true, "level_0" => true);
64
  $caps = array_merge($caps, array("access_s2member_level0" => true));
65
+ $caps = (!empty($bbp_participant_caps)) ? array_merge($caps, $bbp_participant_caps) : $caps;
66
  /**/
67
  if(!($role = &get_role("subscriber")))
68
  {
78
  {
79
  for($i = 0, $caps = array("read" => true, "level_0" => true); $i <= $n; $i++)
80
  $caps = array_merge($caps, array("access_s2member_level".$i => true));
81
+ $caps = (!empty($bbp_participant_caps)) ? array_merge($caps, $bbp_participant_caps) : $caps;
82
  /**/
83
  if(!($role = &get_role("s2member_level".$n)))
84
  {
90
  $role->add_cap($cap);
91
  }
92
  /**/
93
+ $full_access_roles = array("administrator", "editor", "author", "contributor");
94
+ /**/
95
+ if(function_exists("bbp_get_caps_for_role") && !function_exists("bbp_get_dynamic_roles") /* bbPress® < v2.2 integration. */)
96
+ $full_access_roles = array_merge($full_access_roles, (array)bbp_get_moderator_role());
97
+ /**/
98
+ foreach($full_access_roles as $role)
99
  {
100
  if(($role = &get_role($role)))
101
  for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
108
  return; /* Return for uniformity. */
109
  }
110
  /**
111
+ * Adds support for bbPress® v2.2+ dynamic roles.
112
+ *
113
+ * @package s2Member\Roles_Caps
114
+ * @since 112512
115
+ *
116
+ * @attaches-to ``add_filter("bbp_get_caps_for_role");``
117
+ *
118
+ * @return array
119
+ */
120
+ public static function bbp_dynamic_role_caps($caps = FALSE, $role = FALSE)
121
+ {
122
+ if(function_exists("bbp_get_dynamic_roles") && $role !== bbp_get_blocked_role())
123
+ {
124
+ $caps = array_merge($caps, array("read" => true, "level_0" => true));
125
+ $caps = array_merge($caps, array("access_s2member_level0" => true));
126
+ /**/
127
+ if(in_array($role, array(bbp_get_keymaster_role(), bbp_get_moderator_role()), TRUE))
128
+ {
129
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
130
+ $caps = array_merge($caps, array("access_s2member_level".$n => true));
131
+ }
132
+ }
133
+ return /* Dynamic capabilities. */ $caps;
134
+ }
135
+ /**
136
  * Unlinks Roles/Capabilities.
137
  *
138
  * @package s2Member\Roles_Caps
152
  for($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["max_levels"]; $n++)
153
  remove_role("s2member_level".$n);
154
  /**/
155
+ $full_access_roles = array("administrator", "editor", "author", "contributor");
156
+ /**/
157
+ if(function_exists("bbp_get_caps_for_role") && !function_exists("bbp_get_dynamic_roles") /* bbPress® < v2.2 integration. */)
158
+ $full_access_roles = array_merge($full_access_roles, (array)bbp_get_moderator_role());
159
+ /**/
160
+ foreach($full_access_roles as $role)
161
  {
162
  if(($role = &get_role($role)))
163
  for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["max_levels"]; $n++)
includes/hooks.inc.php CHANGED
@@ -168,6 +168,7 @@ add_action("ws_plugin__s2member_during_collective_eots", "c_ws_plugin__s2member_
168
  /**/
169
  add_filter("ws_plugin__s2member_content_redirect_status", "c_ws_plugin__s2member_utils_urls::redirect_browsers_using_302_status");
170
  /**/
 
171
  add_action("bbp_activation", "c_ws_plugin__s2member_roles_caps::config_roles", 11);
172
  /*
173
  Register the activation | de-activation routines.
168
  /**/
169
  add_filter("ws_plugin__s2member_content_redirect_status", "c_ws_plugin__s2member_utils_urls::redirect_browsers_using_302_status");
170
  /**/
171
+ add_filter("bbp_get_caps_for_role", "c_ws_plugin__s2member_roles_caps::bbp_dynamic_role_caps", 10, 2);
172
  add_action("bbp_activation", "c_ws_plugin__s2member_roles_caps::config_roles", 11);
173
  /*
174
  Register the activation | de-activation routines.
includes/menu-pages/integrations.inc.php CHANGED
@@ -14,10 +14,10 @@
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
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_menu_page_integrations"))
21
  {
22
  /**
23
  * Menu page for the s2Member plugin ( Integrations page ).
@@ -27,61 +27,70 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_integrations"))
27
  */
28
  class c_ws_plugin__s2member_menu_page_integrations
29
  {
30
- public function __construct ()
31
  {
32
- echo '<div class="wrap ws-menu-page">' . "\n";
33
  /**/
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>Other s2Member® Integrations</h2>' . "\n";
36
  /**/
37
- echo '<table class="ws-menu-page-table">' . "\n";
38
- echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
39
- echo '<tr class="ws-menu-page-table-tr">' . "\n";
40
- echo '<td class="ws-menu-page-table-l">' . "\n";
41
  /**/
42
- do_action ("ws_plugin__s2member_during_integrations_page_before_left_sections", get_defined_vars ());
43
  /**/
44
- if (apply_filters ("ws_plugin__s2member_during_integrations_page_during_left_sections_display_bbpress", true, get_defined_vars ()))
45
  {
46
- do_action ("ws_plugin__s2member_during_integrations_page_during_left_sections_before_bbpress", get_defined_vars ());
47
  /**/
48
- echo '<div class="ws-menu-page-group" title="bbPress® Plugin Integration ( 2.0+ plugin version )" default-state="open">' . "\n";
49
  /**/
50
- echo '<div class="ws-menu-page-section ws-plugin--s2member-bbpress-section">' . "\n";
51
- echo '<h3>bbPress® Plugin Integration ( easy peasy )</h3>' . "\n";
52
- echo '<input type="button" value="Update Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-update-roles-button" style="min-width:175px;" />' . "\n";
53
- echo '<p>The plugin version of <a href="http://www.s2member.com/bbpress-plugin" target="_blank" rel="external">bbPress® 2.0+</a> integrates seamlessly with WordPress®. If bbPress® was already installed when you activated s2Member, your s2Member Roles/Capabilities are already configured to work in harmony with bbPress®. If you didn\'t, you can simply click the "Update Roles/Capabilities" button here. That\'s all it takes. Once your Roles/Capbilities are updated, s2Member and bbPress® are fully integrated with each other.</p>' . "\n";
54
- echo '<h3>bbPress® Forums and s2Member Roles/Capabilities</h3>' . "\n";
55
- echo '<p>s2Member configures your Membership Roles ( by default, these include: <em>s2Member Level 1</em>, <em>s2Member Level 2</em>, <em>s2Member Level 3</em>, <em>s2Member Level 4</em> ), with a default set of permissions that allow all Members to access and particpate in your forums, just as if they were a WordPress® Subscriber Role. This is how bbPress® expects s2Member to behave. bbPress® also adds a new Role to your WordPress® installation: <em>Forum Moderator</em>. s2Member allows Forum Moderators full access to all content protected by s2Member, just like <em>Administrators</em>, <em>Editors</em>, <em>Authors</em>, and <em>Contributors</em>.</p>' . "\n";
56
- echo '<p><strong>Membership Levels provide incremental access:</strong></p>' . "\n";
57
- echo '<p>* A Member with Level 4 access, will also be able to access Levels 0, 1, 2 &amp; 3.<br />* A Member with Level 3 access, will also be able to access Levels 0, 1 &amp; 2.<br />* A Member with Level 2 access, will also be able to access Levels 0 &amp; 1.<br />* A Member with Level 1 access, will also be able to access Level 0.<br />* A Subscriber with Level 0 access, will ONLY be able to access Level 0.<br />* A public Visitor will have NO access to protected content.</p>' . "\n";
58
- echo '<p><em>* WordPress® Subscribers are at Membership Level 0. If you\'re allowing Open Registration, Subscribers will be at Level 0 ( a Free Subscriber ). WordPress® Administrators, Editors, Authors, Contributors, <strong class="ws-menu-page-hilite">and bbPress® Forum Moderators</strong> have Level 4 access, with respect to s2Member. All of their other Roles/Capabilities are left untouched.</em></p>' . "\n";
59
- echo '<p>You can protect individual Forum Topics/Posts/Replies at different Levels with s2Member, or even with Custom Capabilities. Forum Topics/Posts/Replies are integrated by bbPress® internally as "Custom Post Types", which can be protected by s2Member either through Post Level Access Restrictions, or through URI Level Access Restrictions. s2Member will provide you with drop-down menus whenever you add or edit Forum Topics/Posts/Replies.</p>' . "\n";
60
- echo '<p>You can also take a look at: <code>s2Member -> Restriction Options</code>. * Note, it is currently NOT possible to protect a Forum, and have all Topics inside that Forum protected automatically. In order to accomplish that, you\'ll need to use s2Member\'s URI Access Restrictions. We\'re working to improve this functionality in the mean time. Also, s2Member is currently NOT capable of protecting Topic Tags; but you can use URI Restrictions for these in the mean time.</p>' . "\n";
61
- do_action ("ws_plugin__s2member_during_integrations_page_during_left_sections_during_api_easy_way", get_defined_vars ());
62
- echo '</div>' . "\n";
63
  /**/
64
- echo '</div>' . "\n";
65
  /**/
66
- do_action ("ws_plugin__s2member_during_integrations_page_during_left_sections_after_bbpress", get_defined_vars ());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
  /**/
69
- do_action ("ws_plugin__s2member_during_integrations_page_after_left_sections", get_defined_vars ());
70
  /**/
71
- echo '</td>' . "\n";
72
  /**/
73
- echo '<td class="ws-menu-page-table-r">' . "\n";
74
- c_ws_plugin__s2member_menu_pages_rs::display ();
75
- echo '</td>' . "\n";
76
  /**/
77
- echo '</tr>' . "\n";
78
- echo '</tbody>' . "\n";
79
- echo '</table>' . "\n";
80
  /**/
81
- echo '</div>' . "\n";
82
  }
83
  }
84
  }
85
  /**/
86
- new c_ws_plugin__s2member_menu_page_integrations ();
87
  ?>
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
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_menu_page_integrations"))
21
  {
22
  /**
23
  * Menu page for the s2Member plugin ( Integrations page ).
27
  */
28
  class c_ws_plugin__s2member_menu_page_integrations
29
  {
30
+ public function __construct()
31
  {
32
+ echo '<div class="wrap ws-menu-page">'."\n";
33
  /**/
34
+ echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
+ echo '<h2>Other s2Member® Integrations</h2>'."\n";
36
  /**/
37
+ echo '<table class="ws-menu-page-table">'."\n";
38
+ echo '<tbody class="ws-menu-page-table-tbody">'."\n";
39
+ echo '<tr class="ws-menu-page-table-tr">'."\n";
40
+ echo '<td class="ws-menu-page-table-l">'."\n";
41
  /**/
42
+ do_action("ws_plugin__s2member_during_integrations_page_before_left_sections", get_defined_vars());
43
  /**/
44
+ if(apply_filters("ws_plugin__s2member_during_integrations_page_during_left_sections_display_bbpress", true, get_defined_vars()))
45
  {
46
+ do_action("ws_plugin__s2member_during_integrations_page_during_left_sections_before_bbpress", get_defined_vars());
47
  /**/
48
+ echo '<div class="ws-menu-page-group" title="bbPress® Plugin Integration ( 2.0+ plugin version )" default-state="open">'."\n";
49
  /**/
50
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-bbpress-section">'."\n";
51
+ echo '<h3>bbPress® Plugin Integration ( easy peasy )</h3>'."\n";
52
+ echo '<input type="button" value="Update Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-update-roles-button" style="min-width:175px;" />'."\n";
53
+ echo '<p>The plugin version of <a href="http://www.s2member.com/bbpress-plugin" target="_blank" rel="external">bbPress® 2.0+</a> integrates seamlessly with WordPress®. If bbPress® was already installed when you activated s2Member, your s2Member Roles/Capabilities are already configured to work in harmony with bbPress®. If you didn\'t, you can simply click the "Update Roles/Capabilities" button here. That\'s all it takes. Once your Roles/Capbilities are updated, s2Member and bbPress® are fully integrated with each other.</p>'."\n";
 
 
 
 
 
 
 
 
 
54
  /**/
55
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
56
  /**/
57
+ echo '<h3>bbPress® Forums and s2Member Roles/Capabilities</h3>'."\n";
58
+ echo '<p>s2Member configures your Membership Roles (by default, these include: <em>s2Member Level 1</em>, <em>s2Member Level 2</em>, <em>s2Member Level 3</em>, <em>s2Member Level 4</em>), with a default set of bbPress® permissions that allow all Members to both spectate and particpate in your forums, just as if they were a WordPress® Subscriber Role (or a bbPress® Participant Role).</p>'."\n";
59
+ echo '<p>bbPress® also adds some new Roles (dynamic Roles in bbPress® 2.2+) to your WordPress® installation. These include but are not limited to: <em>Keymaster</em> and <em>Moderator</em>. s2Member allows Forum Keymasters &amp; Moderators full access to the highest Membership Level you offer; just like it does with <em>Administrators</em>, <em>Editors</em>, <em>Authors</em>, and <em>Contributors</em>.</p>'."\n";
60
+ echo '<p><strong>Membership Levels provide incremental access:</strong></p>'."\n";
61
+ echo '<p>* A Member with Level 4 access, will also be able to access Levels 0, 1, 2 &amp; 3 <em>(plus spectate/participate in bbPress® Forums)</em>.<br />* A Member with Level 3 access, will also be able to access Levels 0, 1 &amp; 2 <em>(plus spectate/participate in bbPress® Forums)</em>.<br />* A Member with Level 2 access, will also be able to access Levels 0 &amp; 1 <em>(plus spectate/participate in bbPress® Forums)</em>.<br />* A Member with Level 1 access, will also be able to access Level 0 <em>(plus spectate/participate in bbPress® Forums)</em>.<br />* A Subscriber with Level 0 access, will ONLY be able to access Level 0 <em>(plus spectate/participate in bbPress® Forums)</em>.<br />* A public Visitor will have NO access to protected content <em>(and no special access to bbPress® Forums)</em>.</p>'."\n";
62
+ echo '<p><em>* WordPress® Subscribers <strong class="ws-menu-page-hilite">and bbPress® Spectators/Participants</strong> are at Membership Level 0. If you\'re allowing Open Registration via s2Member, Subscribers will be at Level 0 (a Free Subscriber).</em></p>'."\n";
63
+ echo '<p><em>* WordPress® Administrators, Editors, Authors, Contributors, <strong class="ws-menu-page-hilite">and bbPress® Keymasters/Moderators</strong> have Level 4 access, with respect to s2Member. All of their other Roles/Capabilities are left untouched.</em></p>'."\n";
64
+ /**/
65
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
66
+ /**/
67
+ echo '<h3>Protecting Content Introduced by bbPress®</h3>'."\n";
68
+ echo '<p>You can protect individual Forum Topics/Posts/Replies at different Levels with s2Member, or even with Custom Capabilities. Forum Topics/Posts/Replies are integrated by bbPress® internally as "Custom Post Types", which can be protected by s2Member either through Post Level Access Restrictions, or through URI Level Access Restrictions (recommended). If you choose to use Post Level Access Restrictions, please remember that s2Member will provide you with drop-down menus whenever you add or edit Forum Topics/Posts/Replies to make things easier for you.</p>'."\n";
69
+ echo '<p>Regarding s2Member\'s Post Level Access Restrictions with bbPress®. Before you decide to use Post Level Access Restrictions, please take a look at: <code>s2Member -> Restriction Options -> URI Access Restrictions</code> and consider the following limitations in the current release of s2Member. It is currently NOT possible to protect a Forum, and have all Topics inside that Forum protected automatically. In order to accomplish that, you\'ll need to use s2Member\'s URI Access Restrictions. Also, s2Member is currently NOT capable of protecting Topic Tags; but you can use URI Restrictions for these also.</p>'."\n";
70
+ do_action("ws_plugin__s2member_during_integrations_page_during_left_sections_during_api_easy_way", get_defined_vars());
71
+ echo '</div>'."\n";
72
+ /**/
73
+ echo '</div>'."\n";
74
+ /**/
75
+ do_action("ws_plugin__s2member_during_integrations_page_during_left_sections_after_bbpress", get_defined_vars());
76
  }
77
  /**/
78
+ do_action("ws_plugin__s2member_during_integrations_page_after_left_sections", get_defined_vars());
79
  /**/
80
+ echo '</td>'."\n";
81
  /**/
82
+ echo '<td class="ws-menu-page-table-r">'."\n";
83
+ c_ws_plugin__s2member_menu_pages_rs::display();
84
+ echo '</td>'."\n";
85
  /**/
86
+ echo '</tr>'."\n";
87
+ echo '</tbody>'."\n";
88
+ echo '</table>'."\n";
89
  /**/
90
+ echo '</div>'."\n";
91
  }
92
  }
93
  }
94
  /**/
95
+ new c_ws_plugin__s2member_menu_page_integrations();
96
  ?>
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the s2Member® Framework package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: s2Member® Framework 120703\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/___s2member\n"
7
- "POT-Creation-Date: 2012-10-24 02:10:21+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -669,7 +669,7 @@ msgstr ""
669
  #: s2member/includes/classes/paypal-utilities.inc.php:290
670
  #: s2member/includes/classes/paypal-utilities.inc.php:299
671
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:97
672
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:319
673
  msgctxt "s2member-front"
674
  msgid "Error. Please contact Support for assistance."
675
  msgstr ""
@@ -706,7 +706,7 @@ msgstr ""
706
  #: s2member/includes/classes/paypal-utilities.inc.php:287
707
  #: s2member/includes/classes/paypal-utilities.inc.php:296
708
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:94
709
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:316
710
  msgctxt "s2member-front"
711
  msgid "Error #%1$s. %2$s."
712
  msgstr ""
@@ -2540,7 +2540,7 @@ msgstr ""
2540
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:224
2541
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:355
2542
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:474
2543
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:662
2544
  msgctxt "s2member-front"
2545
  msgid "Security Code"
2546
  msgstr ""
@@ -2548,7 +2548,7 @@ msgstr ""
2548
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:187
2549
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:630
2550
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:191
2551
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:629
2552
  msgctxt "s2member-front"
2553
  msgid "Additional Info"
2554
  msgstr ""
@@ -2558,7 +2558,7 @@ msgstr ""
2558
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2559
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2560
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2561
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
2562
  msgctxt "s2member-front"
2563
  msgid "Visa®"
2564
  msgstr ""
@@ -2568,7 +2568,7 @@ msgstr ""
2568
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2569
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2570
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2571
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
2572
  msgctxt "s2member-front"
2573
  msgid "MasterCard®"
2574
  msgstr ""
@@ -2578,7 +2578,7 @@ msgstr ""
2578
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2579
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2580
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2581
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
2582
  msgctxt "s2member-front"
2583
  msgid "Discover®"
2584
  msgstr ""
@@ -2588,7 +2588,7 @@ msgstr ""
2588
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2589
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2590
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2591
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
2592
  msgctxt "s2member-front"
2593
  msgid "American Express®"
2594
  msgstr ""
@@ -3357,26 +3357,26 @@ msgctxt "s2member-front"
3357
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3358
  msgstr ""
3359
 
3360
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:652
3361
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:795
3362
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:271
3363
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:414
3364
  msgctxt "s2member-front percentage-symbol"
3365
  msgid "%"
3366
  msgstr ""
3367
 
3368
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:794
3369
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:413
3370
  msgctxt "s2member-front"
3371
  msgid " + tax"
3372
  msgstr ""
3373
 
3374
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:839
3375
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:891
3376
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:904
3377
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:926
3378
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:986
3379
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1001
3380
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:458
3381
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:510
3382
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:523
@@ -3387,12 +3387,12 @@ msgctxt "s2member-front"
3387
  msgid "COUPON %s off. ( Now: %s )"
3388
  msgstr ""
3389
 
3390
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:840
3391
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:892
3392
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:905
3393
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:927
3394
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:987
3395
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1002
3396
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:459
3397
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:511
3398
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:524
@@ -3403,12 +3403,12 @@ msgctxt "s2member-front"
3403
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s</strong> )</div>"
3404
  msgstr ""
3405
 
3406
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:852
3407
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:865
3408
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:878
3409
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:941
3410
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:956
3411
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:971
3412
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:471
3413
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:484
3414
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:497
@@ -3419,12 +3419,12 @@ msgctxt "s2member-front"
3419
  msgid "COUPON %s off. ( Now: %s, then %s )"
3420
  msgstr ""
3421
 
3422
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:853
3423
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:866
3424
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:879
3425
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:942
3426
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:957
3427
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:972
3428
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:472
3429
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:485
3430
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:498
@@ -3435,27 +3435,27 @@ msgctxt "s2member-front"
3435
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s, then %s</strong> )</div>"
3436
  msgstr ""
3437
 
3438
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:909
3439
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1006
3440
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:528
3441
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:625
3442
  msgctxt "s2member-front"
3443
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3444
  msgstr ""
3445
 
3446
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1010
3447
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:629
3448
  msgctxt "s2member-front"
3449
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3450
  msgstr ""
3451
 
3452
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1014
3453
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:633
3454
  msgctxt "s2member-front"
3455
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3456
  msgstr ""
3457
 
3458
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1018
3459
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:637
3460
  msgctxt "s2member-front"
3461
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
@@ -3464,14 +3464,14 @@ msgstr ""
3464
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3465
  #. is original description.
3466
 
3467
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1024
3468
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:643
3469
  msgctxt "s2member-front"
3470
  msgid "%1$s ~ ORIGINALLY: %2$s"
3471
  msgstr ""
3472
 
3473
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1052
3474
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1056
3475
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:671
3476
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:675
3477
  msgctxt "s2member-front"
@@ -3605,26 +3605,26 @@ msgstr ""
3605
 
3606
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
3607
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3608
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
3609
  msgctxt "s2member-front"
3610
  msgid "Maestro®"
3611
  msgstr ""
3612
 
3613
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
3614
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3615
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
3616
  msgctxt "s2member-front"
3617
  msgid "Solo®"
3618
  msgstr ""
3619
 
3620
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3621
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:595
3622
  msgctxt "s2member-front"
3623
  msgid "PayPal®"
3624
  msgstr ""
3625
 
3626
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:517
3627
- #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:706
3628
  msgctxt "s2member-front"
3629
  msgid "We Accept PayPal®"
3630
  msgstr ""
2
  # This file is distributed under the same license as the s2Member® Framework package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: s2Member® Framework 121023\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/___s2member\n"
7
+ "POT-Creation-Date: 2012-12-01 19:58:09+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
669
  #: s2member/includes/classes/paypal-utilities.inc.php:290
670
  #: s2member/includes/classes/paypal-utilities.inc.php:299
671
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:97
672
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:322
673
  msgctxt "s2member-front"
674
  msgid "Error. Please contact Support for assistance."
675
  msgstr ""
706
  #: s2member/includes/classes/paypal-utilities.inc.php:287
707
  #: s2member/includes/classes/paypal-utilities.inc.php:296
708
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:94
709
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:319
710
  msgctxt "s2member-front"
711
  msgid "Error #%1$s. %2$s."
712
  msgstr ""
2540
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:224
2541
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:355
2542
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:474
2543
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:663
2544
  msgctxt "s2member-front"
2545
  msgid "Security Code"
2546
  msgstr ""
2548
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:187
2549
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:630
2550
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:191
2551
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:630
2552
  msgctxt "s2member-front"
2553
  msgid "Additional Info"
2554
  msgstr ""
2558
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2559
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2560
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2561
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
2562
  msgctxt "s2member-front"
2563
  msgid "Visa®"
2564
  msgstr ""
2568
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2569
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2570
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2571
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
2572
  msgctxt "s2member-front"
2573
  msgid "MasterCard®"
2574
  msgstr ""
2578
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2579
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2580
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2581
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
2582
  msgctxt "s2member-front"
2583
  msgid "Discover®"
2584
  msgstr ""
2588
  #: s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:594
2589
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
2590
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
2591
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
2592
  msgctxt "s2member-front"
2593
  msgid "American Express®"
2594
  msgstr ""
3357
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3358
  msgstr ""
3359
 
3360
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:655
3361
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:798
3362
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:271
3363
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:414
3364
  msgctxt "s2member-front percentage-symbol"
3365
  msgid "%"
3366
  msgstr ""
3367
 
3368
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:797
3369
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:413
3370
  msgctxt "s2member-front"
3371
  msgid " + tax"
3372
  msgstr ""
3373
 
3374
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:842
3375
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:894
3376
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:907
3377
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:929
3378
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:989
3379
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1004
3380
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:458
3381
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:510
3382
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:523
3387
  msgid "COUPON %s off. ( Now: %s )"
3388
  msgstr ""
3389
 
3390
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:843
3391
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:895
3392
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:908
3393
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:930
3394
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:990
3395
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1005
3396
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:459
3397
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:511
3398
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:524
3403
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s</strong> )</div>"
3404
  msgstr ""
3405
 
3406
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:855
3407
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:868
3408
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:881
3409
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:944
3410
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:959
3411
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:974
3412
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:471
3413
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:484
3414
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:497
3419
  msgid "COUPON %s off. ( Now: %s, then %s )"
3420
  msgstr ""
3421
 
3422
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:856
3423
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:869
3424
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:882
3425
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:945
3426
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:960
3427
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:975
3428
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:472
3429
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:485
3430
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:498
3435
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s, then %s</strong> )</div>"
3436
  msgstr ""
3437
 
3438
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:912
3439
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1009
3440
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:528
3441
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:625
3442
  msgctxt "s2member-front"
3443
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3444
  msgstr ""
3445
 
3446
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1013
3447
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:629
3448
  msgctxt "s2member-front"
3449
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3450
  msgstr ""
3451
 
3452
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1017
3453
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:633
3454
  msgctxt "s2member-front"
3455
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3456
  msgstr ""
3457
 
3458
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1021
3459
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:637
3460
  msgctxt "s2member-front"
3461
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
3464
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3465
  #. is original description.
3466
 
3467
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1027
3468
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:643
3469
  msgctxt "s2member-front"
3470
  msgid "%1$s ~ ORIGINALLY: %2$s"
3471
  msgstr ""
3472
 
3473
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1055
3474
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1059
3475
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:671
3476
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:675
3477
  msgctxt "s2member-front"
3605
 
3606
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
3607
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3608
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
3609
  msgctxt "s2member-front"
3610
  msgid "Maestro®"
3611
  msgstr ""
3612
 
3613
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:324
3614
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3615
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
3616
  msgctxt "s2member-front"
3617
  msgid "Solo®"
3618
  msgstr ""
3619
 
3620
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:443
3621
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:596
3622
  msgctxt "s2member-front"
3623
  msgid "PayPal®"
3624
  msgstr ""
3625
 
3626
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:518
3627
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:708
3628
  msgctxt "s2member-front"
3629
  msgid "We Accept PayPal®"
3630
  msgstr ""
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 121023
4
- Stable tag: 121023
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -91,18 +91,26 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
91
 
92
  == Upgrade Notice ==
93
 
94
- = v121023 =
95
  Maintenance release. Upgrade immediately.
96
 
97
  == Changelog ==
98
 
 
 
 
 
 
 
 
 
99
  = v121023 =
100
  * **(Maintenance Release) Upgrade immediately.**
101
  * (s2Member / s2Member Pro) **Bug Fix**. A bug related to s2Member's `is_site_root()` method, when fancy permalinks are NOT in use; has been corrected for compatibility with the latest version of WordPress. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
102
  * (s2Member Pro) **Import/Export Bug Fix**. An issue related to RFC guidelines for escape sequences in CSV files has been addressed in this release. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
103
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility across multiple ccBill® sub-accounts.
104
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility w/ ccBill® servers running on MST timezone.
105
- * (s2Member/s2Member Pro) **API Function**. A new API Function was added. See: ``s2member_login_ips_for($username)``. Please check the [s2Member® Codex](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) for documentation. [This thread](http://www.s2member.com/forums/topic/s2member-restriction-options-unique-ip/#post-20562) may also be of some assistance.
106
  * (s2Member/s2Member Pro) **404 Error (Bug Fix)**. A former dependency on `l10n.js` from the WordPress® core is no longer necessary. This old dependency has been removed to prevent 404 errors in the latest versions of WordPress®. Please check [this thread](http://www.s2member.com/forums/topic/wordpress-i10n-file-404-from-s2member/#post-20567) for further details.
107
  * (s2Member Pro) **reCAPTCHA® Bug Fix**. A bug sometimes causing failed reCAPTCHA® responses after PayPal® Express Checkout has been corrected in this release. This occurred during certain scenarios, whenever reCAPTCHA® was enabled for checkout forms, and PayPal Express Checkout was selected as the payment method of choice.
108
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was modified to prevent dates in the future from being requested from the DataLink API. ccBill® was responding to some DataLink requests with a failed authentication, which were caused by dates/times in the future; according to MST on the ccBill® side of things.
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 121201
4
+ Stable tag: 121201
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
91
 
92
  == Upgrade Notice ==
93
 
94
+ = v121201 =
95
  Maintenance release. Upgrade immediately.
96
 
97
  == Changelog ==
98
 
99
+ = v121201 =
100
+ * **(Maintenance Release) Upgrade immediately.**
101
+ * (s2Member / s2Member Pro) **Bug Fix**. Support Rep Cristián Lávaque found a bug in the behavior of s2Member’s Alternative View Restrictions, associated with Category listings in custom menu widgets. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/welcome-page-title-shows-but-no-content/page/2/#post-29802).
102
+ * (s2Member Pro) **Feature Enhancement**. s2Member Pro Forms integrated ONLY with PayPal Express Checkout (`accept="paypal" accept_via_paypal="paypal"`), will no longer display a Billing Method section on the Pro Form, as it's not necessary (there's only one possible option in this case, and it's already depicted by the PayPal button at the bottom of the Pro Form). Many site owners had implemented CSS hacks to hide this section of a Pro Form configured this way, based on [this FAQ article](http://www.s2member.com/faqs/#s2-faqs-paypal-pro-not-required). This hack is no longer necessary - starting with this release.
103
+ * (s2Member Pro) **Bug Fix**. s2Member Pro Forms integrated with Payflow Recurring Billing via PayPal Express Checkout were failing against some accounts with an erroneous error #10422 related to an invalid funding source. With some help from other site owners and the assistance of PayPal technical support, the underlying issue has been fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/paypal-error-36-transaction-failed/page/2/#post-31490).
104
+ * (s2Member Pro) **Compatiblity**. ccBill Buttons can now be generated for amounts exceeding $100.00, so long as prior ccBill approval is obtained from ccBill merchant support. Discussed in [this thread](http://www.s2member.com/forums/topic/cc-bill-button-increase-dollar-amount/#post-31636).
105
+ * (s2Member/s2Member Pro) **Compatiblity**. Updated to support Dynamic Roles introduced in bbPress® v2.2. Discussed in [this thread](http://www.s2member.com/forums/topic/dont-upgrade-to-bbpress-2-2/#post-32523).
106
+
107
  = v121023 =
108
  * **(Maintenance Release) Upgrade immediately.**
109
  * (s2Member / s2Member Pro) **Bug Fix**. A bug related to s2Member's `is_site_root()` method, when fancy permalinks are NOT in use; has been corrected for compatibility with the latest version of WordPress. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
110
  * (s2Member Pro) **Import/Export Bug Fix**. An issue related to RFC guidelines for escape sequences in CSV files has been addressed in this release. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
111
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility across multiple ccBill® sub-accounts.
112
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility w/ ccBill® servers running on MST timezone.
113
+ * (s2Member/s2Member Pro) **API Function**. A new API Function was added. See: `s2member_login_ips_for($username)`. Please check the [s2Member® Codex](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) for documentation. [This thread](http://www.s2member.com/forums/topic/s2member-restriction-options-unique-ip/#post-20562) may also be of some assistance.
114
  * (s2Member/s2Member Pro) **404 Error (Bug Fix)**. A former dependency on `l10n.js` from the WordPress® core is no longer necessary. This old dependency has been removed to prevent 404 errors in the latest versions of WordPress®. Please check [this thread](http://www.s2member.com/forums/topic/wordpress-i10n-file-404-from-s2member/#post-20567) for further details.
115
  * (s2Member Pro) **reCAPTCHA® Bug Fix**. A bug sometimes causing failed reCAPTCHA® responses after PayPal® Express Checkout has been corrected in this release. This occurred during certain scenarios, whenever reCAPTCHA® was enabled for checkout forms, and PayPal Express Checkout was selected as the payment method of choice.
116
  * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was modified to prevent dates in the future from being requested from the DataLink API. ccBill® was responding to some DataLink requests with a failed authentication, which were caused by dates/times in the future; according to MST on the ccBill® side of things.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 121023
23
- Stable tag: 121023
24
 
25
  SSL Compatible: yes
26
  bbPress® Compatible: yes
@@ -75,7 +75,7 @@ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
- define("WS_PLUGIN__S2MEMBER_VERSION", "121023" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
- define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "121023" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 121201
23
+ Stable tag: 121201
24
 
25
  SSL Compatible: yes
26
  bbPress® Compatible: yes
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "121201" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "121201" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.