PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260814
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260814
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 releases
s2member / src / includes / syscon.inc.php

syscon.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 260814, at src/includes/syscon.inc.php

755 lines 44.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * System configuration for the s2Member plugin.
5 *
6 * **WARNING:** This is a system configuration file, please DO NOT EDIT this file directly.
7 * Instead, use the plugin options panel in WordPress to override these settings.
8 *
9 * Copyright: © 2009-2011
10 * {@link http://websharks-inc.com/ WebSharks, Inc.}
11 * (coded in the USA)
12 *
13 * Released under the terms of the GNU General Public License.
14 * You should have received a copy of the GNU General Public License,
15 * along with this software. In the main directory, see: /licensing/
16 * If not, see: {@link http://www.gnu.org/licenses/}.
17 *
18 * @package s2Member
19 * @since 3.0
20 */
21 if(!defined('WPINC')) // MUST have WordPress.
22 exit('Do not access this file directly.');
23 /*
24 Determine the directory.
25 */
26 $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir'] = dirname(dirname(dirname(__FILE__)));
27 /*
28 Determine the base directory name.
29 */
30 $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_base'] = basename(dirname(dirname(dirname(__FILE__))));
31 /*
32 Determine the full URL to the directory this plugin resides in.
33 */
34 $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'] = (stripos(__FILE__, WP_CONTENT_DIR) !== 0) ? // Have to assume plugins dir?
35 plugins_url('/'.basename(dirname(dirname(dirname(__FILE__))))) : // Otherwise, this gives it a chance to live anywhere in the content dir.
36 content_url(preg_replace('/^(.*?)\/'.preg_quote(basename(WP_CONTENT_DIR), '/').'/', '', str_replace(DIRECTORY_SEPARATOR, '/', dirname(dirname(dirname(__FILE__))))));
37 /*
38 Determine full URL to the s2Member-only file that loads WordPress with only s2Member active.
39 */
40 $GLOBALS['WS_PLUGIN__']['s2member']['c']['s2o_url'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/'.preg_replace('/\.php$/', '-o.php', basename($GLOBALS['WS_PLUGIN__']['s2member']['l']));
41 /*
42 Determine correct ``plugin_basename()`` here. WordPress has a few issues with its ``plugin_basename()`` function across different platforms.
43 */
44 $GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'] = basename(dirname($GLOBALS['WS_PLUGIN__']['s2member']['l'])).'/'.basename($GLOBALS['WS_PLUGIN__']['s2member']['l']);
45 /*
46 Configure the number of Membership Levels being used with s2Member. This is now possible. All areas of s2Member are now capable of adapting to this.
47 */
48 $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels'] = 4; // Hard coded in at 4 Levels. This can only be extended when/if s2Member Pro is installed.
49 $GLOBALS['WS_PLUGIN__']['s2member']['c']['min_levels'] = 1; // A lower limit to protect the integrity of the s2Member software application.
50 $GLOBALS['WS_PLUGIN__']['s2member']['c']['max_levels'] = apply_filters('ws_plugin__s2member_max_levels', 100); // Filterable.
51 /*
52 Configure regular expression matches for Membership Access Item Numbers (including those with only Custom Capabilities).
53 */
54 $GLOBALS['WS_PLUGIN__']['s2member']['c']['membership_item_number_w_level_regex'] = '/^([1-9][0-9]*)(?:(?:\:((?:-all\+|\+-all|-all|\+)?[a-z_0-9,\+]*)?)?(?:\:([0-9]+ [A-Z])?)?)?$/';
55 $GLOBALS['WS_PLUGIN__']['s2member']['c']['membership_item_number_wo_level_regex'] = '/^(\*)(?:(?:\:((?:-all\+|\+-all|-all|\+)?[a-z_0-9,\+]*)?)?(?:\:([0-9]+ [A-Z])?)?)?$/';
56 $GLOBALS['WS_PLUGIN__']['s2member']['c']['membership_item_number_w_or_wo_level_regex'] = '/^([1-9][0-9]*|\*)(?:(?:\:((?:-all\+|\+-all|-all|\+)?[a-z_0-9,\+]*)?)?(?:\:([0-9]+ [A-Z])?)?)?$/';
57 /*
58 Configure regular expression match for Specific Post/Page Access Item Numbers (all elements required here).
59 */
60 $GLOBALS['WS_PLUGIN__']['s2member']['c']['sp_access_item_number_regex'] = '/^(sp)(?:(?:\:([1-9][0-9,]*))(?:\:([1-9][0-9]*)))$/';
61 /*
62 Configure multibyte detection order when charset is unknown ( used by calls to `mb_convert_encoding()` ).
63 */
64 $GLOBALS['WS_PLUGIN__']['s2member']['c']['mb_detection_order'] = 'UTF-8, ISO-8859-1, WINDOWS-1252, ASCII, JIS, EUC-JP, SJIS';
65 /*
66 Configure an array of file extensions associated with streaming media file types. See: <http://www.spartanicus.utvinternet.ie/streaming.htm> Also see: <http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12539/supported-video-and-audio-formats>
67 */
68 $GLOBALS['WS_PLUGIN__']['s2member']['c']['streaming_file_extns'] = array_unique(array('avi', 'wav', 'mpa', 'mpeg', 'mpv', 'mps', 'm1v', 'm2v', 'mp4', 'mp3', 'm3u', 'mp4', 'flv', 'f4v', '3gp', '3g2', 'aac', 'm4a', 'webm', 'ogg', 'ogv', 'pls', 'm3u', 'ogm', 'm4u', 'mov', 'qtl', 'mp4', 'asf', 'wmv', 'wvx', 'wma', 'wax', 'ra', 'rm', 'ram'));
69 /*
70 Configure directory and .htaccess for files protected by s2Member.
71 */
72 $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_files_dir'] = dirname(dirname(dirname(__FILE__))).'-files'.((stripos(PHP_OS, 'win') === 0 && stripos($_SERVER['SERVER_SOFTWARE'], 'apache') === FALSE) ? '/app_data' : '');
73 $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'] = apply_filters('ws_plugin__s2member_files_dir', $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_files_dir']);
74 $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_no_gzip_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-files-no-gzip.php';
75 $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-files.php';
76 /*
77 Configure the directory for logs protected by s2Member.
78 */
79 $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_logs_dir'] = dirname(dirname(dirname(__FILE__))).'-logs'.((stripos(PHP_OS, 'win') === 0 && stripos($_SERVER['SERVER_SOFTWARE'], 'apache') === FALSE) ? '/app_data' : '');
80 $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'] = apply_filters('ws_plugin__s2member_logs_dir', $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_logs_dir']);
81 $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-logs.php';
82 /*
83 Configure the global reCaptcha (www.websharks-inc.net / or any domain). These public/private keys work on any installation.
84 */
85 $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha'] = array('public_key' => '6LeCANsSAAAAAIIrlB3FrXe42mr0OSSZpT0pkpFK', 'private_key' => '6LeCANsSAAAAAGBXMIKAirv6G4PmaGa-ORxdD-oZ', 'lang' => 'en');
86 /*
87 Configure the right menu options panel for s2Member.
88 */
89 $GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages'] = array('updates' => TRUE, 'upsell-pro' => TRUE, 'installation' => FALSE, 'tools' => FALSE, 'kb' => TRUE, 'videos' => TRUE, 'support' => TRUE, 'donations' => TRUE, 'beta' => TRUE);
90 /*
91 Check if s2Member has been configured *should be set after the first config via options panel*.
92 */
93 $GLOBALS['WS_PLUGIN__']['s2member']['c']['configured'] = get_option('ws_plugin__s2member_configured');
94 /*
95 This is a special option cache that holds some additional information autoloaded into WordPress.
96 */
97 $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache'] = get_option('ws_plugin__s2member_cache');
98 /*
99 Configure checksum time for the syscon.inc.php file.
100 */
101 $GLOBALS['WS_PLUGIN__']['s2member']['c']['checksum'] = filemtime(__FILE__);
102 /*
103 Configure an array of pluggable functions handled by s2Member.
104 */
105 $GLOBALS['WS_PLUGIN__']['s2member']['c']['pluggables'] = array();
106 /*
107 Configure & validate all of the s2Member options; and set their defaults.
108 */
109 if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
110 {
111 /**
112 * Configures an options array for the s2Member plugin.
113 *
114 * **WARNING:** This is a system configuration function, please DO NOT EDIT this function directly.
115 * Instead, use the plugin options panel in WordPress to override these settings.
116 *
117 * @package s2Member
118 * @since 3.0
119 *
120 * @param boolean|array $options Optional. An array of new options, to be merged with the defaults.
121 *
122 * @return array This merged array of options: ``$GLOBALS['WS_PLUGIN__']['s2member']['o']``
123 */
124 function ws_plugin__s2member_configure_options_and_their_defaults($options = FALSE)
125 {
126 global $current_site, $current_blog;
127
128 $default_options['options_checksum'] = '';
129 $default_options['options_version'] = '1.0';
130
131 $default_options['gateway_debug_logs'] = '0';
132 $default_options['gateway_debug_logs_extensive'] = '0';
133
134 $default_options['lazy_load_css_js'] = '0';
135 $default_options['no_cache_headers_mode'] = 'always'; //260308 No-cache headers mode: `always`, `selective`, `evaluative`.
136 $default_options['no_cache_headers_debug'] = '0'; //260308 Adds Server-Timing no-cache debug header (support use only).
137 $default_options['sc_conds_allow_arbitrary_php'] = '0';
138 $default_options['sc_conds_whitelist'] = '';
139
140 //260812 New shared whitelist; keep the old s2Get option synchronized temporarily for rollback compatibility.
141 $default_options['sc_user_fields_whitelist'] = '';
142 $default_options['sc_s2get_userid_whitelist'] = '';
143
144 $default_options['sec_encryption_key'] = '';
145 $default_options['sec_encryption_key_history'] = array();
146
147 $default_options['def_combo_encryption_key'] = '';
148 $default_options['def_combo_encryption_key_history'] = array();
149 $default_options['def_custom_combo_encryption_keys'] = array();
150
151 //260809 Store new Defuse key mappings by one-way hashes instead of raw secret keys.
152 $default_options['secret_key_to_defuse_key'] = array();
153 $default_options['secret_key_to_defuse_key_history'] = array();
154 $default_options['custom_secret_key_to_defuse_key'] = array();
155
156 $default_options['s_badge_status_enabled'] = '0';
157
158 $default_options['max_ip_restriction'] = '5';
159 $default_options['max_ip_restriction_time'] = '3600';
160 $default_options['max_failed_login_attempts'] = '5';
161 $default_options['max_simultaneous_logins'] = '0';
162 $default_options['max_simultaneous_logins_timeout'] = '30 minutes';
163
164 $default_options['run_uninstall_routines'] = '0';
165
166 $default_options['custom_reg_fields'] = '';
167 $default_options['custom_reg_names'] = '1';
168 $default_options['custom_reg_display_name'] = 'full';
169 $default_options['custom_reg_password'] = '0';
170 $default_options['custom_reg_password_min_length'] = '8'; // Minimum characters.
171 $default_options['custom_reg_password_min_strength'] = 'good'; // `weak`, `good` or `strong`.
172
173 $default_options['custom_reg_opt_in'] = '1';
174 $default_options['custom_reg_opt_in_label'] = 'Yes, I want to receive updates via email.';
175
176 $default_options['custom_reg_auto_opt_outs'] = array();
177 $default_options['custom_reg_auto_opt_out_transitions'] = '0';
178
179 $default_options['custom_reg_fields_4bp'] = array();
180 $default_options['custom_reg_force_personal_emails'] = '';
181
182 $default_options['allow_subscribers_in'] = '0';
183 $default_options['force_admin_lockouts'] = '0';
184 $default_options['filter_wp_query'] = array('all');
185
186 $default_options['default_url_shortener'] = 's2member'; //260612
187 $default_options['default_url_shortener_key'] = '';
188 $default_options['default_custom_str_url_shortener'] = '';
189
190 $default_options['mms_auto_patch'] = '1';
191 $default_options['mms_registration_file'] = 'wp-login';
192 $default_options['mms_registration_grants'] = 'none';
193 for($n = 0, $v = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++, $v = $v + 5)
194 $default_options['mms_registration_blogs_level'.$n] = (string)$v;
195
196 $default_options['login_welcome_page'] = '';
197 $default_options['login_redirection_override'] = '';
198 $default_options['membership_options_page'] = '';
199 $default_options['membership_options_page_vars_enable'] = '1';
200 $default_options['membership_options_page_ga_vars_enable'] = '1';
201
202 $default_options['login_reg_design_enabled'] = '1';
203
204 $default_options['login_reg_background_color'] = 'FFFFFF';
205 $default_options['login_reg_background_image'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/bg.png';
206 $default_options['login_reg_background_image_repeat'] = 'repeat';
207
208 $default_options['login_reg_background_text_color'] = '000000';
209 $default_options['login_reg_background_text_shadow_color'] = 'EEEEEE';
210 $default_options['login_reg_background_box_shadow_color'] = 'EEEEEE';
211
212 $default_options['login_reg_logo_src'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/logo.png';
213 $default_options['login_reg_logo_src_width'] = '550';
214 $default_options['login_reg_logo_src_height'] = '100';
215 $default_options['login_reg_logo_url'] = home_url('/');
216 $default_options['login_reg_logo_title'] = get_bloginfo('name');
217
218 $default_options['login_reg_font_size'] = '12px';
219 $default_options['login_reg_font_family'] = "'Verdana', 'Arial', sans-serif";
220 $default_options['login_reg_font_field_size'] = '18px';
221
222 $default_options['login_reg_footer_backtoblog'] = '0';
223 $default_options['login_reg_footer_design'] = '';
224
225 $default_options['html_emails_enabled'] = 0; //250615
226
227 $default_options['reg_email_from_name'] = get_bloginfo('name');
228 $default_options['reg_email_from_email'] = get_bloginfo('admin_email');
229 $default_options['reg_email_support_link'] = 'mailto:'.get_bloginfo('admin_email');
230
231 $default_options['new_user_emails_enabled'] = '0';
232
233 $default_options['new_user_email_subject'] = sprintf('[%s] Username/Password', get_bloginfo('name'));
234 $default_options['new_user_email_message'] = sprintf("Your Username/Password for: \n%s\n\nUsername: %%%%user_login%%%%\nTo set your password, visit: %%%%wp_set_pass_url%%%%\n\n%%%%wp_login_url%%%%", get_bloginfo('name'));
235
236 $default_options['new_user_admin_email_recipients'] = get_bloginfo('admin_email');
237 $default_options['new_user_admin_email_subject'] = sprintf('[%s] New User Registration', get_bloginfo('name'));
238 $default_options['new_user_admin_email_message'] = sprintf("New User Registration on your site: \n%s\n\nUser ID: %%%%user_id%%%%\nUsername: %%%%user_login%%%%\nEmail: %%%%user_email%%%%\nIP Address: %%%%user_ip%%%%", get_bloginfo('name'));
239
240 $default_options['paypal_sandbox'] = '0';
241 $default_options['paypal_business'] = '';
242 $default_options['paypal_merchant_id'] = '';
243 $default_options['paypal_api_username'] = '';
244 $default_options['paypal_api_password'] = '';
245 $default_options['paypal_api_signature'] = '';
246 $default_options['paypal_identity_token'] = '';
247 $default_options['paypal_btn_encryption'] = '0';
248
249 //260106
250 $default_options['paypal_checkout_enable'] = '0';
251 $default_options['paypal_checkout_sandbox'] = '0';
252 $default_options['paypal_checkout_client_id'] = '';
253 $default_options['paypal_checkout_client_secret'] = '';
254 $default_options['paypal_checkout_sandbox_client_id'] = '';
255 $default_options['paypal_checkout_sandbox_client_secret']= '';
256 $default_options['paypal_checkout_webhook_id'] = '';
257 $default_options['paypal_checkout_sandbox_webhook_id'] = '';
258
259 $default_options['paypal_checkout_cache'] = array();
260
261 $default_options['paypal_payflow_api_username'] = '';
262 $default_options['paypal_payflow_api_partner'] = 'PayPal';
263 $default_options['paypal_payflow_api_vendor'] = '';
264 $default_options['paypal_payflow_api_password'] = '';
265
266 $default_options['ipn_signup_vars_fallback'] = '0'; //250427
267 $default_options['skip_ipn_domain_validation'] = '0'; //250606
268
269 $default_options['signup_tracking_codes'] = '';
270 $default_options['modification_tracking_codes'] = '';
271 $default_options['ccap_tracking_codes'] = '';
272 $default_options['sp_tracking_codes'] = '';
273
274 $default_options['signup_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
275 $default_options['signup_email_subject'] = 'Congratulations! (your membership has been approved)';
276 $default_options['signup_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your membership has been approved.\n\nIf you haven't already done so, the next step is to Register a Username.\n\nComplete your registration here: \n%%%%registration_url%%%%\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name'));
277
278 $default_options['modification_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
279 $default_options['modification_email_subject'] = 'Thank you! Your account has been updated.';
280 $default_options['modification_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name'));
281
282 $default_options['ccap_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
283 $default_options['ccap_email_subject'] = 'Thank you! Your account has been updated.';
284 $default_options['ccap_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name'));
285
286 $default_options['sp_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
287 $default_options['sp_email_subject'] = 'Thank You! (instructions for access)';
288 $default_options['sp_email_message'] = sprintf("Thanks %%%%first_name%%%%! \n\n%%%%item_name%%%%\n\nYour order can be retrieved here: \n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name'));
289
290 $default_options['mailchimp_api_key'] = '';
291 $default_options['getresponse_api_key'] = '';
292 $default_options['aweber_api_key'] = '';
293 $default_options['aweber_internal_api_key'] = '';
294 $default_options['aweber_api_type'] = 'api';
295 if($GLOBALS['WS_PLUGIN__']['s2member']['c']['configured'])
296 $default_options['aweber_api_type'] = 'email';
297
298 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
299 $default_options['level'.$n.'_mailchimp_list_ids'] = '';
300
301 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
302 $default_options['level'.$n.'_getresponse_list_ids'] = '';
303
304 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
305 $default_options['level'.$n.'_aweber_list_ids'] = '';
306
307 $default_options['signup_notification_urls'] = '';
308 $default_options['registration_notification_urls'] = '';
309 $default_options['payment_notification_urls'] = '';
310 $default_options['modification_notification_urls'] = '';
311 $default_options['cancellation_notification_urls'] = '';
312 $default_options['eot_del_notification_urls'] = '';
313 $default_options['ref_rev_notification_urls'] = '';
314 $default_options['sp_sale_notification_urls'] = '';
315 $default_options['sp_ref_rev_notification_urls'] = '';
316
317 $default_options['signup_notification_recipients'] = '';
318 $default_options['registration_notification_recipients'] = '';
319 $default_options['payment_notification_recipients'] = '';
320 $default_options['modification_notification_recipients'] = '';
321 $default_options['cancellation_notification_recipients'] = '';
322 $default_options['eot_del_notification_recipients'] = '';
323 $default_options['ref_rev_notification_recipients'] = '';
324 $default_options['sp_sale_notification_recipients'] = '';
325 $default_options['sp_ref_rev_notification_recipients'] = '';
326
327 for ($n = 0, $l = array('Free Subscriber', 'Bronze Member', 'Silver Member', 'Gold Member', 'Platinum Member'); $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) {
328 $default_options['level'.$n.'_label'] = (!empty($l[$n])) ? $l[$n] : 'Level '.$n.' Member';
329 }
330
331 $default_options['apply_label_translations'] = '0';
332
333 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
334 $default_options['level'.$n.'_file_downloads_allowed'] = '';
335
336 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
337 $default_options['level'.$n.'_file_downloads_allowed_days'] = '';
338
339 $default_options['file_download_limit_exceeded_page'] = '';
340 $default_options['file_download_inline_extensions'] = '';
341 $default_options['file_download_stream_extensions'] = '';
342 $default_options['file_download_content_encodong_none'] = '0';
343
344 $default_options['amazon_s3_files_bucket'] = '';
345 $default_options['amazon_s3_files_bucket_region'] = '';
346 $default_options['amazon_s3_files_access_key'] = '';
347 $default_options['amazon_s3_files_secret_key'] = '';
348
349 $default_options['amazon_cf_files_private_key'] = '';
350 $default_options['amazon_cf_files_private_key_id'] = '';
351 $default_options['amazon_cf_files_distros_access_id'] = '';
352 $default_options['amazon_cf_files_distros_s3_access_id'] = '';
353 $default_options['amazon_cf_files_distro_downloads_id'] = '';
354 $default_options['amazon_cf_files_distro_downloads_cname'] = '';
355 $default_options['amazon_cf_files_distro_downloads_dname'] = '';
356 $default_options['amazon_cf_files_distro_streaming_id'] = '';
357 $default_options['amazon_cf_files_distro_streaming_cname'] = '';
358 $default_options['amazon_cf_files_distro_streaming_dname'] = '';
359 $default_options['amazon_cf_files_distros_auto_config_status'] = '';
360 $default_options['amazon_cf_files_rtmp_policy_include_ip'] = '1';
361
362 $default_options['ruris_case_sensitive'] = '0'; // No by default.
363
364 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
365 $default_options['level'.$n.'_ruris'] = '';
366 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
367 $default_options['level'.$n.'_catgs'] = '';
368 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
369 $default_options['level'.$n.'_ptags'] = '';
370 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
371 $default_options['level'.$n.'_posts'] = '';
372 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
373 $default_options['level'.$n.'_pages'] = '';
374
375 $default_options['specific_ids'] = '';
376
377 $default_options['triggers_immediate_eot'] = 'reversals';
378 $default_options['membership_eot_behavior'] = 'demote';
379 $default_options['eot_time_ext_behavior'] = 'extend';
380 $default_options['auto_eot_system_enabled'] = '1';
381 $default_options['eots_remove_ccaps'] = '1';
382 $default_options['eot_grace_time'] = '86400';
383
384 $default_options['wp_footer_code'] = '';
385
386 $default_options = apply_filters('ws_plugin__s2member_default_options', $default_options);
387
388 unset($n, $v, $l); // Unset/cleanup these working variables from the routines above.
389 /*
390 Here they are merged. User options will overwrite some or all default values.
391 */
392 $_stored_options = (($options !== FALSE) ? (array)$options : (array)get_option('ws_plugin__s2member_options'));
393 $GLOBALS['WS_PLUGIN__']['s2member']['o'] = array_merge($default_options, $_stored_options);
394
395 //260812 Keep both whitelist option names synchronized, with the legacy value taking precedence after a rollback.
396 if(isset($_stored_options['sc_s2get_userid_whitelist']) && is_string($_stored_options['sc_s2get_userid_whitelist']))
397 {
398 if(!array_key_exists('sc_user_fields_whitelist', $_stored_options) || $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_user_fields_whitelist'] !== $_stored_options['sc_s2get_userid_whitelist'])
399 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_user_fields_whitelist'] = $_stored_options['sc_s2get_userid_whitelist'];
400 }
401 else if(isset($_stored_options['sc_user_fields_whitelist']) && is_string($_stored_options['sc_user_fields_whitelist']))
402 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_s2get_userid_whitelist'] = $_stored_options['sc_user_fields_whitelist'];
403 unset($_stored_options);
404
405 /*
406 * Ditch this old option key; no longer in use.
407 */
408 if(isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines'])) unset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines']);
409 /*
410 This builds an MD5 checksum for the full array of options. This also includes the config checksum and the current set of default options.
411 */
412 $checksum = md5(($checksum_prefix = $GLOBALS['WS_PLUGIN__']['s2member']['c']['checksum'].serialize($default_options)).serialize(array_merge($GLOBALS['WS_PLUGIN__']['s2member']['o'], array('options_checksum' => 0))));
413 /*
414 Validate each option, possibly reverting back to the default value in some cases. This is only processed when/if the checksum is not up-to-date.
415 */
416 if($options !== FALSE || ($GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] !== $checksum && $GLOBALS['WS_PLUGIN__']['s2member']['o'] !== $default_options))
417 {
418 foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $key => &$value)
419 {
420 if(!isset($default_options[$key]) && !preg_match('/^pro_/', $key))
421 unset($GLOBALS['WS_PLUGIN__']['s2member']['o'][$key]);
422
423 else if($key === 'options_checksum' && (!is_string($value) || !strlen($value)))
424 $value = $default_options[$key];
425
426 else if($key === 'options_version' && (!is_string($value) || !is_numeric($value)))
427 $value = $default_options[$key];
428
429 else if(preg_match('/^gateway_debug_logs|gateway_debug_logs_extensive/', $key) && (!is_string($value) || !is_numeric($value)))
430 $value = $default_options[$key];
431
432 else if($key === 'lazy_load_css_js' && (!is_string($value) || !is_numeric($value)))
433 $value = $default_options[$key];
434
435 else if($key === 'no_cache_headers_mode' && (!is_string($value) || !in_array($value, array('always', 'selective', 'evaluative'), TRUE)))
436 $value = $default_options[$key];
437
438 else if($key === 'no_cache_headers_debug' && (!is_string($value) || !is_numeric($value)))
439 $value = $default_options[$key];
440
441 else if($key === 'sc_conds_allow_arbitrary_php' && (!is_string($value) || !is_numeric($value)))
442 $value = $default_options[$key];
443
444 else if($key === 'sc_s2get_userid_whitelist' && !is_string($value)) //260324
445 $value = $default_options[$key];
446 else if($key === 'sc_user_fields_whitelist' && !is_string($value)) //260812
447 $value = $default_options[$key];
448
449 else if($key === 'sec_encryption_key' && (!is_string($value) || !strlen($value)))
450 $value = $default_options[$key];
451
452 else if($key === 'sec_encryption_key_history' && (!is_array($value) || empty($value)))
453 $value = $default_options[$key];
454
455 else if($key === 'def_combo_encryption_key' && (!is_string($value) || !strlen($value)))
456 $value = $default_options[$key];
457
458 else if($key === 'def_combo_encryption_key_history' && (!is_array($value) || empty($value)))
459 $value = $default_options[$key];
460
461 else if($key === 'def_custom_combo_encryption_keys' && (!is_array($value) || empty($value)))
462 $value = $default_options[$key];
463
464 //260809 Validate the hashed Defuse key mappings independently of the legacy options.
465 else if(preg_match('/^(?:secret_key_to_defuse_key|secret_key_to_defuse_key_history|custom_secret_key_to_defuse_key)$/', $key) && (!is_array($value) || empty($value)))
466 $value = $default_options[$key];
467
468 else if($key === 's_badge_status_enabled' && (!is_string($value) || !is_numeric($value)))
469 $value = $default_options[$key];
470
471 else if($key === 'max_ip_restriction' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100))
472 $value = $default_options[$key];
473
474 else if($key === 'max_ip_restriction_time' && (!is_string($value) || !is_numeric($value) || $value < 300 || $value > 31556926))
475 $value = $default_options[$key];
476
477 else if($key === 'max_failed_login_attempts' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100))
478 $value = $default_options[$key];
479
480 else if($key === 'max_simultaneous_logins' && (!is_string($value) || !is_numeric($value) || $value < 0))
481 $value = $default_options[$key];
482
483 else if($key === 'max_simultaneous_logins_timeout' && (!is_string($value) || !strlen($value)))
484 $value = $default_options[$key];
485
486 else if($key === 'run_uninstall_routines' && (!is_string($value) || !is_numeric($value)))
487 $value = $default_options[$key];
488
489 else if($key === 'custom_reg_fields' && (!is_string($value) || !strlen($value)))
490 $value = $default_options[$key];
491
492 else if(preg_match('/^custom_reg_(?:names|password|password_min_length|opt_in|auto_opt_out_transitions)$/', $key) && (!is_string($value) || !is_numeric($value)))
493 $value = $default_options[$key];
494
495 else if($key === 'custom_reg_password_min_strength' && (!is_string($value) || !strlen($value)))
496 $value = $default_options[$key];
497
498 else if($key === 'custom_reg_display_name' && (!is_string($value) || !preg_match('/^(?:full|first|last|login|0)$/', $value)))
499 $value = $default_options[$key];
500
501 else if($key === 'custom_reg_opt_in_label' && (!is_string($value) || !strlen($value)))
502 $value = $default_options[$key];
503
504 else if($key === 'custom_reg_auto_opt_outs' && (!is_array($value) || empty($value)))
505 $value = $default_options[$key];
506
507 else if($key === 'custom_reg_fields_4bp' && (!is_array($value) || empty($value)))
508 $value = $default_options[$key];
509
510 else if($key === 'custom_reg_force_personal_emails' && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
511 $value = $default_options[$key];
512
513 else if($key === 'allow_subscribers_in' && (!is_string($value) || !is_numeric($value)))
514 $value = $default_options[$key];
515
516 else if($key === 'mms_auto_patch' && (!is_string($value) || !is_numeric($value)))
517 $value = $default_options[$key];
518
519 else if($key === 'mms_registration_file' && (!is_string($value) || !preg_match('/^(?:wp-login|wp-signup)$/', $value)))
520 $value = $default_options[$key];
521
522 else if($key === 'mms_registration_grants' && (!is_string($value) || !preg_match('/^(?:none|user|all)$/', $value)))
523 $value = $default_options[$key];
524
525 else if(preg_match('/^mms_registration_blogs_level[0-9]+$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
526 $value = $default_options[$key];
527
528 else if($key === 'force_admin_lockouts' && (!is_string($value) || !is_numeric($value)))
529 $value = $default_options[$key];
530
531 else if($key === 'filter_wp_query' && !is_array($value) /* This array CAN be empty. */)
532 $value = $default_options[$key];
533
534 else if(preg_match('/^default_(?:custom_str_)?url_shortener$/', $key) && (!is_string($value) || !strlen($value)))
535 $value = $default_options[$key];
536
537 else if($key === 'login_welcome_page' && (!is_string($value) || !is_numeric($value)))
538 $value = $default_options[$key];
539
540 else if($key === 'login_redirection_override' && (!is_string($value) || !strlen($value)))
541 $value = $default_options[$key];
542
543 else if($key === 'membership_options_page' && (!is_string($value) || !is_numeric($value)))
544 $value = $default_options[$key];
545
546 else if($key === 'membership_options_page_vars_enable' && (!is_string($value) || !is_numeric($value)))
547 $value = $default_options[$key];
548
549 else if($key === 'membership_options_page_ga_vars_enable' && (!is_string($value) || !is_numeric($value)))
550 $value = $default_options[$key];
551
552 else if($key === 'login_reg_design_enabled' && (!is_string($value) || !is_numeric($value)))
553 $value = $default_options[$key];
554
555 else if($key === 'login_reg_background_image' && !is_string($value) /* This is optional. */)
556 $value = $default_options[$key];
557
558 else if($key === 'login_reg_background_image_repeat' && (!is_string($value) || !preg_match('/^(?:repeat|repeat-x|repeat-y|no-repeat)$/', $value)))
559 $value = $default_options[$key];
560
561 else if(preg_match('/^login_reg_(?:background|logo|font|footer)_/', $key) && !preg_match('/background_image/', $key) && (!is_string($value) || !strlen($value)))
562 $value = $default_options[$key];
563
564 else if($key === 'login_reg_footer_backtoblog' && (!is_string($value) || !is_numeric($value)))
565 $value = $default_options[$key];
566
567 else if(preg_match('/^reg_email_(?:from_name|from_email|support_link)$/', $key) && (!is_string($value) || !strlen($value)))
568 $value = $default_options[$key];
569
570 else if($key === 'new_user_emails_enabled' && (!is_string($value) || !is_numeric($value)))
571 $value = $default_options[$key];
572
573 else if(preg_match('/^new_user_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
574 $value = $default_options[$key];
575
576 else if(preg_match('/^new_user_admin_email_(?:recipients|subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
577 $value = $default_options[$key];
578
579 else if($key === 'paypal_sandbox' && (!is_string($value) || !is_numeric($value)))
580 $value = $default_options[$key];
581
582 else if(preg_match('/^paypal_(?:business|merchant_id|api_username|api_password|api_signature|identity_token)$/', $key) && (!is_string($value) || !strlen($value)))
583 $value = $default_options[$key];
584
585 else if(preg_match('/^paypal_payflow(?:api_username|api_partner|api_vendor|api_password)$/', $key) && (!is_string($value) || !strlen($value)))
586 $value = $default_options[$key];
587
588 else if($key === 'paypal_btn_encryption' && (!is_string($value) || !is_numeric($value)))
589 $value = $default_options[$key];
590
591 //260106
592 else if($key === 'paypal_checkout_enable' && (!is_string($value) || !is_numeric($value)))
593 $value = $default_options[$key];
594 else if($key === 'paypal_checkout_sandbox' && (!is_string($value) || !is_numeric($value)))
595 $value = $default_options[$key];
596 else if(preg_match('/^paypal_checkout_(?:client_id|client_secret|sandbox_client_id|sandbox_client_secret)$/', $key) && !is_string($value))
597 $value = $default_options[$key];
598
599 else if(preg_match('/^(?:signup|modification|ccap|sp)_tracking_codes$/', $key) && (!is_string($value) || !strlen($value)))
600 $value = $default_options[$key];
601
602 else if(preg_match('/^(?:signup|modification|ccap|sp)_email_recipients$/', $key) && !is_string($value) /* Can be empty. */)
603 $value = $default_options[$key];
604
605 else if(preg_match('/^(?:signup|modification|ccap|sp)_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
606 $value = $default_options[$key];
607
608 else if($key === 'aweber_api_type' && (!is_string($value) || !preg_match('/^(?:api|email)$/', $value)))
609 $value = $default_options[$key];
610
611 else if(preg_match('/^(?:mailchimp|getresponse|aweber)(?:_internal)?_api_key$/', $key) && (!is_string($value) || !strlen($value)))
612 $value = $default_options[$key];
613
614 else if(preg_match('/^level[0-9]+_mailchimp_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/['."\r\n\t".']+/', '', $value))))
615 $value = $default_options[$key];
616
617 else if(preg_match('/^level[0-9]+_getresponse_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
618 $value = $default_options[$key];
619
620 else if(preg_match('/^level[0-9]+_aweber_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
621 $value = $default_options[$key];
622
623 else if(preg_match('/^(?:signup|registration|payment|modification|cancellation|eot_del|ref_rev|sp_sale|sp_ref_rev)_notification_urls$/', $key) && (!is_string($value) || !strlen($value)))
624 $value = $default_options[$key];
625
626 else if(preg_match('/^(?:signup|registration|payment|modification|cancellation|eot_del|ref_rev|sp_sale|sp_ref_rev)_notification_recipients$/', $key) && (!is_string($value) || !strlen($value)))
627 $value = $default_options[$key];
628
629 else if(preg_match('/^level[0-9]+_label$/', $key) && (!is_string($value) || !strlen($value)))
630 $value = $default_options[$key];
631
632 else if($key === 'apply_label_translations' && (!is_string($value) || !is_numeric($value)))
633 $value = $default_options[$key];
634
635 else if(preg_match('/^level[0-9]+_file_downloads_allowed$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
636 $value = $default_options[$key];
637
638 else if(preg_match('/^level[0-9]+_file_downloads_allowed_days$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
639 $value = $default_options[$key];
640
641 else if($key === 'file_download_limit_exceeded_page' && (!is_string($value) || !is_numeric($value)))
642 $value = $default_options[$key];
643
644 else if(preg_match('/^file_download_(?:inline|stream)_extensions$/', $key) && (!is_string($value) || !($value = strtolower(preg_replace('/\s+/', '', $value)))))
645 $value = $default_options[$key];
646
647 else if(preg_match('/^amazon_(?:s3|cf)_files_/', $key) && (!is_string($value) || !strlen($value)))
648 $value = $default_options[$key];
649
650 else if($key === 'ruris_case_sensitive' && (!is_string($value) || !is_numeric($value)))
651 $value = $default_options[$key];
652
653 else if(preg_match('/^level[0-9]+_ruris$/', $key) && (!is_string($value) || !strlen($value)))
654 $value = $default_options[$key];
655
656 else if(preg_match('/^level[0-9]+_catgs$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/[^0-9,]/', '', $value), ',')))))
657 $value = $default_options[$key];
658
659 else if(preg_match('/^level[0-9]+_ptags$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/ +/', ' ', trim(preg_replace('/ *, */', ',', $value))), ',')))))
660 $value = $default_options[$key];
661
662 else if(preg_match('/^level[0-9]+_posts$/', $key) && (!is_string($value) || !($value = trim( /* Supports `all` or `1,2,3,all-[type]s`. */
663 preg_replace('/[^a-z0-9_\-,]/', '', strtolower($value)), ',')))
664 ) $value = $default_options[$key];
665
666 else if(preg_match('/^level[0-9]+_pages$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/[^0-9,]/', '', $value), ',')))))
667 $value = $default_options[$key];
668
669 else if($key === 'specific_ids' && (!is_string($value) || !($value = trim(preg_replace('/[^0-9,]/', '', $value), ','))))
670 $value = $default_options[$key];
671
672 else if($key === 'triggers_immediate_eot' && (!is_string($value) || !preg_match('/^(?:none|refunds|reversals|refunds,reversals|refunds,partial_refunds,reversals)$/', $value)))
673 $value = $default_options[$key];
674
675 else if($key === 'membership_eot_behavior' && (!is_string($value) || !preg_match('/^(?:demote|delete)$/', $value)))
676 $value = $default_options[$key];
677
678 else if($key === 'eot_time_ext_behavior' && (!is_string($value) || !preg_match('/^(?:extend|reset)$/', $value)))
679 $value = $default_options[$key];
680
681 else if(preg_match('/^(?:auto_eot_system_enabled|eot_grace_time|eots_remove_ccaps)$/', $key) && (!is_string($value) || !is_numeric($value)))
682 $value = $default_options[$key];
683
684 else if($key === 'wp_footer_code' && (!is_string($value) || !strlen($value)))
685 $value = $default_options[$key];
686 }
687 if($options !== FALSE && is_string($options['sec_encryption_key']) && strlen($options['sec_encryption_key']) && !in_array($options['sec_encryption_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'])) {
688 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], $options['sec_encryption_key']);
689 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], 0, 10);
690 }
691 if($options !== FALSE && is_string($options['def_combo_encryption_key']) && strlen($options['def_combo_encryption_key']) && !in_array($options['def_combo_encryption_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'])) {
692 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], $options['def_combo_encryption_key']);
693 $GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], 0, 10);
694 }
695 //260809 Keep a recovery-only history of default hashed Defuse key mappings.
696 if($options !== FALSE && is_array($options['secret_key_to_defuse_key']) && !empty($options['secret_key_to_defuse_key']) && !in_array($options['secret_key_to_defuse_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], TRUE)) {
697 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], $options['secret_key_to_defuse_key']);
698 $GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], 0, 10);
699 }
700 $GLOBALS['WS_PLUGIN__']['s2member']['o'] = apply_filters_ref_array('ws_plugin__s2member_options_before_checksum', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
701
702 $GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] = md5($checksum_prefix.serialize(array_merge($GLOBALS['WS_PLUGIN__']['s2member']['o'], array('options_checksum' => 0))));
703 }
704
705 return apply_filters_ref_array('ws_plugin__s2member_options', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
706 }
707 }
708
709 //250506 Move _x's to init to avoid PHP Notice since WP 6.7
710 add_action('init', function () {
711 $o =& $GLOBALS['WS_PLUGIN__']['s2member']['o'];
712
713 // Apply the filter to retrieve default values (not global)
714 $default_values = apply_filters('ws_plugin__s2member_default_options', []);
715
716 // Translated defaults for $o[...] options, only applied if still at their original defaults
717 $translated_defaults = [
718 'custom_reg_opt_in_label' => _x('Yes, I want to receive updates via email.', 's2member-front', 's2member'),
719 'new_user_email_subject' => sprintf(_x('[%s] Username/Password', 's2member-front', 's2member'), get_bloginfo('name')),
720 'new_user_email_message' => sprintf(_x("Your Username/Password for: \n%s\n\nUsername: %%%%user_login%%%%\nTo set your password, visit: %%%%wp_set_pass_url%%%%\n\n%%%%wp_login_url%%%%", 's2member-front', 's2member'), get_bloginfo('name')),
721 'new_user_admin_email_subject' => sprintf(_x('[%s] New User Registration', 's2member-front', 's2member'), get_bloginfo('name')),
722 'new_user_admin_email_message' => sprintf(_x("New User Registration on your site: \n%s\n\nUser ID: %%%%user_id%%%%\nUsername: %%%%user_login%%%%\nEmail: %%%%user_email%%%%\nIP Address: %%%%user_ip%%%%", 's2member-front', 's2member'), get_bloginfo('name')),
723 'signup_email_subject' => _x('Congratulations! (your membership has been approved)', 's2member-front', 's2member'),
724 'signup_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your membership has been approved.\n\nIf you haven't already done so, the next step is to Register a Username.\n\nComplete your registration here: \n%%%%registration_url%%%%\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')),
725 'modification_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'),
726 'modification_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')),
727 'ccap_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'),
728 'ccap_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')),
729 'sp_email_subject' => _x('Thank You! (instructions for access)', 's2member-front', 's2member'),
730 'sp_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! \n\n%%%%item_name%%%%\n\nYour order can be retrieved here: \n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')),
731 'level0_label' => _x('Free Subscriber', 's2member-front', 's2member'),
732 'level1_label' => _x('Bronze Member', 's2member-front', 's2member'),
733 'level2_label' => _x('Silver Member', 's2member-front', 's2member'),
734 'level3_label' => _x('Gold Member', 's2member-front', 's2member'),
735 'level4_label' => _x('Platinum Member', 's2member-front', 's2member'),
736 ];
737
738 // Add extra levels if they exist.
739 for ($n = 5; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) {
740 $translated_defaults['level'.$n.'_label'] = sprintf(_x('Level %s Member', 's2member-front', 's2member'), $n);
741 }
742
743 // Apply translations to options if they are at their default
744 foreach ($translated_defaults as $key => $translated) {
745 if (isset($default_values[$key]) && isset($o[$key]) && $default_values[$key] === $o[$key]) {
746 $o[$key] = $translated;
747 }
748 }
749
750 // Handle recaptcha_lang separately
751 if (isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang']) && $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] === 'en') {
752 $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] = _x('en', 's2member-front recaptcha-lang-code', 's2member');
753 }
754 });
755