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

Version Description

= v150311 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 150225 to 150311

changelog.md CHANGED
@@ -1,3 +1,12 @@
 
 
 
 
 
 
 
 
 
1
  = v150225 =
2
 
3
  - (s2Member Pro) **Accept Bitcoin via Stripe!** This release of s2Member Pro comes integrated with the latest version of the Stripe API, where it is now possible to accept Bitcoin right along with most major credit cards—made possible by [Stripe's latest update to support Bitcoin](https://stripe.com/bitcoin). It's as easy as flipping a switch :-) Please see: `Dashboard ⥱ s2Member Pro ⥱ Stripe Options ⥱ Account Details ⥱ Accept Bitcoin`. Referencing [this GitHub issue](https://github.com/websharks/s2member/issues/482); i.e., the original feature request.
1
+ = v150311 =
2
+
3
+ - (s2Member/s2Member) **Bug Fix:** The list of users in the WordPress Dashboard was going blank in a particular scenario where a search was attempted in concert with a sortable s2Member column. Fixed in this release. Props to @bridgeport for finding this. See also [this GitHub issue](https://github.com/websharks/s2member/issues/496#issuecomment-76821470) if you'd like technical details.
4
+ - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent changes in the `WP_User_Query` class. See [this GitHub issue](https://github.com/websharks/s2member/issues/493) if you'd like additional details.
5
+ - (s2Member Pro) **Remote Operations API (Bug Fix):** If a remote API call was made to find a user by `user_login`, and that username was all numeric, the `WP_User` class treated it like a user ID instead of as an actual username. Resolved in this release by calling `new WP_User(0, [user login])` as the second argument to the constructor. Thereby forcing `WP_User` to consider it a username. See also [this GitHub issue](https://github.com/websharks/s2member/issues/498) if you'd like technical details.
6
+ - (s2Member Pro) **Stripe Bug Fix:** Stripe Pro-Forms for Specific Post/Page Access should not disable the email address field for logged-in users. Resolved in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/500) if you'd like technical details.
7
+ - (s2Member Pro) **Stripe Pro-Forms:** This release corrects a bug first introduced in the last release that prevented custom templates for Stripe Pro-Forms from working as intended. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/510) if you'd like additional details.
8
+ - (s2Member Pro) **Bug Fix for Gift/Redemption Codes:** This release of s2Member corrects a bug that impacted the generation of Gift/Redemption Codes whenever they were sold with Specific Post/Page Access. See also [this GitHub issue](https://github.com/websharks/s2member/issues/512) if you'd like additional details.
9
+
10
  = v150225 =
11
 
12
  - (s2Member Pro) **Accept Bitcoin via Stripe!** This release of s2Member Pro comes integrated with the latest version of the Stripe API, where it is now possible to accept Bitcoin right along with most major credit cards—made possible by [Stripe's latest update to support Bitcoin](https://stripe.com/bitcoin). It's as easy as flipping a switch :-) Please see: `Dashboard ⥱ s2Member Pro ⥱ Stripe Options ⥱ Account Details ⥱ Accept Bitcoin`. Referencing [this GitHub issue](https://github.com/websharks/s2member/issues/482); i.e., the original feature request.
checksum.txt CHANGED
@@ -1 +1 @@
1
- 73638fc82a53a79d203ccd74db9b5416
1
+ 6e978345db7617c401da82504eb6d20b
includes/classes/brute-force.inc.php CHANGED
@@ -1,101 +1,112 @@
1
  <?php
2
  /**
3
- * s2Member's Brute Force protection routines.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Brute_Force
15
- * @since 3.5
16
- */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
- exit("Do not access this file directly.");
19
 
20
- if (!class_exists ("c_ws_plugin__s2member_brute_force"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * s2Member's Brute Force protection routines.
24
- *
25
- * @package s2Member\Brute_Force
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_brute_force
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  {
30
- /**
31
- * Tracks failed login attempts.
32
- *
33
- * Prevents an attacker from guessing Usernames/Passwords.
34
- * Allows only 5 failed login attempts every 30 minutes.
35
- *
36
- * @package s2Member\Brute_Force
37
- * @since 3.5
38
- *
39
- * @attaches-to ``add_action("wp_login_failed");``
40
- *
41
- * @param string $username Expects the $username to be passed in through the Hook.
42
- * @return null
43
- */
44
- public static function track_failed_logins ($username = FALSE)
45
- {
46
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
47
- do_action("ws_plugin__s2member_before_track_failed_logins", get_defined_vars ());
48
- unset($__refs, $__v);
49
 
50
- if (($max = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_failed_login_attempts"]))
51
- {
52
- $exp_secs = strtotime ("+" . apply_filters("ws_plugin__s2member_track_failed_logins__exp_time", "30 minutes", get_defined_vars ())) - time ();
53
- // If you add Filters to this value, you should use a string that is compatible with PHP's strtotime() function.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
- $transient = "s2m_ipr_" . md5 ("s2member_transient_failed_login_attempts_" . $_SERVER["REMOTE_ADDR"]);
56
- set_transient ($transient, (int)get_transient ($transient) + 1, $exp_secs);
57
- }
58
- do_action("ws_plugin__s2member_after_track_failed_logins", get_defined_vars ());
 
 
 
59
 
60
- return /* Return for uniformity. */;
61
- }
62
- /**
63
- * Stops anyone attempting a Brute Force attack.
64
- *
65
- * Prevents an attacker from guessing Usernames/Passwords.
66
- * Allows only 5 failed login attempts every 30 minutes.
67
- *
68
- * @package s2Member\Brute_Force
69
- * @since 3.5
70
- *
71
- * @attaches-to ``add_filter("authenticate");``
72
- *
73
- * @param object $user Expects a WP_User object, or possibly a null value.
74
- * This parameter value is simply passed through this routine.
75
- * @return obj|null Either null, the ``$user`` obj, or a `WP_Error` obj.
76
- */
77
- public static function stop_brute_force_logins ($user = FALSE)
78
- {
79
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
80
- do_action("ws_plugin__s2member_before_stop_brute_force_logins", get_defined_vars ());
81
- unset($__refs, $__v);
82
 
83
- if (($max = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_failed_login_attempts"]))
84
- {
85
- if ((int)get_transient ("s2m_ipr_" . md5 ("s2member_transient_failed_login_attempts_" . $_SERVER["REMOTE_ADDR"])) > $max)
86
- {
87
- $exp_secs = strtotime ("+" . apply_filters("ws_plugin__s2member_track_failed_logins__exp_time", "30 minutes", get_defined_vars ())) - time ();
88
- // If you add Filters to this value, you should use a string that is compatible with PHP's strtotime() function.
89
- $about = c_ws_plugin__s2member_utils_time::approx_time_difference (time (), time () + $exp_secs);
90
- $errors = new WP_Error ("incorrect_password", sprintf (_x ("Max failed logins. Please wait %s and try again.", "s2member-front", "s2member"), $about));
91
 
92
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
93
- do_action("ws_plugin__s2member_during_stop_brute_force_logins", get_defined_vars ());
94
- unset($__refs, $__v);
95
- }
96
- }
97
- return apply_filters("ws_plugin__s2member_stop_brute_force_logins", ((!empty($errors)) ? $errors : $user), get_defined_vars ());
98
- }
99
  }
 
 
100
  }
101
- ?>
1
  <?php
2
  /**
3
+ * s2Member's Brute Force protection routines.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Brute_Force
15
+ * @since 3.5
16
+ */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
+ exit('Do not access this file directly.');
19
 
20
+ if(!class_exists('c_ws_plugin__s2member_brute_force'))
21
+ {
22
+ /**
23
+ * s2Member's Brute Force protection routines.
24
+ *
25
+ * @package s2Member\Brute_Force
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_brute_force
29
  {
30
  /**
31
+ * Tracks failed login attempts.
32
+ *
33
+ * Prevents an attacker from guessing Usernames/Passwords.
34
+ * Allows only 5 failed login attempts every 30 minutes.
35
+ *
36
+ * @package s2Member\Brute_Force
37
+ * @since 3.5
38
+ *
39
+ * @attaches-to ``add_action('wp_login_failed');``
40
+ *
41
+ * @param string $username Expects the $username to be passed in through the Hook.
42
+ */
43
+ public static function track_failed_logins($username = '')
44
+ {
45
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
46
+ do_action('ws_plugin__s2member_before_track_failed_logins', get_defined_vars());
47
+ unset($__refs, $__v);
48
+
49
+ if(($max = $GLOBALS['WS_PLUGIN__']['s2member']['o']['max_failed_login_attempts']))
50
  {
51
+ $exp_secs = strtotime('+'.apply_filters('ws_plugin__s2member_track_failed_logins__exp_time', '30 minutes', get_defined_vars())) - time();
52
+ // If you add Filters to this value, you should use a string that is compatible with PHP's strtotime() function.
53
+
54
+ $ip = $_SERVER['REMOTE_ADDR']; // Default value.
55
+ if(!empty($GLOBALS['s2member_pro_remote_op_auth_check_user_ip'])
56
+ && c_ws_plugin__s2member_utils_conds::pro_is_installed()
57
+ && c_ws_plugin__s2member_pro_remote_ops::is_remote_op('auth_check_user')
58
+ ) $ip = $GLOBALS['s2member_pro_remote_op_auth_check_user_ip'];
59
+
60
+ $transient = 's2m_ipr_'.md5('s2member_transient_failed_login_attempts_'.$ip);
61
+ set_transient($transient, (int)get_transient($transient) + 1, $exp_secs);
62
+ }
63
+ do_action('ws_plugin__s2member_after_track_failed_logins', get_defined_vars());
64
+ }
 
 
 
 
 
65
 
66
+ /**
67
+ * Stops anyone attempting a Brute Force attack.
68
+ *
69
+ * Prevents an attacker from guessing Usernames/Passwords.
70
+ * Allows only 5 failed login attempts every 30 minutes.
71
+ *
72
+ * @package s2Member\Brute_Force
73
+ * @since 3.5
74
+ *
75
+ * @attaches-to ``add_filter('authenticate');``
76
+ *
77
+ * @param WP_User $user Expects a WP_User object, or possibly a null value.
78
+ * This parameter value is simply passed through this routine.
79
+ *
80
+ * @return WP_User|null Either null, the ``$user`` obj, or a `WP_Error` obj.
81
+ */
82
+ public static function stop_brute_force_logins($user = NULL)
83
+ {
84
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
85
+ do_action('ws_plugin__s2member_before_stop_brute_force_logins', get_defined_vars());
86
+ unset($__refs, $__v);
87
 
88
+ if(($max = $GLOBALS['WS_PLUGIN__']['s2member']['o']['max_failed_login_attempts']))
89
+ {
90
+ $ip = $_SERVER['REMOTE_ADDR']; // Default value.
91
+ if(!empty($GLOBALS['s2member_pro_remote_op_auth_check_user_ip'])
92
+ && c_ws_plugin__s2member_utils_conds::pro_is_installed()
93
+ && c_ws_plugin__s2member_pro_remote_ops::is_remote_op('auth_check_user')
94
+ ) $ip = $GLOBALS['s2member_pro_remote_op_auth_check_user_ip'];
95
 
96
+ if((int)get_transient('s2m_ipr_'.md5('s2member_transient_failed_login_attempts_'.$ip)) > $max)
97
+ {
98
+ $exp_secs = strtotime('+'.apply_filters('ws_plugin__s2member_track_failed_logins__exp_time', '30 minutes', get_defined_vars())) - time();
99
+ // If you add Filters to this value, you should use a string that is compatible with PHP's strtotime() function.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
+ $about = c_ws_plugin__s2member_utils_time::approx_time_difference(time(), time() + $exp_secs);
102
+ $errors = new WP_Error('incorrect_password', sprintf(_x('Max failed logins. Please wait %s and try again.', 's2member-front', 's2member'), $about));
 
 
 
 
 
 
103
 
104
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
105
+ do_action('ws_plugin__s2member_during_stop_brute_force_logins', get_defined_vars());
106
+ unset($__refs, $__v);
107
+ }
 
 
 
108
  }
109
+ return apply_filters('ws_plugin__s2member_stop_brute_force_logins', !empty($errors) ? $errors : $user, get_defined_vars());
110
+ }
111
  }
112
+ }
includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php CHANGED
@@ -76,8 +76,8 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
76
 
77
  if(empty($_REQUEST['s2member_paypal_proxy'])) // Only on true PayPal IPNs; e.g., we can bypass this on proxied IPNs.
78
  {
79
- $paypal['s2member_log'][] = 'Sleeping for 10 seconds. Waiting for a possible ( `subscr_signup|subscr_modify|recurring_payment_profile_created` ).';
80
- sleep(10); // Sleep here for a moment. PayPal sometimes sends a subscr_eot before the subscr_signup, subscr_modify.
81
  $paypal['s2member_log'][] = 'Awake. It\'s '.date('D M j, Y g:i:s a T').'. s2Member `txn_type` identified as '.$identified_as.'.';
82
  }
83
  $paypal['ip'] = (preg_match('/ip address/i', $paypal['option_name2']) && $paypal['option_selection2']) ? $paypal['option_selection2'] : '';
76
 
77
  if(empty($_REQUEST['s2member_paypal_proxy'])) // Only on true PayPal IPNs; e.g., we can bypass this on proxied IPNs.
78
  {
79
+ $paypal['s2member_log'][] = 'Sleeping for 15 seconds. Waiting for a possible ( `subscr_signup|subscr_modify|recurring_payment_profile_created` ).';
80
+ sleep(15); // Sleep here for a moment. PayPal sometimes sends a subscr_eot before the subscr_signup, subscr_modify.
81
  $paypal['s2member_log'][] = 'Awake. It\'s '.date('D M j, Y g:i:s a T').'. s2Member `txn_type` identified as '.$identified_as.'.';
82
  }
83
  $paypal['ip'] = (preg_match('/ip address/i', $paypal['option_name2']) && $paypal['option_selection2']) ? $paypal['option_selection2'] : '';
includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php CHANGED
@@ -62,8 +62,8 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_
62
 
63
  if(empty($_REQUEST['s2member_paypal_proxy'])) // Only on true PayPal IPNs; e.g., we can bypass this on proxied IPNs.
64
  {
65
- $paypal['s2member_log'][] = 'Sleeping for 5 seconds. Waiting for a possible ( `subscr_signup|subscr_modify|recurring_payment_profile_created` ).';
66
- sleep(5); // Sleep here for a moment. PayPal sometimes sends a subscr_payment before the subscr_signup, subscr_modify.
67
  $paypal['s2member_log'][] = 'Awake. It\'s '.date('D M j, Y g:i:s a T').'. s2Member `txn_type` identified as '.$identified_as.'.';
68
  }
69
  list($paypal['level'], $paypal['ccaps']) = preg_split('/\:/', $paypal['item_number'], 3);
62
 
63
  if(empty($_REQUEST['s2member_paypal_proxy'])) // Only on true PayPal IPNs; e.g., we can bypass this on proxied IPNs.
64
  {
65
+ $paypal['s2member_log'][] = 'Sleeping for 15 seconds. Waiting for a possible ( `subscr_signup|subscr_modify|recurring_payment_profile_created` ).';
66
+ sleep(15); // Sleep here for a moment. PayPal sometimes sends a subscr_payment before the subscr_signup, subscr_modify.
67
  $paypal['s2member_log'][] = 'Awake. It\'s '.date('D M j, Y g:i:s a T').'. s2Member `txn_type` identified as '.$identified_as.'.';
68
  }
69
  list($paypal['level'], $paypal['ccaps']) = preg_split('/\:/', $paypal['item_number'], 3);
includes/classes/paypal-notify-in.inc.php CHANGED
@@ -78,7 +78,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in'))
78
 
79
  if(!empty($paypal['txn_type']) && $paypal['txn_type'] === 'merch_pmt')
80
  // This is mostly irrelevant, but it helps to keep the logs cleaner.
81
- sleep(5); // Wait for Pro-Form procesing to complete.
82
 
83
  if(empty($paypal['custom']) && !empty($paypal['recurring_payment_id'])) // Recurring Profile ID.
84
  $paypal['custom'] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal['recurring_payment_id']);
78
 
79
  if(!empty($paypal['txn_type']) && $paypal['txn_type'] === 'merch_pmt')
80
  // This is mostly irrelevant, but it helps to keep the logs cleaner.
81
+ sleep(15); // Wait for Pro-Form procesing to complete.
82
 
83
  if(empty($paypal['custom']) && !empty($paypal['recurring_payment_id'])) // Recurring Profile ID.
84
  $paypal['custom'] = c_ws_plugin__s2member_utils_users::get_user_custom_with($paypal['recurring_payment_id']);
includes/classes/users-list.inc.php CHANGED
@@ -1,309 +1,321 @@
1
  <?php
2
  /**
3
- * Users list.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Users_List
15
- * @since 3.5
16
- */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
- if (!class_exists ("c_ws_plugin__s2member_users_list"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * Users list.
24
- *
25
- * @package s2Member\Users_List
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_users_list
29
- {
30
- /**
31
- * Adds Custom Fields to the admin Profile editing page.
32
- *
33
- * @package s2Member\Users_List
34
- * @since 3.5
35
- *
36
- * @attaches-to ``add_action("edit_user_profile");``
37
- * @attaches-to ``add_action("show_user_profile");``
38
- *
39
- * @param WP_User $user Expects a `WP_User` object passed in by the Action Hook.
40
- * @return inner Return-value of inner routine.
41
- */
42
- public static function users_list_edit_cols ($user = FALSE)
43
- {
44
- return c_ws_plugin__s2member_users_list_in::users_list_edit_cols ($user);
45
- }
46
- /**
47
- * Saves Custom Fields after an admin updates Profile.
48
- *
49
- * @package s2Member\Users_List
50
- * @since 3.5
51
- *
52
- * @attaches-to ``add_action("edit_user_profile_update");``
53
- * @attaches-to ``add_action("personal_options_update");``
54
- *
55
- * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
56
- * @return inner Return-value of inner routine.
57
- */
58
- public static function users_list_update_cols ($user_id = FALSE)
59
- {
60
- return c_ws_plugin__s2member_users_list_in::users_list_update_cols ($user_id);
61
- }
62
- /**
63
- * Modifies the search query.
64
- *
65
- * Affects searches performed in the list of Users.
66
- *
67
- * @package s2Member\Users_List
68
- * @since 3.5
69
- *
70
- * @attaches-to ``add_action("pre_user_query");``
71
- *
72
- * @param WP_User_Query $query Expects a `WP_User_Query` object, by reference.
73
- */
74
- public static function users_list_query (&$query = FALSE)
 
 
 
75
  {
76
- global $wpdb; /** @var $wpdb wpdb */
77
-
78
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
79
- do_action("ws_plugin__s2member_before_users_list_search", get_defined_vars ());
80
- unset($__refs, $__v);
81
-
82
- if (is_admin() && !empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'users.php')
83
- if(isset ($query->query_vars) && !is_network_admin ()) // NOT in Network admin panels.
84
- if (is_array($qv = $query->query_vars) && ($s = trim ($qv["search"], "* \t\n\r\0\x0B")) && ($s = "%" . esc_sql (c_ws_plugin__s2member_utils_strings::like_escape ($s)) . "%"))
85
- {
86
- $query->query_fields = "SQL_CALC_FOUND_ROWS DISTINCT(`" . $wpdb->users . "`.`ID`)";
87
- $query->query_from = " FROM `" . $wpdb->users . "`, `" . $wpdb->usermeta . "`"; // Include meta table also.
88
- $query->query_where = " WHERE `" . $wpdb->users . "`.`ID` = `" . $wpdb->usermeta . "`.`user_id`"; // Join w/ meta table.
89
- $query->query_where .= " AND (" . apply_filters("ws_plugin__s2member_before_users_list_search_where_or_before", "", get_defined_vars ());
90
- $query->query_where .= " (`" . $wpdb->users . "`.`user_login` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_nicename` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`display_name` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_email` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_url` LIKE '" . $s . "')";
91
- $query->query_where .= " OR ((`" . $wpdb->usermeta . "`.`meta_key` = 'first_name' OR `" . $wpdb->usermeta . "`.`meta_key` = 'last_name') AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')";
92
- $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_subscr_id' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')";
93
- $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_custom' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')";
94
- $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_custom_fields' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')";
95
- if(apply_filters("ws_plugin__s2member_users_list_search_admin_notes", false, get_defined_vars())) // Off by default; this can get very slow on large sites.
96
- $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_notes' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')";
97
- $query->query_where .= apply_filters("ws_plugin__s2member_before_users_list_search_where_or_after", "", get_defined_vars ()) . ")"; // Leaving room for additional searches here.
98
-
99
- if(is_multisite()) // On a Multisite Network we need to make sure we're searching only users w/ capabilities on this blog.
100
- $query->query_where .= " AND `" . $wpdb->users . "`.`ID` IN(SELECT DISTINCT(`user_id`) FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "capabilities')";
101
-
102
- $query->query_from = apply_filters("ws_plugin__s2member_before_users_list_search_from", $query->query_from, get_defined_vars ());
103
- $query->query_where = apply_filters("ws_plugin__s2member_before_users_list_search_where", $query->query_where, get_defined_vars ());
104
- }
105
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
106
- do_action("ws_plugin__s2member_after_users_list_search", get_defined_vars ());
107
- unset($__refs, $__v);
108
  }
109
- /**
110
- * Adds columns to the list of Users.
111
- *
112
- * @package s2Member\Users_List
113
- * @since 3.5
114
- *
115
- * @attaches-to ``add_filter ("manage_users_columns");``
116
- *
117
- * @param array $columns Expects an array of columns to be passed through by the Filter.
118
- * @return array Array of columns, merged with columns introduced by this routine.
119
- */
120
- public static function users_list_cols ($cols = FALSE)
121
- {
122
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
123
- do_action("ws_plugin__s2member_before_users_list_cols", get_defined_vars ());
124
- unset($__refs, $__v);
125
 
126
- $cols["s2member_registration_time"] = "Registration Date";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
- if (apply_filters("ws_plugin__s2member_users_list_cols_display_paid_registration_times", false))
129
- $cols["s2member_paid_registration_times"] = "Paid Registr. Date";
 
130
 
131
- $cols["s2member_subscr_id"] = "Paid Subscr. ID";
 
132
 
133
- if (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ())
134
- $cols["s2member_ccaps"] = "Custom Capabilities";
 
135
 
136
- $cols["s2member_auto_eot_time"] = "EOT Time";
 
137
 
138
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
139
- foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
140
- {
141
- $field_var = preg_replace ("/[^a-z0-9]/i", "_", strtolower ($field["id"]));
142
- $field_id_class = preg_replace ("/_/", "-", $field_var);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
 
144
- $field_title = ucwords (preg_replace ("/_/", " ", $field_var));
145
- $cols["s2member_custom_field_" . $field_var] = $field_title;
146
- }
 
 
 
 
 
147
 
148
- $cols["s2member_login_counter"] = "# Of Logins";
149
- $cols["s2member_last_login_time"] = "Last Login Time";
 
 
 
150
 
151
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
152
- do_action("ws_plugin__s2member_during_users_list_cols", get_defined_vars ());
153
- unset($__refs, $__v);
 
154
 
155
- return apply_filters("ws_plugin__s2member_users_list_cols", $cols, get_defined_vars ());
156
- }
157
- /**
158
- * Displays column data in the row of details.
159
- *
160
- * @package s2Member\Users_List
161
- * @since 3.5
162
- *
163
- * @attaches-to ``add_filter ("manage_users_custom_column");``
164
- *
165
- * @param string $val A value for this column, passed through by the Filter.
166
- * @param string $col The name of the column for which we might need to supply data for.
167
- * @param int|string $user_id Expects a WordPress User ID, passed through by the Filter.
168
- * @return string A column value introduced by this routine, or existing value, or, if empty, a dash.
169
- */
170
- public static function users_list_display_cols ($val = FALSE, $col = FALSE, $user_id = FALSE)
171
- {
172
- static $user, $last_user_id; // Used internally for optimization.
173
- static $fields, $last_fields_id; // Used for optimization.
174
-
175
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
176
- do_action("ws_plugin__s2member_before_users_list_display_cols", get_defined_vars ());
177
- unset($__refs, $__v);
178
-
179
- $user = (is_object ($user) && $user_id === $last_user_id) ? $user : new WP_User ($user_id);
180
-
181
- if ($col === "s2member_registration_time")
182
- $val = (($time = strtotime (get_date_from_gmt ($user->user_registered)))) ? esc_html (date ("D M jS, Y", $time)) . '<br /><small>@ precisely ' . esc_html (date ("g:i a", $time)) . '</small>' : "—";
183
-
184
- else if ($col === "s2member_paid_registration_times")
185
- {
186
- $val = ""; // Initialize $val before we begin.
187
- if (is_array($v = get_user_option ("s2member_paid_registration_times", $user_id)))
188
- foreach ($v as $level => $time) // Go through each Paid Registration Time.
189
- {
190
- $time = strtotime (get_date_from_gmt (date ("Y-m-d H:i:s", $time)));
191
-
192
- if ($level === "level") // First Payment Time, regardless of Level.
193
- $val .= (($val) ? "<br />" : "") . '<span title="' . esc_attr (date ("D M jS, Y", $time)) . ' @ precisely ' . esc_attr (date ("g:i a", $time)) . '">' . esc_html (date ("D M jS, Y", $time)) . '</span>';
194
- else if (preg_match ("/^level([0-9]+)$/i", $level) && ($level = preg_replace ("/^level/", "", $level)))
195
- $val .= (($val) ? "<br />" : "") . '<small><em>@Level ' . esc_html ($level) . ': <span title="' . esc_attr (date ("D M jS, Y", $time)) . ' @ precisely ' . esc_attr (date ("g:i a", $time)) . '">' . esc_html (date ("D M jS, Y", $time)) . '</span></em></small>';
196
- }
197
- }
198
- else if ($col === "s2member_subscr_id")
199
- $val = ($v = get_user_option ("s2member_subscr_id", $user_id)) ? esc_html ($v) : "—";
200
-
201
- else if ($col === "s2member_ccaps") // Custom Capabilities.
202
- {
203
- foreach ($user->allcaps as $cap => $cap_enabled)
204
- if (preg_match ("/^access_s2member_ccap_/", $cap))
205
- $ccaps[] = preg_replace ("/^access_s2member_ccap_/", "", $cap);
206
-
207
- $val = (!empty($ccaps)) ? implode ("<br />", $ccaps) : "—";
208
- }
209
- else if($col === "s2member_auto_eot_time")
210
- $val = ($v = get_user_option ("s2member_auto_eot_time", $user_id)) ? date("D M jS, Y", (integer)$v) . "<br /><small>@ precisely " . date ("g:i a", (integer)$v)."</small>" : "—";
211
-
212
- else if (preg_match ("/^s2member_custom_field_/", $col))
213
- {
214
- if (!$last_fields_id || $last_fields_id !== $user_id)
215
- $fields = get_user_option ("s2member_custom_fields", $user_id);
216
-
217
- $field_var = preg_replace ("/^s2member_custom_field_/", "", $col);
218
-
219
- if (isset ($fields[$field_var]) && is_string ($fields[$field_var]) && preg_match ("/^http(s?)\:/i", $fields[$field_var]))
220
- $val = '<a href="' . esc_attr ($fields[$field_var]) . '" target="_blank">' . esc_html (substr ($fields[$field_var], strpos ($fields[$field_var], ":") + 3, 25) . "...") . '</a>';
221
-
222
- else if (isset ($fields[$field_var]) && is_array($fields[$field_var]) && !empty($fields[$field_var]))
223
- $val = preg_replace ("/-\|br\|-/", "<br />", esc_html (implode ("-|br|-", $fields[$field_var])));
224
-
225
- else if (isset ($fields[$field_var]) && is_string ($fields[$field_var]) && strlen ($fields[$field_var]))
226
- $val = esc_html ($fields[$field_var]);
227
-
228
- $last_fields_id = $user_id; // Record this.
229
- }
230
- else if ($col === "s2member_login_counter")
231
- $val = ($v = get_user_option ("s2member_login_counter", $user_id)) ? esc_html ($v) : "—";
232
-
233
- else if ($col === "s2member_last_login_time")
234
- {
235
- if(($time = get_user_option ("s2member_last_login_time", $user_id)))
236
- {
237
- $time = strtotime (get_date_from_gmt (date ("Y-m-d H:i:s", $time)));
238
- $val = esc_html (date ("D M jS, Y", $time)) . '<br /><small>@ precisely ' . esc_html (date ("g:i a", $time)) . '</small>';
239
- }
240
- else $val = "—"; // Not applicable (we've never recorded them logging into the site).
241
- }
242
- $last_user_id = $user_id; // Record this for internal optimizations.
243
-
244
- return apply_filters("ws_plugin__s2member_users_list_display_cols", ((strlen ($val)) ? $val : "—"), get_defined_vars ());
245
- }
246
 
247
- /**
248
- * Tells WordPress certain fields s2Member adds are sortable
249
- *
250
- * @package s2Member\Users_List
251
- * @since 140518
252
- *
253
- * @attaches-to ``add_filter ("manage_users_sortable_columns");``
254
- *
255
- * @param array $columns An Array of sortable User List Columns
256
- */
257
- public static function users_list_add_sortable($columns)
258
- {
259
- $columns['s2member_registration_time'] = 's2member_registration_time';
260
- $columns['s2member_subscr_id'] = 's2member_subscr_id';
261
- $columns['s2member_auto_eot_time'] = 's2member_auto_eot_time';
262
- $columns['s2member_login_counter'] = 's2member_login_counter';
263
- $columns['s2member_last_login_time'] = 's2member_last_login_time';
264
- return $columns;
265
- }
266
 
267
- /**
268
- * Alters WP_Query object to make custom columns sortable
269
- *
270
- * @package s2Member\Users_List
271
- * @since 140518
272
- *
273
- * @attaches-to ``add_filter ("pre_user_query");``
274
- *
275
- * @param WP_User_Query $query `WP_Query` Object passed from WordPress
276
- */
277
- public static function users_list_make_sortable($query)
278
  {
279
- if (!is_admin()
280
- || empty($GLOBALS['pagenow']) || $GLOBALS['pagenow'] !== 'users.php'
281
- || !isset ($query->query_vars))
282
- return;
283
-
284
- global $wpdb; /** @var $wpdb wpdb */
285
- $vars = $query->query_vars;
286
-
287
- switch($vars['orderby'])
288
- {
289
- // This isn't a usermeta value, so we don't need to `LEFT JOIN` here.
290
- case 's2member_registration_time':
291
- $query->query_orderby = "ORDER BY CAST(`user_registered` AS UNSIGNED) " . $vars['order'];
292
- break;
293
-
294
- // s2Member Subscription ID can contain non-integer characters. We don't `CAST` this value as `UNSIGNED`
295
- case 's2member_subscr_id':
296
- $query->query_from .= " LEFT JOIN `" . $wpdb->usermeta . "` `m` ON (`" . $wpdb->users . "`.`ID` = `m`.`user_id` AND `m`.`meta_key` = '" . esc_sql($wpdb->prefix . $vars['orderby']) . "')";
297
- $query->query_orderby = "ORDER BY `m`.`meta_value` " . $vars['order'];
298
- break;
299
-
300
- case 's2member_auto_eot_time':
301
- case 's2member_login_counter':
302
- case 's2member_last_login_time':
303
- $query->query_from .= " LEFT JOIN `" . $wpdb->usermeta . "` `m` ON (`" . $wpdb->users . "`.`ID` = `m`.`user_id` AND `m`.`meta_key` = '" . esc_sql($wpdb->prefix . $vars['orderby']) . "')";
304
- $query->query_orderby = "ORDER BY CAST(`m`.`meta_value` AS UNSIGNED) " . $vars['order'];
305
- break;
306
- }
307
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  }
309
- }
 
 
1
  <?php
2
  /**
3
+ * Users list.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Users_List
15
+ * @since 3.5
16
+ */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
+ if(!class_exists("c_ws_plugin__s2member_users_list"))
21
+ {
22
+ /**
23
+ * Users list.
24
+ *
25
+ * @package s2Member\Users_List
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_users_list
29
  {
30
  /**
31
+ * Adds Custom Fields to the admin Profile editing page.
32
+ *
33
+ * @package s2Member\Users_List
34
+ * @since 3.5
35
+ *
36
+ * @attaches-to ``add_action("edit_user_profile");``
37
+ * @attaches-to ``add_action("show_user_profile");``
38
+ *
39
+ * @param WP_User $user Expects a `WP_User` object passed in by the Action Hook.
40
+ */
41
+ public static function users_list_edit_cols($user = NULL)
42
+ {
43
+ c_ws_plugin__s2member_users_list_in::users_list_edit_cols($user);
44
+ }
45
+
46
+ /**
47
+ * Saves Custom Fields after an admin updates Profile.
48
+ *
49
+ * @package s2Member\Users_List
50
+ * @since 3.5
51
+ *
52
+ * @attaches-to ``add_action("edit_user_profile_update");``
53
+ * @attaches-to ``add_action("personal_options_update");``
54
+ *
55
+ * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
56
+ */
57
+ public static function users_list_update_cols($user_id = NULL)
58
+ {
59
+ return c_ws_plugin__s2member_users_list_in::users_list_update_cols($user_id);
60
+ }
61
+
62
+ /**
63
+ * Modifies the search query.
64
+ *
65
+ * Affects searches performed in the list of Users.
66
+ *
67
+ * @package s2Member\Users_List
68
+ * @since 3.5
69
+ *
70
+ * @attaches-to ``add_action("pre_user_query");``
71
+ *
72
+ * @param WP_User_Query $query Expects a `WP_User_Query` object, by reference.
73
+ */
74
+ public static function users_list_query(&$query = NULL)
75
+ {
76
+ global $wpdb;
77
+ /** @var $wpdb wpdb */
78
+
79
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
80
+ do_action("ws_plugin__s2member_before_users_list_search", get_defined_vars());
81
+ unset($__refs, $__v);
82
+
83
+ if(is_admin() && !empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'users.php')
84
+ if(isset ($query->query_vars) && !is_network_admin()) // NOT in Network admin panels.
85
+ if(is_array($qv = $query->query_vars) && ($s = trim($qv["search"], "* \t\n\r\0\x0B")) && ($s = "%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($s))."%"))
86
  {
87
+ $query->query_fields = "SQL_CALC_FOUND_ROWS DISTINCT(`".$wpdb->users."`.`ID`)";
88
+ $query->query_from = " FROM `".$wpdb->users."`, `".$wpdb->usermeta."`"; // Include meta table also.
89
+ $query->query_where = " WHERE `".$wpdb->users."`.`ID` = `".$wpdb->usermeta."`.`user_id`"; // Join w/ meta table.
90
+ $query->query_where .= " AND (".apply_filters("ws_plugin__s2member_before_users_list_search_where_or_before", "", get_defined_vars());
91
+ $query->query_where .= " (`".$wpdb->users."`.`user_login` LIKE '".$s."' OR `".$wpdb->users."`.`user_nicename` LIKE '".$s."' OR `".$wpdb->users."`.`display_name` LIKE '".$s."' OR `".$wpdb->users."`.`user_email` LIKE '".$s."' OR `".$wpdb->users."`.`user_url` LIKE '".$s."')";
92
+ $query->query_where .= " OR ((`".$wpdb->usermeta."`.`meta_key` = 'first_name' OR `".$wpdb->usermeta."`.`meta_key` = 'last_name') AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
93
+ $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_subscr_id' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
94
+ $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_custom' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
95
+ $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_custom_fields' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
96
+ if(apply_filters("ws_plugin__s2member_users_list_search_admin_notes", FALSE, get_defined_vars())) // Off by default; this can get very slow on large sites.
97
+ $query->query_where .= " OR (`".$wpdb->usermeta."`.`meta_key` = '".$wpdb->base_prefix."s2member_notes' AND `".$wpdb->usermeta."`.`meta_value` LIKE '".$s."')";
98
+ $query->query_where .= apply_filters("ws_plugin__s2member_before_users_list_search_where_or_after", "", get_defined_vars()).")"; // Leaving room for additional searches here.
99
+
100
+ if(is_multisite()) // On a Multisite Network we need to make sure we're searching only users w/ capabilities on this blog.
101
+ $query->query_where .= " AND `".$wpdb->users."`.`ID` IN(SELECT DISTINCT(`user_id`) FROM `".$wpdb->usermeta."` WHERE `meta_key` = '".$wpdb->prefix."capabilities')";
102
+
103
+ $query->query_from = apply_filters("ws_plugin__s2member_before_users_list_search_from", $query->query_from, get_defined_vars());
104
+ $query->query_where = apply_filters("ws_plugin__s2member_before_users_list_search_where", $query->query_where, get_defined_vars());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
107
+ do_action("ws_plugin__s2member_after_users_list_search", get_defined_vars());
108
+ unset($__refs, $__v);
109
+ }
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
+ /**
112
+ * Adds columns to the list of Users.
113
+ *
114
+ * @package s2Member\Users_List
115
+ * @since 3.5
116
+ *
117
+ * @attaches-to ``add_filter ("manage_users_columns");``
118
+ *
119
+ * @param array $cols Expects an array of columns to be passed through by the Filter.
120
+ *
121
+ * @return array Array of columns, merged with columns introduced by this routine.
122
+ */
123
+ public static function users_list_cols($cols = array())
124
+ {
125
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
126
+ do_action("ws_plugin__s2member_before_users_list_cols", get_defined_vars());
127
+ unset($__refs, $__v);
128
+
129
+ $cols["s2member_registration_time"] = "Registration Date";
130
+
131
+ if(apply_filters("ws_plugin__s2member_users_list_cols_display_paid_registration_times", FALSE))
132
+ $cols["s2member_paid_registration_times"] = "Paid Registr. Date";
133
+
134
+ $cols["s2member_subscr_id"] = "Paid Subscr. ID";
135
+
136
+ if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
137
+ $cols["s2member_ccaps"] = "Custom Capabilities";
138
+
139
+ $cols["s2member_auto_eot_time"] = "EOT Time";
140
+
141
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
142
+ foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
143
+ {
144
+ $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
145
+ $field_id_class = preg_replace("/_/", "-", $field_var);
146
 
147
+ $field_title = ucwords(preg_replace("/_/", " ", $field_var));
148
+ $cols["s2member_custom_field_".$field_var] = $field_title;
149
+ }
150
 
151
+ $cols["s2member_login_counter"] = "# Of Logins";
152
+ $cols["s2member_last_login_time"] = "Last Login Time";
153
 
154
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
155
+ do_action("ws_plugin__s2member_during_users_list_cols", get_defined_vars());
156
+ unset($__refs, $__v);
157
 
158
+ return apply_filters("ws_plugin__s2member_users_list_cols", $cols, get_defined_vars());
159
+ }
160
 
161
+ /**
162
+ * Displays column data in the row of details.
163
+ *
164
+ * @package s2Member\Users_List
165
+ * @since 3.5
166
+ *
167
+ * @attaches-to ``add_filter ("manage_users_custom_column");``
168
+ *
169
+ * @param string $val A value for this column, passed through by the Filter.
170
+ * @param string $col The name of the column for which we might need to supply data for.
171
+ * @param int|string $user_id Expects a WordPress User ID, passed through by the Filter.
172
+ *
173
+ * @return string A column value introduced by this routine, or existing value, or, if empty, a dash.
174
+ */
175
+ public static function users_list_display_cols($val = '', $col = '', $user_id = '')
176
+ {
177
+ static $user, $last_user_id; // Used internally for optimization.
178
+ static $fields, $last_fields_id; // Used for optimization.
179
+
180
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
181
+ do_action("ws_plugin__s2member_before_users_list_display_cols", get_defined_vars());
182
+ unset($__refs, $__v);
183
+
184
+ $user = (is_object($user) && $user_id === $last_user_id) ? $user : new WP_User ($user_id);
185
+
186
+ if($col === "s2member_registration_time")
187
+ $val = (($time = strtotime(get_date_from_gmt($user->user_registered)))) ? esc_html(date("D M jS, Y", $time)).'<br /><small>@ precisely '.esc_html(date("g:i a", $time)).'</small>' : "—";
188
+
189
+ else if($col === "s2member_paid_registration_times")
190
+ {
191
+ $val = ""; // Initialize $val before we begin.
192
+ if(is_array($v = get_user_option("s2member_paid_registration_times", $user_id)))
193
+ foreach($v as $level => $time) // Go through each Paid Registration Time.
194
+ {
195
+ $time = strtotime(get_date_from_gmt(date("Y-m-d H:i:s", $time)));
196
 
197
+ if($level === "level") // First Payment Time, regardless of Level.
198
+ $val .= (($val) ? "<br />" : "").'<span title="'.esc_attr(date("D M jS, Y", $time)).' @ precisely '.esc_attr(date("g:i a", $time)).'">'.esc_html(date("D M jS, Y", $time)).'</span>';
199
+ else if(preg_match("/^level([0-9]+)$/i", $level) && ($level = preg_replace("/^level/", "", $level)))
200
+ $val .= (($val) ? "<br />" : "").'<small><em>@Level '.esc_html($level).': <span title="'.esc_attr(date("D M jS, Y", $time)).' @ precisely '.esc_attr(date("g:i a", $time)).'">'.esc_html(date("D M jS, Y", $time)).'</span></em></small>';
201
+ }
202
+ }
203
+ else if($col === "s2member_subscr_id")
204
+ $val = ($v = get_user_option("s2member_subscr_id", $user_id)) ? esc_html($v) : "—";
205
 
206
+ else if($col === "s2member_ccaps") // Custom Capabilities.
207
+ {
208
+ foreach($user->allcaps as $cap => $cap_enabled)
209
+ if(preg_match("/^access_s2member_ccap_/", $cap))
210
+ $ccaps[] = preg_replace("/^access_s2member_ccap_/", "", $cap);
211
 
212
+ $val = (!empty($ccaps)) ? implode("<br />", $ccaps) : "—";
213
+ }
214
+ else if($col === "s2member_auto_eot_time")
215
+ $val = ($v = get_user_option("s2member_auto_eot_time", $user_id)) ? date("D M jS, Y", (integer)$v)."<br /><small>@ precisely ".date("g:i a", (integer)$v)."</small>" : "—";
216
 
217
+ else if(preg_match("/^s2member_custom_field_/", $col))
218
+ {
219
+ if(!$last_fields_id || $last_fields_id !== $user_id)
220
+ $fields = get_user_option("s2member_custom_fields", $user_id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
+ $field_var = preg_replace("/^s2member_custom_field_/", "", $col);
223
+
224
+ if(isset ($fields[$field_var]) && is_string($fields[$field_var]) && preg_match("/^http(s?)\:/i", $fields[$field_var]))
225
+ $val = '<a href="'.esc_attr($fields[$field_var]).'" target="_blank">'.esc_html(substr($fields[$field_var], strpos($fields[$field_var], ":") + 3, 25)."...").'</a>';
226
+
227
+ else if(isset ($fields[$field_var]) && is_array($fields[$field_var]) && !empty($fields[$field_var]))
228
+ $val = preg_replace("/-\|br\|-/", "<br />", esc_html(implode("-|br|-", $fields[$field_var])));
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
+ else if(isset ($fields[$field_var]) && is_string($fields[$field_var]) && strlen($fields[$field_var]))
231
+ $val = esc_html($fields[$field_var]);
232
+
233
+ $last_fields_id = $user_id; // Record this.
234
+ }
235
+ else if($col === "s2member_login_counter")
236
+ $val = ($v = get_user_option("s2member_login_counter", $user_id)) ? esc_html($v) : "—";
237
+
238
+ else if($col === "s2member_last_login_time")
239
+ {
240
+ if(($time = get_user_option("s2member_last_login_time", $user_id)))
241
  {
242
+ $time = strtotime(get_date_from_gmt(date("Y-m-d H:i:s", $time)));
243
+ $val = esc_html(date("D M jS, Y", $time)).'<br /><small>@ precisely '.esc_html(date("g:i a", $time)).'</small>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
  }
245
+ else $val = "—"; // Not applicable (we've never recorded them logging into the site).
246
+ }
247
+ $last_user_id = $user_id; // Record this for internal optimizations.
248
+
249
+ return apply_filters("ws_plugin__s2member_users_list_display_cols", ((strlen($val)) ? $val : "—"), get_defined_vars());
250
+ }
251
+
252
+ /**
253
+ * Tells WordPress certain fields s2Member adds are sortable
254
+ *
255
+ * @package s2Member\Users_List
256
+ * @since 140518
257
+ *
258
+ * @attaches-to ``add_filter ("manage_users_sortable_columns");``
259
+ *
260
+ * @param array $columns An array of sortable user list columns.
261
+ *
262
+ * @return array The input array after having been filtered here.
263
+ */
264
+ public static function users_list_add_sortable($columns = array())
265
+ {
266
+ if(!empty($_REQUEST['s']))
267
+ return $columns;
268
+
269
+ $columns['s2member_registration_time'] = 's2member_registration_time';
270
+ $columns['s2member_subscr_id'] = 's2member_subscr_id';
271
+ $columns['s2member_auto_eot_time'] = 's2member_auto_eot_time';
272
+ $columns['s2member_login_counter'] = 's2member_login_counter';
273
+ $columns['s2member_last_login_time'] = 's2member_last_login_time';
274
+
275
+ return $columns;
276
+ }
277
+
278
+ /**
279
+ * Alters WP_Query object to make custom columns sortable
280
+ *
281
+ * @package s2Member\Users_List
282
+ * @since 140518
283
+ *
284
+ * @attaches-to ``add_filter ("pre_user_query");``
285
+ *
286
+ * @param WP_User_Query $query `WP_Query` Object passed from WordPress
287
+ */
288
+ public static function users_list_make_sortable($query)
289
+ {
290
+ if(!is_admin()
291
+ || empty($GLOBALS['pagenow']) || $GLOBALS['pagenow'] !== 'users.php'
292
+ || !isset ($query->query_vars) || !empty($_REQUEST['s'])
293
+ ) return;
294
+
295
+ global $wpdb;
296
+ /** @var $wpdb wpdb */
297
+ $vars = $query->query_vars;
298
+
299
+ switch($vars['orderby'])
300
+ {
301
+ // This isn't a usermeta value, so we don't need to `LEFT JOIN` here.
302
+ case 's2member_registration_time':
303
+ $query->query_orderby = "ORDER BY CAST(`user_registered` AS UNSIGNED) ".$vars['order'];
304
+ break;
305
+
306
+ // s2Member Subscription ID can contain non-integer characters. We don't `CAST` this value as `UNSIGNED`
307
+ case 's2member_subscr_id':
308
+ $query->query_from .= " LEFT JOIN `".$wpdb->usermeta."` `___m` ON (`".$wpdb->users."`.`ID` = `___m`.`user_id` AND `___m`.`meta_key` = '".esc_sql($wpdb->prefix.$vars['orderby'])."')";
309
+ $query->query_orderby = "ORDER BY `___m`.`meta_value` ".$vars['order'];
310
+ break;
311
+
312
+ case 's2member_auto_eot_time':
313
+ case 's2member_login_counter':
314
+ case 's2member_last_login_time':
315
+ $query->query_from .= " LEFT JOIN `".$wpdb->usermeta."` `___m` ON (`".$wpdb->users."`.`ID` = `___m`.`user_id` AND `___m`.`meta_key` = '".esc_sql($wpdb->prefix.$vars['orderby'])."')";
316
+ $query->query_orderby = "ORDER BY CAST(`___m`.`meta_value` AS UNSIGNED) ".$vars['order'];
317
+ break;
318
  }
319
+ }
320
+ }
321
+ }
includes/classes/utils-urls.inc.php CHANGED
@@ -198,6 +198,9 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
198
 
199
  $args["httpversion"] = (!isset($args["httpversion"])) ? "1.1" : $args["httpversion"];
200
 
 
 
 
201
  if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
202
  $args = array_merge($args, array("method" => "POST", "body" => $post_vars));
203
 
198
 
199
  $args["httpversion"] = (!isset($args["httpversion"])) ? "1.1" : $args["httpversion"];
200
 
201
+ if(!isset($args["sslverify"]) && c_ws_plugin__s2member_utils_conds::is_localhost())
202
+ $args["sslverify"] = FALSE; // Force this off on localhost installs.
203
+
204
  if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
205
  $args = array_merge($args, array("method" => "POST", "body" => $post_vars));
206
 
includes/translations/s2member.pot CHANGED
@@ -1,10 +1,10 @@
1
- # Copyright (C) 2015
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 150203\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2015-02-13 02:20:51+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,7 +12,7 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
- #: s2member/includes/classes/brute-force.inc.php:90
16
  msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
@@ -1414,12 +1414,12 @@ msgstr ""
1414
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1415
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1416
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
1417
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:312
1418
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:317
1419
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:595
1420
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:600
1421
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:605
1422
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:610
1423
  msgctxt "s2member-front"
1424
  msgid "— Oops, you missed something: —"
1425
  msgstr ""
@@ -1434,7 +1434,7 @@ msgstr ""
1434
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:895
1435
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1436
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1437
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:600
1438
  msgctxt "s2member-front"
1439
  msgid "Passwords do not match up. Please try again."
1440
  msgstr ""
@@ -1449,7 +1449,7 @@ msgstr ""
1449
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:902
1450
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1451
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1452
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:605
1453
  msgctxt "s2member-front"
1454
  msgid "Password MUST be at least 6 characters. Please try again."
1455
  msgstr ""
@@ -2621,7 +2621,7 @@ msgstr ""
2621
  #: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:236
2622
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:663
2623
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:311
2624
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:857
2625
  msgctxt "s2member-front percentage-symbol"
2626
  msgid "%"
2627
  msgstr ""
@@ -2740,7 +2740,7 @@ msgid "You're <strong>NOT</strong> logged in."
2740
  msgstr ""
2741
 
2742
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:290
2743
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:630
2744
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:343
2745
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:668
2746
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:411
@@ -2752,23 +2752,23 @@ msgid "<strong>Thank you.</strong> Your account has been updated.<br />&mdash; P
2752
  msgstr ""
2753
 
2754
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:494
2755
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:747
2756
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:503
2757
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:821
2758
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:588
2759
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:902
2760
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:746
2761
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1071
2762
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:407
2763
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:602
2764
  msgctxt "s2member-front"
2765
  msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2766
  msgstr ""
2767
 
2768
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:503
2769
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:527
2770
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:756
2771
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:777
2772
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:124
2773
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:141
2774
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:512
@@ -2785,33 +2785,33 @@ msgstr ""
2785
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1101
2786
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:124
2787
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:141
2788
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:419
2789
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:614
2790
  #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:126
2791
  msgctxt "s2member-front"
2792
  msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
2793
  msgstr ""
2794
 
2795
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:518
2796
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:768
2797
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:524
2798
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:842
2799
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:609
2800
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:923
2801
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:767
2802
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1092
2803
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:408
2804
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:603
2805
  msgctxt "s2member-front"
2806
  msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; You'll receive an email momentarily."
2807
  msgstr ""
2808
 
2809
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:788
2810
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:862
2811
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:943
2812
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1112
2813
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:136
2814
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:618
2815
  msgctxt "s2member-front"
2816
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2817
  msgstr ""
@@ -2826,11 +2826,11 @@ msgstr ""
2826
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:431
2827
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:571
2828
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:784
2829
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:162
2830
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:243
2831
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:316
2832
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:385
2833
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:513
2834
  msgctxt "s2member-front"
2835
  msgid "Security Code"
2836
  msgstr ""
@@ -2839,8 +2839,8 @@ msgstr ""
2839
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:743
2840
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:246
2841
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:752
2842
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:216
2843
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:486
2844
  msgctxt "s2member-front"
2845
  msgid "Additional Info"
2846
  msgstr ""
@@ -3859,14 +3859,14 @@ msgstr ""
3859
 
3860
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:169
3861
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:288
3862
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:154
3863
  msgctxt "s2member-front"
3864
  msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
3865
  msgstr ""
3866
 
3867
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
3868
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:295
3869
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:161
3870
  msgctxt "s2member-front"
3871
  msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
3872
  msgstr ""
@@ -4072,8 +4072,8 @@ msgctxt "s2member-front"
4072
  msgid "API failure. Please contact Support for assistance."
4073
  msgstr ""
4074
 
4075
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:248
4076
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:495
4077
  msgctxt "s2member-front"
4078
  msgid "<strong>Thank you.</strong> Your account has been updated :-)"
4079
  msgstr ""
@@ -4131,32 +4131,32 @@ msgctxt "s2member-front"
4131
  msgid "<strong>Oops.</strong> No Customer|Subscr. ID. Please contact Support for assistance."
4132
  msgstr ""
4133
 
4134
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:630
4135
  msgctxt "s2member-front"
4136
  msgid "Error code: <code>%1$s</code>. %2$s."
4137
  msgstr ""
4138
 
4139
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:634
4140
  msgctxt "s2member-front"
4141
  msgid "Invalid parameters to Stripe; please contact the site owner."
4142
  msgstr ""
4143
 
4144
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:637
4145
  msgctxt "s2member-front"
4146
  msgid "Invalid Stripe API keys; please contact the site owner."
4147
  msgstr ""
4148
 
4149
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:640
4150
  msgctxt "s2member-front"
4151
  msgid "Network communication failure with Stripe; please try again."
4152
  msgstr ""
4153
 
4154
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:643
4155
  msgctxt "s2member-front"
4156
  msgid "Stripe API error; please try again."
4157
  msgstr ""
4158
 
4159
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:645
4160
  msgctxt "s2member-front"
4161
  msgid "Stripe error; please try again."
4162
  msgstr ""
@@ -4261,8 +4261,8 @@ msgstr ""
4261
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4262
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
4263
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
4264
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:317
4265
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:610
4266
  msgctxt "s2member-front"
4267
  msgid "Security Code missing. Please try again."
4268
  msgstr ""
@@ -4294,7 +4294,7 @@ msgstr ""
4294
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:350
4295
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:650
4296
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4297
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:466
4298
  msgctxt "s2member-front"
4299
  msgid "calculating sales tax..."
4300
  msgstr ""
@@ -4306,7 +4306,7 @@ msgstr ""
4306
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4307
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4308
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4309
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:483
4310
  msgctxt "s2member-front"
4311
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
4312
  msgstr ""
@@ -4318,7 +4318,7 @@ msgstr ""
4318
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4319
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4320
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4321
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:483
4322
  msgctxt "s2member-front"
4323
  msgid "Today"
4324
  msgstr ""
@@ -4328,7 +4328,7 @@ msgstr ""
4328
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4329
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:723
4330
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4331
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:411
4332
  #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:59
4333
  #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:43
4334
  #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:59
@@ -4344,7 +4344,7 @@ msgstr ""
4344
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4345
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:724
4346
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4347
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:412
4348
  msgctxt "s2member-front"
4349
  msgid "Your Profile"
4350
  msgstr ""
@@ -4380,15 +4380,15 @@ msgid "Submit Form"
4380
  msgstr ""
4381
 
4382
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4383
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:277
4384
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:557
4385
  msgctxt "s2member-front"
4386
  msgid "Add"
4387
  msgstr ""
4388
 
4389
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4390
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:296
4391
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:580
4392
  msgctxt "s2member-front"
4393
  msgid "No Billing Method; please try again."
4394
  msgstr ""
1
+ # Copyright (C) 2015
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 150311\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2015-03-11 20:36:05+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: s2member/includes/classes/brute-force.inc.php:102
16
  msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
1414
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1415
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1416
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
1417
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:315
1418
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:320
1419
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:616
1420
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:621
1421
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:626
1422
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:631
1423
  msgctxt "s2member-front"
1424
  msgid "— Oops, you missed something: —"
1425
  msgstr ""
1434
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:895
1435
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1436
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1437
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:621
1438
  msgctxt "s2member-front"
1439
  msgid "Passwords do not match up. Please try again."
1440
  msgstr ""
1449
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:902
1450
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1451
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1452
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:626
1453
  msgctxt "s2member-front"
1454
  msgid "Password MUST be at least 6 characters. Please try again."
1455
  msgstr ""
2621
  #: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:236
2622
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:663
2623
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:311
2624
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:869
2625
  msgctxt "s2member-front percentage-symbol"
2626
  msgid "%"
2627
  msgstr ""
2740
  msgstr ""
2741
 
2742
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:290
2743
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:634
2744
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:343
2745
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:668
2746
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:411
2752
  msgstr ""
2753
 
2754
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:494
2755
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:751
2756
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:503
2757
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:821
2758
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:588
2759
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:902
2760
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:746
2761
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1071
2762
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:408
2763
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:603
2764
  msgctxt "s2member-front"
2765
  msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2766
  msgstr ""
2767
 
2768
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:505
2769
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:531
2770
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:760
2771
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:781
2772
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:124
2773
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:141
2774
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:512
2785
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1101
2786
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:124
2787
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:141
2788
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:420
2789
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:615
2790
  #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:126
2791
  msgctxt "s2member-front"
2792
  msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
2793
  msgstr ""
2794
 
2795
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:520
2796
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:772
2797
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:524
2798
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:842
2799
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:609
2800
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:923
2801
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:767
2802
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1092
2803
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:409
2804
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:604
2805
  msgctxt "s2member-front"
2806
  msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; You'll receive an email momentarily."
2807
  msgstr ""
2808
 
2809
+ #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:792
2810
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:862
2811
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:943
2812
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1112
2813
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:136
2814
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:619
2815
  msgctxt "s2member-front"
2816
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2817
  msgstr ""
2826
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:431
2827
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:571
2828
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:784
2829
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:164
2830
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:245
2831
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:318
2832
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:402
2833
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:556
2834
  msgctxt "s2member-front"
2835
  msgid "Security Code"
2836
  msgstr ""
2839
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:743
2840
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:246
2841
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:752
2842
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:218
2843
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:529
2844
  msgctxt "s2member-front"
2845
  msgid "Additional Info"
2846
  msgstr ""
3859
 
3860
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:169
3861
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:288
3862
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:155
3863
  msgctxt "s2member-front"
3864
  msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
3865
  msgstr ""
3866
 
3867
  #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
3868
  #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:295
3869
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:162
3870
  msgctxt "s2member-front"
3871
  msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
3872
  msgstr ""
4072
  msgid "API failure. Please contact Support for assistance."
4073
  msgstr ""
4074
 
4075
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:249
4076
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:496
4077
  msgctxt "s2member-front"
4078
  msgid "<strong>Thank you.</strong> Your account has been updated :-)"
4079
  msgstr ""
4131
  msgid "<strong>Oops.</strong> No Customer|Subscr. ID. Please contact Support for assistance."
4132
  msgstr ""
4133
 
4134
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:641
4135
  msgctxt "s2member-front"
4136
  msgid "Error code: <code>%1$s</code>. %2$s."
4137
  msgstr ""
4138
 
4139
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:645
4140
  msgctxt "s2member-front"
4141
  msgid "Invalid parameters to Stripe; please contact the site owner."
4142
  msgstr ""
4143
 
4144
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:648
4145
  msgctxt "s2member-front"
4146
  msgid "Invalid Stripe API keys; please contact the site owner."
4147
  msgstr ""
4148
 
4149
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:651
4150
  msgctxt "s2member-front"
4151
  msgid "Network communication failure with Stripe; please try again."
4152
  msgstr ""
4153
 
4154
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:654
4155
  msgctxt "s2member-front"
4156
  msgid "Stripe API error; please try again."
4157
  msgstr ""
4158
 
4159
+ #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:656
4160
  msgctxt "s2member-front"
4161
  msgid "Stripe error; please try again."
4162
  msgstr ""
4261
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4262
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
4263
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
4264
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:320
4265
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:631
4266
  msgctxt "s2member-front"
4267
  msgid "Security Code missing. Please try again."
4268
  msgstr ""
4294
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:350
4295
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:650
4296
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4297
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:473
4298
  msgctxt "s2member-front"
4299
  msgid "calculating sales tax..."
4300
  msgstr ""
4306
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4307
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4308
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4309
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:490
4310
  msgctxt "s2member-front"
4311
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
4312
  msgstr ""
4318
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4319
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4320
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4321
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:490
4322
  msgctxt "s2member-front"
4323
  msgid "Today"
4324
  msgstr ""
4328
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4329
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:723
4330
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4331
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:417
4332
  #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:59
4333
  #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:43
4334
  #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:59
4344
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4345
  #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:724
4346
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4347
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:418
4348
  msgctxt "s2member-front"
4349
  msgid "Your Profile"
4350
  msgstr ""
4380
  msgstr ""
4381
 
4382
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4383
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:279
4384
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:577
4385
  msgctxt "s2member-front"
4386
  msgid "Add"
4387
  msgstr ""
4388
 
4389
  #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4390
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:299
4391
+ #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:601
4392
  msgctxt "s2member-front"
4393
  msgid "No Billing Method; please try again."
4394
  msgstr ""
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 150225
4
- Stable tag: 150225
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -169,12 +169,21 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
169
 
170
  == Upgrade Notice ==
171
 
172
- = v150225 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
 
 
 
 
 
 
 
 
 
178
  = v150225 =
179
 
180
  - (s2Member Pro) **Accept Bitcoin via Stripe!** This release of s2Member Pro comes integrated with the latest version of the Stripe API, where it is now possible to accept Bitcoin right along with most major credit cards—made possible by [Stripe's latest update to support Bitcoin](https://stripe.com/bitcoin). It's as easy as flipping a switch :-) Please see: `Dashboard ⥱ s2Member Pro ⥱ Stripe Options ⥱ Account Details ⥱ Accept Bitcoin`. Referencing [this GitHub issue](https://github.com/websharks/s2member/issues/482); i.e., the original feature request.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 150311
4
+ Stable tag: 150311
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
169
 
170
  == Upgrade Notice ==
171
 
172
+ = v150311 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
178
+ = v150311 =
179
+
180
+ - (s2Member/s2Member) **Bug Fix:** The list of users in the WordPress Dashboard was going blank in a particular scenario where a search was attempted in concert with a sortable s2Member column. Fixed in this release. Props to @bridgeport for finding this. See also [this GitHub issue](https://github.com/websharks/s2member/issues/496#issuecomment-76821470) if you'd like technical details.
181
+ - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent changes in the `WP_User_Query` class. See [this GitHub issue](https://github.com/websharks/s2member/issues/493) if you'd like additional details.
182
+ - (s2Member Pro) **Remote Operations API (Bug Fix):** If a remote API call was made to find a user by `user_login`, and that username was all numeric, the `WP_User` class treated it like a user ID instead of as an actual username. Resolved in this release by calling `new WP_User(0, [user login])` as the second argument to the constructor. Thereby forcing `WP_User` to consider it a username. See also [this GitHub issue](https://github.com/websharks/s2member/issues/498) if you'd like technical details.
183
+ - (s2Member Pro) **Stripe Bug Fix:** Stripe Pro-Forms for Specific Post/Page Access should not disable the email address field for logged-in users. Resolved in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/500) if you'd like technical details.
184
+ - (s2Member Pro) **Stripe Pro-Forms:** This release corrects a bug first introduced in the last release that prevented custom templates for Stripe Pro-Forms from working as intended. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/510) if you'd like additional details.
185
+ - (s2Member Pro) **Bug Fix for Gift/Redemption Codes:** This release of s2Member corrects a bug that impacted the generation of Gift/Redemption Codes whenever they were sold with Specific Post/Page Access. See also [this GitHub issue](https://github.com/websharks/s2member/issues/512) if you'd like additional details.
186
+
187
  = v150225 =
188
 
189
  - (s2Member Pro) **Accept Bitcoin via Stripe!** This release of s2Member Pro comes integrated with the latest version of the Stripe API, where it is now possible to accept Bitcoin right along with most major credit cards—made possible by [Stripe's latest update to support Bitcoin](https://stripe.com/bitcoin). It's as easy as flipping a switch :-) Please see: `Dashboard ⥱ s2Member Pro ⥱ Stripe Options ⥱ Account Details ⥱ Accept Bitcoin`. Referencing [this GitHub issue](https://github.com/websharks/s2member/issues/482); i.e., the original feature request.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 150225
23
- Stable tag: 150225
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -76,7 +76,7 @@ if(!defined('WPINC')) // MUST have WordPress.
76
  * @var string
77
  */
78
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
79
- define('WS_PLUGIN__S2MEMBER_VERSION', '150225' /* !#distro-version#! */);
80
  /**
81
  * Minimum PHP version required to run s2Member.
82
  *
@@ -106,7 +106,7 @@ if(!defined('WS_PLUGIN__S2MEMBER_MIN_WP_VERSION'))
106
  * @var string
107
  */
108
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
109
- define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '150225' /* !#distro-version#! */);
110
  /*
111
  Several compatibility checks.
112
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 150311
23
+ Stable tag: 150311
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
76
  * @var string
77
  */
78
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
79
+ define('WS_PLUGIN__S2MEMBER_VERSION', '150311' /* !#distro-version#! */);
80
  /**
81
  * Minimum PHP version required to run s2Member.
82
  *
106
  * @var string
107
  */
108
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
109
+ define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '150311' /* !#distro-version#! */);
110
  /*
111
  Several compatibility checks.
112
  If all pass, load the s2Member plugin.