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

Version Description

= v120219 = Link updates and a compatibility fix. Upgrade immediately.

Download this release

Release Info

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

Code changes from version 120213 to 120219

includes/classes/ip-restrictions.inc.php CHANGED
@@ -14,10 +14,10 @@
14
  * @package s2Member\IP_Restrictions
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_ip_restrictions"))
21
  {
22
  /**
23
  * IP Restrictions.
@@ -39,68 +39,68 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
39
  * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
40
  * @return bool True if IP Restrictions are OK, otherwise this function will exit script execution after issuing a warning.
41
  */
42
- public static function ip_restrictions_ok ($ip = FALSE, $restriction = FALSE)
43
  {
44
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
45
- do_action ("ws_plugin__s2member_before_ip_restrictions_ok", get_defined_vars ());
46
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
47
  /**/
48
- if (!apply_filters ("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars ())
49
- /* Also allow specific exclusions here. */ && !apply_filters ("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars ())
50
- /* And enabled by site owner? */ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"] /* And a valid ``$restriction``? */ && $restriction && is_string ($restriction)
51
  /* Flag indicating that we ARE processing this IP Restriction. Useful in Hooks/Filters. */ && ($processing = true))
52
  {
53
- $msg_503 = _x ('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member");
54
  /**/
55
- $prefix = "s2m_ipr_"; /* s2Member Transient prefix for all IP Restrictions. Allows s2Member to find these easily. */
56
  /**/
57
- $transient_entries = $prefix . md5 ("s2member_ip_restrictions_" . $restriction . "_entries");
58
- $transient_security_breach = $prefix . md5 ("s2member_ip_restrictions_" . $restriction . "_security_breach");
59
  /**/
60
  /* If you add Filters, use a string compatible with PHP's strtotime() function. */
61
- $concurrency = apply_filters ("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
62
  /**/
63
- $entries = (is_array ($entries = get_transient ($transient_entries))) ? $entries : array ();
64
  /**/
65
- foreach ($entries as $_entry => $_time) /* Auto-expire entries, based on time. */
66
- if ($_time < strtotime ("-" . $concurrency)) /* Based on time. */
67
  unset($entries[$_entry]); /* Unset this entry value. */
68
  /**/
69
- $ip = ($ip && is_string ($ip)) ? $ip : "empty"; /* Allow empty IPs. */
70
- $entries[$ip] = strtotime ("now"); /* Log entry. Add IP with entry time. */
71
- set_transient ($transient_entries, $entries, 2 * (strtotime ("+" . $concurrency) - strtotime ("now")));
72
  /**/
73
- if (get_transient ($transient_security_breach)) /* Already breached security? */
74
  {
75
- c_ws_plugin__s2member_no_cache::no_cache_constants (true);
76
  /**/
77
  status_header(503); /* Send a 503 error status header; temporarily unavailable. */
78
- wp_clear_auth_cookie (); /* Clear authorization cookies; we need to log them out now. */
79
  header("Content-Type: text/html; charset=utf-8"); /* Content-Type text/html with UTF-8. */
80
  eval('while (@ob_end_clean ());'); /* End/clean any output buffers that may exist. */
81
  /**/
82
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
83
- do_action ("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars ());
84
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
85
  /**/
86
  exit($msg_503); /* Clean exit with 503 error message. */
87
  }
88
  /**/
89
- else if (count ($entries) > $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
90
  {
91
- c_ws_plugin__s2member_no_cache::no_cache_constants (true);
92
  /**/
93
  set_transient /* A security breach has just occurred. We need to set this Transient now. */
94
  ($transient_security_breach, 1, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction_time"]);
95
  /**/
96
  status_header(503); /* Send a 503 error status header; temporarily unavailable. */
97
- wp_clear_auth_cookie (); /* Clear authorization cookies; we need to log them out now. */
98
  header("Content-Type: text/html; charset=utf-8"); /* Content-Type text/html with UTF-8. */
99
  eval('while (@ob_end_clean ());'); /* End/clean any output buffers that may exist. */
100
  /**/
101
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
102
- do_action ("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars ());
103
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
104
  /**/
105
  exit($msg_503); /* Clean exit with 503 error message. */
106
  }
@@ -108,18 +108,18 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
108
  else /* OK, this looks legitimate. Apply Filters here and return true. */
109
  {
110
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
111
- do_action ("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars ());
112
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
113
  /**/
114
- return apply_filters ("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars ());
115
  }
116
  }
117
  /**/
118
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
119
- do_action ("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars ());
120
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
121
  /**/
122
- return apply_filters ("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars ());
123
  }
124
  /**
125
  * Queries Transients for specific IP Restrictions associated with a security breach.
@@ -130,15 +130,15 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
130
  * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
131
  * @return bool True if the specific IP Restriction is associated with a security breach, else false.
132
  */
133
- public static function specific_ip_restriction_breached_security ($restriction = FALSE)
134
  {
135
- do_action ("ws_plugin__s2member_before_specific_ip_restriction_breached_security", get_defined_vars ());
136
  /**/
137
  $prefix = "s2m_ipr_"; /* s2Member Transient prefix for all IP Restrictions. */
138
- $transient_security_breach = $prefix . md5 ("s2member_ip_restrictions_" . (string)$restriction . "_security_breach");
139
- $breached_security = $associated_with_security_breach = (get_transient ($transient_security_breach)) ? true : false;
140
  /**/
141
- return apply_filters ("ws_plugin__s2member_before_specific_ip_restriction_breached_security", $breached_security, get_defined_vars ());
142
  }
143
  /**
144
  * Resets/deletes specific IP Restrictions.
@@ -151,22 +151,22 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
151
  *
152
  * @todo Make return value conditional, based on success.
153
  */
154
- public static function delete_reset_specific_ip_restrictions ($restriction = FALSE)
155
  {
156
  global $wpdb; /* Need global database object. */
157
  /**/
158
- do_action ("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions", get_defined_vars ());
159
  /**/
160
  $prefix = "s2m_ipr_"; /* s2Member Transient prefix for all IP Restrictions. */
161
- $transient_entries = $prefix . md5 ("s2member_ip_restrictions_" . (string)$restriction . "_entries");
162
- $transient_security_breach = $prefix . md5 ("s2member_ip_restrictions_" . (string)$restriction . "_security_breach");
163
  /**/
164
- $wpdb->query ("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '%" . esc_sql (like_escape ($transient_entries)) . "'");
165
- $wpdb->query ("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '%" . esc_sql (like_escape ($transient_security_breach)) . "'");
166
  /**/
167
- do_action ("ws_plugin__s2member_after_delete_reset_specific_ip_restrictions", get_defined_vars ());
168
  /**/
169
- return apply_filters ("ws_plugin__s2member_delete_reset_specific_ip_restrictions", true, get_defined_vars ());
170
  }
171
  /**
172
  * Resets/deletes specific IP Restrictions via AJAX.
@@ -178,28 +178,28 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
178
  *
179
  * @return null Exits script execution after returning data for AJAX caller.
180
  */
181
- public static function delete_reset_specific_ip_restrictions_via_ajax ()
182
  {
183
- do_action ("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions_via_ajax", get_defined_vars ());
184
  /**/
185
  status_header(200); /* Send a 200 OK status header. */
186
  header("Content-Type: text/plain; charset=utf-8"); /* Content-Type with UTF-8. */
187
  eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
188
  /**/
189
- if (current_user_can ("create_users")) /* Check priveledges. Ability to create Users? */
190
  /**/
191
- if (!empty ($_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
192
- if (($nonce = $_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
193
- if (wp_verify_nonce ($nonce, "ws-plugin--s2member-delete-reset-specific-ip-restrictions-via-ajax"))
194
  /**/
195
- if (!empty ($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
196
- if (is_string /* Must be a string here. */ ($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
197
- if (($restriction = trim (stripslashes ($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))))
198
  /**/
199
- if (c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions ($restriction))
200
  $success = true; /* Yes, this IP Restriction was deleted/reset. */
201
  /**/
202
- exit(apply_filters ("ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", ((isset ($success) && $success) ? "1" : "0"), get_defined_vars ()));
203
  }
204
  /**
205
  * Resets/deletes all IP Restrictions.
@@ -211,18 +211,18 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
211
  *
212
  * @todo Make return value conditional, based on success.
213
  */
214
- public static function delete_reset_all_ip_restrictions ()
215
  {
216
  global $wpdb; /* Need global database object. */
217
  /**/
218
- do_action ("ws_plugin__s2member_before_delete_reset_all_ip_restrictions", get_defined_vars ());
219
  /**/
220
- $wpdb->query ("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql (like_escape ("_transient_s2m_ipr_")) . "%'");
221
- $wpdb->query ("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql (like_escape ("_transient_timeout_s2m_ipr_")) . "%'");
222
  /**/
223
- do_action ("ws_plugin__s2member_after_delete_reset_all_ip_restrictions", get_defined_vars ());
224
  /**/
225
- return apply_filters ("ws_plugin__s2member_delete_reset_all_ip_restrictions", true, get_defined_vars ());
226
  }
227
  /**
228
  * Resets/deletes all IP Restrictions via AJAX.
@@ -234,24 +234,24 @@ if (!class_exists ("c_ws_plugin__s2member_ip_restrictions"))
234
  *
235
  * @return null Exits script execution after returning data for AJAX caller.
236
  */
237
- public static function delete_reset_all_ip_restrictions_via_ajax ()
238
  {
239
- do_action ("ws_plugin__s2member_before_delete_reset_all_ip_restrictions_via_ajax", get_defined_vars ());
240
  /**/
241
  status_header(200); /* Send a 200 OK status header. */
242
  header("Content-Type: text/plain; charset=utf-8"); /* Content-Type with UTF-8. */
243
  eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
244
  /**/
245
- if (current_user_can ("create_users")) /* Check priveledges. Ability to create Users? */
246
  /**/
247
- if (!empty ($_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
248
- if (($nonce = $_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
249
- if (wp_verify_nonce ($nonce, "ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax"))
250
  /**/
251
- if (c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions ())
252
  $success = true; /* Yes, all IP Restrictions were deleted/reset. */
253
  /**/
254
- exit(apply_filters ("ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", ((isset ($success) && $success) ? "1" : "0"), get_defined_vars ()));
255
  }
256
  }
257
  }
14
  * @package s2Member\IP_Restrictions
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_ip_restrictions"))
21
  {
22
  /**
23
  * IP Restrictions.
39
  * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
40
  * @return bool True if IP Restrictions are OK, otherwise this function will exit script execution after issuing a warning.
41
  */
42
+ public static function ip_restrictions_ok($ip = FALSE, $restriction = FALSE)
43
  {
44
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
45
+ do_action("ws_plugin__s2member_before_ip_restrictions_ok", get_defined_vars());
46
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
47
  /**/
48
+ if(!apply_filters("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars())
49
+ /* Also allow specific exclusions here. */ && !apply_filters("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars())
50
+ /* And enabled by site owner? */ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"] /* And a valid ``$restriction``? */ && $restriction && is_string($restriction)
51
  /* Flag indicating that we ARE processing this IP Restriction. Useful in Hooks/Filters. */ && ($processing = true))
52
  {
53
+ $msg_503 = _x('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member");
54
  /**/
55
+ $prefix = /* s2Member Transient prefix for all IP Restrictions. Allows s2Member to find these easily. */ "s2m_ipr_";
56
  /**/
57
+ $transient_entries = $prefix.md5("s2member_ip_restrictions_".$restriction."_entries");
58
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".$restriction."_security_breach");
59
  /**/
60
  /* If you add Filters, use a string compatible with PHP's strtotime() function. */
61
+ $concurrency = apply_filters("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
62
  /**/
63
+ $entries = (is_array($entries = get_transient($transient_entries))) ? $entries : array();
64
  /**/
65
+ foreach($entries as $_entry => $_time) /* Auto-expire entries, based on time. */
66
+ if($_time < strtotime("-".$concurrency)) /* Based on time. */
67
  unset($entries[$_entry]); /* Unset this entry value. */
68
  /**/
69
+ $ip = ($ip && is_string($ip)) ? $ip : "empty"; /* Allow empty IPs. */
70
+ $entries[$ip] = strtotime("now"); /* Log entry. Add IP with entry time. */
71
+ set_transient($transient_entries, $entries, 2 * (strtotime("+".$concurrency) - strtotime("now")));
72
  /**/
73
+ if(get_transient($transient_security_breach)) /* Already breached security? */
74
  {
75
+ c_ws_plugin__s2member_no_cache::no_cache_constants(true);
76
  /**/
77
  status_header(503); /* Send a 503 error status header; temporarily unavailable. */
78
+ wp_clear_auth_cookie(); /* Clear authorization cookies; we need to log them out now. */
79
  header("Content-Type: text/html; charset=utf-8"); /* Content-Type text/html with UTF-8. */
80
  eval('while (@ob_end_clean ());'); /* End/clean any output buffers that may exist. */
81
  /**/
82
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
83
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
84
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
85
  /**/
86
  exit($msg_503); /* Clean exit with 503 error message. */
87
  }
88
  /**/
89
+ else if(count($entries) > $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
90
  {
91
+ c_ws_plugin__s2member_no_cache::no_cache_constants(true);
92
  /**/
93
  set_transient /* A security breach has just occurred. We need to set this Transient now. */
94
  ($transient_security_breach, 1, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction_time"]);
95
  /**/
96
  status_header(503); /* Send a 503 error status header; temporarily unavailable. */
97
+ wp_clear_auth_cookie(); /* Clear authorization cookies; we need to log them out now. */
98
  header("Content-Type: text/html; charset=utf-8"); /* Content-Type text/html with UTF-8. */
99
  eval('while (@ob_end_clean ());'); /* End/clean any output buffers that may exist. */
100
  /**/
101
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
102
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
103
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
104
  /**/
105
  exit($msg_503); /* Clean exit with 503 error message. */
106
  }
108
  else /* OK, this looks legitimate. Apply Filters here and return true. */
109
  {
110
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
111
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
112
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
113
  /**/
114
+ return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
115
  }
116
  }
117
  /**/
118
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
119
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
120
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
121
  /**/
122
+ return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
123
  }
124
  /**
125
  * Queries Transients for specific IP Restrictions associated with a security breach.
130
  * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
131
  * @return bool True if the specific IP Restriction is associated with a security breach, else false.
132
  */
133
+ public static function specific_ip_restriction_breached_security($restriction = FALSE)
134
  {
135
+ do_action("ws_plugin__s2member_before_specific_ip_restriction_breached_security", get_defined_vars());
136
  /**/
137
  $prefix = "s2m_ipr_"; /* s2Member Transient prefix for all IP Restrictions. */
138
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
139
+ $breached_security = $associated_with_security_breach = (get_transient($transient_security_breach)) ? true : false;
140
  /**/
141
+ return apply_filters("ws_plugin__s2member_before_specific_ip_restriction_breached_security", $breached_security, get_defined_vars());
142
  }
143
  /**
144
  * Resets/deletes specific IP Restrictions.
151
  *
152
  * @todo Make return value conditional, based on success.
153
  */
154
+ public static function delete_reset_specific_ip_restrictions($restriction = FALSE)
155
  {
156
  global $wpdb; /* Need global database object. */
157
  /**/
158
+ do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions", get_defined_vars());
159
  /**/
160
  $prefix = "s2m_ipr_"; /* s2Member Transient prefix for all IP Restrictions. */
161
+ $transient_entries = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_entries");
162
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
163
  /**/
164
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_entries))."'");
165
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_security_breach))."'");
166
  /**/
167
+ do_action("ws_plugin__s2member_after_delete_reset_specific_ip_restrictions", get_defined_vars());
168
  /**/
169
+ return apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions", true, get_defined_vars());
170
  }
171
  /**
172
  * Resets/deletes specific IP Restrictions via AJAX.
178
  *
179
  * @return null Exits script execution after returning data for AJAX caller.
180
  */
181
+ public static function delete_reset_specific_ip_restrictions_via_ajax()
182
  {
183
+ do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions_via_ajax", get_defined_vars());
184
  /**/
185
  status_header(200); /* Send a 200 OK status header. */
186
  header("Content-Type: text/plain; charset=utf-8"); /* Content-Type with UTF-8. */
187
  eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
188
  /**/
189
+ if(current_user_can("create_users")) /* Check priveledges. Ability to create Users? */
190
  /**/
191
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
192
+ if(($nonce = $_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
193
+ if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-specific-ip-restrictions-via-ajax"))
194
  /**/
195
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
196
+ if(is_string /* Must be a string here. */($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
197
+ if(($restriction = trim(stripslashes($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))))
198
  /**/
199
+ if(c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions($restriction))
200
  $success = true; /* Yes, this IP Restriction was deleted/reset. */
201
  /**/
202
+ exit(apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
203
  }
204
  /**
205
  * Resets/deletes all IP Restrictions.
211
  *
212
  * @todo Make return value conditional, based on success.
213
  */
214
+ public static function delete_reset_all_ip_restrictions()
215
  {
216
  global $wpdb; /* Need global database object. */
217
  /**/
218
+ do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions", get_defined_vars());
219
  /**/
220
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_s2m_ipr_"))."%'");
221
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_timeout_s2m_ipr_"))."%'");
222
  /**/
223
+ do_action("ws_plugin__s2member_after_delete_reset_all_ip_restrictions", get_defined_vars());
224
  /**/
225
+ return apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions", true, get_defined_vars());
226
  }
227
  /**
228
  * Resets/deletes all IP Restrictions via AJAX.
234
  *
235
  * @return null Exits script execution after returning data for AJAX caller.
236
  */
237
+ public static function delete_reset_all_ip_restrictions_via_ajax()
238
  {
239
+ do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions_via_ajax", get_defined_vars());
240
  /**/
241
  status_header(200); /* Send a 200 OK status header. */
242
  header("Content-Type: text/plain; charset=utf-8"); /* Content-Type with UTF-8. */
243
  eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
244
  /**/
245
+ if(current_user_can("create_users")) /* Check priveledges. Ability to create Users? */
246
  /**/
247
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
248
+ if(($nonce = $_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
249
+ if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax"))
250
  /**/
251
+ if(c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions())
252
  $success = true; /* Yes, all IP Restrictions were deleted/reset. */
253
  /**/
254
+ exit(apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
255
  }
256
  }
257
  }
includes/classes/paypal-notify-in.inc.php CHANGED
@@ -150,7 +150,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
150
  $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
151
  $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.";
152
  $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server.";
153
- $paypal["s2member_log"][] = "Please see this thread: `http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636` for details regarding the ideal server configuration for s2Member.";
154
  $paypal["s2member_log"][] = var_export ($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */
155
  }
156
  /**/
150
  $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
151
  $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.";
152
  $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server.";
153
+ $paypal["s2member_log"][] = "Please see this thread: `http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/` for details regarding the ideal server configuration for s2Member.";
154
  $paypal["s2member_log"][] = var_export ($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */
155
  }
156
  /**/
includes/classes/paypal-return-in.inc.php CHANGED
@@ -123,13 +123,13 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in"))
123
  $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
124
  $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.";
125
  $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server.";
126
- $paypal["s2member_log"][] = "Please see this thread: `http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636` for details regarding the ideal server configuration for s2Member.";
127
  $paypal["s2member_log"][] = var_export ($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */
128
  /**/
129
  $paypal["s2member_log"][] = "Redirecting Customer to the Home Page, due to an error that occurred.";
130
  /**/
131
  echo c_ws_plugin__s2member_return_templates::return_template ("default",/**/
132
- _x ('<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you\'re absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows® server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows® server.<br /><br />Please see <a href="http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636" target="_blank">this thread</a> for details regarding the ideal server configuration for s2Member.', "s2member-front", "s2member"),/**/
133
  _x ("Back To Home Page", "s2member-front", "s2member"), home_url ("/"));
134
  }
135
  /*
123
  $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
124
  $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.";
125
  $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server.";
126
+ $paypal["s2member_log"][] = "Please see this thread: `http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/` for details regarding the ideal server configuration for s2Member.";
127
  $paypal["s2member_log"][] = var_export ($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */
128
  /**/
129
  $paypal["s2member_log"][] = "Redirecting Customer to the Home Page, due to an error that occurred.";
130
  /**/
131
  echo c_ws_plugin__s2member_return_templates::return_template ("default",/**/
132
+ _x ('<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you\'re absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows® server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows® server.<br /><br />Please see <a href="http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/" target="_blank">this thread</a> for details regarding the ideal server configuration for s2Member.', "s2member-front", "s2member"),/**/
133
  _x ("Back To Home Page", "s2member-front", "s2member"), home_url ("/"));
134
  }
135
  /*
includes/menu-pages/down-ops.inc.php CHANGED
@@ -175,7 +175,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
175
  /**/
176
  echo '<div class="ws-menu-page-hr"></div>'."\n";
177
  /**/
178
- echo '<p>The function <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12453#src_doc_s2member_file_download_key%28%29" target="_blank" rel="external">s2member_file_download_key()</a>, is part of the s2Member API. It produces a time-sensitive File Download Key that is unique to each and every visitor. Each Key it produces <em>( at the time it is produced )</em>, will be valid for the current day, and only for a specific IP address and User-Agent string; as detected by s2Member. This makes it possible for you to create links on your site, which provide access to protected file downloads; and without having to worry about one visitor sharing their link with another. So let\'s take a quick look at what <code>s2member_file_download_key()</code> actually produces.</p>'."\n";
179
  echo '<p><code>s2member_file_download_key("example-file.zip")</code> = a site-specific hash of: <code>date("Y-m-d").$_SERVER["REMOTE_ADDR"].$_SERVER["HTTP_USER_AGENT"].$file</code></p>'."\n";
180
  echo '<p>When <code>s2member_file_download_key = <em>a valid Key</em></code>, it works independently from Member Level Access. That is, a visitor does NOT have to be logged in to receive access; they just need a valid Key. Using this advanced technique, you could extend s2Member\'s file protection routines, or even combine them with Specific Post/Page Access, and more. The possibilities are limitless really.</p>'."\n";
181
  /**/
@@ -235,7 +235,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
235
  echo '<div class="ws-menu-page-section ws-plugin--s2member-remote-authorization-section">'."\n";
236
  echo '<h3>Remote Header Authorization ( optional )</h3>'."\n";
237
  echo '<p>This can be enabled on a case-by-case basis. Just add this to the end of your download links: <code>&amp;s2member_file_remote=yes</code>. Shortcode alternative: <code>[s2File download="example-file.zip" remote="yes" /]</code>.</p>'."\n";
238
- echo '<p>Remote Header Authorization allows access to file downloads through an entirely different approach. Instead of asking the Member to log into your site through a browser, a Member will be prompted automatically, to log in through HTTP Header Authorization prompts; which is the same technique used in more traditional security systems via .htaccess files. In other words, Remote Header Authorization makes it possible for your Members to access files through remote applications that may NOT use a browser. This is often the case when a Member needs to access protected files through a software client like iTunes®; typical with podcasts. See <a href="http://www.primothemes.com/forums/viewtopic.php?f=4&t=837&p=28558#p28558" target="_blank" rel="external">tutorial here</a> for details about how to setup a Podcast for iTunes®.</p>'."\n";
239
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_remote_authorization", get_defined_vars());
240
  echo '</div>'."\n";
241
  /**/
@@ -494,13 +494,13 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
494
  echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <code>s2Member -> Download Options -> Advanced Mod Rewrite Linkage</code>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
495
  /**/
496
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, via s2Member\'s Amazon® S3/CloudFront integration )</a></p>'."\n";
497
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
498
  /**/
499
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative )</a></p>'."\n";
500
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
501
  /**/
502
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, advanced w/ multiple HTML5 fallbacks )</a></p>'."\n";
503
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
504
  /**/
505
  echo '</div>'."\n";
506
  /**/
@@ -548,7 +548,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
548
  echo '<div class="ws-menu-page-hr"></div>'."\n";
549
  /**/
550
  echo '<h4 style="margin:0;"><code>[s2File /]</code> Shortcode Attributes:</h4>'."\n";
551
- echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12453#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
552
  echo '<table class="form-table" style="margin-top:0;">'."\n";
553
  echo '<tbody>'."\n";
554
  echo '<tr style="padding-top:0;">'."\n";
@@ -580,7 +580,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
580
  echo '<div class="ws-menu-page-hr"></div>'."\n";
581
  /**/
582
  echo '<h4 style="margin:0;"><code>[s2Key /]</code> Shortcode Attributes:</h4>'."\n";
583
- echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12453#src_doc_s2member_file_download_key()" target="_blank" rel="external">s2member_file_download_key()</a> for PHP integration.</p>'."\n";
584
  echo '<table class="form-table" style="margin-top:0;">'."\n";
585
  echo '<tbody>'."\n";
586
  echo '<tr style="padding-top:0;">'."\n";
175
  /**/
176
  echo '<div class="ws-menu-page-hr"></div>'."\n";
177
  /**/
178
+ echo '<p>The function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_key()" target="_blank" rel="external">s2member_file_download_key()</a>, is part of the s2Member API. It produces a time-sensitive File Download Key that is unique to each and every visitor. Each Key it produces <em>( at the time it is produced )</em>, will be valid for the current day, and only for a specific IP address and User-Agent string; as detected by s2Member. This makes it possible for you to create links on your site, which provide access to protected file downloads; and without having to worry about one visitor sharing their link with another. So let\'s take a quick look at what <code>s2member_file_download_key()</code> actually produces.</p>'."\n";
179
  echo '<p><code>s2member_file_download_key("example-file.zip")</code> = a site-specific hash of: <code>date("Y-m-d").$_SERVER["REMOTE_ADDR"].$_SERVER["HTTP_USER_AGENT"].$file</code></p>'."\n";
180
  echo '<p>When <code>s2member_file_download_key = <em>a valid Key</em></code>, it works independently from Member Level Access. That is, a visitor does NOT have to be logged in to receive access; they just need a valid Key. Using this advanced technique, you could extend s2Member\'s file protection routines, or even combine them with Specific Post/Page Access, and more. The possibilities are limitless really.</p>'."\n";
181
  /**/
235
  echo '<div class="ws-menu-page-section ws-plugin--s2member-remote-authorization-section">'."\n";
236
  echo '<h3>Remote Header Authorization ( optional )</h3>'."\n";
237
  echo '<p>This can be enabled on a case-by-case basis. Just add this to the end of your download links: <code>&amp;s2member_file_remote=yes</code>. Shortcode alternative: <code>[s2File download="example-file.zip" remote="yes" /]</code>.</p>'."\n";
238
+ echo '<p>Remote Header Authorization allows access to file downloads through an entirely different approach. Instead of asking the Member to log into your site through a browser, a Member will be prompted automatically, to log in through HTTP Header Authorization prompts; which is the same technique used in more traditional security systems via .htaccess files. In other words, Remote Header Authorization makes it possible for your Members to access files through remote applications that may NOT use a browser. This is often the case when a Member needs to access protected files through a software client like iTunes®; typical with podcasts. See <a href="http://www.s2member.com/videos/71F49478D6983A9C/" target="_blank" rel="external">tutorial video here</a> for details about how to setup a Podcast for iTunes®.</p>'."\n";
239
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_remote_authorization", get_defined_vars());
240
  echo '</div>'."\n";
241
  /**/
494
  echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <code>s2Member -> Download Options -> Advanced Mod Rewrite Linkage</code>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
495
  /**/
496
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, via s2Member\'s Amazon® S3/CloudFront integration )</a></p>'."\n";
497
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
498
  /**/
499
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative )</a></p>'."\n";
500
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
501
  /**/
502
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player® ( RTMP streaming MP4, advanced w/ multiple HTML5 fallbacks )</a></p>'."\n";
503
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player® here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon® S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
504
  /**/
505
  echo '</div>'."\n";
506
  /**/
548
  echo '<div class="ws-menu-page-hr"></div>'."\n";
549
  /**/
550
  echo '<h4 style="margin:0;"><code>[s2File /]</code> Shortcode Attributes:</h4>'."\n";
551
+ echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
552
  echo '<table class="form-table" style="margin-top:0;">'."\n";
553
  echo '<tbody>'."\n";
554
  echo '<tr style="padding-top:0;">'."\n";
580
  echo '<div class="ws-menu-page-hr"></div>'."\n";
581
  /**/
582
  echo '<h4 style="margin:0;"><code>[s2Key /]</code> Shortcode Attributes:</h4>'."\n";
583
+ echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_key()" target="_blank" rel="external">s2member_file_download_key()</a> for PHP integration.</p>'."\n";
584
  echo '<table class="form-table" style="margin-top:0;">'."\n";
585
  echo '<tbody>'."\n";
586
  echo '<tr style="padding-top:0;">'."\n";
includes/menu-pages/els-ops.inc.php CHANGED
@@ -119,8 +119,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
119
  echo '<a href="http://www.s2member.com/aweber" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/aweber-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
120
  echo '<h3>AWeber® List Server Integration ( optional )</h3>'."\n";
121
  echo '<p>s2Member can be integrated with AWeber®. AWeber® is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you.</p>'."\n";
122
- echo '<p>You can have your Members automatically subscribed to your AWeber® marketing lists <em>( e.g. newsletters / auto-responders )</em>. You\'ll need an <a href="http://www.s2member.com/aweber" target="_blank" rel="external">AWeber® account</a> and your <a href="#" onclick="alert(\'To obtain your AWeber® List ID(s), log into your AWeber® account. Click on the Lists tab. On that page you\\\'ll find a Unique List ID associated with each of your lists. AWeber® sometimes refers to this as a List Name instead of a List ID.\'); return false;">AWeber® List IDs</a>. You will ALSO need to configure a <a href="http://www.primothemes.com/forums/viewtopic.php?f=36&t=15496" target="_blank" rel="external">Custom Email Parser</a> inside your AWeber® account.</p>'."\n";
123
- echo '<p>Log into AWeber®, and go to <em>My Lists -> Email Parser</em>. If you like, choose the PayPal® Parser <em>( even if you\'re not using PayPal® as your Payment Gateway )</em>. You can safely ignore the additional instructions they provide. s2Member just needs the PayPal® box checked, and that\'s all. Or, even better, integrate <a href="http://www.primothemes.com/forums/viewtopic.php?f=36&t=15496" target="_blank" rel="external">s2Member\'s Custom Email Parser</a> for AWeber, which <strong>will improve reliability</strong> and flexibility.</p>'."\n";
124
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_aweber", get_defined_vars());
125
  /**/
126
  echo '<table class="form-table">'."\n";
119
  echo '<a href="http://www.s2member.com/aweber" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/aweber-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
120
  echo '<h3>AWeber® List Server Integration ( optional )</h3>'."\n";
121
  echo '<p>s2Member can be integrated with AWeber®. AWeber® is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you.</p>'."\n";
122
+ echo '<p>You can have your Members automatically subscribed to your AWeber® marketing lists <em>( e.g. newsletters / auto-responders )</em>. You\'ll need an <a href="http://www.s2member.com/aweber" target="_blank" rel="external">AWeber® account</a> and your <a href="#" onclick="alert(\'To obtain your AWeber® List ID(s), log into your AWeber® account. Click on the Lists tab. On that page you\\\'ll find a Unique List ID associated with each of your lists. AWeber® sometimes refers to this as a List Name instead of a List ID.\'); return false;">AWeber® List IDs</a>. You will ALSO need to configure a <a href="http://www.s2member.com/kb/aweber-email-parser-for-s2member/" target="_blank" rel="external">Custom Email Parser</a> inside your AWeber® account.</p>'."\n";
123
+ echo '<p>Log into AWeber®, and go to <em>My Lists -> Email Parser</em>. If you like, choose the PayPal® Parser <em>( even if you\'re not using PayPal® as your Payment Gateway )</em>. You can safely ignore the additional instructions they provide. s2Member just needs the PayPal® box checked, and that\'s all. Or, even better, integrate <a href="http://www.s2member.com/kb/aweber-email-parser-for-s2member/" target="_blank" rel="external">s2Member\'s Custom Email Parser</a> for AWeber, which <strong>will improve reliability</strong> and flexibility.</p>'."\n";
124
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_aweber", get_defined_vars());
125
  /**/
126
  echo '<table class="form-table">'."\n";
includes/menu-pages/gen-ops.inc.php CHANGED
@@ -551,7 +551,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
551
  echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">' . "\n";
552
  echo '<h3>Membership Levels ( required, please customize these )</h3>' . "\n";
553
  echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>( at Level #0 )</em>, along with several Primary Roles for paid Membership <em>( i.e. Levels 1-4 )</em>, created by the s2Member plugin.' . ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? ' s2Member also supports unlimited Custom Capability Packages <em>( see <code>s2Member -> API Scripting -> Custom Capabilities</code> )</em>' : '') . '. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>' . "\n";
554
- echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Module / Prices")) . '" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <code>s2Member -> API Scripting -> Custom Capabilities</code>. We also recommend the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.</em></p>' . "\n" : '';
555
  do_action ("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars ());
556
  /**/
557
  echo '<table class="form-table">' . "\n";
551
  echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">' . "\n";
552
  echo '<h3>Membership Levels ( required, please customize these )</h3>' . "\n";
553
  echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>( at Level #0 )</em>, along with several Primary Roles for paid Membership <em>( i.e. Levels 1-4 )</em>, created by the s2Member plugin.' . ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? ' s2Member also supports unlimited Custom Capability Packages <em>( see <code>s2Member -> API Scripting -> Custom Capabilities</code> )</em>' : '') . '. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>' . "\n";
554
+ echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Module / Prices")) . '" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <code>s2Member -> API Scripting -> Custom Capabilities</code>. We also recommend the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.</em></p>' . "\n" : '';
555
  do_action ("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars ());
556
  /**/
557
  echo '<table class="form-table">' . "\n";
includes/menu-pages/res-ops.inc.php CHANGED
@@ -56,7 +56,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
56
  echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member also supports Custom <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Types</a> here. If you have a theme or plugin installed, which has enabled Custom Post Types <em>( i.e. Music/Videos or something else )</em>, you can put the IDs for those Posts here.</p>' . "\n";
57
  echo '<p><em><strong>*Note*</strong> Protecting individual Posts, ONLY protects the Permalinks for those Posts. It is still possible for excerpts of protected content to be seen in search results generated by WordPress®, feeds, and Archive views; such as your Home Page, inside a Category listing, or through other queries formulated by your theme. This is the intended functionality. Excerpts are a great way to "tease" public visitors. In other words, public visitors may have access to excerpts introduced by your theme, but any attempt to view the full Post ( i.e. the Permalink ) will result in an automatic redirect to your Membership Options Page; requiring registration.</em></p>' . "\n";
58
  echo '<p><em><strong>*Note*</strong> If you would like to protect many Posts at once ( including Archive views ), you can use Category Level Restrictions, Tag Level Restrictions, or have a look down below at s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>' . "\n";
59
- echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post IDs? Get <a href="http://www.primothemes.com/post/product/wp-show-ids-plugin/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
60
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars ());
61
  /**/
62
  echo '<table class="form-table">' . "\n";
@@ -103,7 +103,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
103
  echo '<div class="ws-menu-page-section ws-plugin--s2member-page-level-access-section">' . "\n";
104
  echo '<h3>Page Level Access Restrictions ( optional )</h3>' . "\n";
105
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>' . "\n";
106
- echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Page IDs? Get <a href="http://www.primothemes.com/post/product/wp-show-ids-plugin/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
107
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars ());
108
  /**/
109
  echo '<table class="form-table">' . "\n";
@@ -193,7 +193,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
193
  echo '<div class="ws-menu-page-section ws-plugin--s2member-category-level-access-section">' . "\n";
194
  echo '<h3>Category Level Access Restrictions ( optional )</h3>' . "\n";
195
  echo '<p>Here you can specify Categories that are restricted to certain Membership Access Levels. Category restrictions are a bit more complex. When you restrict access to a Category, it also restricts access to any child Categories it may have <em>( aka: sub-Categories )</em>. In other words, restricting a Category, protects a Category Archive, all of its child Category Archives, and any Posts contained within the Category, or its child Categories. This is a VERY powerful form of protection, so please be careful. It\'s very easy to protect too much content by accident.</p>' . "\n";
196
- echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Category IDs? Get <a href="http://www.primothemes.com/post/product/wp-show-ids-plugin/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
197
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars ());
198
  /**/
199
  echo '<table class="form-table">' . "\n";
@@ -311,7 +311,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
311
  echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically, using this technique:<br />' . "\n";
312
  echo '<code><a href="http://codex.wordpress.org/Function_Reference/query_posts" target="_blank" rel="external">query_posts</a>("suppress_filters=true");</code><br />' . "\n";
313
  echo '<code><a href="http://codex.wordpress.org/Function_Reference/get_posts" target="_blank" rel="external">get_posts</a>()</code> auto-suppresses filters.<br />' . "\n";
314
- echo 'Also see <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12453#src_doc_attach_s2member_query_filters%28%29" target="_blank" rel="external">this article</a> in the s2Member® Codex.' . "\n";
315
  echo '</td>' . "\n";
316
  /**/
317
  echo '</tr>' . "\n";
@@ -336,7 +336,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
336
  echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link ( see: <code>s2Member -> PayPal® Options -> Specific Post/Page Email</code> ). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
337
  echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress®. A Specific Post/Page that is protected by s2Member, might contain a download link for your eBook, access to file &amp; music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress® Post/Page that you\'ve created.</p>' . "\n";
338
  echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <code>s2Member -> PayPal® Buttons -> Specific Post/Page</code> to generate "Buy Now" Buttons that you can insert into your WordPress® Editor, and make available on your site. The Button Generator for s2Member, will even let you Package Additional Posts/Pages together into one transaction.</p>' . "\n";
339
- echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post/Page IDs? Get <a href="http://www.primothemes.com/post/product/wp-show-ids-plugin/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
340
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars ());
341
  /**/
342
  echo '<table class="form-table">' . "\n";
56
  echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member also supports Custom <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Types</a> here. If you have a theme or plugin installed, which has enabled Custom Post Types <em>( i.e. Music/Videos or something else )</em>, you can put the IDs for those Posts here.</p>' . "\n";
57
  echo '<p><em><strong>*Note*</strong> Protecting individual Posts, ONLY protects the Permalinks for those Posts. It is still possible for excerpts of protected content to be seen in search results generated by WordPress®, feeds, and Archive views; such as your Home Page, inside a Category listing, or through other queries formulated by your theme. This is the intended functionality. Excerpts are a great way to "tease" public visitors. In other words, public visitors may have access to excerpts introduced by your theme, but any attempt to view the full Post ( i.e. the Permalink ) will result in an automatic redirect to your Membership Options Page; requiring registration.</em></p>' . "\n";
58
  echo '<p><em><strong>*Note*</strong> If you would like to protect many Posts at once ( including Archive views ), you can use Category Level Restrictions, Tag Level Restrictions, or have a look down below at s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>' . "\n";
59
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
60
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars ());
61
  /**/
62
  echo '<table class="form-table">' . "\n";
103
  echo '<div class="ws-menu-page-section ws-plugin--s2member-page-level-access-section">' . "\n";
104
  echo '<h3>Page Level Access Restrictions ( optional )</h3>' . "\n";
105
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>' . "\n";
106
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
107
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars ());
108
  /**/
109
  echo '<table class="form-table">' . "\n";
193
  echo '<div class="ws-menu-page-section ws-plugin--s2member-category-level-access-section">' . "\n";
194
  echo '<h3>Category Level Access Restrictions ( optional )</h3>' . "\n";
195
  echo '<p>Here you can specify Categories that are restricted to certain Membership Access Levels. Category restrictions are a bit more complex. When you restrict access to a Category, it also restricts access to any child Categories it may have <em>( aka: sub-Categories )</em>. In other words, restricting a Category, protects a Category Archive, all of its child Category Archives, and any Posts contained within the Category, or its child Categories. This is a VERY powerful form of protection, so please be careful. It\'s very easy to protect too much content by accident.</p>' . "\n";
196
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Category IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
197
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars ());
198
  /**/
199
  echo '<table class="form-table">' . "\n";
311
  echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically, using this technique:<br />' . "\n";
312
  echo '<code><a href="http://codex.wordpress.org/Function_Reference/query_posts" target="_blank" rel="external">query_posts</a>("suppress_filters=true");</code><br />' . "\n";
313
  echo '<code><a href="http://codex.wordpress.org/Function_Reference/get_posts" target="_blank" rel="external">get_posts</a>()</code> auto-suppresses filters.<br />' . "\n";
314
+ echo 'Also see <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_attach_s2member_query_filters()" target="_blank" rel="external">this article</a> in the s2Member® Codex.' . "\n";
315
  echo '</td>' . "\n";
316
  /**/
317
  echo '</tr>' . "\n";
336
  echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link ( see: <code>s2Member -> PayPal® Options -> Specific Post/Page Email</code> ). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
337
  echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress®. A Specific Post/Page that is protected by s2Member, might contain a download link for your eBook, access to file &amp; music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress® Post/Page that you\'ve created.</p>' . "\n";
338
  echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <code>s2Member -> PayPal® Buttons -> Specific Post/Page</code> to generate "Buy Now" Buttons that you can insert into your WordPress® Editor, and make available on your site. The Button Generator for s2Member, will even let you Package Additional Posts/Pages together into one transaction.</p>' . "\n";
339
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
340
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars ());
341
  /**/
342
  echo '<table class="form-table">' . "\n";
includes/menu-pages/scripting.inc.php CHANGED
@@ -136,8 +136,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
136
  /**/
137
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
138
  /**/
139
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
140
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
141
  /**/
142
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
143
  /**/
@@ -208,8 +208,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
208
  /**/
209
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
210
  /**/
211
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
212
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
213
  /**/
214
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
215
  /**/
@@ -277,8 +277,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
277
  /**/
278
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
279
  /**/
280
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
281
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
282
  /**/
283
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
284
  /**/
@@ -336,8 +336,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
336
  /**/
337
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
338
  /**/
339
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
340
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br />' . "\n";
341
  echo '<strong>See Also:</strong> <a href="http://wordpress.org/extend/plugins/user-role-editor/" target="_blank" rel="external">Plugins -> User Role Editor</a> <em>( may come in handy for some )</em>.</p>' . "\n";
342
  /**/
343
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
@@ -368,8 +368,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
368
  /**/
369
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
370
  /**/
371
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
372
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
373
  /**/
374
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
375
  /**/
@@ -408,8 +408,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
408
  /**/
409
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
410
  /**/
411
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
412
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
413
  /**/
414
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
415
  /**/
@@ -713,8 +713,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
713
  /**/
714
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
715
  /**/
716
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
717
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
718
  /**/
719
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
720
  /**/
@@ -1026,8 +1026,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
1026
  /**/
1027
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1028
  /**/
1029
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1030
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
1031
  /**/
1032
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1033
  /**/
@@ -1058,13 +1058,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
1058
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
1059
  echo '<h3>WP® Hooks For Theme/Plugin Developers ( scripting required )</h3>' . "\n";
1060
  echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>( or even modify )</em> s2Member in lots of different ways. If you need to add custom processing routines, modify the behavior of existing processing routines, or tinker with things otherwise; you should use API Hooks/Filters. API Hooks &amp; Filters, give you the ability to "hook into", and/or "filter" processing routines, with files/functions of your own; instead of editing the s2Member plugin files directly. If you don\'t use a Hook/Filter, and instead, you edit the plugin files for s2Member, you\'ll have to merge all of your changes every time a new version of s2Member is released. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://codex.wordpress.org/Must_Use_Plugins" target="_blank" rel="external">MUST USE plugins</a>, which are loaded into WordPress® automatically; that\'s what you want!</p>' . "\n";
1061
- echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>( over 1000 total )</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="http://www.primothemes.com/forums/viewforum.php?f=40#src_doc_overview_description" target="_blank" rel="external">this article</a> as a primer. The <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
1062
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
1063
  /**/
1064
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1065
  /**/
1066
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.primothemes.com/forums/viewforum.php?f=40" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1067
- echo '<strong>See Also:</strong> <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12450" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
1068
  echo '</div>' . "\n";
1069
  /**/
1070
  echo '</div>' . "\n";
136
  /**/
137
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
138
  /**/
139
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
140
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
141
  /**/
142
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
143
  /**/
208
  /**/
209
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
210
  /**/
211
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
212
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
213
  /**/
214
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
215
  /**/
277
  /**/
278
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
279
  /**/
280
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
281
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
282
  /**/
283
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
284
  /**/
336
  /**/
337
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
338
  /**/
339
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
340
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.<br />' . "\n";
341
  echo '<strong>See Also:</strong> <a href="http://wordpress.org/extend/plugins/user-role-editor/" target="_blank" rel="external">Plugins -> User Role Editor</a> <em>( may come in handy for some )</em>.</p>' . "\n";
342
  /**/
343
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
368
  /**/
369
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
370
  /**/
371
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
372
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
373
  /**/
374
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
375
  /**/
408
  /**/
409
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
410
  /**/
411
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
412
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
413
  /**/
414
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
415
  /**/
713
  /**/
714
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
715
  /**/
716
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
717
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
718
  /**/
719
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
720
  /**/
1026
  /**/
1027
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1028
  /**/
1029
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1030
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
1031
  /**/
1032
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1033
  /**/
1058
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
1059
  echo '<h3>WP® Hooks For Theme/Plugin Developers ( scripting required )</h3>' . "\n";
1060
  echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>( or even modify )</em> s2Member in lots of different ways. If you need to add custom processing routines, modify the behavior of existing processing routines, or tinker with things otherwise; you should use API Hooks/Filters. API Hooks &amp; Filters, give you the ability to "hook into", and/or "filter" processing routines, with files/functions of your own; instead of editing the s2Member plugin files directly. If you don\'t use a Hook/Filter, and instead, you edit the plugin files for s2Member, you\'ll have to merge all of your changes every time a new version of s2Member is released. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://codex.wordpress.org/Must_Use_Plugins" target="_blank" rel="external">MUST USE plugins</a>, which are loaded into WordPress® automatically; that\'s what you want!</p>' . "\n";
1061
+ echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>( over 1000 total )</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="http://www.s2member.com/codex/#src_doc_overview_description" target="_blank" rel="external">this article</a> as a primer. The <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
1062
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
1063
  /**/
1064
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1065
  /**/
1066
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1067
+ echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex -> API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -> API Functions</a>.</p>' . "\n";
1068
  echo '</div>' . "\n";
1069
  /**/
1070
  echo '</div>' . "\n";
includes/s2member.css CHANGED
@@ -18,10 +18,6 @@ Structural styles for s2Member Security Badge.
18
 
19
  These are basic CSS rules. You can override any of these
20
  through the `/style.css` file for your WordPress® theme.
21
-
22
- If you're using a `PriMo Theme`, you can use:
23
- PriMoTheme Options -> Custom CSS
24
- See: http://www.primothemes.com/
25
  */
26
  div.ws-plugin--s2member-s-badge
27
  {
@@ -33,10 +29,6 @@ Structural styles for Password strength indicators.
33
 
34
  These are basic CSS rules. You can override any of these
35
  through the `/style.css` file for your WordPress® theme.
36
-
37
- If you're using a `PriMo Theme`, you can use:
38
- PriMoTheme Options -> Custom CSS
39
- See: http://www.primothemes.com/
40
  */
41
  div.ws-plugin--s2member-password-strength
42
  {
@@ -73,10 +65,6 @@ Structural styles for Multisite Integration Forms.
73
 
74
  These are basic CSS rules. You can override any of these
75
  through the `/style.css` file for your WordPress® theme.
76
-
77
- If you're using a `PriMo Theme`, you can use:
78
- PriMoTheme Options -> Custom CSS
79
- See: http://www.primothemes.com/
80
  */
81
  div#content > div.mu_register,
82
  div#content > div.mu_register h2
@@ -155,10 +143,6 @@ Structural styles for Return Pages.
155
 
156
  These are basic CSS rules. You can override any of these
157
  through the `/style.css` file for your WordPress® theme.
158
-
159
- If you're using a `PriMo Theme`, you can use:
160
- PriMoTheme Options -> Custom CSS
161
- See: http://www.primothemes.com/
162
  */
163
  body.s2member-return-body
164
  {
@@ -263,10 +247,6 @@ Structural styles for Shortcode Profile Editing panel.
263
 
264
  These are basic CSS rules. You can override any of these
265
  through the `/style.css` file for your WordPress® theme.
266
-
267
- If you're using a `PriMo Theme`, you can use:
268
- PriMoTheme Options -> Custom CSS
269
- See: http://www.primothemes.com/
270
  */
271
  div#ws-plugin--s2member-profile-saved
272
  {
@@ -348,10 +328,6 @@ Structural styles for BuddyPress Profile Field items.
348
 
349
  These are basic CSS rules. You can override any of these
350
  through the `/style.css` file for your WordPress® theme.
351
-
352
- If you're using a `PriMo Theme`, you can use:
353
- PriMoTheme Options -> Custom CSS
354
- See: http://www.primothemes.com/
355
  */
356
  body.profile.public div.ws-plugin--s2member-profile-field-4bp-divider-section
357
  {
@@ -372,10 +348,6 @@ Structural styles for BuddyPress Registration Fields.
372
 
373
  These are basic CSS rules. You can override any of these
374
  through the `/style.css` file for your WordPress® theme.
375
-
376
- If you're using a `PriMo Theme`, you can use:
377
- PriMoTheme Options -> Custom CSS
378
- See: http://www.primothemes.com/
379
  */
380
  body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section
381
  {
@@ -437,10 +409,6 @@ Structural styles for BuddyPress Profile Field integrations.
437
 
438
  These are basic CSS rules. You can override any of these
439
  through the `/style.css` file for your WordPress® theme.
440
-
441
- If you're using a `PriMo Theme`, you can use:
442
- PriMoTheme Options -> Custom CSS
443
- See: http://www.primothemes.com/
444
  */
445
  body.logged-in.profile.profile-edit form#profile-edit-form div.editfield input[type="text"],
446
  body.logged-in.profile.profile-edit form#profile-edit-form div.editfield input[type="email"],
18
 
19
  These are basic CSS rules. You can override any of these
20
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
21
  */
22
  div.ws-plugin--s2member-s-badge
23
  {
29
 
30
  These are basic CSS rules. You can override any of these
31
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
32
  */
33
  div.ws-plugin--s2member-password-strength
34
  {
65
 
66
  These are basic CSS rules. You can override any of these
67
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
68
  */
69
  div#content > div.mu_register,
70
  div#content > div.mu_register h2
143
 
144
  These are basic CSS rules. You can override any of these
145
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
146
  */
147
  body.s2member-return-body
148
  {
247
 
248
  These are basic CSS rules. You can override any of these
249
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
250
  */
251
  div#ws-plugin--s2member-profile-saved
252
  {
328
 
329
  These are basic CSS rules. You can override any of these
330
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
331
  */
332
  body.profile.public div.ws-plugin--s2member-profile-field-4bp-divider-section
333
  {
348
 
349
  These are basic CSS rules. You can override any of these
350
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
351
  */
352
  body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section
353
  {
409
 
410
  These are basic CSS rules. You can override any of these
411
  through the `/style.css` file for your WordPress® theme.
 
 
 
 
412
  */
413
  body.logged-in.profile.profile-edit form#profile-edit-form div.editfield input[type="text"],
414
  body.logged-in.profile.profile-edit form#profile-edit-form div.editfield input[type="email"],
includes/templates/cfg-files/s2member-files-no-gzip.php CHANGED
@@ -11,7 +11,7 @@ $ws_plugin__s2member_temp_s_base = (!empty ($base)) ? $base : c_ws_plugin__s2mem
11
  <IfModule mod_rewrite.c>
12
  RewriteEngine On
13
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
14
- RewriteCond %{QUERY_STRING} (?:^|\?|&)s2member_file_download\=.+
15
  RewriteRule .* - [E=no-gzip:1]
16
  </IfModule>
17
 
11
  <IfModule mod_rewrite.c>
12
  RewriteEngine On
13
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
14
+ RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+
15
  RewriteRule .* - [E=no-gzip:1]
16
  </IfModule>
17
 
includes/translations/s2member.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 120213\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/__s2member\n"
7
- "POT-Creation-Date: 2012-02-14 02:33:18+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -652,7 +652,7 @@ msgstr ""
652
 
653
  #: s2member/includes/classes/paypal-return-in.inc.php:132
654
  msgctxt "s2member-front"
655
- msgid "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows® server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows® server.<br /><br />Please see <a href=\"http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636\" target=\"_blank\">this thread</a> for details regarding the ideal server configuration for s2Member."
656
  msgstr ""
657
 
658
  #. translators: Exclude `%2$s` and `%3$s`. These are English details returned
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 120213\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/__s2member\n"
7
+ "POT-Creation-Date: 2012-02-19 18:06:50+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
652
 
653
  #: s2member/includes/classes/paypal-return-in.inc.php:132
654
  msgctxt "s2member-front"
655
+ msgid "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows® server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows® server.<br /><br />Please see <a href=\"http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/\" target=\"_blank\">this thread</a> for details regarding the ideal server configuration for s2Member."
656
  msgstr ""
657
 
658
  #. translators: Exclude `%2$s` and `%3$s`. These are English details returned
includes/translations/translators.txt CHANGED
@@ -8,6 +8,6 @@ Like WordPress® itself, we chose to use the GNU `gettext` localization framewor
8
 
9
  The file: `/s2member/includes/translations/s2member.pot` will be updated with each new release of s2Member.
10
 
11
- If this is your first translation of a WordPress® plugin, [this article](http://codex.wordpress.org/Translating_WordPress#Localization_Technology) and/or [this article](http://urbangiraffe.com/articles/translating-wordpress-themes-and-plugins/), might be of some assistance. When you are finished translating the `s2member.pot` file, place your completed `s2member-[locale].mo` file into this directory: `/wp-content/plugins/`; and please feel free to [share your translation](http://www.primothemes.com/forums/viewforum.php?f=4) with the rest of the s2Member® community.
12
 
13
  Quick Tip: If you only need to translate the front-end of s2Member, please ignore entries in the `s2member.pot` file with a context matching `s2member-admin`. Those sections of s2Member are only seen by site Administrators; they are NOT used in s2Member's front-end integration with WordPress®. Skipping over translation entries with a context matching `s2member-admin` can save you time.
8
 
9
  The file: `/s2member/includes/translations/s2member.pot` will be updated with each new release of s2Member.
10
 
11
+ If this is your first translation of a WordPress® plugin, [this article](http://codex.wordpress.org/Translating_WordPress#Localization_Technology) and/or [this article](http://urbangiraffe.com/articles/translating-wordpress-themes-and-plugins/), might be of some assistance. When you are finished translating the `s2member.pot` file, place your completed `s2member-[locale].mo` file into this directory: `/wp-content/plugins/`; and please feel free to [share your translation](http://www.s2member.com/forums/forum/community/) with the rest of the s2Member® community.
12
 
13
  Quick Tip: If you only need to translate the front-end of s2Member, please ignore entries in the `s2member.pot` file with a context matching `s2member-admin`. Those sections of s2Member are only seen by site Administrators; they are NOT used in s2Member's front-end integration with WordPress®. Skipping over translation entries with a context matching `s2member-admin` can save you time.
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 120213
4
- Stable tag: 120213
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -85,11 +85,21 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
85
 
86
  == Upgrade Notice ==
87
 
88
- = v120213 =
89
- Optimization and a few bug fixes. Upgrade immediately.
90
 
91
  == Changelog ==
92
 
 
 
 
 
 
 
 
 
 
 
93
  = v120213 =
94
  * (s2Member) **File downloads**. GZIP conflicts can now been resolved for file downloads. s2Member now introduces an `.htaccess` rewrite rule, which is automatically installed during activation and/or a future upgrade of the s2Member® Framework plugin. These rewrite rules are installed into your root `.htaccess` file for WordPress (if it's writable). If your `.htaccess` file is not writable, you will get a warning in your `s2Member -> Download Options` panel.
95
 
@@ -144,7 +154,7 @@ Optimization and a few bug fixes. Upgrade immediately.
144
  * (s2Member Pro) **Bug fix**. Automatic upgrader failing on `copy` command when running at HostGator. Fixed in this release.
145
  * (s2Member/s2Member Pro) **Security fix**. The `/s2member-files/` directory *(with newly updated Mod Rewrite rules in its .htaccess file)* was allowing directory indexing inadvertently, on some servers. This was a low-level vulnerability, because although directory indexing was possible, protected file access was not. Fixed in this release. For further details, please see [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=15665&p=48984&hilit=next+release#p48984).
146
  * (s2Member/s2Member Pro) **Bug fix**. A bug related to the `init()` Hook firing an early call to `c_ws_plugin__s2member_systematics::is_wp_systematic_use_page()` was identified. Fixed in this release. One symptom of this bug was for Users/Members to have trouble accessing a BuddyPress registration form after having paid for Membership, under the right scenario.
147
- * (s2Member/s2Member Pro) **New API Functions**. New API Functions: `s2member_shorten_url()`, `s2member_user_downloads()`, `s2member_total_downloads_of()`, and `s2member_total_unique_downloads_of()`. For further details, please check the [s2Member Codex](http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455).
148
  * (s2Member/s2Member Pro) **Routine maintenance**. Some code optimization, some cleanup, and some organizational improvements in preparation for new features in a coming release.
149
  * (s2Member/s2Member Pro) **WordPress® 3.3-beta2**. Compatibility updates. CSS tweaks, JavaScript tweaks and other considerations for the coming release of WordPress® 3.3.
150
 
@@ -234,7 +244,7 @@ Optimization and a few bug fixes. Upgrade immediately.
234
  * (s2Member) **PayPal® ( Bug fix )**. s2Member was incorrectly handling delayed EOT Times under a specific scenario, as [reported here](http://www.primothemes.com/forums/viewtopic.php?f=4&t=14876&p=34414#p34414). Corrected in this release.
235
  * (s2Member) **JavaScript/CSS Optimization**. s2Member now loads its dynamic JavaScript/CSS libraries through a new optimized file called `/s2member-o.php`, designed to increase the speed at which your installation of WordPress® can load these resources. The new optimized `/s2member-o.php` file loads only the core WordPress® framework and the s2Member JavaScript and/or CSS file, depending on which is being requested. This new file will eliminate a potential bottleneck on some WordPress® installations, which may have MANY other plugins running in concert with s2Member. It also works to further reduce CPU and memory consumption for all site owners. For further details about why this optimization is beneficial, please see [this article](http://www.primothemes.com/forums/viewtopic.php?f=4&t=14359&p=33441#p33441).
236
  * (s2Member Pro) **PayPal® Express Checkout / Pre-Population**. s2Member now pre-populates everything it can through PayPal® Express Checkout integration. If a Customer does NOT already have a PayPal® account when they arrive at Express Checkout, the Account Creation Form at PayPal® will be pre-populated with a minimum of their Name and Email Address. Street address information will ONLY be pre-populated, when/if s2Member collects it for tax purposes. Otherwise, the address information will NOT be pre-populated, because only PayPal® will ask for those details anyway *( i.e. s2Member doesn't ask for address details when Express Checkout is used; not unless you're collecting taxes: `s2Member -> PayPal® Options -> Tax Calculations` ).
237
- * (s2Member) **New API Function**. This version of s2Member includes a new API Function `get_s2member_custom_fields()`, designed to provide more information about Custom Registration/Profile Field configuration and values for a specific User. The API function `get_user_field()` remains available as well. For further details, please see [this article](http://www.primothemes.com/forums/viewtopic.php?f=40&t=12455) in the s2Member Codex.
238
  * (s2Member Pro) **Pro Login Widget**. This version of s2Member improves the `%%automatic%%` setting for the Signup URL in Pro Login Widgets. When/if a Customer has already paid for their Membership, the Signup URL presented in the Pro Login Widget will change dynamically, pointing a Customer to the Registration Form, instead of to your Membership Options Page. Of course, this behavior could be overridden by changing the Signup URL to something other than `%%automatic%%`, if you prefer.
239
 
240
  = v110815 =
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 120219
4
+ Stable tag: 120219
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
85
 
86
  == Upgrade Notice ==
87
 
88
+ = v120219 =
89
+ Link updates and a compatibility fix. Upgrade immediately.
90
 
91
  == Changelog ==
92
 
93
+ = v120219 =
94
+ * (s2Member) **File downloads**. s2Member\'s `.htaccess` rules updated to also support older versions of the Apache 1.x series. However, we still recommend that you run s2Member® with Apache 2.0 or higher. Or, with another modern web server that's Apache-compatible, such as [LiteSpeed](http://litespeedtech.com/).
95
+ * (s2Member) **Link updates**. Some of the documentation built into the s2Member® plugin contained links which were outdated after our recent move to the new [s2Member.com](http://www.s2member.com/). These links have now been updated within the plugin.
96
+ * (s2Member) **New video tutorial**. [s2Member® Intros, Framework and Pro](http://www.s2member.com/videos/85E41C40550808C2/)
97
+ * (s2Member) **New video tutorial**. [s2Member® File Downloads, Complete Series / From Basics On Up](http://www.s2member.com/videos/7547A199A4385310/)
98
+ * (s2Member) **New video tutorial**. [s2Member® File Downloads, Amazon S3/CloudFront/JW Player](http://www.s2member.com/videos/BD496E5F2CCAB12A/)
99
+ * (s2Member) **New video tutorial**. [s2Member® File Downloads, Remote Auth/Podcasting](http://www.s2member.com/videos/71F49478D6983A9C/)
100
+ * (s2Member) **New video tutorial**. [s2Member® File Downloads, GZIP Conflicts?](http://www.s2member.com/videos/038A4033A8D2A2EB/)
101
+ * (s2Member) **New video tutorial**. [s2Member®, Using The PayPal Sandbox](http://www.s2member.com/videos/A7AEF89D281A75A0/)
102
+
103
  = v120213 =
104
  * (s2Member) **File downloads**. GZIP conflicts can now been resolved for file downloads. s2Member now introduces an `.htaccess` rewrite rule, which is automatically installed during activation and/or a future upgrade of the s2Member® Framework plugin. These rewrite rules are installed into your root `.htaccess` file for WordPress (if it's writable). If your `.htaccess` file is not writable, you will get a warning in your `s2Member -> Download Options` panel.
105
 
154
  * (s2Member Pro) **Bug fix**. Automatic upgrader failing on `copy` command when running at HostGator. Fixed in this release.
155
  * (s2Member/s2Member Pro) **Security fix**. The `/s2member-files/` directory *(with newly updated Mod Rewrite rules in its .htaccess file)* was allowing directory indexing inadvertently, on some servers. This was a low-level vulnerability, because although directory indexing was possible, protected file access was not. Fixed in this release. For further details, please see [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=15665&p=48984&hilit=next+release#p48984).
156
  * (s2Member/s2Member Pro) **Bug fix**. A bug related to the `init()` Hook firing an early call to `c_ws_plugin__s2member_systematics::is_wp_systematic_use_page()` was identified. Fixed in this release. One symptom of this bug was for Users/Members to have trouble accessing a BuddyPress registration form after having paid for Membership, under the right scenario.
157
+ * (s2Member/s2Member Pro) **New API Functions**. New API Functions: `s2member_shorten_url()`, `s2member_user_downloads()`, `s2member_total_downloads_of()`, and `s2member_total_unique_downloads_of()`. For further details, please check the [s2Member Codex](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/).
158
  * (s2Member/s2Member Pro) **Routine maintenance**. Some code optimization, some cleanup, and some organizational improvements in preparation for new features in a coming release.
159
  * (s2Member/s2Member Pro) **WordPress® 3.3-beta2**. Compatibility updates. CSS tweaks, JavaScript tweaks and other considerations for the coming release of WordPress® 3.3.
160
 
244
  * (s2Member) **PayPal® ( Bug fix )**. s2Member was incorrectly handling delayed EOT Times under a specific scenario, as [reported here](http://www.primothemes.com/forums/viewtopic.php?f=4&t=14876&p=34414#p34414). Corrected in this release.
245
  * (s2Member) **JavaScript/CSS Optimization**. s2Member now loads its dynamic JavaScript/CSS libraries through a new optimized file called `/s2member-o.php`, designed to increase the speed at which your installation of WordPress® can load these resources. The new optimized `/s2member-o.php` file loads only the core WordPress® framework and the s2Member JavaScript and/or CSS file, depending on which is being requested. This new file will eliminate a potential bottleneck on some WordPress® installations, which may have MANY other plugins running in concert with s2Member. It also works to further reduce CPU and memory consumption for all site owners. For further details about why this optimization is beneficial, please see [this article](http://www.primothemes.com/forums/viewtopic.php?f=4&t=14359&p=33441#p33441).
246
  * (s2Member Pro) **PayPal® Express Checkout / Pre-Population**. s2Member now pre-populates everything it can through PayPal® Express Checkout integration. If a Customer does NOT already have a PayPal® account when they arrive at Express Checkout, the Account Creation Form at PayPal® will be pre-populated with a minimum of their Name and Email Address. Street address information will ONLY be pre-populated, when/if s2Member collects it for tax purposes. Otherwise, the address information will NOT be pre-populated, because only PayPal® will ask for those details anyway *( i.e. s2Member doesn't ask for address details when Express Checkout is used; not unless you're collecting taxes: `s2Member -> PayPal® Options -> Tax Calculations` ).
247
+ * (s2Member) **New API Function**. This version of s2Member includes a new API Function `get_s2member_custom_fields()`, designed to provide more information about Custom Registration/Profile Field configuration and values for a specific User. The API function `get_user_field()` remains available as well. For further details, please see [this article](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) in the s2Member Codex.
248
  * (s2Member Pro) **Pro Login Widget**. This version of s2Member improves the `%%automatic%%` setting for the Signup URL in Pro Login Widgets. When/if a Customer has already paid for their Membership, the Signup URL presented in the Pro Login Widget will change dynamically, pointing a Customer to the Registration Form, instead of to your Membership Options Page. Of course, this behavior could be overridden by changing the Signup URL to something other than `%%automatic%%`, if you prefer.
249
 
250
  = v110815 =
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 120213
23
- Stable tag: 120213
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", "120213" /* !#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", "120213" /* !#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: 120219
23
+ Stable tag: 120219
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", "120219" /* !#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", "120219" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.