PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260917
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260917
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 260917, at src/includes/syscon.inc.php

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