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

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

790 lines 47.9 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['static_css'] = '0'; //260903.0612 Generated static CSS delivery remains opt-in while frontend asset generation is beta.
136 $default_options['static_css_minify'] = '0'; //260902.2107 Static CSS minification is independently opt-in while generated asset delivery is beta.
137 $default_options['static_js'] = '0'; //260903.0437 Static frontend JavaScript delivery remains opt-in while generated assets are beta.
138 $default_options['static_js_text'] = 'static'; //260906.2049 Keep JavaScript text in cacheable static files by default; multilingual sites can load it with each WordPress page instead.
139 $default_options['static_js_minify'] = '0'; //260903.0437 Static JavaScript minification is independently opt-in and uses readable source files.
140 $default_options['static_assets_combine'] = '0'; //260903.1918 Keep Framework/Pro generated files separate by default; combining is an explicit request-reduction optimization.
141 $default_options['asset_health_wait_seconds'] = '3'; //260912.0522 Wait briefly after page load before treating an asset that cannot be confirmed active as Late.
142 //260904.1923 Keep the repaired s2Member Dynamic Loader as the default; WordPress routing is an explicit compatibility option.
143 $default_options['dynamic_asset_loader'] = 's2o'; //260910.0724 In current terminology, that established default is the s2Member-Only Dynamic Loader served by s2member-o.php.
144 $default_options['no_cache_headers_mode'] = 'always'; //260308 No-cache headers mode: `always`, `selective`, `evaluative`.
145 $default_options['no_cache_headers_debug'] = '0'; //260308 Adds Server-Timing no-cache debug header (support use only).
146 $default_options['sc_conds_allow_arbitrary_php'] = '0';
147 $default_options['sc_conds_whitelist'] = '';
148
149 //260812 New shared whitelist; keep the old s2Get option synchronized temporarily for rollback compatibility.
150 $default_options['sc_user_fields_whitelist'] = '';
151 $default_options['sc_s2get_userid_whitelist'] = '';
152
153 $default_options['sec_encryption_key'] = '';
154 $default_options['sec_encryption_key_history'] = array();
155
156 $default_options['def_combo_encryption_key'] = '';
157 $default_options['def_combo_encryption_key_history'] = array();
158 $default_options['def_custom_combo_encryption_keys'] = array();
159
160 //260809 Store new Defuse key mappings by one-way hashes instead of raw secret keys.
161 $default_options['secret_key_to_defuse_key'] = array();
162 $default_options['secret_key_to_defuse_key_history'] = array();
163 $default_options['custom_secret_key_to_defuse_key'] = array();
164
165 $default_options['s_badge_status_enabled'] = '0';
166
167 $default_options['max_ip_restriction'] = '5';
168 $default_options['max_ip_restriction_time'] = '3600';
169 $default_options['max_failed_login_attempts'] = '5';
170 $default_options['max_simultaneous_logins'] = '0';
171 $default_options['max_simultaneous_logins_timeout'] = '30 minutes';
172
173 $default_options['run_uninstall_routines'] = '0';
174
175 $default_options['custom_reg_fields'] = '';
176 $default_options['custom_reg_names'] = '1';
177 $default_options['custom_reg_display_name'] = 'full';
178 $default_options['custom_reg_password'] = '0';
179 $default_options['custom_reg_password_min_length'] = '8'; // Minimum characters.
180 $default_options['custom_reg_password_min_strength'] = 'good'; // `weak`, `good` or `strong`.
181
182 $default_options['custom_reg_opt_in'] = '1';
183 $default_options['custom_reg_opt_in_label'] = 'Yes, I want to receive updates via email.';
184
185 $default_options['custom_reg_auto_opt_outs'] = array();
186 $default_options['custom_reg_auto_opt_out_transitions'] = '0';
187
188 $default_options['custom_reg_fields_4bp'] = array();
189 $default_options['custom_reg_force_personal_emails'] = '';
190 $default_options['custom_reg_require_valid_email_domain'] = '0'; //261005.0548 Opt-in DNS mail-domain validation during account creation and s2Member Profile email changes.
191
192 $default_options['allow_subscribers_in'] = '0';
193 $default_options['force_admin_lockouts'] = '0';
194 $default_options['filter_wp_query'] = array('all');
195
196 $default_options['default_url_shortener'] = 's2member'; //260612
197 $default_options['default_url_shortener_key'] = '';
198 $default_options['default_custom_str_url_shortener'] = '';
199
200 $default_options['mms_auto_patch'] = '1';
201 $default_options['mms_registration_file'] = 'wp-login';
202 $default_options['mms_registration_grants'] = 'none';
203 for($n = 0, $v = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++, $v = $v + 5)
204 $default_options['mms_registration_blogs_level'.$n] = (string)$v;
205
206 $default_options['login_welcome_page'] = '';
207 $default_options['login_redirection_override'] = '';
208 $default_options['membership_options_page'] = '';
209 $default_options['membership_options_page_vars_enable'] = '1';
210 $default_options['membership_options_page_ga_vars_enable'] = '1';
211
212 $default_options['login_reg_design_enabled'] = '1';
213
214 $default_options['login_reg_background_color'] = 'FFFFFF';
215 $default_options['login_reg_background_image'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/bg.png';
216 $default_options['login_reg_background_image_repeat'] = 'repeat';
217
218 $default_options['login_reg_background_text_color'] = '000000';
219 $default_options['login_reg_background_text_shadow_color'] = 'EEEEEE';
220 $default_options['login_reg_background_box_shadow_color'] = 'EEEEEE';
221
222 $default_options['login_reg_logo_src'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/logo.png';
223 $default_options['login_reg_logo_src_width'] = '550';
224 $default_options['login_reg_logo_src_height'] = '100';
225 $default_options['login_reg_logo_url'] = home_url('/');
226 $default_options['login_reg_logo_title'] = get_bloginfo('name');
227
228 $default_options['login_reg_font_size'] = '12px';
229 $default_options['login_reg_font_family'] = "'Verdana', 'Arial', sans-serif";
230 $default_options['login_reg_font_field_size'] = '18px';
231
232 $default_options['login_reg_footer_backtoblog'] = '0';
233 $default_options['login_reg_footer_design'] = '';
234
235 $default_options['html_emails_enabled'] = 0; //250615
236
237 $default_options['reg_email_from_name'] = get_bloginfo('name');
238 $default_options['reg_email_from_email'] = get_bloginfo('admin_email');
239 $default_options['reg_email_support_link'] = 'mailto:'.get_bloginfo('admin_email');
240
241 $default_options['new_user_emails_enabled'] = '0';
242
243 $default_options['new_user_email_subject'] = sprintf('[%s] Username/Password', get_bloginfo('name'));
244 $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'));
245
246 $default_options['new_user_admin_email_recipients'] = get_bloginfo('admin_email');
247 $default_options['new_user_admin_email_subject'] = sprintf('[%s] New User Registration', get_bloginfo('name'));
248 $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'));
249
250 $default_options['paypal_sandbox'] = '0';
251 $default_options['paypal_business'] = '';
252 $default_options['paypal_merchant_id'] = '';
253 $default_options['paypal_api_username'] = '';
254 $default_options['paypal_api_password'] = '';
255 $default_options['paypal_api_signature'] = '';
256 $default_options['paypal_identity_token'] = '';
257 $default_options['paypal_btn_encryption'] = '0';
258
259 //260106
260 $default_options['paypal_checkout_enable'] = '0';
261 $default_options['paypal_checkout_sandbox'] = '0';
262 $default_options['paypal_checkout_client_id'] = '';
263 $default_options['paypal_checkout_client_secret'] = '';
264 $default_options['paypal_checkout_sandbox_client_id'] = '';
265 $default_options['paypal_checkout_sandbox_client_secret']= '';
266 $default_options['paypal_checkout_webhook_id'] = '';
267 $default_options['paypal_checkout_sandbox_webhook_id'] = '';
268
269 $default_options['paypal_checkout_cache'] = array();
270
271 $default_options['paypal_payflow_api_username'] = '';
272 $default_options['paypal_payflow_api_partner'] = 'PayPal';
273 $default_options['paypal_payflow_api_vendor'] = '';
274 $default_options['paypal_payflow_api_password'] = '';
275
276 $default_options['ipn_signup_vars_fallback'] = '0'; //250427
277 $default_options['skip_ipn_domain_validation'] = '0'; //250606
278
279 $default_options['signup_tracking_codes'] = '';
280 $default_options['modification_tracking_codes'] = '';
281 $default_options['ccap_tracking_codes'] = '';
282 $default_options['sp_tracking_codes'] = '';
283
284 $default_options['signup_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
285 $default_options['signup_email_subject'] = 'Congratulations! (your membership has been approved)';
286 $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'));
287
288 $default_options['modification_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
289 $default_options['modification_email_subject'] = 'Thank you! Your account has been updated.';
290 $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'));
291
292 $default_options['ccap_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
293 $default_options['ccap_email_subject'] = 'Thank you! Your account has been updated.';
294 $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'));
295
296 $default_options['sp_email_recipients'] = '"%%full_name%%" <%%payer_email%%>';
297 $default_options['sp_email_subject'] = 'Thank You! (instructions for access)';
298 $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'));
299
300 $default_options['mailchimp_api_key'] = '';
301 $default_options['getresponse_api_key'] = '';
302 $default_options['aweber_api_key'] = '';
303 $default_options['aweber_internal_api_key'] = '';
304 $default_options['aweber_api_type'] = 'api';
305 if($GLOBALS['WS_PLUGIN__']['s2member']['c']['configured'])
306 $default_options['aweber_api_type'] = 'email';
307
308 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
309 $default_options['level'.$n.'_mailchimp_list_ids'] = '';
310
311 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
312 $default_options['level'.$n.'_getresponse_list_ids'] = '';
313
314 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
315 $default_options['level'.$n.'_aweber_list_ids'] = '';
316
317 $default_options['signup_notification_urls'] = '';
318 $default_options['registration_notification_urls'] = '';
319 $default_options['payment_notification_urls'] = '';
320 $default_options['modification_notification_urls'] = '';
321 $default_options['cancellation_notification_urls'] = '';
322 $default_options['eot_del_notification_urls'] = '';
323 $default_options['ref_rev_notification_urls'] = '';
324 $default_options['sp_sale_notification_urls'] = '';
325 $default_options['sp_ref_rev_notification_urls'] = '';
326
327 $default_options['signup_notification_recipients'] = '';
328 $default_options['registration_notification_recipients'] = '';
329 $default_options['payment_notification_recipients'] = '';
330 $default_options['modification_notification_recipients'] = '';
331 $default_options['cancellation_notification_recipients'] = '';
332 $default_options['eot_del_notification_recipients'] = '';
333 $default_options['ref_rev_notification_recipients'] = '';
334 $default_options['sp_sale_notification_recipients'] = '';
335 $default_options['sp_ref_rev_notification_recipients'] = '';
336
337 for ($n = 0, $l = array('Free Subscriber', 'Bronze Member', 'Silver Member', 'Gold Member', 'Platinum Member'); $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) {
338 $default_options['level'.$n.'_label'] = (!empty($l[$n])) ? $l[$n] : 'Level '.$n.' Member';
339 }
340
341 $default_options['apply_label_translations'] = '0';
342
343 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
344 $default_options['level'.$n.'_file_downloads_allowed'] = '';
345
346 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
347 $default_options['level'.$n.'_file_downloads_allowed_days'] = '';
348
349 $default_options['file_download_limit_exceeded_page'] = '';
350 $default_options['file_download_inline_extensions'] = '';
351 $default_options['file_download_stream_extensions'] = '';
352 $default_options['file_download_content_encodong_none'] = '0';
353
354 $default_options['amazon_s3_files_bucket'] = '';
355 $default_options['amazon_s3_files_bucket_region'] = '';
356 $default_options['amazon_s3_files_access_key'] = '';
357 $default_options['amazon_s3_files_secret_key'] = '';
358
359 $default_options['amazon_cf_files_private_key'] = '';
360 $default_options['amazon_cf_files_private_key_id'] = '';
361 $default_options['amazon_cf_files_distros_access_id'] = '';
362 $default_options['amazon_cf_files_distros_s3_access_id'] = '';
363 $default_options['amazon_cf_files_distro_downloads_id'] = '';
364 $default_options['amazon_cf_files_distro_downloads_cname'] = '';
365 $default_options['amazon_cf_files_distro_downloads_dname'] = '';
366 $default_options['amazon_cf_files_distro_streaming_id'] = '';
367 $default_options['amazon_cf_files_distro_streaming_cname'] = '';
368 $default_options['amazon_cf_files_distro_streaming_dname'] = '';
369 $default_options['amazon_cf_files_distros_auto_config_status'] = '';
370 $default_options['amazon_cf_files_rtmp_policy_include_ip'] = '1';
371
372 $default_options['ruris_case_sensitive'] = '0'; // No by default.
373
374 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
375 $default_options['level'.$n.'_ruris'] = '';
376 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
377 $default_options['level'.$n.'_catgs'] = '';
378 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
379 $default_options['level'.$n.'_ptags'] = '';
380 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
381 $default_options['level'.$n.'_posts'] = '';
382 for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
383 $default_options['level'.$n.'_pages'] = '';
384
385 $default_options['specific_ids'] = '';
386
387 $default_options['triggers_immediate_eot'] = 'reversals';
388 $default_options['membership_eot_behavior'] = 'demote';
389 $default_options['eot_demotion_to_role'] = 'subscriber';
390 $default_options['eot_demotion_from'] = 'all'; //260916.2137 Missing options must preserve legacy behavior until a fresh activation explicitly stores the new Level-only default.
391 $default_options['eot_time_ext_behavior'] = 'extend';
392 $default_options['auto_eot_system_enabled'] = '1';
393 $default_options['auto_eot_system_runtime_mode'] = 'auto';
394 $default_options['auto_eot_system_runtime_custom'] = '30';
395 $default_options['eots_remove_ccaps'] = '1';
396 $default_options['eot_grace_time'] = '86400';
397
398 $default_options['wp_footer_code'] = '';
399
400 $default_options = apply_filters('ws_plugin__s2member_default_options', $default_options);
401
402 unset($n, $v, $l); // Unset/cleanup these working variables from the routines above.
403 /*
404 Here they are merged. User options will overwrite some or all default values.
405 */
406 $_stored_options = (($options !== FALSE) ? (array)$options : (array)get_option('ws_plugin__s2member_options'));
407 $GLOBALS['WS_PLUGIN__']['s2member']['o'] = array_merge($default_options, $_stored_options);
408
409 //260812 Keep both whitelist option names synchronized, with the legacy value taking precedence after a rollback.
410 if(isset($_stored_options['sc_s2get_userid_whitelist']) && is_string($_stored_options['sc_s2get_userid_whitelist']))
411 {
412 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'])
413 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_user_fields_whitelist'] = $_stored_options['sc_s2get_userid_whitelist'];
414 }
415 else if(isset($_stored_options['sc_user_fields_whitelist']) && is_string($_stored_options['sc_user_fields_whitelist']))
416 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_s2get_userid_whitelist'] = $_stored_options['sc_user_fields_whitelist'];
417 unset($_stored_options);
418
419 /*
420 * Ditch this old option key; no longer in use.
421 */
422 if(isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines'])) unset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines']);
423 /*
424 This builds an MD5 checksum for the full array of options. This also includes the config checksum and the current set of default options.
425 */
426 $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))));
427 /*
428 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.
429 */
430 if($options !== FALSE || ($GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] !== $checksum && $GLOBALS['WS_PLUGIN__']['s2member']['o'] !== $default_options))
431 {
432 foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $key => &$value)
433 {
434 if(!isset($default_options[$key]) && !preg_match('/^pro_/', $key))
435 unset($GLOBALS['WS_PLUGIN__']['s2member']['o'][$key]);
436
437 else if($key === 'options_checksum' && (!is_string($value) || !strlen($value)))
438 $value = $default_options[$key];
439
440 else if($key === 'options_version' && (!is_string($value) || !is_numeric($value)))
441 $value = $default_options[$key];
442
443 else if(preg_match('/^gateway_debug_logs|gateway_debug_logs_extensive/', $key) && (!is_string($value) || !is_numeric($value)))
444 $value = $default_options[$key];
445
446 else if($key === 'lazy_load_css_js' && (!is_string($value) || !is_numeric($value)))
447 $value = $default_options[$key];
448
449 else if(preg_match('/^static_(?:css|js)(?:_minify)?$/', $key) && (!is_string($value) || !is_numeric($value))) //260903.0437
450 $value = $default_options[$key];
451
452 //260912.0522 Keep the operator-facing wait bounded so an accidental value cannot effectively disable health checking.
453 //260911.0010 Here, bounded means the explicit 1–60-second range exposed by the setting.
454 else if($key === 'asset_health_wait_seconds')
455 $value = (!is_string($value) || !is_numeric($value) || (int)$value < 1 || (int)$value > 60) ? $default_options[$key] : (string)(int)$value;
456
457 else if($key === 'no_cache_headers_mode' && (!is_string($value) || !in_array($value, array('always', 'selective', 'evaluative'), TRUE)))
458 $value = $default_options[$key];
459
460 else if($key === 'no_cache_headers_debug' && (!is_string($value) || !is_numeric($value)))
461 $value = $default_options[$key];
462
463 else if($key === 'sc_conds_allow_arbitrary_php' && (!is_string($value) || !is_numeric($value)))
464 $value = $default_options[$key];
465
466 else if($key === 'sc_s2get_userid_whitelist' && !is_string($value)) //260324
467 $value = $default_options[$key];
468 else if($key === 'sc_user_fields_whitelist' && !is_string($value)) //260812
469 $value = $default_options[$key];
470
471 else if($key === 'sec_encryption_key' && (!is_string($value) || !strlen($value)))
472 $value = $default_options[$key];
473
474 else if($key === 'sec_encryption_key_history' && (!is_array($value) || empty($value)))
475 $value = $default_options[$key];
476
477 else if($key === 'def_combo_encryption_key' && (!is_string($value) || !strlen($value)))
478 $value = $default_options[$key];
479
480 else if($key === 'def_combo_encryption_key_history' && (!is_array($value) || empty($value)))
481 $value = $default_options[$key];
482
483 else if($key === 'def_custom_combo_encryption_keys' && (!is_array($value) || empty($value)))
484 $value = $default_options[$key];
485
486 //260809 Validate the hashed Defuse key mappings independently of the legacy options.
487 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)))
488 $value = $default_options[$key];
489
490 else if($key === 's_badge_status_enabled' && (!is_string($value) || !is_numeric($value)))
491 $value = $default_options[$key];
492
493 else if($key === 'max_ip_restriction' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100))
494 $value = $default_options[$key];
495
496 else if($key === 'max_ip_restriction_time' && (!is_string($value) || !is_numeric($value) || $value < 300 || $value > 31556926))
497 $value = $default_options[$key];
498
499 else if($key === 'max_failed_login_attempts' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100))
500 $value = $default_options[$key];
501
502 else if($key === 'max_simultaneous_logins' && (!is_string($value) || !is_numeric($value) || $value < 0))
503 $value = $default_options[$key];
504
505 else if($key === 'max_simultaneous_logins_timeout' && (!is_string($value) || !strlen($value)))
506 $value = $default_options[$key];
507
508 else if($key === 'run_uninstall_routines' && (!is_string($value) || !is_numeric($value)))
509 $value = $default_options[$key];
510
511 else if($key === 'custom_reg_fields' && (!is_string($value) || !strlen($value)))
512 $value = $default_options[$key];
513
514 else if(preg_match('/^custom_reg_(?:names|password|password_min_length|opt_in|auto_opt_out_transitions|require_valid_email_domain)$/', $key) && (!is_string($value) || !is_numeric($value)))
515 $value = $default_options[$key];
516
517 else if($key === 'custom_reg_password_min_strength' && (!is_string($value) || !strlen($value)))
518 $value = $default_options[$key];
519
520 else if($key === 'custom_reg_display_name' && (!is_string($value) || !preg_match('/^(?:full|first|last|login|0)$/', $value)))
521 $value = $default_options[$key];
522
523 else if($key === 'custom_reg_opt_in_label' && (!is_string($value) || !strlen($value)))
524 $value = $default_options[$key];
525
526 else if($key === 'custom_reg_auto_opt_outs' && (!is_array($value) || empty($value)))
527 $value = $default_options[$key];
528
529 else if($key === 'custom_reg_fields_4bp' && (!is_array($value) || empty($value)))
530 $value = $default_options[$key];
531
532 else if($key === 'custom_reg_force_personal_emails' && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
533 $value = $default_options[$key];
534
535 else if($key === 'allow_subscribers_in' && (!is_string($value) || !is_numeric($value)))
536 $value = $default_options[$key];
537
538 else if($key === 'mms_auto_patch' && (!is_string($value) || !is_numeric($value)))
539 $value = $default_options[$key];
540
541 else if($key === 'mms_registration_file' && (!is_string($value) || !preg_match('/^(?:wp-login|wp-signup)$/', $value)))
542 $value = $default_options[$key];
543
544 else if($key === 'mms_registration_grants' && (!is_string($value) || !preg_match('/^(?:none|user|all)$/', $value)))
545 $value = $default_options[$key];
546
547 else if(preg_match('/^mms_registration_blogs_level[0-9]+$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
548 $value = $default_options[$key];
549
550 else if($key === 'force_admin_lockouts' && (!is_string($value) || !is_numeric($value)))
551 $value = $default_options[$key];
552
553 else if($key === 'filter_wp_query' && !is_array($value) /* This array CAN be empty. */)
554 $value = $default_options[$key];
555
556 else if(preg_match('/^default_(?:custom_str_)?url_shortener$/', $key) && (!is_string($value) || !strlen($value)))
557 $value = $default_options[$key];
558
559 else if($key === 'login_welcome_page' && (!is_string($value) || !is_numeric($value)))
560 $value = $default_options[$key];
561
562 else if($key === 'login_redirection_override' && (!is_string($value) || !strlen($value)))
563 $value = $default_options[$key];
564
565 else if($key === 'membership_options_page' && (!is_string($value) || !is_numeric($value)))
566 $value = $default_options[$key];
567
568 else if($key === 'membership_options_page_vars_enable' && (!is_string($value) || !is_numeric($value)))
569 $value = $default_options[$key];
570
571 else if($key === 'membership_options_page_ga_vars_enable' && (!is_string($value) || !is_numeric($value)))
572 $value = $default_options[$key];
573
574 else if($key === 'login_reg_design_enabled' && (!is_string($value) || !is_numeric($value)))
575 $value = $default_options[$key];
576
577 else if($key === 'login_reg_background_image' && !is_string($value) /* This is optional. */)
578 $value = $default_options[$key];
579
580 else if($key === 'login_reg_background_image_repeat' && (!is_string($value) || !preg_match('/^(?:repeat|repeat-x|repeat-y|no-repeat)$/', $value)))
581 $value = $default_options[$key];
582
583 else if(preg_match('/^login_reg_(?:background|logo|font|footer)_/', $key) && !preg_match('/background_image/', $key) && (!is_string($value) || !strlen($value)))
584 $value = $default_options[$key];
585
586 else if($key === 'login_reg_footer_backtoblog' && (!is_string($value) || !is_numeric($value)))
587 $value = $default_options[$key];
588
589 else if(preg_match('/^reg_email_(?:from_name|from_email|support_link)$/', $key) && (!is_string($value) || !strlen($value)))
590 $value = $default_options[$key];
591
592 else if($key === 'new_user_emails_enabled' && (!is_string($value) || !is_numeric($value)))
593 $value = $default_options[$key];
594
595 else if(preg_match('/^new_user_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
596 $value = $default_options[$key];
597
598 else if(preg_match('/^new_user_admin_email_(?:recipients|subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
599 $value = $default_options[$key];
600
601 else if($key === 'paypal_sandbox' && (!is_string($value) || !is_numeric($value)))
602 $value = $default_options[$key];
603
604 else if(preg_match('/^paypal_(?:business|merchant_id|api_username|api_password|api_signature|identity_token)$/', $key) && (!is_string($value) || !strlen($value)))
605 $value = $default_options[$key];
606
607 else if(preg_match('/^paypal_payflow(?:api_username|api_partner|api_vendor|api_password)$/', $key) && (!is_string($value) || !strlen($value)))
608 $value = $default_options[$key];
609
610 else if($key === 'paypal_btn_encryption' && (!is_string($value) || !is_numeric($value)))
611 $value = $default_options[$key];
612
613 //260106
614 else if($key === 'paypal_checkout_enable' && (!is_string($value) || !is_numeric($value)))
615 $value = $default_options[$key];
616 else if($key === 'paypal_checkout_sandbox' && (!is_string($value) || !is_numeric($value)))
617 $value = $default_options[$key];
618 else if(preg_match('/^paypal_checkout_(?:client_id|client_secret|sandbox_client_id|sandbox_client_secret)$/', $key) && !is_string($value))
619 $value = $default_options[$key];
620
621 else if(preg_match('/^(?:signup|modification|ccap|sp)_tracking_codes$/', $key) && (!is_string($value) || !strlen($value)))
622 $value = $default_options[$key];
623
624 else if(preg_match('/^(?:signup|modification|ccap|sp)_email_recipients$/', $key) && !is_string($value) /* Can be empty. */)
625 $value = $default_options[$key];
626
627 else if(preg_match('/^(?:signup|modification|ccap|sp)_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value)))
628 $value = $default_options[$key];
629
630 else if($key === 'aweber_api_type' && (!is_string($value) || !preg_match('/^(?:api|email)$/', $value)))
631 $value = $default_options[$key];
632
633 else if(preg_match('/^(?:mailchimp|getresponse|aweber)(?:_internal)?_api_key$/', $key) && (!is_string($value) || !strlen($value)))
634 $value = $default_options[$key];
635
636 else if(preg_match('/^level[0-9]+_mailchimp_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/['."\r\n\t".']+/', '', $value))))
637 $value = $default_options[$key];
638
639 else if(preg_match('/^level[0-9]+_getresponse_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
640 $value = $default_options[$key];
641
642 else if(preg_match('/^level[0-9]+_aweber_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value))))
643 $value = $default_options[$key];
644
645 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)))
646 $value = $default_options[$key];
647
648 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)))
649 $value = $default_options[$key];
650
651 else if(preg_match('/^level[0-9]+_label$/', $key) && (!is_string($value) || !strlen($value)))
652 $value = $default_options[$key];
653
654 else if($key === 'apply_label_translations' && (!is_string($value) || !is_numeric($value)))
655 $value = $default_options[$key];
656
657 else if(preg_match('/^level[0-9]+_file_downloads_allowed$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
658 $value = $default_options[$key];
659
660 else if(preg_match('/^level[0-9]+_file_downloads_allowed_days$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0))
661 $value = $default_options[$key];
662
663 else if($key === 'file_download_limit_exceeded_page' && (!is_string($value) || !is_numeric($value)))
664 $value = $default_options[$key];
665
666 else if(preg_match('/^file_download_(?:inline|stream)_extensions$/', $key) && (!is_string($value) || !($value = strtolower(preg_replace('/\s+/', '', $value)))))
667 $value = $default_options[$key];
668
669 else if(preg_match('/^amazon_(?:s3|cf)_files_/', $key) && (!is_string($value) || !strlen($value)))
670 $value = $default_options[$key];
671
672 else if($key === 'ruris_case_sensitive' && (!is_string($value) || !is_numeric($value)))
673 $value = $default_options[$key];
674
675 else if(preg_match('/^level[0-9]+_ruris$/', $key) && (!is_string($value) || !strlen($value)))
676 $value = $default_options[$key];
677
678 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), ',')))))
679 $value = $default_options[$key];
680
681 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))), ',')))))
682 $value = $default_options[$key];
683
684 else if(preg_match('/^level[0-9]+_posts$/', $key) && (!is_string($value) || !($value = trim( /* Supports `all` or `1,2,3,all-[type]s`. */
685 preg_replace('/[^a-z0-9_\-,]/', '', strtolower($value)), ',')))
686 ) $value = $default_options[$key];
687
688 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), ',')))))
689 $value = $default_options[$key];
690
691 else if($key === 'specific_ids' && (!is_string($value) || !($value = trim(preg_replace('/[^0-9,]/', '', $value), ','))))
692 $value = $default_options[$key];
693
694 else if($key === 'triggers_immediate_eot' && (!is_string($value) || !preg_match('/^(?:none|refunds|reversals|refunds,reversals|refunds,partial_refunds,reversals)$/', $value)))
695 $value = $default_options[$key];
696
697 else if($key === 'membership_eot_behavior' && (!is_string($value) || !preg_match('/^(?:demote|delete)$/', $value)))
698 $value = $default_options[$key];
699
700 //260916.2306 Keep bootstrap validation side-effect free; role existence is checked later when the EOT demotion role is resolved, after s2Member is fully loaded.
701 else if($key === 'eot_demotion_to_role' && (!is_string($value) || !$value || in_array($value, array('administrator', 'editor', 'author', 'contributor', 's2member_pending_deletion'), TRUE)))
702 $value = $default_options[$key];
703
704 else if($key === 'eot_demotion_from' && (!is_string($value) || !preg_match('/^(?:s2member_level|all)$/', $value)))
705 $value = $default_options[$key];
706
707 else if($key === 'eot_time_ext_behavior' && (!is_string($value) || !preg_match('/^(?:extend|reset)$/', $value)))
708 $value = $default_options[$key];
709
710 else if($key === 'auto_eot_system_runtime_mode' && (!is_string($value) || !preg_match('/^(?:auto|custom)$/', $value)))
711 $value = $default_options[$key];
712
713 else if($key === 'auto_eot_system_runtime_custom' && (!is_string($value) || !is_numeric($value) || (float)$value < 1 || (float)$value > 3600))
714 $value = $default_options[$key];
715
716 else if(preg_match('/^(?:auto_eot_system_enabled|eot_grace_time|eots_remove_ccaps)$/', $key) && (!is_string($value) || !is_numeric($value)))
717 $value = $default_options[$key];
718
719 else if($key === 'wp_footer_code' && (!is_string($value) || !strlen($value)))
720 $value = $default_options[$key];
721 }
722 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'])) {
723 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], $options['sec_encryption_key']);
724 $GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], 0, 10);
725 }
726 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'])) {
727 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], $options['def_combo_encryption_key']);
728 $GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], 0, 10);
729 }
730 //260809 Keep a recovery-only history of default hashed Defuse key mappings.
731 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)) {
732 array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], $options['secret_key_to_defuse_key']);
733 $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);
734 }
735 $GLOBALS['WS_PLUGIN__']['s2member']['o'] = apply_filters_ref_array('ws_plugin__s2member_options_before_checksum', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
736
737 $GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] = md5($checksum_prefix.serialize(array_merge($GLOBALS['WS_PLUGIN__']['s2member']['o'], array('options_checksum' => 0))));
738 }
739
740 return apply_filters_ref_array('ws_plugin__s2member_options', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
741 }
742 }
743
744 //250506 Move _x's to init to avoid PHP Notice since WP 6.7
745 add_action('init', function () {
746 $o =& $GLOBALS['WS_PLUGIN__']['s2member']['o'];
747
748 // Apply the filter to retrieve default values (not global)
749 $default_values = apply_filters('ws_plugin__s2member_default_options', []);
750
751 // Translated defaults for $o[...] options, only applied if still at their original defaults
752 $translated_defaults = [
753 'custom_reg_opt_in_label' => _x('Yes, I want to receive updates via email.', 's2member-front', 's2member'),
754 'new_user_email_subject' => sprintf(_x('[%s] Username/Password', 's2member-front', 's2member'), get_bloginfo('name')),
755 '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')),
756 'new_user_admin_email_subject' => sprintf(_x('[%s] New User Registration', 's2member-front', 's2member'), get_bloginfo('name')),
757 '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')),
758 'signup_email_subject' => _x('Congratulations! (your membership has been approved)', 's2member-front', 's2member'),
759 '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')),
760 'modification_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'),
761 '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')),
762 'ccap_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'),
763 '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')),
764 'sp_email_subject' => _x('Thank You! (instructions for access)', 's2member-front', 's2member'),
765 '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')),
766 'level0_label' => _x('Free Subscriber', 's2member-front', 's2member'),
767 'level1_label' => _x('Bronze Member', 's2member-front', 's2member'),
768 'level2_label' => _x('Silver Member', 's2member-front', 's2member'),
769 'level3_label' => _x('Gold Member', 's2member-front', 's2member'),
770 'level4_label' => _x('Platinum Member', 's2member-front', 's2member'),
771 ];
772
773 // Add extra levels if they exist.
774 for ($n = 5; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) {
775 $translated_defaults['level'.$n.'_label'] = sprintf(_x('Level %s Member', 's2member-front', 's2member'), $n);
776 }
777
778 // Apply translations to options if they are at their default
779 foreach ($translated_defaults as $key => $translated) {
780 if (isset($default_values[$key]) && isset($o[$key]) && $default_values[$key] === $o[$key]) {
781 $o[$key] = $translated;
782 }
783 }
784
785 // Handle recaptcha_lang separately
786 if (isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang']) && $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] === 'en') {
787 $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] = _x('en', 's2member-front recaptcha-lang-code', 's2member');
788 }
789 });
790