PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260909
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260909
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 / menu-pages / gen-ops.inc.php

gen-ops.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 260909, at src/includes/menu-pages/gen-ops.inc.php

1,816 lines 133.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * Menu page for the s2Member plugin (General Options page).
5 *
6 * Copyright: © 2009-2011
7 * {@link http://websharks-inc.com/ WebSharks, Inc.}
8 * (coded in the USA)
9 *
10 * Released under the terms of the GNU General Public License.
11 * You should have received a copy of the GNU General Public License,
12 * along with this software. In the main directory, see: /licensing/
13 * If not, see: {@link http://www.gnu.org/licenses/}.
14 *
15 * @package s2Member\Menu_Pages
16 * @since 3.0
17 */
18 if(!defined('WPINC')) // MUST have WordPress.
19 exit("Do not access this file directly.");
20
21 if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
22 {
23 /**
24 * Menu page for the s2Member plugin (General Options page).
25 *
26 * @package s2Member\Menu_Pages
27 * @since 110531
28 */
29 class c_ws_plugin__s2member_menu_page_gen_ops
30 {
31 public function __construct()
32 {
33 echo '<div class="wrap ws-menu-page">'."\n";
34
35 echo '<div class="wp-header-end"></div>'."\n";
36
37 echo '<div class="ws-menu-page-toolbox">'."\n";
38 c_ws_plugin__s2member_menu_pages_tb::display();
39 echo '</div>'."\n";
40
41 echo '<h2>General Options</h2>'."\n";
42
43 echo '<table class="ws-menu-page-table">'."\n";
44 echo '<tbody class="ws-menu-page-table-tbody">'."\n";
45 echo '<tr class="ws-menu-page-table-tr">'."\n";
46 echo '<td class="ws-menu-page-table-l">'."\n";
47
48 do_action("ws_plugin__s2member_during_gen_ops_page_before_left_sections_form", get_defined_vars());
49
50 echo '<form method="post" name="ws_plugin__s2member_options_form" id="ws-plugin--s2member-options-form" autocomplete="off">'."\n";
51 echo '<input type="hidden" name="ws_plugin__s2member_options_save" id="ws-plugin--s2member-options-save" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-options-save")).'" />'."\n";
52 echo '<input type="hidden" name="ws_plugin__s2member_configured" id="ws-plugin--s2member-configured" value="1" />'."\n";
53
54 do_action("ws_plugin__s2member_during_gen_ops_page_before_left_sections", get_defined_vars());
55
56 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_uninstall", (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site() || is_super_admin()), get_defined_vars()))
57 {
58 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_uninstall", get_defined_vars());
59
60 echo '<div class="ws-menu-page-group" title="Plugin Deletion Safeguards"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["run_uninstall_routines"]) ? ' default-state="open"' : '').'>'."\n";
61
62 echo '<div class="ws-menu-page-section ws-plugin--s2member-uninstall-section">'."\n";
63 echo '<h3>Plugin Deletion Safeguards (highly recommended)</h3>'."\n";
64 echo '<p>By default, s2Member will retain all of it\'s Roles, Capabilities, and your Configuration Options when/if you delete s2Member from the Plugins Menu in WordPress. However, if you would like for s2Member to erase itself completely, please choose: <code>No (upon deletion, erase all data/options)</code>. See also: <a href="http://s2member.com/kb-article/how-do-i-uninstall-s2member/" target="_blank" rel="external">s2Member Uninstall Instructions</a></p>';
65 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_uninstall", get_defined_vars());
66
67 echo '<table class="form-table">'."\n";
68 echo '<tbody>'."\n";
69 echo '<tr>'."\n";
70
71 echo '<th>'."\n";
72 echo '<label for="ws-plugin--s2member-run-uninstall-routines">'."\n";
73 echo 'Safeguard s2Member Data/Options?'."\n";
74 echo '</label>'."\n";
75 echo '</th>'."\n";
76
77 echo '</tr>'."\n";
78 echo '<tr>'."\n";
79
80 echo '<td>'."\n";
81 echo '<select name="ws_plugin__s2member_run_uninstall_routines" id="ws-plugin--s2member-run-uninstall-routines">'."\n";
82 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["run_uninstall_routines"]) ? ' selected="selected"' : '').'>Yes (safeguard all data/options)</option>'."\n";
83 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["run_uninstall_routines"]) ? ' selected="selected"' : '').'>No (upon deletion, erase all data/options)</option>'."\n";
84 echo '</select><br />'."\n";
85 echo 'Recommended setting: (<code>Yes, safeguard all data/options</code>)'."\n";
86 echo '</td>'."\n";
87
88 echo '</tr>'."\n";
89 echo '</tbody>'."\n";
90 echo '</table>'."\n";
91 echo '</div>'."\n";
92
93 echo '</div>'."\n";
94
95 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_uninstall", get_defined_vars());
96 }
97 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_security", TRUE, get_defined_vars()))
98 {
99 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_security", get_defined_vars());
100
101 echo '<div class="ws-menu-page-group" title="Security Encryption Key">'."\n";
102
103 echo '<div class="ws-menu-page-section ws-plugin--s2member-security-section">'."\n";
104 echo '<img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/src/images/large-icon.png" title="s2Member (a Membership management system for WordPress)" alt="" style="float:right; margin:0 0 0 25px; border:0;" />'."\n";
105 //260810 Clarify that s2Member always has an encryption secret and that this separate key is optional.
106 echo '<h3>Security Encryption Key (optional)</h3>'."\n";
107 echo '<p>s2Member uses an encryption secret to encrypt and validate certain sensitive values. If you leave this setting blank, s2Member automatically uses the WordPress salts via <code>wp_salt()</code>. You can instead configure a separate Security Encryption Key for s2Member, giving you independent control over this secret and making it easier to preserve across site moves or restores when you keep the same key.</p>'."\n";
108 echo '<p>Once a site is in use, avoid changing its effective encryption key unless you intend to invalidate or recover data encrypted with a previous key. Existing Specific Post/Page Access Links, Registration Access Links, registration/tracking cookies, pending transaction-return data, and values encrypted through s2Member\'s encryption API may depend on it. If you configure a key here, keep a secure backup of it.</p>'."\n";
109 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_security", get_defined_vars());
110
111 echo '<table class="form-table">'."\n";
112 echo '<tbody>'."\n";
113 echo '<tr>'."\n";
114
115 echo '<th>'."\n";
116 echo '<label for="ws-plugin--s2member-sec-encryption-key">'."\n";
117 echo 'Security Encryption Key (optional; 60+ chars recommended)'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key"]) ? ' <a href="#" onclick="ws_plugin__s2member_enableSecurityKey(); return false;" title="Changing the Key will invalidate existing data that was encrypted with the current effective key.">edit key</a>' : ' <a href="#" onclick="ws_plugin__s2member_generateSecurityKey(); return false;" title="Insert an auto-generated 64-character Key.">auto-generate</a>')."\n";
118 echo '</label>'."\n";
119 echo '</th>'."\n";
120
121 echo '</tr>'."\n";
122 echo '<tr>'."\n";
123
124 echo '<td>'."\n";
125 echo '<input type="text" maxlength="256" autocomplete="off" name="ws_plugin__s2member_sec_encryption_key" id="ws-plugin--s2member-sec-encryption-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key"]).'"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key"]) ? ' disabled="disabled"' : '').' />'."\n";
126 //260810 Make the configured-key guidance explicit without implying that a separate key is required.
127 echo (!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key"]) ? '<br />If you configure a separate key, use at least 60 characters. It may contain letters, numbers, spaces, and punctuation; up to 256 characters.<br /><em>Ex: <code>'.esc_html(strtoupper(c_ws_plugin__s2member_utils_strings::random_str_gen(64))).'</code></em>'."\n" : '';
128 echo (count($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key_history"]) > 1) ? '<br /><a href="#" onclick="ws_plugin__s2member_securityKeyHistory(); return false;">Click here</a> for a history of your last 10 configured Security Encryption Keys.<div id="ws-plugin--s2member-sec-encryption-key-history" style="display:none;"><code>'.implode('</code><br /><code>', $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key_history"]).'</code></div>'."\n" : '';
129 echo '</td>'."\n";
130
131 echo '</tr>'."\n";
132 echo '</tbody>'."\n";
133 echo '</table>'."\n";
134
135 echo '<div class="ws-menu-page-hr"></div>'."\n";
136
137 //260810 Explain how the configured key fits into s2Member's normal key resolution and what key changes affect.
138 echo '<h3>How this Key is Used:</h3>'."\n";
139 echo '<p>For normal encryption/decryption, a custom key supplied by code takes precedence. Otherwise s2Member uses the Security Encryption Key configured above; if this setting is blank, it falls back to the WordPress salts via <code>wp_salt()</code>.</p>'."\n";
140 echo '<p>Many encrypted values are short-lived, but some can remain valid much longer. Changing the effective key will invalidate existing data that was encrypted with the previous key, which can include Specific Post/Page Access Links, Registration Access Links, registration and tracking cookies, pending transaction-return data, and values created through s2Member\'s encryption API. If this setting is blank, changing the WordPress salts will likewise invalidate data encrypted with the previous salts.</p>'."\n";
141
142 echo '</div>'."\n";
143
144 echo '</div>'."\n";
145
146 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_security", get_defined_vars());
147 }
148 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_localhost_info", (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site() || is_super_admin()), get_defined_vars()))
149 {
150 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_localhost_info", get_defined_vars());
151
152 echo '<div class="ws-menu-page-group" title="Localhost WAMP/MAMP Developers">'."\n";
153
154 echo '<div class="ws-menu-page-section ws-plugin--s2member-localhost-info-section">'."\n";
155 echo '<h3>Localhost WAMP/MAMP Installs (are you a developer?)</h3>'."\n";
156 echo '<p>If you\'re developing your site in a <code>localhost</code> environment, running something like WAMP/MAMP, or <a href="https://s2member.com/r/easyphp/" target="_blank" rel="external">EasyPHP</a>, please add this line to your <code>/wp-config.php</code> file: <code><span style="color:#0000BB;">define</span><span style="color:#007700;">(</span><span style="color:#DD0000;">"LOCALHOST"</span>, <span style="color:#0000BB;">true</span><span style="color:#007700;">);</span></code>.</p>'."\n";
157 echo '<p>This lets s2Member know definitively that your site is in a <code>localhost</code> environment. s2Member will adjust itself accordingly, maximizing functionality during your developement. s2Member can usually auto-detect this, but in cases where your <code>localhost</code> installation runs on something other than <code>127.0.0.1/localhost</code>, you need to tell s2Member definitively, by adding that line to your <code>/wp-config.php</code> file. For instance, s2Member needs to know when your server IP is the same as all User IPs.</p>'."\n";
158 echo '<p><em>Once your site goes live, please remove the line. If you\'re already on a live server connected to the web, please ignore this section.</em></p>'."\n";
159 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_localhost_info", get_defined_vars());
160 echo '</div>'."\n";
161
162 echo '</div>'."\n";
163
164 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_localhost_info", get_defined_vars());
165 }
166 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_lazy_load", (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site() || is_super_admin()), get_defined_vars()))
167 {
168 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_lazy_load", get_defined_vars());
169
170 $open_performance_panel = !empty($_GET['s2member-open-panel']) && in_array((string)$_GET['s2member-open-panel'], array('frontend-static-assets', 'dynamic-asset-loader'), TRUE);
171 echo '<div class="ws-menu-page-group" title="Performance &amp; Caching"'.(($open_performance_panel) ? ' default-state="open"' : '').'>'."\n";
172
173 echo '<div class="ws-menu-page-section ws-plugin--s2member-lazy-load-section">'."\n";
174 echo '<h3>CSS/JS Lazy Loading (Client-Side Libraries)</h3>'."\n";
175 echo '<p>By default, s2Member will load it\'s CSS/JS libraries on every page of your site. However, you may wish to enable lazy-loading here (i.e., only load when absolutely necessary).</p>'."\n";
176 echo '<p><em><strong>Tip:</strong> Do you need s2Member\'s CSS/JS on every page? If not, you can turn lazy-loading on. If you need s2Member\'s CSS/JS on a given Post/Page, you can insert an HTML comment into the Post/Page content like this: <code>&lt;!--s2member--&gt;</code>. If a Post/Page contains the word <code>s2member</code> or an <code>[s2*</code> Shortcode, this will automatically trigger s2Member\'s lazy-load routine (no matter what you configure here). Thus, it\'s an easy way to force s2Member to load it\'s CSS/JS on specific Posts/Pages where you deem this necessary. There is also a WordPress filter available: <code>add_filter("ws_plugin__s2member_lazy_load_css_js", "__return_true");</code> for developers. This could be incorporated into more dynamic scenarios.</em></p>'."\n";
177 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_lazy_load", get_defined_vars());
178
179 echo '<table class="form-table">'."\n";
180 echo '<tbody>'."\n";
181 echo '<tr>'."\n";
182
183 echo '<th>'."\n";
184 echo '<label for="ws-plugin--s2member-lazy-load-css-js">'."\n";
185 echo 'Lazy-Load s2Member\'s CSS/JS Libraries?'."\n";
186 echo '</label>'."\n";
187 echo '</th>'."\n";
188
189 echo '</tr>'."\n";
190 echo '<tr>'."\n";
191
192 echo '<td>'."\n";
193 echo '<select name="ws_plugin__s2member_lazy_load_css_js" id="ws-plugin--s2member-lazy-load-css-js">'."\n";
194 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["lazy_load_css_js"]) ? ' selected="selected"' : '').'>No (always load the CSS/JS libraries; i.e., on every page of the site)</option>'."\n";
195 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["lazy_load_css_js"]) ? ' selected="selected"' : '').'>Yes (lazy-load CSS/JS libraries; i.e., load only when absolutely necessary)</option>'."\n";
196 echo '</select>'."\n";
197 echo '</td>'."\n";
198
199 echo '</tr>'."\n";
200 echo '</tbody>'."\n";
201 echo '</table>'."\n";
202 echo '</div>'."\n";
203
204 echo '<div style="margin:1em 0;">'."\n";
205 echo '<div class="ws-menu-page-hr"></div>'."\n";
206 echo '</div>'."\n";
207
208 //260904.2014 Dynamic delivery applies independently of static delivery, so give its loader choice a separate section.
209 echo '<div id="ws-plugin--s2member-dynamic-asset-loader-section" class="ws-menu-page-section ws-plugin--s2member-dynamic-asset-loader-section">'."\n";
210 echo '<h3>Dynamic CSS/JS Loader</h3>'."\n";
211 echo '<p>When s2Member needs to generate CSS or JavaScript dynamically, this controls how that request is loaded.</p>'."\n";
212 echo '<table class="form-table">'."\n";
213 echo '<tbody>'."\n";
214
215 $dynamic_asset_loader = (!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['dynamic_asset_loader']) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['dynamic_asset_loader'] === 'wordpress') ? 'wordpress' : 's2o';
216 echo '<tr><th><label for="ws-plugin--s2member-dynamic-asset-loader">Dynamic CSS/JS Loader</label></th></tr>'."\n";
217 echo '<tr><td>'."\n";
218 echo '<select name="ws_plugin__s2member_dynamic_asset_loader" id="ws-plugin--s2member-dynamic-asset-loader">'."\n";
219 echo '<option value="s2o"'.(($dynamic_asset_loader === 's2o') ? ' selected="selected"' : '').'>s2Member Dynamic Loader (recommended)</option>'."\n";
220 echo '<option value="wordpress"'.(($dynamic_asset_loader === 'wordpress') ? ' selected="selected"' : '').'>WordPress Dynamic Loader (compatibility)</option>'."\n";
221 echo '</select><br />'."\n";
222 echo '<em>The s2Member Dynamic Loader uses a lighter WordPress load for better performance. The WordPress Dynamic Loader uses the site\'s normal WordPress request and can help when a server or security tool blocks direct <code>s2member-o.php</code> requests. See <a href="https://s2member.com/kb-article/mod-security-odd-403-503-500-errors/" target="_blank" rel="external">Mod Security (Odd 403, 503, 500 Errors)</a>.</em>'."\n";
223 echo '</td></tr>'."\n";
224
225 echo '</tbody>'."\n";
226 echo '</table>'."\n";
227 echo '</div>'."\n";
228
229 echo '<div style="margin:1em 0;">'."\n";
230 echo '<div class="ws-menu-page-hr"></div>'."\n";
231 echo '</div>'."\n";
232
233 //260904.2014 Keep static CSS/JS delivery and its related optimizations together in a clearly named section.
234 echo '<div id="ws-plugin--s2member-static-assets" class="ws-menu-page-section ws-plugin--s2member-static-assets-section">'."\n";
235 echo '<h3>Static CSS/JS Optimization (beta)</h3>'."\n";
236 echo '<p>These beta options build CSS and JavaScript files ahead of time under the WordPress uploads directory, so the web server can serve them directly without starting PHP and WordPress for each request. Framework and Pro files remain separate by default, with optional combining and minification for further optimization.</p>'."\n";
237 echo '<p><em>After enabling these options, test your membership, registration, profile, and payment pages. If a static file cannot be used, s2Member automatically uses the selected Dynamic CSS/JS Loader instead.</em></p>'."\n";
238
239 echo '<table class="form-table">'."\n";
240 echo '<tbody>'."\n";
241 echo '<tr><th><label for="ws-plugin--s2member-static-css">Static CSS Delivery?</label></th></tr>'."\n";
242 echo '<tr><td>'."\n";
243 echo '<select name="ws_plugin__s2member_static_css" id="ws-plugin--s2member-static-css" onchange="jQuery(\'#ws-plugin--s2member-static-css-minify\').prop(\'disabled\', this.value !== \'1\');">'."\n";
244 echo '<option value="0"'.((!$GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) ? ' selected="selected"' : '').'>No (use dynamic CSS)</option>'."\n";
245 echo '<option value="1"'.(($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) ? ' selected="selected"' : '').'>Yes (beta; generate and serve static CSS)</option>'."\n";
246 echo '</select><br />'."\n";
247 echo '<em>Generates timestamped Framework CSS and, when Pro is active, a separate Pro/gateway stylesheet by default. Generation failures or incompatible custom CSS hooks use legacy dynamic CSS.</em>'."\n";
248 echo '</td></tr>'."\n";
249
250 echo '<tr><th><label for="ws-plugin--s2member-static-css-minify">Minify Static CSS?</label></th></tr>'."\n";
251 echo '<tr><td>'."\n";
252 echo '<select name="ws_plugin__s2member_static_css_minify" id="ws-plugin--s2member-static-css-minify"'.((!$GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) ? ' disabled="disabled"' : '').'>'."\n";
253 echo '<option value="0"'.((empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) || empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css_minify'])) ? ' selected="selected"' : '').'>No (keep generated CSS readable)</option>'."\n";
254 echo '<option value="1"'.((!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) && !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css_minify'])) ? ' selected="selected"' : '').'>Yes (beta; minify generated CSS)</option>'."\n";
255 echo '</select><br />'."\n";
256 echo '<em>Used only with Static CSS Delivery. Original source files remain readable and unchanged.</em>'."\n";
257 echo '</td></tr>'."\n";
258
259 echo '<tr><th><label for="ws-plugin--s2member-static-js">Static JS Delivery?</label></th></tr>'."\n";
260 echo '<tr><td>'."\n";
261 echo '<select name="ws_plugin__s2member_static_js" id="ws-plugin--s2member-static-js" onchange="jQuery(\'#ws-plugin--s2member-static-js-minify\').prop(\'disabled\', this.value !== \'1\');">'."\n";
262 echo '<option value="0"'.((!$GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']) ? ' selected="selected"' : '').'>No (use dynamic JavaScript)</option>'."\n";
263 echo '<option value="1"'.(($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']) ? ' selected="selected"' : '').'>Yes (beta; generate and serve static JavaScript)</option>'."\n";
264 echo '</select><br />'."\n";
265 echo '<em>Generates timestamped Framework JavaScript and, when Pro is active, a separate Pro/gateway script by default. Personal/member details always remain page-specific and are never stored in static files. WordPress 4.2–4.4 automatically keep dynamic JavaScript.</em>'."\n";
266 echo '</td></tr>'."\n";
267
268 $static_js_text = (isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js_text']) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js_text'] === 'page') ? 'page' : 'static';
269 $static_js_page_text_supported = c_ws_plugin__s2member_utils_assets::static_js_page_text_supported();
270 echo '<tr><th><label for="ws-plugin--s2member-static-js-text">JavaScript Text Delivery</label></th></tr>'."\n";
271 echo '<tr><td>'."\n";
272 echo '<p style="margin-top:0;"><em>Some s2Member messages and labels are shown or updated by JavaScript—for example, form validation and password feedback—so JavaScript needs access to that text too.</em></p>'."\n";
273 echo '<select name="ws_plugin__s2member_static_js_text" id="ws-plugin--s2member-static-js-text">'."\n";
274 echo '<option value="static"'.(($static_js_text === 'static') ? ' selected="selected"' : '').'>Load JavaScript text with the static files</option>'."\n";
275 echo '<option value="page"'.(($static_js_text === 'page') ? ' selected="selected"' : '').((!$static_js_page_text_supported) ? ' disabled="disabled"' : '').'>Load JavaScript text with each WordPress page</option>'."\n";
276 echo '</select><br />'."\n";
277 echo '<em><strong>Static files:</strong> best for sites that use one language throughout; the text is cached with the generated JavaScript and does not add the larger text block to every page. <strong>WordPress page:</strong> use this for multilingual sites where the language can change between pages or visitors; the same external JavaScript can then be reused across languages. Personal/member details are always loaded with the page and are never stored in static files.</em>'."\n";
278 if(!$static_js_page_text_supported)
279 echo '<p class="ws-menu-page-error" style="margin:.75em 0 0;"><em><strong>Load with each WordPress page is unavailable:</strong> update s2Member Pro to a version that supports page-loaded JavaScript text. If your site needs different JavaScript text between languages before updating Pro, set Static JS Delivery to No so WordPress generates the JavaScript dynamically.</em></p>'."\n";
280 echo '</td></tr>'."\n";
281
282 echo '<tr><th><label for="ws-plugin--s2member-static-js-minify">Minify Static JS?</label></th></tr>'."\n";
283 echo '<tr><td>'."\n";
284 echo '<select name="ws_plugin__s2member_static_js_minify" id="ws-plugin--s2member-static-js-minify"'.((!$GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']) ? ' disabled="disabled"' : '').'>'."\n";
285 echo '<option value="0"'.((empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']) || empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js_minify'])) ? ' selected="selected"' : '').'>No (keep generated JavaScript readable)</option>'."\n";
286 echo '<option value="1"'.((!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']) && !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js_minify'])) ? ' selected="selected"' : '').'>Yes (beta; minify generated JavaScript)</option>'."\n";
287 echo '</select><br />'."\n";
288 echo '<em>Used only with Static JS Delivery. s2Member generates from readable JavaScript sources; developers do not maintain parallel minified files.</em>'."\n";
289 echo '</td></tr>'."\n";
290
291 echo '<tr><th><label for="ws-plugin--s2member-static-assets-combine">Combine Framework + Pro Static Assets?</label></th></tr>'."\n";
292 echo '<tr><td>'."\n";
293 echo '<select name="ws_plugin__s2member_static_assets_combine" id="ws-plugin--s2member-static-assets-combine">'."\n";
294 echo '<option value="0"'.((empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_assets_combine'])) ? ' selected="selected"' : '').'>No (keep Framework and Pro files separate)</option>'."\n";
295 echo '<option value="1"'.((!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_assets_combine'])) ? ' selected="selected"' : '').'>Yes (combine each enabled type to reduce requests)</option>'."\n";
296 echo '</select><br />'."\n";
297 echo '<em>Applies when s2Member Pro is active. Separate delivery is the default; combining is an optional optimization that serves one generated CSS file and/or one generated JavaScript file instead of separate Framework and Pro files.</em>'."\n";
298 echo '</td></tr>'."\n";
299
300 $static_assets_enabled = !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_css']) || !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['static_js']);
301 $static_asset_health = ($static_assets_enabled) ? c_ws_plugin__s2member_utils_assets::static_assets_health(TRUE) : array();
302 echo '<tr><th>Static Asset Files</th></tr>'."\n";
303 echo '<tr><td>'."\n";
304 echo '<span id="ws-plugin--s2member-refresh-static-assets-feedback" style="display:flex; align-items:center; gap:.5em; max-width:100%;"><button type="button" class="button" id="ws-plugin--s2member-refresh-static-assets" style="flex:0 0 auto;"'.((!$static_assets_enabled) ? ' disabled="disabled"' : '').'>Refresh Static Assets</button><span id="ws-plugin--s2member-refresh-static-assets-status" aria-live="polite" style="display:block; flex:1 1 auto; min-width:0;"></span></span><br />'."\n";
305 echo '<em>'.(($static_assets_enabled) ? 'Creates new timestamps immediately for every active generated file. Separate Framework/Pro files keep independent build timestamps, while combined mode uses one timestamp per enabled asset type. Save option changes before using this button.' : 'Enable Static CSS Delivery or Static JS Delivery and save the options before using this button.').'</em>'."\n";
306
307 //260907.2203 Point site owners to the CSS/JS operational history from the asset controls.
308 echo '<p style="margin:.75em 0 0;"><em>When s2Member logging is enabled, important static and dynamic CSS/JS events such as generation, refreshes, delivery problems, fallbacks, and recovery are recorded in <code>css-js.log</code>. Routine page loads are not logged.</em></p>'."\n";
309
310 if($static_asset_health)
311 echo '<p class="ws-menu-page-error" style="margin:.75em 0 0;"><em><strong>Static asset health:</strong> '.esc_html(implode(' ', $static_asset_health)).' Use Refresh Static Assets to recreate missing files.</em></p>'."\n";
312 echo '</td></tr>'."\n";
313 echo '</tbody>'."\n";
314 echo '</table>'."\n";
315 //260904.0649 Keep Refresh tied to saved settings: disable it when no static type is active and while related controls have unsaved changes.
316 echo '<script type="text/javascript">jQuery(function($){var $b=$("#ws-plugin--s2member-refresh-static-assets"),$s=$("#ws-plugin--s2member-refresh-static-assets-status"),$controls=$("#ws-plugin--s2member-static-css,#ws-plugin--s2member-static-css-minify,#ws-plugin--s2member-static-js,#ws-plugin--s2member-static-js-text,#ws-plugin--s2member-static-js-minify,#ws-plugin--s2member-static-assets-combine"),savedEnabled='.($static_assets_enabled ? 'true' : 'false').',dirtyMessage="Save option changes before refreshing.";function values(){return $controls.map(function(){return this.value;}).get().join("|");}var initial=values();function sync(){var changed=values()!==initial;$b.prop("disabled",!savedEnabled||changed);if(changed)$s.text(dirtyMessage);else if($s.text()===dirtyMessage)$s.text("");}$controls.on("change",sync);$b.on("click",function(){$b.prop("disabled",true);$s.text("Refreshing…");$.post(ajaxurl,{action:"ws_plugin__s2member_refresh_static_assets",_ajax_nonce:"'.esc_js(wp_create_nonce('ws-plugin--s2member-refresh-static-assets')).'"}).done(function(r){$s.text(r&&r.data&&r.data.message?r.data.message:"Static assets refreshed.");}).fail(function(xhr){var r=xhr.responseJSON;$s.text(r&&r.data&&r.data.message?r.data.message:"Static assets could not be refreshed.");}).always(function(){sync();});});sync();});</script>'."\n";
317 echo '</div>'."\n";
318
319 echo '<div style="margin:1em 0;">'."\n";
320 echo '<div class="ws-menu-page-hr"></div>'."\n";
321 echo '</div>'."\n";
322
323 echo '<div class="ws-menu-page-section ws-plugin--s2member-no-cache-headers-section">'."\n";
324 echo '<h3>No-Cache Headers Behavior (beta)</h3>'."\n";
325 echo '<p>s2Member can render different output depending on logged-in state, access level, conditionals (e.g., <code>[s2If]</code>), and nonce-based forms. If a cache stores a page generated under one context and serves it to another, visitors may see incorrect content or stale nonces. These options control when s2Member sends HTTP no-cache headers (<code>Cache-Control: no-cache</code>) to reduce that risk while allowing caching where appropriate.</p>'."\n";
326 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_no_cache_headers", get_defined_vars());
327 echo '<table class="form-table">'."\n";
328 echo '<tbody>'."\n";
329 echo '<tr>'."\n";
330
331 echo '<th>'."\n";
332 echo '<label for="ws-plugin--s2member-no-cache-headers-mode">'."\n";
333 echo 'When should no-cache headers be sent?'."\n";
334 echo '</label>'."\n";
335 echo '</th>'."\n";
336
337 echo '</tr>'."\n";
338 echo '<tr>'."\n";
339
340 echo '<td>'."\n";
341 echo '<select name="ws_plugin__s2member_no_cache_headers_mode" id="ws-plugin--s2member-no-cache-headers-mode">'."\n";
342 echo '<option value="always"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'always') ? ' selected="selected"' : '').'>Always (disables guest caching site-wide)</option>'."\n";
343 echo '<option value="selective"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'selective') ? ' selected="selected"' : '').'>Selective (may improve caching for guests)</option>'."\n";
344 echo '<option value="evaluative"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'evaluative') ? ' selected="selected"' : '').'>Evaluative (better informed guest caching)</option>'."\n";
345 echo '</select><br />'."\n";
346 echo '<em>Choose when s2Member should send HTTP no-cache headers.</em>'."\n";
347 echo '<ul style="margin: .3em 0 0 1.1em; line-height: 1.5em;">'."\n";
348 echo '<li><strong>Always:</strong> <em>Sends no-cache headers very early on every page request. This is the safest behavior when member-conditional output could appear anywhere (content, widgets, theme templates, menus) and caching is not configured to vary correctly. It can reduce performance because it prevents caching for guests site-wide.</em></li>'."\n";
349 echo '<li><strong>Selective:</strong> <em>Enables selective behavior via the long-standing <code>ws_plugin__s2member_no_cache_headers_selective</code> filter used by customizations/plugins to change the default. Headers are still decided very early, actually too early to reliably reflect decisions made while a page renders (for example, when <code>[s2If]</code> or other shortcodes execute). This may improve caching for guests, but it can miss some runtime no-cache triggers in edge cases. Use this for backward compatibility if you already rely on it and understand the tradeoffs.</em></li>'."\n";
350 echo '<li><strong>Evaluative (beta):</strong> <em>Evaluates the page later, after s2Member shortcodes and other runtime checks have affected the page, resulting in better informed guest caching. No-cache headers are then sent at WordPress\' standard header-sending stage. Because this mode sends no-cache headers later than Always or Selective modes, it may expose “headers already sent” issues caused by another plugin or theme outputting content too early. Output added in widgets, menus, or theme templates may still require using Always or Selective mode.</em></li>'."\n";
351 echo '</ul>'."\n";
352
353 //260308 Sub-setting UI for no-cache debug header; label-based heading without extra divider.
354 echo '<p style="margin-top:25px; font-size: 115%;"><strong>Enable no-cache debug header?</strong></p>'."\n";
355 echo '<p>'."\n";
356 echo '<input type="radio" name="ws_plugin__s2member_no_cache_headers_debug" id="ws-plugin--s2member-no-cache-headers-debug-no" value="0"'.((empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_debug"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-no-cache-headers-debug-no">No</label> &nbsp;&nbsp;&nbsp;'."\n";
357 echo '<input type="radio" name="ws_plugin__s2member_no_cache_headers_debug" id="ws-plugin--s2member-no-cache-headers-debug-yes" value="1"'.((!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_debug"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-no-cache-headers-debug-yes">Yes, add a debug header.</label><br />'."\n";
358 echo '<em>This adds a <code>Server-Timing</code> header to help troubleshoot why no-cache headers are being applied or not. This header includes the following variables:</em>'."\n";
359 echo '</p>'."\n";
360 echo '<ul style="margin: .3em 0 0 1.1em; line-height: 1.5em; font-style: italic;">'."\n";
361 echo '<li><code>mode</code> = Behavior mode in effect: <code>always</code>, <code>selective</code>, <code>evaluative</code>.</li>'."\n";
362 echo '<li><code>no_cache</code> = <code>1</code> means forced no-cache via filter; <code>0</code> means not forced.</li>'."\n";
363 echo '<li><code>selective</code> = <code>1</code> means selective behavior enabled; <code>0</code> means not enabled.</li>'."\n";
364 echo '<li><code>headers</code> = <code>1</code> means s2Member decided this request shouldn\'t be cached; <code>0</code> means it didn\'t.</li>'."\n";
365 echo '</ul>'."\n";
366
367 echo '</td>'."\n";
368
369 echo '</tr>'."\n";
370 echo '</tbody>'."\n";
371 echo '</table>'."\n";
372 echo '</div>'."\n";
373
374 echo '</div>'."\n";
375
376 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_lazy_load", get_defined_vars());
377 }
378 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_s_badge_wp_footer_code", TRUE, get_defined_vars()))
379 {
380 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_s_badge_wp_footer_code", get_defined_vars());
381
382 echo '<div class="ws-menu-page-group" title="s2Member Security Badge">'."\n";
383
384 echo '<div class="ws-menu-page-section ws-plugin--s2member-s-badge-wp-footer-code-section">'."\n";
385 echo '<h3>Security Badge &amp; Footer Configuration (optional)</h3>'."\n";
386 echo '<div class="ws-menu-page-right">'.c_ws_plugin__s2member_utilities::s_badge_gen("1", TRUE, TRUE).'</div>'."\n";
387 echo '<p>An s2Member Security Badge can be used to express your site\'s concern for security. To qualify your site, you must enable the Badge Status API (see below), and you must <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">properly configure all security features in WordPress &amp; s2Member</a>. If you enable the Badge Status API, s2Member will make a connection to your site <strong>once per day</strong>, to test your status. Once your status is <code>1</code> (secure), <strong>it can then take up to 12 hours</strong> for your s2Member Security Badge image to show a green status for the first time.</p>'."\n";
388 echo '<p><strong>How does s2Member know when my site is secure?</strong><br />If enabled below, an API call for "Security Badge Status" will allow web service connections to determine your status. For example, clicking <a href="'.esc_attr(home_url("/?s2member_s_badge_status=1")).'" target="_blank" rel="external">this link</a> will report <code>1</code> (secure), <code>0</code> (at risk), or <code>-</code> (API disabled). Once you have <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">properly configured all security features in WordPress &amp; s2Member</a>, the s2Member Badge Status API will report <code>1</code> (secure) for your installation. <strong>Note:</strong> this simple API will not, and should not, report any other information. It will only report the current status of your Security Badge, as determined by your installation of s2Member.</p>'."\n";
389 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_s_badge_wp_footer_code", get_defined_vars());
390
391 echo '<table class="form-table">'."\n";
392 echo '<tbody>'."\n";
393 echo '<tr>'."\n";
394
395 echo '<th>'."\n";
396 echo '<label for="ws-plugin--s2member-s-badge-status-enabled">'."\n";
397 echo 'Enable Security Badge Status API?'."\n";
398 echo '</label>'."\n";
399 echo '</th>'."\n";
400
401 echo '</tr>'."\n";
402 echo '<tr>'."\n";
403
404 echo '<td>'."\n";
405 echo '<select name="ws_plugin__s2member_s_badge_status_enabled" id="ws-plugin--s2member-s-badge-status-enabled">'."\n";
406 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>No (default, Badge Status API is disabled)</option>'."\n";
407 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>Yes (enable Badge Status API for verification)</option>'."\n";
408 echo '</select><br />'."\n";
409 echo '<em>This must be enabled if you want s2Member to verify your Security Badge each day.</em>'."\n";
410 echo '</td>'."\n";
411
412 echo '</tr>'."\n";
413 echo '<tr>'."\n";
414
415 echo '<th>'."\n";
416 echo '<label for="ws-plugin--s2member-wp-footer-code">'."\n";
417 echo 'Customize WordPress Footer:<br />'."\n";
418 echo '<small>[ <a href="#" onclick="this.$code = jQuery(\'textarea#ws-plugin--s2member-wp-footer-code\'); this.$code.val(jQuery.trim(unescape(\''.rawurlencode('[s2Member-Security-Badge v="1" /]').'\')+\'\n\'+this.$code.val())); return false;">Click HERE to insert your Security Badge</a> ],<br />or use Shortcode <code>[s2Member-Security-Badge v="1" /]</code> in a Post/Page/Widget.<br />The <code>v="1"</code> attribute is a Security Badge style/variation. Try variations <code>1|2|3</code>.</small>'."\n";
419 echo '</label>'."\n";
420 echo '</th>'."\n";
421
422 echo '</tr>'."\n";
423 echo '<tr>'."\n";
424
425 echo '<td>'."\n";
426 echo '<textarea name="ws_plugin__s2member_wp_footer_code" id="ws-plugin--s2member-wp-footer-code" rows="8" wrap="off" spellcheck="false">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["wp_footer_code"]).'</textarea><br />'."\n";
427 echo 'Any valid XHTML / JavaScript'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' (or even PHP)').' code will work just fine here.'."\n";
428 echo '</td>'."\n";
429
430 echo '</tr>'."\n";
431 echo '</tbody>'."\n";
432 echo '</table>'."\n";
433 echo '</div>'."\n";
434
435 echo '</div>'."\n";
436
437 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_s_badge_wp_footer_code", get_defined_vars());
438 }
439 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_email_config", TRUE, get_defined_vars()))
440 {
441 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_email_config", get_defined_vars());
442
443 echo '<div class="ws-menu-page-group" title="Email Configuration">'."\n";
444
445 echo '<div class="ws-menu-page-section ws-plugin--s2member-email-section">'."\n";
446 echo '<h3 style="margin:0;">Email From: '.esc_html('"Name" <address>').'</h3>'."\n";
447 echo '<p style="margin:0;">This is the name/address that will appear in outgoing email notifications sent by the s2Member plugin.</p>'."\n";
448 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_email_from_name_config", get_defined_vars());
449
450 echo '<table class="form-table">'."\n";
451 echo '<tbody>'."\n";
452 echo '<tr>'."\n";
453
454 echo '<th>'."\n";
455 echo '<label for="ws-plugin--s2member-reg-email-from-name">'."\n";
456 echo 'Email From Name:'."\n";
457 echo '</label>'."\n";
458 echo '</th>'."\n";
459
460 echo '</tr>'."\n";
461 echo '<tr>'."\n";
462
463 echo '<td>'."\n";
464 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_reg_email_from_name" id="ws-plugin--s2member-reg-email-from-name" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_name"]).'" /><br />'."\n";
465 echo 'We recommend that you use the name of your site here.'."\n";
466 echo '</td>'."\n";
467
468 echo '</tr>'."\n";
469 echo '<tr>'."\n";
470
471 echo '<th>'."\n";
472 echo '<label for="ws-plugin--s2member-reg-email-from-email">'."\n";
473 echo 'Email From Address:'."\n";
474 echo '</label>'."\n";
475 echo '</th>'."\n";
476
477 echo '</tr>'."\n";
478 echo '<tr>'."\n";
479
480 echo '<td>'."\n";
481 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_reg_email_from_email" id="ws-plugin--s2member-reg-email-from-email" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_email"]).'" /><br />'."\n";
482 echo 'Example: support@your-domain.com. <em>Please read <a href="#" onclick="alert(\'Running WordPress with an SMTP mail plugin?\\n\\nPlease be advised. If you run an SMTP mail plugin with WordPress, be sure to configure s2Member with a valid `From:` address (i.e., one matching your SMTP configuration perhaps). Most free SMTP servers, such as Gmail and Yahoo, require that your `From:` header match the email address associated with your account. Please check with your SMTP service provider before attempting to configure plugins like s2Member to use a different `From:` address when sending email messages.\'); return false;">this important note</a></em>.'."\n";
483 echo '</td>'."\n";
484
485 echo '</tr>'."\n";
486 echo '<tr>'."\n";
487
488 echo '<th>'."\n";
489 echo '<label for="ws-plugin--s2member-reg-email-support-link">'."\n";
490 echo 'Email Support/Contact Link:'."\n";
491 echo '</label>'."\n";
492 echo '</th>'."\n";
493
494 echo '</tr>'."\n";
495 echo '<tr>'."\n";
496
497 echo '<td>'."\n";
498 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_reg_email_support_link" id="ws-plugin--s2member-reg-email-support-link" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_support_link"]).'" /><br />'."\n";
499 echo 'Ex: <code>mailto:support@your-domain.com</code> (<em>mailto link</em>)<br />'."\n";
500 echo 'Or: <code>'.esc_html(home_url("/contact-us/")).'</code>'."\n";
501 echo '</td>'."\n";
502
503 echo '</tr>'."\n";
504 echo '</tbody>'."\n";
505 echo '</table>'."\n";
506
507 // New table for HTML Emails option.
508 echo '<div class="ws-menu-page-hr"></div>'."\n";
509
510 echo '<table class="form-table">' . "\n";
511 echo '<tbody>' . "\n";
512
513 echo '<tr>' . "\n";
514 echo '<th>' . "\n";
515 echo '<label for="ws-plugin--s2member-html-emails-enabled">' . "\n";
516 echo 'Enable HTML Emails? (beta)' . "\n";
517 echo '</label>' . "\n";
518 echo '</th>' . "\n";
519 echo '</tr>' . "\n";
520
521 echo '<tr>' . "\n";
522 echo '<td>' . "\n";
523 echo '<input type="radio" name="ws_plugin__s2member_html_emails_enabled" id="ws-plugin--s2member-html-emails-enabled-0" value="0"' . (empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["html_emails_enabled"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-html-emails-enabled-0">No</label> &nbsp;&nbsp;&nbsp;' . "\n";
524 echo '<input type="radio" name="ws_plugin__s2member_html_emails_enabled" id="ws-plugin--s2member-html-emails-enabled-1" value="1"' . (!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["html_emails_enabled"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-html-emails-enabled-1">Yes, enable HTML emails.</label><br />' . "\n";
525 echo '<em>This enables s2Member to send HTML emails instead of just plain text. It applies to all emails you can edit in the s2Member options.</em>' . "\n";
526 echo '</td>' . "\n";
527 echo '</tr>' . "\n";
528
529 echo '</tbody>' . "\n";
530 echo '</table>' . "\n";
531
532 echo '<div class="ws-menu-page-hr"></div>'."\n";
533
534 echo '<h3 style="margin:0;">New User Email Configuration</h3>'."\n";
535 echo '<input type="hidden" id="ws-plugin--s2member-pluggables-wp-new-user-notification" value="'.esc_attr((empty($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["pluggables"]["wp_new_user_notification"])) ? '0' : '1').'" />'."\n";
536 echo (empty($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["pluggables"]["wp_new_user_notification"])) ? '<p class="ws-menu-page-error" style="margin:0;"><em><strong>Conflict warning:</strong> You have another theme or plugin installed that is preventing s2Member from controlling this aspect of your installation. When the pluggable function <code><a href="http://codex.wordpress.org/Function_Reference/wp_new_user_notification" target="_blank" rel="external">wp_new_user_notification()</a></code> is handled by another plugin, it\'s not possible for s2Member to allow customization of New User Emails. This is NOT a major issue. In fact, in some cases, it might be desirable. That being said, if you DO want to use s2Member\'s customization of New User Emails, you will need to deactivate one plugin at a time until this conflict warning goes away.</em></p>'."\n" : '';
537 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_emails", get_defined_vars());
538
539 echo '<table class="form-table">'."\n";
540 echo '<tbody>'."\n";
541 echo '<tr>'."\n";
542
543 echo '<td>'."\n";
544 echo '<select name="ws_plugin__s2member_new_user_emails_enabled" id="ws-plugin--s2member-new-user-emails-enabled">'."\n";
545 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_emails_enabled"]) ? ' selected="selected"' : '').'>No (default, use WordPress defaults)</option>'."\n";
546 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_emails_enabled"]) ? ' selected="selected"' : '').'>Yes (customize New User Emails with s2Member)</option>'."\n";
547 echo '</select>'."\n";
548 echo '</td>'."\n";
549
550 echo '</tr>'."\n";
551 echo '</tbody>'."\n";
552 echo '</table>'."\n";
553
554 echo '<div id="ws-plugin--s2member-new-user-emails">'."\n";
555
556 echo '<div class="ws-menu-page-hr"></div>'."\n";
557
558 echo '<h3 style="margin:0;">New User Email Message (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-new-user-email-details\').toggle(); return false;" class="ws-dotted-link">click to customize</a>)</h3>'."\n";
559 echo '<p style="margin:0;">This email is sent to new Users/Members who did <em>not</em> set a Custom Password during registration.</p>'."\n";
560 if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"])
561 echo '<p class="info" style="font-size:80%; margin:.5em 0 0 0;"><strong>↑ NOTE:</strong> You currently have Custom Passwords enabled in your s2Member Registration/Profile Field options. Therefore, this email is not going to be sent; i.e., it is only sent to users who need it for the purpose of obtaining their password.</p>'."\n";
562 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_email", get_defined_vars());
563
564 echo '<div id="ws-plugin--s2member-new-user-email-details" style="display:none;">'."\n";
565 echo c_ws_plugin__s2member_utils_conds::bp_is_installed() ? '<p><em><strong>BuddyPress:</strong> please note that BuddyPress does NOT send this email to Users that register through the BuddyPress registration system. This is because BuddyPress sends each User an activation link; eliminating the need for this email altogether. However, you CAN still customize s2Member\'s separate email to paying Members. See: <strong>s2Member → PayPal Options → Signup Confirmation Email</strong>.</em></p>'."\n" : '';
566 echo '<table class="form-table">'."\n";
567 echo '<tbody>'."\n";
568 echo '<tr>'."\n";
569
570 echo '<th>'."\n";
571 echo '<label for="ws-plugin--s2member-new-user-email-subject">'."\n";
572 echo 'New User Email Subject:'."\n";
573 echo '</label>'."\n";
574 echo '</th>'."\n";
575
576 echo '</tr>'."\n";
577 echo '<tr>'."\n";
578
579 echo '<td>'."\n";
580 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_new_user_email_subject" id="ws-plugin--s2member-new-user-email-subject" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_email_subject"]).'" /><br />'."\n";
581 echo 'Subject Line used in the email sent to new Users/Members.'."\n";
582 echo '</td>'."\n";
583
584 echo '</tr>'."\n";
585 echo '<tr>'."\n";
586
587 echo '<th>'."\n";
588 echo '<label for="ws-plugin--s2member-new-user-email-message">'."\n";
589 echo 'New User Email Message:'."\n";
590 echo '</label>'."\n";
591 echo '</th>'."\n";
592
593 echo '</tr>'."\n";
594 echo '<tr>'."\n";
595
596 echo '<td>'."\n";
597 echo '<p><em>(The purpose of this email is to send the user a password-setup link; i.e., <code>%%wp_set_pass_url%%</code>)</em></small><p>'."\n";
598 //250615 Visual editor for HTML emails.
599 if (empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['html_emails_enabled'])) {
600 echo '<textarea name="ws_plugin__s2member_new_user_email_message" id="ws-plugin--s2member-new-user-email-message" rows="10">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_email_message"]).'</textarea><br />'."\n";
601 } else {
602 c_ws_plugin__s2member_utilities::editor('new_user_email_message');
603 }
604
605 echo 'Message Body used in the email sent to new Users/Members.<br /><br />'."\n";
606 echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
607 echo '<ul>'."\n";
608 echo '<li style="margin-bottom:1em;"><code>%%wp_set_pass_url%%</code> = The full URL where Users can set their password for the first time. Note that <code>%%wp_set_pass_url%%</code> should be used instead of the older/deprecated <code style="text-decoration:line-through;">%%user_pass%%</code> Replacement Code. Starting w/ WordPress v4.3+, a user can visit this link (i.e., <code>%%wp_set_pass_url%%</code>) to set a password of their own, and this is accomplished without sending a plain-text password via email; which improves security. It is suggested that you prefix this as follows: <em>To set your password, visit: <code>%%wp_set_pass_url%%</code></em></li>'."\n";
609 echo '<li><code>%%role%%</code> = The Role ID <code>(subscriber, s2member_level[0-9]+, administrator, editor, author, contributor)</code>.</li>'."\n";
610 echo '<li><code>%%label%%</code> = The Role ID Label <code>(Subscriber, s2Member Level 1, s2Member Level 2; or your own custom Labels—if configured)</code>.</li>'."\n";
611 echo '<li><code>%%level%%</code> = The Level number <code>(0, 1, 2, 3, 4)</code>. (<em>deprecated, no longer recommended; use <code>%%role%%</code></em>)</li>'."\n";
612 echo '<li><code>%%ccaps%%</code> = Custom Capabilities. Ex: <code>music,videos,free_gift</code> (<em>in comma-delimited format</em>).</li>'."\n";
613 echo '<li><code>%%user_first_name%%</code> = The First Name of the Member who registered their Username.</li>'."\n";
614 echo '<li><code>%%user_last_name%%</code> = The Last Name of the Member who registered their Username.</li>'."\n";
615 echo '<li><code>%%user_full_name%%</code> = The Full Name (First &amp; Last) of the Member who registered their Username.</li>'."\n";
616 echo '<li><code>%%user_email%%</code> = The Email Address of the Member who registered their Username.</li>'."\n";
617 echo '<li><code>%%user_login%%</code> = The Username the Member selected during registration.</li>'."\n";
618 echo '<li><code>%%user_ip%%</code> = The User\'s IP Address, detected via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
619 echo '<li><code>%%user_id%%</code> = A unique WordPress User ID generated during registration.</li>'."\n";
620 echo '<li><code>%%wp_login_url%%</code> = The full URL where Users can get logged into your site.</li>'."\n";
621 echo '<li style="margin-top:1em;"><code style="text-decoration:line-through;">%%user_pass%%</code> = <em>Deprecated, please stop using this. Starting w/ WordPress v4.3, this email is only sent to users who did NOT set a Custom Password during registration; i.e., the New User Notification email is only sent to the user whenever they need it to set their password. In that scenario, you should be sending the user the <code>%%wp_set_pass_url%%</code> instead of sending a plain-text password via email; which is a security no-no.</em></li>'."\n";
622 echo '</ul>'."\n";
623
624 echo '<strong>Custom Registration/Profile Fields are also supported in this email:</strong>'."\n";
625 echo '<ul>'."\n";
626 echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
627 echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
628 echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
629 echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
630 echo '</ul>'."\n";
631
632 echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
633 echo '<ul>'."\n";
634 echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
635 echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>'."\n";
636 echo '</ul>'."\n";
637 echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
638 echo '<em>(The campaign (i.e., christmas-promo) could be referenced using <code>%%cv1%%</code>)</em><br />'."\n";
639 echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
640
641 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
642 '<div class="ws-menu-page-hr"></div>'."\n".
643 '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="https://s2member.com/r/wordpress-codex-wp_user/" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please remember that emails are sent in plain text format.</p>'."\n"
644 : '';
645 echo '</td>'."\n";
646
647 echo '</tr>'."\n";
648 echo '</tbody>'."\n";
649 echo '</table>'."\n";
650 echo '</div>'."\n";
651
652 echo '<div class="ws-menu-page-hr"></div>'."\n";
653
654 echo '<h3 style="margin:0;">Administrative: New User Notification (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-new-user-admin-email-details\').toggle(); return false;" class="ws-dotted-link">click to customize</a>)</h3>'."\n";
655 echo '<p style="margin:0;">This email notification is sent to you, each time a new User/Member registers.</p>'."\n";
656 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_admin_email", get_defined_vars());
657
658 echo '<div id="ws-plugin--s2member-new-user-admin-email-details" style="display:none;">'."\n";
659 echo '<table class="form-table">'."\n";
660 echo '<tbody>'."\n";
661 echo '<tr>'."\n";
662
663 echo '<th>'."\n";
664 echo '<label for="ws-plugin--s2member-new-user-admin-email-recipients">'."\n";
665 echo 'New User Notification Recipients:'."\n";
666 echo '</label>'."\n";
667 echo '</th>'."\n";
668
669 echo '</tr>'."\n";
670 echo '<tr>'."\n";
671
672 echo '<td>'."\n";
673 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_new_user_admin_email_recipients" id="ws-plugin--s2member-new-user-admin-email-recipients" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_admin_email_recipients"]).'" /><br />'."\n";
674 echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />'."\n";
675 echo '<code>"Name" &lt;user@example.com&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>'."\n";
676 echo '</td>'."\n";
677
678 echo '</tr>'."\n";
679 echo '<tr>'."\n";
680
681 echo '<th>'."\n";
682 echo '<label for="ws-plugin--s2member-new-user-admin-email-subject">'."\n";
683 echo 'New User Notification Subject:'."\n";
684 echo '</label>'."\n";
685 echo '</th>'."\n";
686
687 echo '</tr>'."\n";
688 echo '<tr>'."\n";
689
690 echo '<td>'."\n";
691 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_new_user_admin_email_subject" id="ws-plugin--s2member-new-user-admin-email-subject" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_admin_email_subject"]).'" /><br />'."\n";
692 echo 'Subject Line used in the email notification sent to Administrator.'."\n";
693 echo '</td>'."\n";
694
695 echo '</tr>'."\n";
696 echo '<tr>'."\n";
697
698 echo '<th>'."\n";
699 echo '<label for="ws-plugin--s2member-new-user-admin-email-message">'."\n";
700 echo 'New User Notification Message:'."\n";
701 echo '</label>'."\n";
702 echo '</th>'."\n";
703
704 echo '</tr>'."\n";
705 echo '<tr>'."\n";
706
707 echo '<td>'."\n";
708 //250615 Visual editor for HTML emails.
709 if (empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['html_emails_enabled'])) {
710 echo '<textarea name="ws_plugin__s2member_new_user_admin_email_message" id="ws-plugin--s2member-new-user-admin-email-message" rows="10">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_admin_email_message"]).'</textarea><br />'."\n";
711 } else {
712 c_ws_plugin__s2member_utilities::editor('new_user_admin_email_message');
713 }
714
715 echo 'Message Body used in the email notification sent to Administrator.<br /><br />'."\n";
716 echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
717 echo '<ul>'."\n";
718 echo '<li><code>%%role%%</code> = The Role ID <code>(subscriber, s2member_level[0-9]+, administrator, editor, author, contributor)</code>.</li>'."\n";
719 echo '<li><code>%%label%%</code> = The Role ID Label <code>(Subscriber, s2Member Level 1, s2Member Level 2; or your own custom Labels—if configured)</code>.</li>'."\n";
720 echo '<li><code>%%level%%</code> = The Level number <code>(0, 1, 2, 3, 4)</code>. (<em>deprecated, no longer recommended; use <code>%%role%%</code></em>)</li>'."\n";
721 echo '<li><code>%%ccaps%%</code> = Custom Capabilities. Ex: <code>music,videos,free_gift</code> (<em>in comma-delimited format</em>).</li>'."\n";
722 echo '<li><code>%%user_first_name%%</code> = The First Name of the Member who registered their Username.</li>'."\n";
723 echo '<li><code>%%user_last_name%%</code> = The Last Name of the Member who registered their Username.</li>'."\n";
724 echo '<li><code>%%user_full_name%%</code> = The Full Name (First &amp; Last) of the Member who registered their Username.</li>'."\n";
725 echo '<li><code>%%user_email%%</code> = The Email Address of the Member who registered their Username.</li>'."\n";
726 echo '<li><code>%%user_login%%</code> = The Username the Member selected during registration.</li>'."\n";
727 echo '<li><code>%%user_ip%%</code> = The User\'s IP Address, detected via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
728 echo '<li><code>%%user_id%%</code> = A unique WordPress User ID generated during registration.</li>'."\n";
729 echo '<li><code>%%wp_login_url%%</code> = The full URL where Users can get logged into your site.</li>'."\n";
730 echo '<li style="margin-top:1em;"><code style="text-decoration:line-through;">%%user_pass%%</code> = <em>Deprecated. Starting w/ WordPress v4.3, this is no longer applicable (or advised).</em></li>'."\n";
731 echo '</ul>'."\n";
732
733 echo '<strong>Custom Registration/Profile Fields are also supported in this email:</strong>'."\n";
734 echo '<ul>'."\n";
735 echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
736 echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
737 echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
738 echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
739 echo '</ul>'."\n";
740
741 echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
742 echo '<ul>'."\n";
743 echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
744 echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>'."\n";
745 echo '</ul>'."\n";
746 echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
747 echo '<em>(The campaign (i.e., christmas-promo) could be referenced using <code>%%cv1%%</code>)</em><br />'."\n";
748 echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
749
750 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
751 '<div class="ws-menu-page-hr"></div>'."\n".
752 '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="https://s2member.com/r/wordpress-codex-wp_user/" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please remember that emails are sent in plain text format.</p>'."\n"
753 : '';
754 echo '</td>'."\n";
755
756 echo '</tr>'."\n";
757 echo '</tbody>'."\n";
758 echo '</table>'."\n";
759 echo '</div>'."\n";
760 echo '</div>'."\n";
761
762 echo '</div>'."\n";
763
764 echo '</div>'."\n";
765
766 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_email_config", get_defined_vars());
767 }
768 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_open_registration", TRUE, get_defined_vars()))
769 {
770 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_open_registration", get_defined_vars());
771
772 if(is_multisite() && is_main_site()) // A Multisite Network, and we're on the Main Site?
773 {
774 echo '<div class="ws-menu-page-group" title="Open Registration">'."\n";
775
776 echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
777 echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
778 echo '<p>On the Main Site of a Multisite Network, the settings for Open Registration are consolidated into the <strong>s2Member → Multisite (Config)</strong> panel.</p>'."\n";
779 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
780 echo '</div>'."\n";
781
782 echo '</div>'."\n";
783 }
784 else // Else we display this section normally. No special considerations are required in this case.
785 {
786 echo '<div class="ws-menu-page-group" title="Open Registration">'."\n";
787
788 echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
789 echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
790 echo '<p>s2Member supports Free Subscribers (at Level #0), along with four Primary Levels [1-4] of paid Membership. If you want your visitors to be capable of registering absolutely free, you will want to "allow" Open Registration. Whenever a visitor registers without paying, they\'ll automatically become a Free Subscriber at Level #0.</p>'."\n";
791 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
792
793 echo '<table class="form-table">'."\n";
794 echo '<tbody>'."\n";
795 echo '<tr>'."\n";
796
797 echo '<th>'."\n";
798 echo '<label for="ws-plugin--s2member-allow-subscribers-in">'."\n";
799 echo 'Allow Open Registration? (Free Subscribers)'."\n";
800 echo '</label>'."\n";
801 echo '</th>'."\n";
802
803 echo '</tr>'."\n";
804 echo '<tr>'."\n";
805
806 echo '<td>'."\n";
807 echo '<select name="ws_plugin__s2member_allow_subscribers_in" id="ws-plugin--s2member-allow-subscribers-in">'."\n";
808 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["allow_subscribers_in"]) ? ' selected="selected"' : '').'>No (do NOT allow Open Registration)</option>'."\n";
809 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["allow_subscribers_in"]) ? ' selected="selected"' : '').'>Yes (allow Open Registration; Free Subscribers at Level #0)</option>'."\n";
810 echo '</select><br />'."\n";
811 echo 'If you set this to <code>Yes</code>, you\'re unlocking <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re already logged-in. Please log out before testing BuddyPress registration.' : '').'\');">/wp-login.php?action=register</a>. When a visitor registers without paying, they\'ll automatically become a Free Subscriber at Level #0. The s2Member software reserves Level #0; to be used only for Free Subscribers. All other Membership Levels [1-4] require payment.'."\n";
812 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><br /><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::bp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re already logged-in. Please log out before testing BuddyPress registration.\');">here</a>.<br />s2Member integrates with BuddyPress, and the above setting will control Open Regisration for BuddyPress too.</em>'."\n" : '';
813 echo '</td>'."\n";
814
815 echo '</tr>'."\n";
816 echo '</tbody>'."\n";
817 echo '</table>'."\n";
818 echo '</div>'."\n";
819
820 echo '</div>'."\n";
821 }
822 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_open_registration", get_defined_vars());
823 }
824 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_membership_levels", TRUE, get_defined_vars()))
825 {
826 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_membership_levels", get_defined_vars());
827
828 echo '<div class="ws-menu-page-group" title="Membership Levels/Labels">'."\n";
829
830 echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
831 echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
832 echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>(at Level #0)</em>, along with several Primary Roles for paid Membership <em>(i.e., Levels 1-4)</em>, created by the s2Member plugin.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' s2Member also supports unlimited Custom Capability Packages <em>(see <strong>s2Member → API Scripting → Custom Capabilities</strong>)</em>' : '').'. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>'."\n";
833 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <strong>s2Member → API Scripting → Custom Capabilities</strong>. We also recommend <a href="https://s2member.com/r/s2member-video-custom-capabilities-for-wordpress/" target="_blank" rel="external">this video tutorial</a>.</em></p>'."\n" : '';
834 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><strong>See also:</strong> These KB articles: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities</a> and <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
835 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
836
837 echo '<table class="form-table">'."\n";
838 echo '<tbody>'."\n";
839
840 for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
841 {
842 echo '<tr>'."\n";
843
844 echo '<th>'."\n";
845 echo '<label for="ws-plugin--s2member-level'.$n.'-label">'."\n";
846 echo ($n === 0) ? 'Level #'.$n.' <em>(Free Subscribers)</em>:'."\n" : 'Level #'.$n.' Members:'."\n";
847 echo '</label>'."\n";
848 echo '</th>'."\n";
849
850 echo '</tr>'."\n";
851 echo '<tr>'."\n";
852
853 echo '<td>'."\n";
854 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_level'.$n.'_label" id="ws-plugin--s2member-level'.$n.'-label" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_label"]).'" /><br />'."\n";
855 echo 'This is the Label for Level #'.$n.(($n === 0) ? ' (Free Subscribers)' : ' Members').'.<br />'."\n";
856 echo '</td>'."\n";
857
858 echo '</tr>'."\n";
859 }
860 echo '</tbody>'."\n";
861 echo '</table>'."\n";
862
863 echo '<div class="ws-menu-page-hr"></div>'."\n";
864
865 echo '<table class="form-table" style="margin-top:0;">'."\n";
866 echo '<tbody>'."\n";
867 echo '<tr>'."\n";
868
869 echo '<th style="padding-top:0;">'."\n";
870 echo '<label for="ws-plugin--s2member-apply-label-translations">'."\n";
871 echo 'Force WordPress to use your Labels?'."\n";
872 echo '</label>'."\n";
873 echo '</th>'."\n";
874
875 echo '</tr>'."\n";
876 echo '<tr>'."\n";
877
878 echo '<td>'."\n";
879 echo '<input type="radio" name="ws_plugin__s2member_apply_label_translations" id="ws-plugin--s2member-apply-label-translations-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["apply_label_translations"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-apply-label-translations-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_apply_label_translations" id="ws-plugin--s2member-apply-label-translations-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["apply_label_translations"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-apply-label-translations-1">Yes, force WordPress to use my Labels.</label><br />'."\n";
880 echo 'This affects your administrative Dashboard only <em>(i.e., your list of Users)</em>.<br />s2Member can force WordPress to use your Labels instead of referencing Roles by `s2Member Level #`. If this is your first installation of s2Member, we suggest leaving this set to <code>no</code> until you\'ve had a chance to get acclimated with s2Member\'s functionality. In fact, many site owners choose to leave this off, because they find it less confusing when Roles are referred to by their s2Member Level #.'."\n";
881 echo '</td>'."\n";
882
883 echo '</tr>'."\n";
884 echo '</tbody>'."\n";
885 echo '</table>'."\n";
886
887 echo '<div class="ws-menu-page-hr"></div>'."\n";
888
889 echo '<input type="button" value="Reset Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-reset-roles-button" style="min-width:175px;" />'."\n";
890 echo '<p>The button to the right, is a nifty tool, which allows you to reset s2Member\'s internal Roles and Capabilities that integrate with WordPress. If you, or a developer working with you, has made attempts to alter the default <em>internal</em> Role/Capability sets that come with s2Member, and you need to reset them back to the way s2Member expects them to be, please use this tool. <em>Attn Developers: it is also possible lock-in your modified Roles/Capabilities with an s2Member Filter. Please see <a href="http://s2member.com/kb-article/locking-s2member-rolescapabilities/" target="_blank" rel="external">this KB article for details</a>.</em></p>'."\n";
891
892 echo '</div>'."\n";
893
894 echo '</div>'."\n";
895
896 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_membership_levels", get_defined_vars());
897 }
898 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_login_registration", TRUE, get_defined_vars()))
899 {
900 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_login_registration", get_defined_vars());
901
902 echo '<div class="ws-menu-page-group" title="Login/Registration Design">'."\n";
903
904 echo '<div class="ws-menu-page-section ws-plugin--s2member-login-registration-section">'."\n";
905 echo '<h3>Login/Registration Page Customization (optional)</h3>'."\n";
906 echo '<p>These settings customize your Standard Login/Registration Pages:<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">'.esc_html(c_ws_plugin__s2member_utils_urls::wp_register_url()).'</a>)</p>'."\n";
907 echo (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site()) ? '<p><em>The Main Site of a Multisite Blog Farm uses this Form instead, powered by your theme.<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Multisite Registration Form.\\n* s2Member makes this form available to logged-in Super Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">'.esc_html(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'</a>)</em></p>'."\n" : '';
908 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form, powered by your theme.<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::bp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.\');">'.esc_html(c_ws_plugin__s2member_utils_urls::bp_register_url()).'</a>)</em></p>'."\n" : '';
909 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_registration", get_defined_vars());
910
911 echo '<table class="form-table">'."\n";
912 echo '<tbody>'."\n";
913 echo '<tr>'."\n";
914
915 echo '<td>'."\n";
916 echo '<h3 style="margin:0;">Enable This Functionality?</h3>'."\n";
917 echo '<select name="ws_plugin__s2member_login_reg_design_enabled" id="ws-plugin--s2member-login-reg-design-enabled">'."\n";
918 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' selected="selected"' : '').'>No (default, use WordPress defaults)</option>'."\n";
919 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' selected="selected"' : '').'>Yes (customize Login/Registration with s2Member)</option>'."\n";
920 echo '</select>'."\n";
921 echo '</td>'."\n";
922
923 echo '</tr>'."\n";
924 echo '</tbody>'."\n";
925 echo '</table>'."\n";
926
927 echo '<div id="ws-plugin--s2member-login-reg-design"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' style="display:none;"' : '').'>'."\n";
928
929 echo '<div class="ws-menu-page-hr"></div>'."\n";
930
931 echo '<table class="form-table">'."\n";
932 echo '<tbody>'."\n";
933 echo '<tr>'."\n";
934
935 echo '<td>'."\n";
936 echo '<h3 style="margin:0;">Overall Font/Size Configuration</h3>'."\n";
937 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Fonts.</p>'."\n";
938 echo '</td>'."\n";
939
940 echo '</tr>'."\n";
941 echo '<tr>'."\n";
942
943 echo '<th>'."\n";
944 echo '<label for="ws-plugin--s2member-login-reg-font-size">'."\n";
945 echo 'Overall Font Size:'."\n";
946 echo '</label>'."\n";
947 echo '</th>'."\n";
948
949 echo '</tr>'."\n";
950 echo '<tr>'."\n";
951
952 echo '<td>'."\n";
953 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_font_size" id="ws-plugin--s2member-login-reg-font-size" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_font_size"]).'" /><br />'."\n";
954 echo 'Set this to a numeric value, calculated in pixels.'."\n";
955 echo '</td>'."\n";
956
957 echo '</tr>'."\n";
958 echo '<tr>'."\n";
959
960 echo '<th>'."\n";
961 echo '<label for="ws-plugin--s2member-login-reg-font-family">'."\n";
962 echo 'Overall Font Family:'."\n";
963 echo '</label>'."\n";
964 echo '</th>'."\n";
965
966 echo '</tr>'."\n";
967 echo '<tr>'."\n";
968
969 echo '<td>'."\n";
970 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_font_family" id="ws-plugin--s2member-login-reg-font-family" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_font_family"]).'" /><br />'."\n";
971 echo 'Set this to a web-safe font family.'."\n";
972 echo '</td>'."\n";
973
974 echo '</tr>'."\n";
975 echo '<tr>'."\n";
976
977 echo '<th>'."\n";
978 echo '<label for="ws-plugin--s2member-login-reg-font-field-size">'."\n";
979 echo 'Form Field Font Size:'."\n";
980 echo '</label>'."\n";
981 echo '</th>'."\n";
982
983 echo '</tr>'."\n";
984 echo '<tr>'."\n";
985
986 echo '<td>'."\n";
987 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_font_field_size" id="ws-plugin--s2member-login-reg-font-field-size" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_font_field_size"]).'" /><br />'."\n";
988 echo 'Set this to a numeric value, calculated in pixels.'."\n";
989 echo '</td>'."\n";
990
991 echo '</tr>'."\n";
992 echo '</tbody>'."\n";
993 echo '</table>'."\n";
994
995 echo '<div class="ws-menu-page-hr"></div>'."\n";
996
997 echo '<table class="form-table" style="margin-top:0;">'."\n";
998 echo '<tbody>'."\n";
999 echo '<tr>'."\n";
1000
1001 echo '<td>'."\n";
1002 echo '<h3 style="margin:0;">Background Configuration</h3>'."\n";
1003 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Background.</p>'."\n";
1004 echo '</td>'."\n";
1005
1006 echo '</tr>'."\n";
1007 echo '<tr>'."\n";
1008
1009 echo '<th>'."\n";
1010 echo '<label for="ws-plugin--s2member-login-reg-background-color">'."\n";
1011 echo 'Background Color:'."\n";
1012 echo '</label>'."\n";
1013 echo '</th>'."\n";
1014
1015 echo '</tr>'."\n";
1016 echo '<tr>'."\n";
1017
1018 echo '<td>'."\n";
1019 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_background_color" id="ws-plugin--s2member-login-reg-background-color" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_color"]).'" /><br />'."\n";
1020 echo 'Set this to a 6-digit hex color code.'."\n";
1021 echo '</td>'."\n";
1022
1023 echo '</tr>'."\n";
1024 echo '<tr>'."\n";
1025
1026 echo '<th>'."\n";
1027 echo '<label for="ws-plugin--s2member-login-reg-background-image">'."\n";
1028 echo 'Background Image:'."\n";
1029 echo '</label>'."\n";
1030 echo '</th>'."\n";
1031
1032 echo '</tr>'."\n";
1033 echo '<tr>'."\n";
1034
1035 echo '<td>'."\n";
1036 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_background_image" id="ws-plugin--s2member-login-reg-background-image" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image"]).'" /><br />'."\n";
1037 echo '<input type="button" id="ws-plugin--s2member-login-reg-background-image-media-btn" value="Open Media Library" class="ws-menu-page-media-btn" rel="ws-plugin--s2member-login-reg-background-image" />'."\n";
1038 echo 'Set this to the URL of your Background Image. (this is optional)<br />';
1039 echo 'If supplied, your Background Image will be tiled.'."\n";
1040 echo '</td>'."\n";
1041
1042 echo '</tr>'."\n";
1043 echo '<tr>'."\n";
1044
1045 echo '<th>'."\n";
1046 echo '<label for="ws-plugin--s2member-login-reg-background-image-repeat">'."\n";
1047 echo 'Background Image Tile:'."\n";
1048 echo '</label>'."\n";
1049 echo '</th>'."\n";
1050
1051 echo '</tr>'."\n";
1052 echo '<tr>'."\n";
1053
1054 echo '<td>'."\n";
1055 echo '<select name="ws_plugin__s2member_login_reg_background_image_repeat" id="ws-plugin--s2member-login-reg-background-image-repeat">'."\n";
1056 echo '<option value="repeat"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat") ? ' selected="selected"' : '').'>Seamless Tile ( background-repeat: repeat; )</option>'."\n";
1057 echo '<option value="repeat-x"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat-x") ? ' selected="selected"' : '').'>Tile Horizontally ( background-repeat: repeat-x; )</option>'."\n";
1058 echo '<option value="repeat-y"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat-y") ? ' selected="selected"' : '').'>Tile Vertically ( background-repeat: repeat-y; )</option>'."\n";
1059 echo '<option value="no-repeat"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "no-repeat") ? ' selected="selected"' : '').'>No Tiles ( background-repeat: no-repeat; )</option>'."\n";
1060 echo '</select><br />'."\n";
1061 echo 'This controls the way your Background Image is styled with CSS. [ <a href="http://s2member.com/r/css-background-repeat/" target="_blank" rel="external">learn more</a> ]'."\n";
1062 echo '</td>'."\n";
1063
1064 echo '</tr>'."\n";
1065 echo '<tr>'."\n";
1066
1067 echo '<th>'."\n";
1068 echo '<label for="ws-plugin--s2member-login-reg-background-text-color">'."\n";
1069 echo 'Color of Text on top of your Background:'."\n";
1070 echo '</label>'."\n";
1071 echo '</th>'."\n";
1072
1073 echo '</tr>'."\n";
1074 echo '<tr>'."\n";
1075
1076 echo '<td>'."\n";
1077 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_background_text_color" id="ws-plugin--s2member-login-reg-background-text-color" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_text_color"]).'" /><br />'."\n";
1078 echo 'Set this to a 6-digit hex color code.'."\n";
1079 echo '</td>'."\n";
1080
1081 echo '</tr>'."\n";
1082 echo '<tr>'."\n";
1083
1084 echo '<th>'."\n";
1085 echo '<label for="ws-plugin--s2member-login-reg-background-text-shadow-color">'."\n";
1086 echo 'Shadow Color for Text on top of your Background:'."\n";
1087 echo '</label>'."\n";
1088 echo '</th>'."\n";
1089
1090 echo '</tr>'."\n";
1091 echo '<tr>'."\n";
1092
1093 echo '<td>'."\n";
1094 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_background_text_shadow_color" id="ws-plugin--s2member-login-reg-background-text-shadow-color" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_text_shadow_color"]).'" /><br />'."\n";
1095 echo 'Set this to a 6-digit hex color code.'."\n";
1096 echo '</td>'."\n";
1097
1098 echo '</tr>'."\n";
1099 echo '<tr>'."\n";
1100
1101 echo '<th>'."\n";
1102 echo '<label for="ws-plugin--s2member-login-reg-background-box-shadow-color">'."\n";
1103 echo 'Shadow Color for Boxes on top of your Background:'."\n";
1104 echo '</label>'."\n";
1105 echo '</th>'."\n";
1106
1107 echo '</tr>'."\n";
1108 echo '<tr>'."\n";
1109
1110 echo '<td>'."\n";
1111 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_background_box_shadow_color" id="ws-plugin--s2member-login-reg-background-box-shadow-color" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_box_shadow_color"]).'" /><br />'."\n";
1112 echo 'Set this to a 6-digit hex color code.'."\n";
1113 echo '</td>'."\n";
1114
1115 echo '</tr>'."\n";
1116 echo '</tbody>'."\n";
1117 echo '</table>'."\n";
1118
1119 echo '<div class="ws-menu-page-hr"></div>'."\n";
1120
1121 echo '<table class="form-table" style="margin-top:0;">'."\n";
1122 echo '<tbody>'."\n";
1123 echo '<tr>'."\n";
1124
1125 echo '<td>'."\n";
1126 echo '<h3 style="margin:0;">Logo Image Configuration</h3>'."\n";
1127 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Logo.</p>'."\n";
1128 echo '</td>'."\n";
1129
1130 echo '</tr>'."\n";
1131 echo '<tr>'."\n";
1132
1133 echo '<th>'."\n";
1134 echo '<label for="ws-plugin--s2member-login-reg-logo-src">'."\n";
1135 echo 'Logo Image Location:'."\n";
1136 echo '</label>'."\n";
1137 echo '</th>'."\n";
1138
1139 echo '</tr>'."\n";
1140 echo '<tr>'."\n";
1141
1142 echo '<td>'."\n";
1143 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_logo_src" id="ws-plugin--s2member-login-reg-logo-src" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_logo_src"]).'" /><br />'."\n";
1144 echo '<input type="button" id="ws-plugin--s2member-login-reg-logo-src-media-btn" value="Open Media Library" class="ws-menu-page-media-btn" rel="ws-plugin--s2member-login-reg-logo-src" />'."\n";
1145 echo 'Set this to the URL of your Logo Image.<br />'."\n";
1146 echo 'Suggested size is around 500 x 100.'."\n";
1147 echo '</td>'."\n";
1148
1149 echo '</tr>'."\n";
1150 echo '<tr>'."\n";
1151
1152 echo '<th>'."\n";
1153 echo '<label for="ws-plugin--s2member-login-reg-logo-src-width">'."\n";
1154 echo 'Logo Image Width:'."\n";
1155 echo '</label>'."\n";
1156 echo '</th>'."\n";
1157
1158 echo '</tr>'."\n";
1159 echo '<tr>'."\n";
1160
1161 echo '<td>'."\n";
1162 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_logo_src_width" id="ws-plugin--s2member-login-reg-logo-src-width" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_logo_src_width"]).'" /><br />'."\n";
1163 echo 'The pixel Width of your Logo Image. <em>* This ALSO affects the overall width of your Login/Registration forms. If you want wider form fields, use a wider Logo.</em>'."\n";
1164 echo '</td>'."\n";
1165
1166 echo '</tr>'."\n";
1167 echo '<tr>'."\n";
1168
1169 echo '<th>'."\n";
1170 echo '<label for="ws-plugin--s2member-login-reg-logo-src-height">'."\n";
1171 echo 'Logo Image Height:'."\n";
1172 echo '</label>'."\n";
1173 echo '</th>'."\n";
1174
1175 echo '</tr>'."\n";
1176 echo '<tr>'."\n";
1177
1178 echo '<td>'."\n";
1179 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_logo_src_height" id="ws-plugin--s2member-login-reg-logo-src-height" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_logo_src_height"]).'" /><br />'."\n";
1180 echo 'The pixel Height of your Logo Image.'."\n";
1181 echo '</td>'."\n";
1182
1183 echo '</tr>'."\n";
1184 echo '<tr>'."\n";
1185
1186 echo '<th>'."\n";
1187 echo '<label for="ws-plugin--s2member-login-reg-logo-url">'."\n";
1188 echo 'Logo Image Click URL:'."\n";
1189 echo '</label>'."\n";
1190 echo '</th>'."\n";
1191
1192 echo '</tr>'."\n";
1193 echo '<tr>'."\n";
1194
1195 echo '<td>'."\n";
1196 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_logo_url" id="ws-plugin--s2member-login-reg-logo-url" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_logo_url"]).'" /><br />'."\n";
1197 echo 'Set this to the Click URL for your Logo Image.'."\n";
1198 echo '</td>'."\n";
1199
1200 echo '</tr>'."\n";
1201 echo '<tr>'."\n";
1202
1203 echo '<th>'."\n";
1204 echo '<label for="ws-plugin--s2member-login-reg-logo-title">'."\n";
1205 echo 'Logo Image Title Attribute:'."\n";
1206 echo '</label>'."\n";
1207 echo '</th>'."\n";
1208
1209 echo '</tr>'."\n";
1210 echo '<tr>'."\n";
1211
1212 echo '<td>'."\n";
1213 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_reg_logo_title" id="ws-plugin--s2member-login-reg-logo-title" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_logo_title"]).'" /><br />'."\n";
1214 echo 'Used as the <code>title=""</code> attribute for your Logo Image.'."\n";
1215 echo '</td>'."\n";
1216
1217 echo '</tr>'."\n";
1218 echo '</tbody>'."\n";
1219 echo '</table>'."\n";
1220
1221 echo '<div class="ws-menu-page-hr"></div>'."\n";
1222
1223 echo '<table class="form-table" style="margin-top:0;">'."\n";
1224 echo '<tbody>'."\n";
1225 echo '<tr>'."\n";
1226
1227 echo '<th>'."\n";
1228 echo '<label for="ws-plugin--s2member-login-reg-footer-backtoblog">'."\n";
1229 echo 'Display [Back to Home Page] Link At Bottom?'."\n";
1230 echo '</label>'."\n";
1231 echo '</th>'."\n";
1232
1233 echo '</tr>'."\n";
1234 echo '<tr>'."\n";
1235
1236 echo '<td>'."\n";
1237 echo '<select name="ws_plugin__s2member_login_reg_footer_backtoblog" id="ws-plugin--s2member-login-reg-footer-backtoblog">'."\n";
1238 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_footer_backtoblog"]) ? ' selected="selected"' : '').'>Yes, display link at bottom pointing visitors back to the home page</option>'."\n";
1239 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_footer_backtoblog"]) ? ' selected="selected"' : '').'>No, hide this link (I\'ll create my own custom footer w/ the details I prefer)</option>'."\n";
1240 echo '</select>'."\n";
1241 echo '</td>'."\n";
1242
1243 echo '</tr>'."\n";
1244 echo '<tr>'."\n";
1245
1246 echo '<td>'."\n";
1247 echo '<h3 style="margin:0;">Footer Design (i.e., Bottom)</h3>'."\n";
1248 echo '<p style="margin:0;">This field accepts raw HTML'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' (and/or PHP)' : '').' code.</p>'."\n";
1249 echo '</td>'."\n";
1250
1251 echo '</tr>'."\n";
1252 echo '<tr>'."\n";
1253
1254 echo '<th>'."\n";
1255 echo '<label for="ws-plugin--s2member-login-reg-footer-design">'."\n";
1256 echo 'Login/Registration Footer Design (optional):'."\n";
1257 echo '</label>'."\n";
1258 echo '</th>'."\n";
1259
1260 echo '</tr>'."\n";
1261 echo '<tr>'."\n";
1262
1263 echo '<td>'."\n";
1264 echo '<textarea name="ws_plugin__s2member_login_reg_footer_design" id="ws-plugin--s2member-login-reg-footer-design" rows="3" wrap="off" spellcheck="false">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_footer_design"]).'</textarea><br />'."\n";
1265 echo 'This optional HTML'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' (and/or PHP)' : '').' code will appear at the very bottom of your Login/Registration Forms.'."\n";
1266 echo '</td>'."\n";
1267
1268 echo '</tr>'."\n";
1269 echo '</tbody>'."\n";
1270 echo '</table>'."\n";
1271 echo '</div>'."\n";
1272
1273 echo '</div>'."\n";
1274
1275 echo '</div>'."\n";
1276
1277 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_login_registration", get_defined_vars());
1278 }
1279 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_custom_reg_fields", TRUE, get_defined_vars()))
1280 {
1281 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_custom_reg_fields", get_defined_vars());
1282
1283 echo '<div class="ws-menu-page-group" title="Registration/Profile Fields &amp; Options">'."\n";
1284
1285 echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-reg-fields-section">'."\n";
1286 echo '<h3>Custom Registration/Profile Fields (optional, for further customization)</h3>'."\n";
1287 echo '<p>Some fields are already built-in by default. The defaults are: <code>*Username*, *Email*, *First Name*, *Last Name*</code>.</p>'."\n";
1288
1289 echo '<p>Custom Fields will appear in your Standard Registration Form, and in User/Member Profiles:<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">'.esc_html(c_ws_plugin__s2member_utils_urls::wp_register_url()).'</a>)</p>'."\n";
1290 echo (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site()) ? '<p><em>The Main Site of a Multisite Blog Farm uses this Form. s2Member supports Custom Fields here too.<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Multisite Registration Form.\\n* s2Member makes this form available to logged-in Super Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">'.esc_html(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'</a>)</em></p>'."\n" : '';
1291 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::bp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.\');">here</a>.<br />s2Member can integrate your Custom Fields with BuddyPress too, please see options below.</em></p>'."\n" : '';
1292 echo '<p><strong>Regarding Registration:</strong> Custom Fields do not appear during repeat registration and/or checkout attempts (i.e., they do not appear for any user that is currently logged into the site). Please make sure that you test registration and/or checkout forms while not logged in (i.e., please test as a first-time customer). Existing users, members, customers may update Custom Fields by editing their Profile.</p>'."\n";
1293
1294 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_custom_reg_fields", get_defined_vars());
1295
1296 echo '<table class="form-table">'."\n";
1297 echo '<tbody>'."\n";
1298 echo '<tr>'."\n";
1299
1300 echo '<th>'."\n";
1301 echo '<label>'."\n";
1302 echo 'Custom Registration/Profile Fields:'."\n";
1303 echo '</label>'."\n";
1304 echo '</th>'."\n";
1305
1306 echo '</tr>'."\n";
1307 echo '<tr>'."\n";
1308
1309 echo '<td>'."\n";
1310 echo '<input type="hidden" name="ws_plugin__s2member_custom_reg_fields" id="ws-plugin--s2member-custom-reg-fields" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]).'" />'."\n";
1311 echo '<div id="ws-plugin--s2member-custom-reg-field-configuration"></div>'."\n"; // This is filled by JavaScript routines.
1312 echo '</td>'."\n";
1313
1314 echo '</tr>'."\n";
1315 echo '</tbody>'."\n";
1316 echo '</table>'."\n";
1317
1318 echo '<div class="ws-menu-page-hr"></div>'."\n";
1319
1320 echo '<table class="form-table">'."\n";
1321 echo '<tbody>'."\n";
1322 echo '<tr>'."\n";
1323
1324 echo '<th>'."\n";
1325 echo '<label for="ws-plugin--s2member-custom-reg-names">'."\n";
1326 echo 'Collect First/Last Names During Registration?'."\n";
1327 echo '</label>'."\n";
1328 echo '</th>'."\n";
1329
1330 echo '</tr>'."\n";
1331 echo '<tr>'."\n";
1332
1333 echo '<td>'."\n";
1334 echo '<select name="ws_plugin__s2member_custom_reg_names" id="ws-plugin--s2member-custom-reg-names">'."\n";
1335 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_names"]) ? ' selected="selected"' : '').'>Yes (always collect First/Last Names during registration)</option>'."\n";
1336 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_names"]) ? ' selected="selected"' : '').'>No (do NOT collect First/Last Names during registration)</option>'."\n";
1337 echo '</select><br />'."\n";
1338 echo 'Recommended setting (<code>Yes</code>). It\'s usually a good idea to leave this on.'."\n";
1339 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Has no affect on BuddyPress registration form (BuddyPress always collects a full <code>Name</code> field).</em>'."\n" : '';
1340 echo (c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? '<br /><em>* s2Member Pro (Checkout) Forms always require a First/Last Name for billing.</em>'."\n" : '';
1341 echo '</td>'."\n";
1342
1343 echo '</tr>'."\n";
1344 echo '</tbody>'."\n";
1345 echo '</table>'."\n";
1346
1347 echo '<div class="ws-menu-page-hr"></div>'."\n";
1348
1349 echo '<table class="form-table">'."\n";
1350 echo '<tbody>'."\n";
1351 echo '<tr>'."\n";
1352
1353 echo '<th>'."\n";
1354 echo '<label for="ws-plugin--s2member-custom-reg-display-name">'."\n";
1355 echo 'Set "Display Name" During Registration?'."\n";
1356 echo '</label>'."\n";
1357 echo '</th>'."\n";
1358
1359 echo '</tr>'."\n";
1360 echo '<tr>'."\n";
1361
1362 echo '<td>'."\n";
1363 echo '<select name="ws_plugin__s2member_custom_reg_display_name" id="ws-plugin--s2member-custom-reg-display-name">'."\n";
1364 echo '<option value="full"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_display_name"] === "full") ? ' selected="selected"' : '').'>Yes (set Display Name to User\'s Full Name)</option>'."\n";
1365 echo '<option value="first"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_display_name"] === "first") ? ' selected="selected"' : '').'>Yes (set Display Name to User\'s First Name)</option>'."\n";
1366 echo '<option value="last"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_display_name"] === "last") ? ' selected="selected"' : '').'>Yes (set Display Name to User\'s Last Name)</option>'."\n";
1367 echo '<option value="login"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_display_name"] === "login") ? ' selected="selected"' : '').'>Yes (set Display Name to User\'s Username)</option>'."\n";
1368 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_display_name"]) ? ' selected="selected"' : '').'>No (leave Display Name at default WordPress value)</option>'."\n";
1369 echo '</select>'."\n";
1370 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Has no affect on BuddyPress registration form (BuddyPress always uses its full <code>Name</code> field).</em>'."\n" : '';
1371 echo '</td>'."\n";
1372
1373 echo '</tr>'."\n";
1374 echo '</tbody>'."\n";
1375 echo '</table>'."\n";
1376
1377 echo '<div class="ws-menu-page-hr"></div>'."\n";
1378
1379 echo '<table class="form-table">'."\n";
1380 echo '<tbody>'."\n";
1381 echo '<tr>'."\n";
1382
1383 echo '<th>'."\n";
1384 echo '<label for="ws-plugin--s2member-custom-reg-password">'."\n";
1385 echo 'Allow Custom Passwords During Registration?'."\n";
1386 echo '</label>'."\n";
1387 echo '</th>'."\n";
1388
1389 echo '</tr>'."\n";
1390 echo '<tr>'."\n";
1391
1392 echo '<td>'."\n";
1393 echo '<p style="margin-bottom:4px;"><em><strong>Note:</strong> Custom Passwords are easier for users. However, this has an impact on site security. Enabling Custom Passwords disables the New User Notification email that contains a password-setup link for each user. In other words, enabling Custom Passwords effectively disables any sort of email verification procedure, because the user is allowed to set their password during registration, instead of doing that via email confirmation—which is the default WordPress behavior.</em></p>'."\n";
1394 echo (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site()) ? '<p style="margin-bottom:4px;"><em>* For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. <a href="#" onclick="alert(\'For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. A User must wait for the activation/confirmation email; where a randomly generated Password will be assigned. Please note, this limitation only affects your Main Site, via `/wp-signup.php`. In other words, your Customers (i.e., other Blog Owners) will still have the ability to allow Custom Passwords with s2Member. YOU are affected by this limitation, NOT them.\\n\\n* NOTE: s2Member (Pro) removes this limitation.\\nIf you install the s2Member Pro Add-on, you WILL be able to allow Custom Passwords through s2Member Pro-Forms; even on a Multisite Blog Farm.\'); return false;" tabindex="-1">[?]</a></em></p>'."\n" : '';
1395 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p style="margin-bottom:4px;"><em>* Does not affect BuddyPress registration form (always <code>yes</code> with BuddyPress registration).</em></p>'."\n" : '';
1396 echo '<select name="ws_plugin__s2member_custom_reg_password" id="ws-plugin--s2member-custom-reg-password"'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site() && !c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? ' disabled="disabled"' : '').'>'."\n";
1397 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>No (send each user a password-setup link after registration; recommended for best security)</option>'."\n";
1398 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>Yes (allow members to create their own password during registration)</option>'."\n";
1399 echo '</select>'."\n";
1400 echo '</td>'."\n";
1401
1402 echo '</tr>'."\n";
1403 echo '</tbody>'."\n";
1404 echo '</table>'."\n";
1405
1406 echo '<div class="ws-menu-page-hr"></div>'."\n";
1407
1408 echo '<table class="form-table">'."\n";
1409 echo '<tbody>'."\n";
1410 echo '<tr>'."\n";
1411
1412 echo '<th>'."\n";
1413 echo '<label for="ws-plugin--s2member-custom-reg-password-min-length">'."\n";
1414 echo 'Minimum Length/Strength for Custom Passwords:'."\n";
1415 echo '</label>'."\n";
1416 echo '</th>'."\n";
1417
1418 echo '</tr>'."\n";
1419 echo '<tr>'."\n";
1420
1421 echo '<td>'."\n";
1422 echo 'Minimum length: <input type="text" autocomplete="off" name="ws_plugin__s2member_custom_reg_password_min_length" id="ws-plugin--s2member-custom-reg-password-min-length" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_length"]).'" maxlength="2" size="2" style="width:auto;" /> characters.'."\n";
1423 echo '&nbsp;&nbsp;&nbsp; Minimum strength: <select name="ws_plugin__s2member_custom_reg_password_min_strength" id="ws-plugin--s2member-custom-reg-password-min-strength" style="width:auto;">'."\n";
1424 echo '<option value="n/a"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'n/a') ? ' selected="selected"' : '').'>N/A (do not enforce a password strength requirement)</option>'."\n";
1425 echo '<option value="weak"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'weak') ? ' selected="selected"' : '').'>Weak (only needs to meet minimum length requirement)</option>'."\n";
1426 echo '<option value="good"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'good') ? ' selected="selected"' : '').'>Good (must have numbers, letters, and mixed caSe)</option>'."\n";
1427 echo '<option value="strong"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'strong') ? ' selected="selected"' : '').'>Strong (must have numbers, letters, mixed caSe, and punctuation)</option>'."\n";
1428 echo '</select>'."\n";
1429 echo '<p><em><strong>Tip:</strong> Minimum length and password strength also impact profile updates, so it\'s a good idea to configure these even if you\'re not using Custom Passwords during registration.</em></p>'."\n";
1430 echo '</td>'."\n";
1431
1432 echo '</tr>'."\n";
1433 echo '</tbody>'."\n";
1434 echo '</table>'."\n";
1435
1436 echo '<div class="ws-menu-page-hr"></div>'."\n";
1437
1438 echo '<table class="form-table">'."\n";
1439 echo '<tbody>'."\n";
1440 echo '<tr>'."\n";
1441
1442 echo '<th>'."\n";
1443 echo '<label for="ws-plugin--s2member-custom-reg-force-personal-emails">'."\n";
1444 echo 'Force Personal Emails During Registration?'."\n";
1445 echo '</label>'."\n";
1446 echo '</th>'."\n";
1447
1448 echo '</tr>'."\n";
1449 echo '<tr>'."\n";
1450
1451 echo '<td>'."\n";
1452 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_custom_reg_force_personal_emails" id="ws-plugin--s2member-custom-reg-force-personal-emails" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]).'" /><br />'."\n";
1453 echo 'To force personal email addresses, provide a comma-delimited list of email users to reject. <a href="#" onclick="alert(\'s2Member will reject [user]@ (based on your configuration here). A JavaScript alert message will be issued, asking the User to, `please use a personal email address`.\'); return false;" tabindex="-1">[?]</a><br />'."\n";
1454 echo 'Ex: <code>info,help,admin,webmaster,hostmaster,sales,support,spam</code><br />'."\n";
1455 echo 'See: <a href="http://s2member.com/r/mailchimp-role-based-emails/" target="_blank" rel="external">this article</a> for a more complete list.'."\n";
1456 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Affects BuddyPress registration form too.</em>'."\n" : '';
1457 echo '</td>'."\n";
1458
1459 echo '</tr>'."\n";
1460 echo '</tbody>'."\n";
1461 echo '</table>'."\n";
1462
1463 echo '<div class="ws-menu-page-hr"></div>'."\n";
1464
1465 echo '<table class="form-table">'."\n";
1466 echo '<tbody>'."\n";
1467 echo '<tr>'."\n";
1468
1469 echo '<th>'."\n";
1470 echo '<label for="ws-plugin--s2member-custom-reg-fields-4bp">'."\n";
1471 echo 'Integrate Custom Registration/Profile Fields with BuddyPress?'."\n";
1472 echo '</label>'."\n";
1473 echo '</th>'."\n";
1474
1475 echo '</tr>'."\n";
1476 echo '<tr>'."\n";
1477
1478 echo '<td>'."\n";
1479 echo '<div class="ws-menu-page-scrollbox" style="height:65px;">'."\n";
1480 echo '<input type="hidden" name="ws_plugin__s2member_custom_reg_fields_4bp[]" value="update-signal"'.((!c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? ' disabled="disabled"' : '').' />'."\n";
1481 foreach(array("profile-view" => "Yes, integrate with BuddyPress Public Profiles.", "registration" => "Yes, integrate with BuddyPress Registration Form.", "profile" => "Yes, integrate with BuddyPress Profile Editing Panel.") as $ws_plugin__s2member_temp_s_value => $ws_plugin__s2member_temp_s_label)
1482 echo '<input type="checkbox" name="ws_plugin__s2member_custom_reg_fields_4bp[]" id="ws-plugin--s2member-custom-reg-fields-4bp-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'" value="'.esc_attr($ws_plugin__s2member_temp_s_value).'"'.((in_array($ws_plugin__s2member_temp_s_value, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields_4bp"])) ? ' checked="checked"' : '').((!c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? ' disabled="disabled"' : '').' /> <label for="ws-plugin--s2member-custom-reg-fields-4bp-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'">'.$ws_plugin__s2member_temp_s_label.'</label><br />'."\n";
1483 echo '</div>'."\n";
1484 echo (!c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<em>* BuddyPress is not installed; which is perfectly OK. BuddyPress is not a requirement.</em>'."\n" : '<em>* The options above, make it possible to integrate Custom Registration/Profile Fields (i.e., those configured with s2Member) into BuddyPress as well. However, if you configure Profile Fields with BuddyPress, those will NOT be integrated with s2Member. Therefore, if you need Custom Registration/Profile Fields to work with both s2Member and with BuddyPress, please configure them with s2Member.</em>';
1485 echo '</td>'."\n";
1486
1487 echo '</tr>'."\n";
1488 echo '</tbody>'."\n";
1489 echo '</table>'."\n";
1490
1491 echo '</div>'."\n";
1492
1493 echo '</div>'."\n";
1494
1495 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_custom_reg_fields", get_defined_vars());
1496 }
1497 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_sc_s2get_shortcode", TRUE, get_defined_vars()))
1498 {
1499 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_sc_s2get_shortcode", get_defined_vars());
1500
1501 //260812 This whitelist is shared by s2Get and s2Member-List; legacy hook and element names are retained for backward compatibility.
1502 echo '<div id="ws-plugin--s2member-shortcode-user-fields-whitelist"></div>'."\n";
1503 echo '<div class="ws-menu-page-group" title="Shortcode User Fields Whitelist"'.((!empty($_GET['s2member-open-panel']) && $_GET['s2member-open-panel'] === 'shortcode-user-fields-whitelist') ? ' default-state="open"' : '').'>'."\n";
1504
1505 echo '<div class="ws-menu-page-section ws-plugin--s2member-sc-get-shortcode-section">'."\n";
1506 echo '<h3>Shortcode User Fields Whitelist (optional)</h3>'."\n";
1507 echo '<p>Enter a comma-separated list of user fields that these shortcodes may display from a user account other than the person currently viewing the page. This applies to <code>[s2Get user_id="" /]</code> and <code>[s2Member-List show_fields="" /]</code>.</p>'."\n";
1508 echo '<p>Only allow fields that are appropriate to reveal about other user accounts wherever these shortcodes are used. If either shortcode tries to display an unlisted field from another user account, s2Member will show administrators a security notice with the fields that need review.</p>'."\n";
1509 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_sc_s2get_shortcode", get_defined_vars());
1510
1511 echo '<table class="form-table">'."\n";
1512 echo '<tbody>'."\n";
1513 echo '<tr>'."\n";
1514
1515 echo '<th>'."\n";
1516 echo '<label for="ws-plugin--s2member-sc-s2get-userid-fields">'."\n";
1517 echo 'Allowed user fields:'."\n";
1518 echo '</label>'."\n";
1519 echo '</th>'."\n";
1520
1521 echo '</tr>'."\n";
1522 echo '<tr>'."\n";
1523
1524 echo '<td>'."\n";
1525 echo '<input type="text" name="ws_plugin__s2member_sc_user_fields_whitelist" id="ws-plugin--s2member-sc-s2get-userid-fields" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sc_user_fields_whitelist"]).'" placeholder="" style="width:100%;" /><br />'."\n";
1526 echo '<strong>Examples:</strong> <code>display_name, avatar, first_name, last_name, full_name</code>'."\n";
1527 echo '</td>'."\n";
1528
1529 echo '</tr>'."\n";
1530 echo '</tbody>'."\n";
1531 echo '</table>'."\n";
1532 echo '</div>'."\n";
1533
1534 echo '</div>'."\n";
1535
1536 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_sc_s2get_shortcode", get_defined_vars());
1537 }
1538 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_login_welcome_page", TRUE, get_defined_vars()))
1539 {
1540 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_login_welcome_page", get_defined_vars());
1541
1542
1543 echo '<div class="ws-menu-page-group" title="Login Welcome Page">'."\n";
1544
1545 echo '<div class="ws-menu-page-section ws-plugin--s2member-login-welcome-page-section">'."\n";
1546 echo '<h3>Login Welcome Page (required, please customize this)</h3>'."\n";
1547 echo '<p>Please create and/or choose an existing Page to use as the first page Members will see after logging in.</p>'."\n";
1548 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> s2Member integrates with BuddyPress. Your Login Welcome Page affects BuddyPress too.</em></p>'."\n" : '';
1549 echo '<p><em><strong>Always Private:</strong> This Page will always require a logged-in User/Member. In fact, this Page will be protected from public access by s2Member automatically. <strong>Note:</strong> for technical reasons, your Login Welcome Page <strong>cannot</strong> be set to your Front Page (i.e., your Home Page); or your Posts Page (i.e., your main Blog page). Please create a separate dedicated Page in WordPress, and then designate it as your Login Welcome Page below.</em></p>'."\n";
1550 echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/customizing-your-lwp/" target="_blank" rel="external">Customizing Your Login Welcome Page</a>.</p>'."\n";
1551 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_welcome_page", get_defined_vars());
1552
1553 echo '<table class="form-table">'."\n";
1554 echo '<tbody>'."\n";
1555 echo '<tr>'."\n";
1556
1557 echo '<th>'."\n";
1558 echo '<label for="ws-plugin--s2member-login-welcome-page">'."\n";
1559 echo 'Login Welcome Page:'."\n";
1560 echo '</label>'."\n";
1561 echo '</th>'."\n";
1562
1563 echo '</tr>'."\n";
1564 echo '<tr>'."\n";
1565
1566 echo '<td>'."\n";
1567 echo '<select name="ws_plugin__s2member_login_welcome_page" id="ws-plugin--s2member-login-welcome-page">'."\n";
1568 echo '<option value="">&mdash; Select &mdash;</option>'."\n";
1569 foreach(($ws_plugin__s2member_temp_a = array_merge((array)get_pages())) as $ws_plugin__s2member_temp_o)
1570 echo '<option value="'.esc_attr($ws_plugin__s2member_temp_o->ID).'"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"] && $ws_plugin__s2member_temp_o->ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]) ? ' selected="selected"' : '').'>'.esc_html($ws_plugin__s2member_temp_o->post_title).'</option>'."\n";
1571 echo '</select><br />'."\n";
1572 echo 'Please choose a Page to be used as the first page Members will see after logging in. This Page can contain anything you like. We recommend the following title: <code>Welcome To Our Members Area</code>.'."\n";
1573 echo '</td>'."\n";
1574
1575 echo '</tr>'."\n";
1576 echo '<tr>'."\n";
1577
1578 echo '<th>'."\n";
1579 echo '<label for="ws-plugin--s2member-login-redirection-override">'."\n";
1580 echo 'Or, a Special Redirection URL?'."\n";
1581 echo '</label>'."\n";
1582 echo '</th>'."\n";
1583
1584 echo '</tr>'."\n";
1585 echo '<tr>'."\n";
1586
1587 echo '<td>'."\n";
1588 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_login_redirection_override" id="ws-plugin--s2member-login-redirection-override" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"]).'" /><br />'."\n";
1589 echo 'Or, you may configure a Special Redirection URL, if you prefer. You\'ll need to type in the full URL, starting with: <code>http://</code> or <code>https://</code>. <em>A few <a href="#" onclick="alert(\'Replacement Codes:\\n\\n%%current_user_login%% = The current User\\\'s Username, lowercase (deprecated, please use %%current_user_nicename%%).\\n\\n%%current_user_nicename%% = The current User\\\'s Nicename in lowercase format (i.e., a cleaner version of the username for URLs; recommended for best compatibility).\\n\\n%%current_user_id%% = The current User\\\'s ID.\\n\\n%%current_user_level%% = The current User\\\'s s2Member Level.\\n\\n%%current_user_role%% = The current User\\\'s WordPress Role.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '\\n\\n%%current_user_ccaps%% = The current User\\\'s Custom Capabilities.' : '').'\\n\\n%%current_user_logins%% = Number of times the current User has logged in.\\n\\nFor example, if you\\\'re using BuddyPress, and you want to redirect Members to their BuddyPress Profile page after logging in, you would setup a Special Redirection URL, like this: '.home_url("/members/%%current_user_nicename%%/profile/").'\\n\\nOr ... using %%current_user_level%%, you could have a separate Login Welcome Page for each Membership Level that you plan to offer. BuddyPress not required.\'); return false;">Replacement Codes</a> are also supported here.</em>'."\n";
1590 echo '</td>'."\n";
1591
1592 echo '</tr>'."\n";
1593 echo '</tbody>'."\n";
1594 echo '</table>'."\n";
1595 echo '</div>'."\n";
1596
1597 echo '</div>'."\n";
1598
1599 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_login_welcome_page", get_defined_vars());
1600 }
1601 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_membership_options_page", TRUE, get_defined_vars()))
1602 {
1603 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_membership_options_page", get_defined_vars());
1604
1605 echo '<div class="ws-menu-page-group" title="Membership Options Page">'."\n";
1606
1607 echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-options-page-section">'."\n";
1608 echo '<h3>Membership Options Page (required, please customize this)</h3>'."\n";
1609 echo '<p>Please create and/or choose an existing Page that showcases your Membership Options. This special Page is where you\'ll insert the Payment Button(s) generated for you by s2Member (or Pro-Forms; if you\'re running s2Member Pro). This Page serves as your lead-in signup page <em>(i.e., you\'ll give visitors one or more registration options here, and they\'ll pay for the option they choose)</em>.</p>'."\n";
1610 echo '<p>Your Membership Options Page should detail all of the features that come with Membership to your site, and provide a Payment Button (or Pro-Form; if you\'re running s2Member Pro) for each Level of access you plan to offer. This is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</p>'."\n";
1611 echo '<p><em><strong>Tip:</strong> If you allow Open Registration (i.e., Free Subscribers), you might want to place a link on your Membership Options Page, which points directly to your free Registration Form, instead of routing a Customer through your Payment Gateway first. It\'s a matter of preference though. For further details, please check the section above: <strong>s2Member → General Options → Open Registration</strong>.</em></p>'."\n";
1612 echo c_ws_plugin__s2member_utils_conds::bp_is_installed() ? '<p><em><strong>BuddyPress:</strong> Even with BuddyPress, s2Member still needs a Membership Options Page. This is where your Payment Buttons (or Pro-Forms; if you\'re running s2Member Pro) will go, giving people the ability to pay you. And again, this is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</em></p>'."\n" : '';
1613 echo '<p><em><strong>Always Public:</strong> This Page must be public at all times. In fact, s2Member will not allow this Page to be restricted in any way. <strong>Note:</strong> for technical reasons, your Membership Options Page <strong>cannot</strong> be set to your Front Page (i.e., your Home Page); or your Posts Page (i.e., your main Blog page). Please create a separate (dedicated) Page in WordPress, and then designate it as your Membership Options Page below.</em></p>'."\n";
1614 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_options_page", get_defined_vars());
1615
1616 echo '<table class="form-table">'."\n";
1617 echo '<tbody>'."\n";
1618 echo '<tr>'."\n";
1619
1620 echo '<th>'."\n";
1621 echo '<label for="ws-plugin--s2member-membership-options-page">'."\n";
1622 echo 'Membership Options Page:'."\n";
1623 echo '</label>'."\n";
1624 echo '</th>'."\n";
1625
1626 echo '</tr>'."\n";
1627 echo '<tr>'."\n";
1628
1629 echo '<td>'."\n";
1630 echo '<select name="ws_plugin__s2member_membership_options_page" id="ws-plugin--s2member-membership-options-page">'."\n";
1631 echo '<option value="">&mdash; Select &mdash;</option>'."\n";
1632 foreach(($ws_plugin__s2member_temp_a = array_merge((array)get_pages())) as $ws_plugin__s2member_temp_o)
1633 echo '<option value="'.esc_attr($ws_plugin__s2member_temp_o->ID).'"'.(($ws_plugin__s2member_temp_o->ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]) ? ' selected="selected"' : '').'>'.esc_html($ws_plugin__s2member_temp_o->post_title).'</option>'."\n";
1634 echo '</select><br />'."\n";
1635 echo 'Please choose a Page that provides Users with a way to sign up. We recommend the following title: <code>Membership Signup</code>'."\n";
1636 echo '</td>'."\n";
1637
1638 echo '</tr>'."\n";
1639 echo '</tbody>'."\n";
1640 echo '</table>'."\n";
1641
1642 echo '<div class="ws-menu-page-hr"></div>'."\n";
1643
1644 echo '<table class="form-table">'."\n";
1645 echo '<tbody>'."\n";
1646 echo '<tr>'."\n";
1647
1648 echo '<th>'."\n";
1649 echo '<label for="ws-plugin--s2member-membership-options-page-vars-enable">'."\n";
1650 echo 'Enable MOP Vars (i.e., Membership Options Page Variables)?'."\n";
1651 echo '</label>'."\n";
1652 echo '</th>'."\n";
1653
1654 echo '</tr>'."\n";
1655 echo '<tr>'."\n";
1656
1657 echo '<td>'."\n";
1658 echo '<select name="ws_plugin__s2member_membership_options_page_vars_enable" id="ws-plugin--s2member-membership-options-page-vars-enable">'."\n";
1659 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>Yes (enable MOP Vars in all redirections; recommended behavior)</option>'."\n";
1660 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>No (don\'t include the additional details provided by MOP Vars)</option>'."\n";
1661 echo '</select><br />'."\n";
1662 echo 'See also: <strong>Dashboard → s2Member → API / Scripting → Membership Options Page / Variables</strong><br />'."\n";
1663 echo 'Recommended setting: (<code>Yes, enable MOP Vars</code>)'."\n";
1664 echo '</td>'."\n";
1665
1666 echo '</tr>'."\n";
1667 echo '</tbody>'."\n";
1668 echo '</table>'."\n";
1669 echo '</div>'."\n";
1670
1671 echo '</div>'."\n";
1672
1673 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_membership_options_page", get_defined_vars());
1674 }
1675 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_profile_modifications", TRUE, get_defined_vars()))
1676 {
1677 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_profile_modifications", get_defined_vars());
1678
1679 echo '<div class="ws-menu-page-group" title="Member Profile Modifications">'."\n";
1680
1681 echo '<div class="ws-menu-page-section ws-plugin--s2member-profile-modifications-section">'."\n";
1682 echo '<h3>Giving Members The Ability To Modify Their Profile</h3>'."\n";
1683 echo '<p>s2Member can be configured to redirect Members away from the <a href="'.esc_attr(admin_url("/profile.php")).'" target="_blank" rel="external">default Profile Editing Panel</a> that is built into WordPress. When/if a Member attempts to access the default Profile Editing Panel, they\'ll instead be redirected to the Login Welcome Page that you\'ve configured with s2Member. <strong>Why would I redirect away from the default Profile Editing Panel?</strong> Unless you\'ve made some drastic modifications to your WordPress installation, the default Profile Editing Panel that comes with WordPress is <em>not</em> suited for any sort of public access.</p>'."\n";
1684 echo '<p>So instead of using this default Profile Editing Panel, s2Member provides you <em>(the site owner)</em> with a special Shortcode: <code>[s2Member-Profile /]</code>. You can insert this into your Login Welcome Page, or any Post/Page for that matter <em>(even into a Text Widget)</em>. This Shortcode produces an Inline Profile Editing Form that supports all aspects of s2Member, including Password changes; and any Custom Registration/Profile Fields that you\'ve configured with s2Member. Alternatively, you can send your Members to a <a href="'.esc_attr(home_url("/?s2member_profile=1")).'" target="_blank" rel="external">special Stand-Alone version</a>. The stand-alone version makes it possible for you to <a href="#" onclick="if(!window.open(\''.home_url("/?s2member_profile=1").'\', \'_popup\', \'width=600,height=400,left=100,screenX=100,top=100,screenY=100,location=0,menubar=0,toolbar=0,status=0,scrollbars=1,resizable=1\')) alert(\'Please disable popup blockers and try again!\'); return false;" rel="external">open it up in a popup window</a>, or embed it into your Login Welcome Page using an IFRAME. Code samples below.</p>'."\n";
1685 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress already provides Users/Members with a Profile Editing Panel, powered by your theme. If you\'ve configured Custom Registration/Profile Fields with s2Member, you can also enable s2Member\'s Profile Field integration with BuddyPress (recommended). For further details, see: <strong>s2Member → General Options → Registration/Profile Fields</strong>.</em></p>'."\n" : '';
1686 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_profile_modifications", get_defined_vars());
1687
1688 echo '<table class="form-table">'."\n";
1689 echo '<tbody>'."\n";
1690 echo '<tr>'."\n";
1691
1692 echo '<th>'."\n";
1693 echo '<label for="ws-plugin--s2member-force-admin-lockouts">'."\n";
1694 echo 'Redirect Members away from the Default Profile Panel?'."\n";
1695 echo '</label>'."\n";
1696 echo '</th>'."\n";
1697
1698 echo '</tr>'."\n";
1699 echo '<tr>'."\n";
1700
1701 echo '<td>'."\n";
1702 echo '<select name="ws_plugin__s2member_force_admin_lockouts" id="ws-plugin--s2member-force-admin-lockouts">'."\n";
1703 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["force_admin_lockouts"]) ? ' selected="selected"' : '').'>No (I want to use the WordPress default methodologies)</option>'."\n";
1704 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["force_admin_lockouts"]) ? ' selected="selected"' : '').'>Yes (redirect to Login Welcome Page; locking all /wp-admin/ areas)</option>'."\n";
1705 echo '</select><br />'."\n";
1706 echo 'Recommended setting (<code>Yes</code>). <em><strong>Note:</strong> When this is set to (<code>Yes</code>), s2Member will take an initiative to further safeguard ALL <code>/wp-admin/</code> areas of your installation; not just the Default Profile Panel.</em>'."\n";
1707 echo '</td>'."\n";
1708
1709 echo '</tr>'."\n";
1710 echo '</tbody>'."\n";
1711 echo '</table>'."\n";
1712
1713 echo '<div class="ws-menu-page-hr"></div>'."\n";
1714
1715 echo '<p style="margin-bottom:0;"><strong>Shortcode (copy/paste)</strong>, for an Inline Profile Modification Form:<br />'."\n";
1716 echo '<p style="margin-top:0;"><input type="text" autocomplete="off" value="'.format_to_edit('[s2Member-Profile /]').'" onclick="this.select ();" /></p>'."\n";
1717
1718 echo '<p style="margin-top:25px; margin-bottom:0;"><strong>Stand-Alone (copy/paste)</strong>, for popup window:</p>'."\n";
1719 echo '<p style="margin-top:0;"><input type="text" autocomplete="off" value="'.format_to_edit(preg_replace("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_refs(home_url("/?s2member_profile=1")), file_get_contents(dirname(__FILE__)."/code-samples/current-user-profile-modification-page-url-2-ops.x-php"))).'" onclick="this.select ();" /></p>'."\n";
1720 echo '</div>'."\n";
1721
1722 echo '</div>'."\n";
1723
1724 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_profile_modifications", get_defined_vars());
1725 }
1726 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_url_shortening", TRUE, get_defined_vars()))
1727 {
1728 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_url_shortening", get_defined_vars());
1729
1730 echo '<div class="ws-menu-page-group" title="URL Shortening Service Preference">'."\n";
1731
1732 echo '<div class="ws-menu-page-section ws-plugin--s2member-url-shortening-section">'."\n";
1733 echo '<h3>URL Shortening Service API (Preference)</h3>'."\n";
1734 echo '<p>In a few special cases, long URLs generated by s2Member (i.e., those containing encrypted authentication details) will be shortened. A shortened URL prevents issues with very long links becoming corrupted by a Customer\'s email application. For instance, the Signup Confirmation Email that s2Member sends out to a new paying Customer may contain a link which is shortened to prevent corruption by email applications. By default, s2Member uses its own built-in short links, stored temporarily on your site. You can also choose a third-party URL shortener, configure a custom shortener, or disable shortening.</p>'."\n";
1735 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_url_shortening", get_defined_vars());
1736
1737 echo '<table class="form-table">'."\n";
1738 echo '<tbody>'."\n";
1739 echo '<tr>'."\n";
1740
1741 echo '<th>'."\n";
1742 echo '<label for="ws-plugin--s2member-default-url-shortener">'."\n";
1743 echo 'URL Shortening Service API (Default):'."\n";
1744 echo '</label>'."\n";
1745 echo '</th>'."\n";
1746
1747 echo '</tr>'."\n";
1748 echo '<tr>'."\n";
1749
1750 echo '<td>'."\n";
1751 echo '<select name="ws_plugin__s2member_default_url_shortener" id="ws-plugin--s2member-default-url-shortener">'."\n";
1752 echo '<option value="s2member"'.((in_array($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"], array("s2member", "tiny_url"), TRUE)) ? ' selected="selected"' : '').'>s2Member Built-In (recommended)</option>'."\n";
1753 echo '<option value="none"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "none") ? ' selected="selected"' : '').'>None (Don\'t shorten the URL)</option>'."\n";
1754 echo '<option value="bitly"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "bitly") ? ' selected="selected"' : '').'>Bitly (free; API key required)</option>'."\n";
1755 echo '</select>'."\n";
1756 echo '</td>'."\n";
1757
1758 echo '</tr>'."\n";
1759 echo '<tr>'."\n";
1760
1761 echo '<td>'."\n";
1762 echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_default_url_shortener_key" id="ws-plugin--s2member-default-url-shortener-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener_key"]).'" /><br />'."\n";
1763 echo '<em>If you choose Bitly, enter your <a href="http://s2member.com/r/bitly-oauth-access-token/" target="_blank" rel="external">Bitly oAuth Access Token</a>'."\n";
1764 echo '</td>'."\n";
1765
1766 echo '</tr>'."\n";
1767 if (c_ws_plugin__s2member_utils_conds::pro_is_installed()) {
1768 echo '<tr>'."\n";
1769
1770 echo '<th>'."\n";
1771 echo '<label for="ws-plugin--s2member-default-custom-str-url-shortener">'."\n";
1772 echo 'Custom URL Shortening Service API (Optional/Advanced):'."\n";
1773 echo '</label>'."\n";
1774 echo '</th>'."\n";
1775
1776 echo '</tr>'."\n";
1777 echo '<tr>'."\n";
1778
1779 echo '<td>'."\n";
1780 echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_default_custom_str_url_shortener" id="ws-plugin--s2member-default-custom-str-url-shortener" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_custom_str_url_shortener"]).'" /><br />'."\n";
1781 echo 'Your own custom URL <code>(i.e., GET request)</code>, with <code>%%s2_long_url%%</code> Replacement Code. [<a href="#" onclick="alert(\'Advanced site owners can use a custom URL shortening service they prefer.\\n\\nIn order for this to work, your URL shortening service must support simple GET requests through its API (sometimes referred to as a REST or NVP API).\\n\\nIn addition, your URL shortening service must return a plain-text URL in the response. See example below.\\n\\nYOURLS example GET request with format=simple:\\n\\nhttp://yoursite.com/yourls/yourls-api.php?signature=1234567890&action=shorturl&format=simple&url=%%s2_long_url%%\\n\\ns2Member expects a shortened URL in the response from YOURLS.\\n\\nIf you configure s2Member to use your own custom URL shortening service, s2Member will try your configuration first, and if anything fails, it will fall back on its own pre-integrated backups.\\n\\nWhen configuring your URL for the GET request, s2Member makes two Replacement Codes available:\\n\\n%%s2_long_url%% = The full URL that needs to be shortened (raw URL-encoded).\\n\\n%%s2_long_url_md5%% = An MD5 hash of the full URL (might be useful in some APIs).\'); return false;" tabindex="-1">details</a>]<br />'."\n";
1782 echo '</td>'."\n";
1783
1784 echo '</tr>'."\n";
1785 }
1786 echo '</tbody>'."\n";
1787 echo '</table>'."\n";
1788 echo '</div>'."\n";
1789
1790 echo '</div>'."\n";
1791
1792 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_url_shortening", get_defined_vars());
1793 }
1794 do_action("ws_plugin__s2member_during_gen_ops_page_after_left_sections", get_defined_vars());
1795
1796 echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
1797
1798 echo '</form>'."\n";
1799
1800 echo '</td>'."\n";
1801
1802 echo '<td class="ws-menu-page-table-r">'."\n";
1803 c_ws_plugin__s2member_menu_pages_rs::display();
1804 echo '</td>'."\n";
1805
1806 echo '</tr>'."\n";
1807 echo '</tbody>'."\n";
1808 echo '</table>'."\n";
1809
1810 echo '</div>'."\n";
1811 }
1812 }
1813 }
1814
1815 new c_ws_plugin__s2member_menu_page_gen_ops ();
1816