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

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

1,700 lines 119.8 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 echo '<div class="ws-menu-page-group" title="Performance &amp; Caching">'."\n";
171
172 echo '<div class="ws-menu-page-section ws-plugin--s2member-lazy-load-section">'."\n";
173 echo '<h3>CSS/JS Lazy Loading (Client-Side Libraries)</h3>'."\n";
174 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";
175 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";
176 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_lazy_load", get_defined_vars());
177
178 echo '<table class="form-table">'."\n";
179 echo '<tbody>'."\n";
180 echo '<tr>'."\n";
181
182 echo '<th>'."\n";
183 echo '<label for="ws-plugin--s2member-lazy-load-css-js">'."\n";
184 echo 'Lazy-Load s2Member\'s CSS/JS Libraries?'."\n";
185 echo '</label>'."\n";
186 echo '</th>'."\n";
187
188 echo '</tr>'."\n";
189 echo '<tr>'."\n";
190
191 echo '<td>'."\n";
192 echo '<select name="ws_plugin__s2member_lazy_load_css_js" id="ws-plugin--s2member-lazy-load-css-js">'."\n";
193 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";
194 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";
195 echo '</select>'."\n";
196 echo '</td>'."\n";
197
198 echo '</tr>'."\n";
199 echo '</tbody>'."\n";
200 echo '</table>'."\n";
201 echo '</div>'."\n";
202
203 echo '<div style="margin:1em 0;">'."\n";
204 echo '<div class="ws-menu-page-hr"></div>'."\n";
205 echo '</div>'."\n";
206
207 echo '<div class="ws-menu-page-section ws-plugin--s2member-no-cache-headers-section">'."\n";
208 echo '<h3>No-Cache Headers Behavior (beta)</h3>'."\n";
209 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";
210 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_no_cache_headers", get_defined_vars());
211 echo '<table class="form-table">'."\n";
212 echo '<tbody>'."\n";
213 echo '<tr>'."\n";
214
215 echo '<th>'."\n";
216 echo '<label for="ws-plugin--s2member-no-cache-headers-mode">'."\n";
217 echo 'When should no-cache headers be sent?'."\n";
218 echo '</label>'."\n";
219 echo '</th>'."\n";
220
221 echo '</tr>'."\n";
222 echo '<tr>'."\n";
223
224 echo '<td>'."\n";
225 echo '<select name="ws_plugin__s2member_no_cache_headers_mode" id="ws-plugin--s2member-no-cache-headers-mode">'."\n";
226 echo '<option value="always"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'always') ? ' selected="selected"' : '').'>Always (disables guest caching site-wide)</option>'."\n";
227 echo '<option value="selective"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'selective') ? ' selected="selected"' : '').'>Selective (may improve caching for guests)</option>'."\n";
228 echo '<option value="evaluative"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["no_cache_headers_mode"] === 'evaluative') ? ' selected="selected"' : '').'>Evaluative (better informed guest caching)</option>'."\n";
229 echo '</select><br />'."\n";
230 echo '<em>Choose when s2Member should send HTTP no-cache headers.</em>'."\n";
231 echo '<ul style="margin: .3em 0 0 1.1em; line-height: 1.5em;">'."\n";
232 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";
233 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";
234 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";
235 echo '</ul>'."\n";
236
237 //260308 Sub-setting UI for no-cache debug header; label-based heading without extra divider.
238 echo '<p style="margin-top:25px; font-size: 115%;"><strong>Enable no-cache debug header?</strong></p>'."\n";
239 echo '<p>'."\n";
240 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";
241 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";
242 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";
243 echo '</p>'."\n";
244 echo '<ul style="margin: .3em 0 0 1.1em; line-height: 1.5em; font-style: italic;">'."\n";
245 echo '<li><code>mode</code> = Behavior mode in effect: <code>always</code>, <code>selective</code>, <code>evaluative</code>.</li>'."\n";
246 echo '<li><code>no_cache</code> = <code>1</code> means forced no-cache via filter; <code>0</code> means not forced.</li>'."\n";
247 echo '<li><code>selective</code> = <code>1</code> means selective behavior enabled; <code>0</code> means not enabled.</li>'."\n";
248 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";
249 echo '</ul>'."\n";
250
251 echo '</td>'."\n";
252
253 echo '</tr>'."\n";
254 echo '</tbody>'."\n";
255 echo '</table>'."\n";
256 echo '</div>'."\n";
257
258 echo '</div>'."\n";
259
260 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_lazy_load", get_defined_vars());
261 }
262 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_s_badge_wp_footer_code", TRUE, get_defined_vars()))
263 {
264 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_s_badge_wp_footer_code", get_defined_vars());
265
266 echo '<div class="ws-menu-page-group" title="s2Member Security Badge">'."\n";
267
268 echo '<div class="ws-menu-page-section ws-plugin--s2member-s-badge-wp-footer-code-section">'."\n";
269 echo '<h3>Security Badge &amp; Footer Configuration (optional)</h3>'."\n";
270 echo '<div class="ws-menu-page-right">'.c_ws_plugin__s2member_utilities::s_badge_gen("1", TRUE, TRUE).'</div>'."\n";
271 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";
272 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";
273 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_s_badge_wp_footer_code", get_defined_vars());
274
275 echo '<table class="form-table">'."\n";
276 echo '<tbody>'."\n";
277 echo '<tr>'."\n";
278
279 echo '<th>'."\n";
280 echo '<label for="ws-plugin--s2member-s-badge-status-enabled">'."\n";
281 echo 'Enable Security Badge Status API?'."\n";
282 echo '</label>'."\n";
283 echo '</th>'."\n";
284
285 echo '</tr>'."\n";
286 echo '<tr>'."\n";
287
288 echo '<td>'."\n";
289 echo '<select name="ws_plugin__s2member_s_badge_status_enabled" id="ws-plugin--s2member-s-badge-status-enabled">'."\n";
290 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>No (default, Badge Status API is disabled)</option>'."\n";
291 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>Yes (enable Badge Status API for verification)</option>'."\n";
292 echo '</select><br />'."\n";
293 echo '<em>This must be enabled if you want s2Member to verify your Security Badge each day.</em>'."\n";
294 echo '</td>'."\n";
295
296 echo '</tr>'."\n";
297 echo '<tr>'."\n";
298
299 echo '<th>'."\n";
300 echo '<label for="ws-plugin--s2member-wp-footer-code">'."\n";
301 echo 'Customize WordPress Footer:<br />'."\n";
302 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";
303 echo '</label>'."\n";
304 echo '</th>'."\n";
305
306 echo '</tr>'."\n";
307 echo '<tr>'."\n";
308
309 echo '<td>'."\n";
310 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";
311 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";
312 echo '</td>'."\n";
313
314 echo '</tr>'."\n";
315 echo '</tbody>'."\n";
316 echo '</table>'."\n";
317 echo '</div>'."\n";
318
319 echo '</div>'."\n";
320
321 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_s_badge_wp_footer_code", get_defined_vars());
322 }
323 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_email_config", TRUE, get_defined_vars()))
324 {
325 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_email_config", get_defined_vars());
326
327 echo '<div class="ws-menu-page-group" title="Email Configuration">'."\n";
328
329 echo '<div class="ws-menu-page-section ws-plugin--s2member-email-section">'."\n";
330 echo '<h3 style="margin:0;">Email From: '.esc_html('"Name" <address>').'</h3>'."\n";
331 echo '<p style="margin:0;">This is the name/address that will appear in outgoing email notifications sent by the s2Member plugin.</p>'."\n";
332 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_email_from_name_config", get_defined_vars());
333
334 echo '<table class="form-table">'."\n";
335 echo '<tbody>'."\n";
336 echo '<tr>'."\n";
337
338 echo '<th>'."\n";
339 echo '<label for="ws-plugin--s2member-reg-email-from-name">'."\n";
340 echo 'Email From Name:'."\n";
341 echo '</label>'."\n";
342 echo '</th>'."\n";
343
344 echo '</tr>'."\n";
345 echo '<tr>'."\n";
346
347 echo '<td>'."\n";
348 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";
349 echo 'We recommend that you use the name of your site here.'."\n";
350 echo '</td>'."\n";
351
352 echo '</tr>'."\n";
353 echo '<tr>'."\n";
354
355 echo '<th>'."\n";
356 echo '<label for="ws-plugin--s2member-reg-email-from-email">'."\n";
357 echo 'Email From Address:'."\n";
358 echo '</label>'."\n";
359 echo '</th>'."\n";
360
361 echo '</tr>'."\n";
362 echo '<tr>'."\n";
363
364 echo '<td>'."\n";
365 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";
366 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";
367 echo '</td>'."\n";
368
369 echo '</tr>'."\n";
370 echo '<tr>'."\n";
371
372 echo '<th>'."\n";
373 echo '<label for="ws-plugin--s2member-reg-email-support-link">'."\n";
374 echo 'Email Support/Contact Link:'."\n";
375 echo '</label>'."\n";
376 echo '</th>'."\n";
377
378 echo '</tr>'."\n";
379 echo '<tr>'."\n";
380
381 echo '<td>'."\n";
382 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";
383 echo 'Ex: <code>mailto:support@your-domain.com</code> (<em>mailto link</em>)<br />'."\n";
384 echo 'Or: <code>'.esc_html(home_url("/contact-us/")).'</code>'."\n";
385 echo '</td>'."\n";
386
387 echo '</tr>'."\n";
388 echo '</tbody>'."\n";
389 echo '</table>'."\n";
390
391 // New table for HTML Emails option.
392 echo '<div class="ws-menu-page-hr"></div>'."\n";
393
394 echo '<table class="form-table">' . "\n";
395 echo '<tbody>' . "\n";
396
397 echo '<tr>' . "\n";
398 echo '<th>' . "\n";
399 echo '<label for="ws-plugin--s2member-html-emails-enabled">' . "\n";
400 echo 'Enable HTML Emails? (beta)' . "\n";
401 echo '</label>' . "\n";
402 echo '</th>' . "\n";
403 echo '</tr>' . "\n";
404
405 echo '<tr>' . "\n";
406 echo '<td>' . "\n";
407 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";
408 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";
409 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";
410 echo '</td>' . "\n";
411 echo '</tr>' . "\n";
412
413 echo '</tbody>' . "\n";
414 echo '</table>' . "\n";
415
416 echo '<div class="ws-menu-page-hr"></div>'."\n";
417
418 echo '<h3 style="margin:0;">New User Email Configuration</h3>'."\n";
419 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";
420 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" : '';
421 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_emails", get_defined_vars());
422
423 echo '<table class="form-table">'."\n";
424 echo '<tbody>'."\n";
425 echo '<tr>'."\n";
426
427 echo '<td>'."\n";
428 echo '<select name="ws_plugin__s2member_new_user_emails_enabled" id="ws-plugin--s2member-new-user-emails-enabled">'."\n";
429 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_emails_enabled"]) ? ' selected="selected"' : '').'>No (default, use WordPress defaults)</option>'."\n";
430 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["new_user_emails_enabled"]) ? ' selected="selected"' : '').'>Yes (customize New User Emails with s2Member)</option>'."\n";
431 echo '</select>'."\n";
432 echo '</td>'."\n";
433
434 echo '</tr>'."\n";
435 echo '</tbody>'."\n";
436 echo '</table>'."\n";
437
438 echo '<div id="ws-plugin--s2member-new-user-emails">'."\n";
439
440 echo '<div class="ws-menu-page-hr"></div>'."\n";
441
442 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";
443 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";
444 if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"])
445 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";
446 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_email", get_defined_vars());
447
448 echo '<div id="ws-plugin--s2member-new-user-email-details" style="display:none;">'."\n";
449 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" : '';
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-new-user-email-subject">'."\n";
456 echo 'New User Email Subject:'."\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_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";
465 echo 'Subject Line used in the email sent to new Users/Members.'."\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-new-user-email-message">'."\n";
473 echo 'New User Email Message:'."\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 '<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";
482 //250615 Visual editor for HTML emails.
483 if (empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['html_emails_enabled'])) {
484 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";
485 } else {
486 c_ws_plugin__s2member_utilities::editor('new_user_email_message');
487 }
488
489 echo 'Message Body used in the email sent to new Users/Members.<br /><br />'."\n";
490 echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
491 echo '<ul>'."\n";
492 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";
493 echo '<li><code>%%role%%</code> = The Role ID <code>(subscriber, s2member_level[0-9]+, administrator, editor, author, contributor)</code>.</li>'."\n";
494 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";
495 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";
496 echo '<li><code>%%ccaps%%</code> = Custom Capabilities. Ex: <code>music,videos,free_gift</code> (<em>in comma-delimited format</em>).</li>'."\n";
497 echo '<li><code>%%user_first_name%%</code> = The First Name of the Member who registered their Username.</li>'."\n";
498 echo '<li><code>%%user_last_name%%</code> = The Last Name of the Member who registered their Username.</li>'."\n";
499 echo '<li><code>%%user_full_name%%</code> = The Full Name (First &amp; Last) of the Member who registered their Username.</li>'."\n";
500 echo '<li><code>%%user_email%%</code> = The Email Address of the Member who registered their Username.</li>'."\n";
501 echo '<li><code>%%user_login%%</code> = The Username the Member selected during registration.</li>'."\n";
502 echo '<li><code>%%user_ip%%</code> = The User\'s IP Address, detected via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
503 echo '<li><code>%%user_id%%</code> = A unique WordPress User ID generated during registration.</li>'."\n";
504 echo '<li><code>%%wp_login_url%%</code> = The full URL where Users can get logged into your site.</li>'."\n";
505 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";
506 echo '</ul>'."\n";
507
508 echo '<strong>Custom Registration/Profile Fields are also supported in this email:</strong>'."\n";
509 echo '<ul>'."\n";
510 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";
511 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";
512 echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
513 echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
514 echo '</ul>'."\n";
515
516 echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
517 echo '<ul>'."\n";
518 echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
519 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";
520 echo '</ul>'."\n";
521 echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
522 echo '<em>(The campaign (i.e., christmas-promo) could be referenced using <code>%%cv1%%</code>)</em><br />'."\n";
523 echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
524
525 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
526 '<div class="ws-menu-page-hr"></div>'."\n".
527 '<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"
528 : '';
529 echo '</td>'."\n";
530
531 echo '</tr>'."\n";
532 echo '</tbody>'."\n";
533 echo '</table>'."\n";
534 echo '</div>'."\n";
535
536 echo '<div class="ws-menu-page-hr"></div>'."\n";
537
538 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";
539 echo '<p style="margin:0;">This email notification is sent to you, each time a new User/Member registers.</p>'."\n";
540 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_admin_email", get_defined_vars());
541
542 echo '<div id="ws-plugin--s2member-new-user-admin-email-details" style="display:none;">'."\n";
543 echo '<table class="form-table">'."\n";
544 echo '<tbody>'."\n";
545 echo '<tr>'."\n";
546
547 echo '<th>'."\n";
548 echo '<label for="ws-plugin--s2member-new-user-admin-email-recipients">'."\n";
549 echo 'New User Notification Recipients:'."\n";
550 echo '</label>'."\n";
551 echo '</th>'."\n";
552
553 echo '</tr>'."\n";
554 echo '<tr>'."\n";
555
556 echo '<td>'."\n";
557 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";
558 echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />'."\n";
559 echo '<code>"Name" &lt;user@example.com&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>'."\n";
560 echo '</td>'."\n";
561
562 echo '</tr>'."\n";
563 echo '<tr>'."\n";
564
565 echo '<th>'."\n";
566 echo '<label for="ws-plugin--s2member-new-user-admin-email-subject">'."\n";
567 echo 'New User Notification Subject:'."\n";
568 echo '</label>'."\n";
569 echo '</th>'."\n";
570
571 echo '</tr>'."\n";
572 echo '<tr>'."\n";
573
574 echo '<td>'."\n";
575 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";
576 echo 'Subject Line used in the email notification sent to Administrator.'."\n";
577 echo '</td>'."\n";
578
579 echo '</tr>'."\n";
580 echo '<tr>'."\n";
581
582 echo '<th>'."\n";
583 echo '<label for="ws-plugin--s2member-new-user-admin-email-message">'."\n";
584 echo 'New User Notification Message:'."\n";
585 echo '</label>'."\n";
586 echo '</th>'."\n";
587
588 echo '</tr>'."\n";
589 echo '<tr>'."\n";
590
591 echo '<td>'."\n";
592 //250615 Visual editor for HTML emails.
593 if (empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['html_emails_enabled'])) {
594 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";
595 } else {
596 c_ws_plugin__s2member_utilities::editor('new_user_admin_email_message');
597 }
598
599 echo 'Message Body used in the email notification sent to Administrator.<br /><br />'."\n";
600 echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
601 echo '<ul>'."\n";
602 echo '<li><code>%%role%%</code> = The Role ID <code>(subscriber, s2member_level[0-9]+, administrator, editor, author, contributor)</code>.</li>'."\n";
603 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";
604 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";
605 echo '<li><code>%%ccaps%%</code> = Custom Capabilities. Ex: <code>music,videos,free_gift</code> (<em>in comma-delimited format</em>).</li>'."\n";
606 echo '<li><code>%%user_first_name%%</code> = The First Name of the Member who registered their Username.</li>'."\n";
607 echo '<li><code>%%user_last_name%%</code> = The Last Name of the Member who registered their Username.</li>'."\n";
608 echo '<li><code>%%user_full_name%%</code> = The Full Name (First &amp; Last) of the Member who registered their Username.</li>'."\n";
609 echo '<li><code>%%user_email%%</code> = The Email Address of the Member who registered their Username.</li>'."\n";
610 echo '<li><code>%%user_login%%</code> = The Username the Member selected during registration.</li>'."\n";
611 echo '<li><code>%%user_ip%%</code> = The User\'s IP Address, detected via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
612 echo '<li><code>%%user_id%%</code> = A unique WordPress User ID generated during registration.</li>'."\n";
613 echo '<li><code>%%wp_login_url%%</code> = The full URL where Users can get logged into your site.</li>'."\n";
614 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";
615 echo '</ul>'."\n";
616
617 echo '<strong>Custom Registration/Profile Fields are also supported in this email:</strong>'."\n";
618 echo '<ul>'."\n";
619 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";
620 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";
621 echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
622 echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
623 echo '</ul>'."\n";
624
625 echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
626 echo '<ul>'."\n";
627 echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
628 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";
629 echo '</ul>'."\n";
630 echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
631 echo '<em>(The campaign (i.e., christmas-promo) could be referenced using <code>%%cv1%%</code>)</em><br />'."\n";
632 echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
633
634 echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
635 '<div class="ws-menu-page-hr"></div>'."\n".
636 '<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"
637 : '';
638 echo '</td>'."\n";
639
640 echo '</tr>'."\n";
641 echo '</tbody>'."\n";
642 echo '</table>'."\n";
643 echo '</div>'."\n";
644 echo '</div>'."\n";
645
646 echo '</div>'."\n";
647
648 echo '</div>'."\n";
649
650 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_email_config", get_defined_vars());
651 }
652 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_open_registration", TRUE, get_defined_vars()))
653 {
654 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_open_registration", get_defined_vars());
655
656 if(is_multisite() && is_main_site()) // A Multisite Network, and we're on the Main Site?
657 {
658 echo '<div class="ws-menu-page-group" title="Open Registration">'."\n";
659
660 echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
661 echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
662 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";
663 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
664 echo '</div>'."\n";
665
666 echo '</div>'."\n";
667 }
668 else // Else we display this section normally. No special considerations are required in this case.
669 {
670 echo '<div class="ws-menu-page-group" title="Open Registration">'."\n";
671
672 echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
673 echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
674 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";
675 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
676
677 echo '<table class="form-table">'."\n";
678 echo '<tbody>'."\n";
679 echo '<tr>'."\n";
680
681 echo '<th>'."\n";
682 echo '<label for="ws-plugin--s2member-allow-subscribers-in">'."\n";
683 echo 'Allow Open Registration? (Free Subscribers)'."\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 '<select name="ws_plugin__s2member_allow_subscribers_in" id="ws-plugin--s2member-allow-subscribers-in">'."\n";
692 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["allow_subscribers_in"]) ? ' selected="selected"' : '').'>No (do NOT allow Open Registration)</option>'."\n";
693 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";
694 echo '</select><br />'."\n";
695 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";
696 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" : '';
697 echo '</td>'."\n";
698
699 echo '</tr>'."\n";
700 echo '</tbody>'."\n";
701 echo '</table>'."\n";
702 echo '</div>'."\n";
703
704 echo '</div>'."\n";
705 }
706 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_open_registration", get_defined_vars());
707 }
708 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_membership_levels", TRUE, get_defined_vars()))
709 {
710 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_membership_levels", get_defined_vars());
711
712 echo '<div class="ws-menu-page-group" title="Membership Levels/Labels">'."\n";
713
714 echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
715 echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
716 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";
717 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" : '';
718 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" : '';
719 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
720
721 echo '<table class="form-table">'."\n";
722 echo '<tbody>'."\n";
723
724 for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
725 {
726 echo '<tr>'."\n";
727
728 echo '<th>'."\n";
729 echo '<label for="ws-plugin--s2member-level'.$n.'-label">'."\n";
730 echo ($n === 0) ? 'Level #'.$n.' <em>(Free Subscribers)</em>:'."\n" : 'Level #'.$n.' Members:'."\n";
731 echo '</label>'."\n";
732 echo '</th>'."\n";
733
734 echo '</tr>'."\n";
735 echo '<tr>'."\n";
736
737 echo '<td>'."\n";
738 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";
739 echo 'This is the Label for Level #'.$n.(($n === 0) ? ' (Free Subscribers)' : ' Members').'.<br />'."\n";
740 echo '</td>'."\n";
741
742 echo '</tr>'."\n";
743 }
744 echo '</tbody>'."\n";
745 echo '</table>'."\n";
746
747 echo '<div class="ws-menu-page-hr"></div>'."\n";
748
749 echo '<table class="form-table" style="margin-top:0;">'."\n";
750 echo '<tbody>'."\n";
751 echo '<tr>'."\n";
752
753 echo '<th style="padding-top:0;">'."\n";
754 echo '<label for="ws-plugin--s2member-apply-label-translations">'."\n";
755 echo 'Force WordPress to use your Labels?'."\n";
756 echo '</label>'."\n";
757 echo '</th>'."\n";
758
759 echo '</tr>'."\n";
760 echo '<tr>'."\n";
761
762 echo '<td>'."\n";
763 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";
764 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";
765 echo '</td>'."\n";
766
767 echo '</tr>'."\n";
768 echo '</tbody>'."\n";
769 echo '</table>'."\n";
770
771 echo '<div class="ws-menu-page-hr"></div>'."\n";
772
773 echo '<input type="button" value="Reset Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-reset-roles-button" style="min-width:175px;" />'."\n";
774 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";
775
776 echo '</div>'."\n";
777
778 echo '</div>'."\n";
779
780 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_membership_levels", get_defined_vars());
781 }
782 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_login_registration", TRUE, get_defined_vars()))
783 {
784 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_login_registration", get_defined_vars());
785
786 echo '<div class="ws-menu-page-group" title="Login/Registration Design">'."\n";
787
788 echo '<div class="ws-menu-page-section ws-plugin--s2member-login-registration-section">'."\n";
789 echo '<h3>Login/Registration Page Customization (optional)</h3>'."\n";
790 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";
791 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" : '';
792 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" : '';
793 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_registration", get_defined_vars());
794
795 echo '<table class="form-table">'."\n";
796 echo '<tbody>'."\n";
797 echo '<tr>'."\n";
798
799 echo '<td>'."\n";
800 echo '<h3 style="margin:0;">Enable This Functionality?</h3>'."\n";
801 echo '<select name="ws_plugin__s2member_login_reg_design_enabled" id="ws-plugin--s2member-login-reg-design-enabled">'."\n";
802 echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' selected="selected"' : '').'>No (default, use WordPress defaults)</option>'."\n";
803 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' selected="selected"' : '').'>Yes (customize Login/Registration with s2Member)</option>'."\n";
804 echo '</select>'."\n";
805 echo '</td>'."\n";
806
807 echo '</tr>'."\n";
808 echo '</tbody>'."\n";
809 echo '</table>'."\n";
810
811 echo '<div id="ws-plugin--s2member-login-reg-design"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_design_enabled"]) ? ' style="display:none;"' : '').'>'."\n";
812
813 echo '<div class="ws-menu-page-hr"></div>'."\n";
814
815 echo '<table class="form-table">'."\n";
816 echo '<tbody>'."\n";
817 echo '<tr>'."\n";
818
819 echo '<td>'."\n";
820 echo '<h3 style="margin:0;">Overall Font/Size Configuration</h3>'."\n";
821 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Fonts.</p>'."\n";
822 echo '</td>'."\n";
823
824 echo '</tr>'."\n";
825 echo '<tr>'."\n";
826
827 echo '<th>'."\n";
828 echo '<label for="ws-plugin--s2member-login-reg-font-size">'."\n";
829 echo 'Overall Font Size:'."\n";
830 echo '</label>'."\n";
831 echo '</th>'."\n";
832
833 echo '</tr>'."\n";
834 echo '<tr>'."\n";
835
836 echo '<td>'."\n";
837 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";
838 echo 'Set this to a numeric value, calculated in pixels.'."\n";
839 echo '</td>'."\n";
840
841 echo '</tr>'."\n";
842 echo '<tr>'."\n";
843
844 echo '<th>'."\n";
845 echo '<label for="ws-plugin--s2member-login-reg-font-family">'."\n";
846 echo 'Overall Font Family:'."\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_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";
855 echo 'Set this to a web-safe font family.'."\n";
856 echo '</td>'."\n";
857
858 echo '</tr>'."\n";
859 echo '<tr>'."\n";
860
861 echo '<th>'."\n";
862 echo '<label for="ws-plugin--s2member-login-reg-font-field-size">'."\n";
863 echo 'Form Field Font Size:'."\n";
864 echo '</label>'."\n";
865 echo '</th>'."\n";
866
867 echo '</tr>'."\n";
868 echo '<tr>'."\n";
869
870 echo '<td>'."\n";
871 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";
872 echo 'Set this to a numeric value, calculated in pixels.'."\n";
873 echo '</td>'."\n";
874
875 echo '</tr>'."\n";
876 echo '</tbody>'."\n";
877 echo '</table>'."\n";
878
879 echo '<div class="ws-menu-page-hr"></div>'."\n";
880
881 echo '<table class="form-table" style="margin-top:0;">'."\n";
882 echo '<tbody>'."\n";
883 echo '<tr>'."\n";
884
885 echo '<td>'."\n";
886 echo '<h3 style="margin:0;">Background Configuration</h3>'."\n";
887 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Background.</p>'."\n";
888 echo '</td>'."\n";
889
890 echo '</tr>'."\n";
891 echo '<tr>'."\n";
892
893 echo '<th>'."\n";
894 echo '<label for="ws-plugin--s2member-login-reg-background-color">'."\n";
895 echo 'Background Color:'."\n";
896 echo '</label>'."\n";
897 echo '</th>'."\n";
898
899 echo '</tr>'."\n";
900 echo '<tr>'."\n";
901
902 echo '<td>'."\n";
903 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";
904 echo 'Set this to a 6-digit hex color code.'."\n";
905 echo '</td>'."\n";
906
907 echo '</tr>'."\n";
908 echo '<tr>'."\n";
909
910 echo '<th>'."\n";
911 echo '<label for="ws-plugin--s2member-login-reg-background-image">'."\n";
912 echo 'Background Image:'."\n";
913 echo '</label>'."\n";
914 echo '</th>'."\n";
915
916 echo '</tr>'."\n";
917 echo '<tr>'."\n";
918
919 echo '<td>'."\n";
920 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";
921 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";
922 echo 'Set this to the URL of your Background Image. (this is optional)<br />';
923 echo 'If supplied, your Background Image will be tiled.'."\n";
924 echo '</td>'."\n";
925
926 echo '</tr>'."\n";
927 echo '<tr>'."\n";
928
929 echo '<th>'."\n";
930 echo '<label for="ws-plugin--s2member-login-reg-background-image-repeat">'."\n";
931 echo 'Background Image Tile:'."\n";
932 echo '</label>'."\n";
933 echo '</th>'."\n";
934
935 echo '</tr>'."\n";
936 echo '<tr>'."\n";
937
938 echo '<td>'."\n";
939 echo '<select name="ws_plugin__s2member_login_reg_background_image_repeat" id="ws-plugin--s2member-login-reg-background-image-repeat">'."\n";
940 echo '<option value="repeat"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat") ? ' selected="selected"' : '').'>Seamless Tile ( background-repeat: repeat; )</option>'."\n";
941 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";
942 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";
943 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";
944 echo '</select><br />'."\n";
945 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";
946 echo '</td>'."\n";
947
948 echo '</tr>'."\n";
949 echo '<tr>'."\n";
950
951 echo '<th>'."\n";
952 echo '<label for="ws-plugin--s2member-login-reg-background-text-color">'."\n";
953 echo 'Color of Text on top of your Background:'."\n";
954 echo '</label>'."\n";
955 echo '</th>'."\n";
956
957 echo '</tr>'."\n";
958 echo '<tr>'."\n";
959
960 echo '<td>'."\n";
961 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";
962 echo 'Set this to a 6-digit hex color code.'."\n";
963 echo '</td>'."\n";
964
965 echo '</tr>'."\n";
966 echo '<tr>'."\n";
967
968 echo '<th>'."\n";
969 echo '<label for="ws-plugin--s2member-login-reg-background-text-shadow-color">'."\n";
970 echo 'Shadow Color for Text on top of your Background:'."\n";
971 echo '</label>'."\n";
972 echo '</th>'."\n";
973
974 echo '</tr>'."\n";
975 echo '<tr>'."\n";
976
977 echo '<td>'."\n";
978 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";
979 echo 'Set this to a 6-digit hex color code.'."\n";
980 echo '</td>'."\n";
981
982 echo '</tr>'."\n";
983 echo '<tr>'."\n";
984
985 echo '<th>'."\n";
986 echo '<label for="ws-plugin--s2member-login-reg-background-box-shadow-color">'."\n";
987 echo 'Shadow Color for Boxes on top of your Background:'."\n";
988 echo '</label>'."\n";
989 echo '</th>'."\n";
990
991 echo '</tr>'."\n";
992 echo '<tr>'."\n";
993
994 echo '<td>'."\n";
995 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";
996 echo 'Set this to a 6-digit hex color code.'."\n";
997 echo '</td>'."\n";
998
999 echo '</tr>'."\n";
1000 echo '</tbody>'."\n";
1001 echo '</table>'."\n";
1002
1003 echo '<div class="ws-menu-page-hr"></div>'."\n";
1004
1005 echo '<table class="form-table" style="margin-top:0;">'."\n";
1006 echo '<tbody>'."\n";
1007 echo '<tr>'."\n";
1008
1009 echo '<td>'."\n";
1010 echo '<h3 style="margin:0;">Logo Image Configuration</h3>'."\n";
1011 echo '<p style="margin:0;">These settings are all focused on your Login/Registration Logo.</p>'."\n";
1012 echo '</td>'."\n";
1013
1014 echo '</tr>'."\n";
1015 echo '<tr>'."\n";
1016
1017 echo '<th>'."\n";
1018 echo '<label for="ws-plugin--s2member-login-reg-logo-src">'."\n";
1019 echo 'Logo Image Location:'."\n";
1020 echo '</label>'."\n";
1021 echo '</th>'."\n";
1022
1023 echo '</tr>'."\n";
1024 echo '<tr>'."\n";
1025
1026 echo '<td>'."\n";
1027 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";
1028 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";
1029 echo 'Set this to the URL of your Logo Image.<br />'."\n";
1030 echo 'Suggested size is around 500 x 100.'."\n";
1031 echo '</td>'."\n";
1032
1033 echo '</tr>'."\n";
1034 echo '<tr>'."\n";
1035
1036 echo '<th>'."\n";
1037 echo '<label for="ws-plugin--s2member-login-reg-logo-src-width">'."\n";
1038 echo 'Logo Image Width:'."\n";
1039 echo '</label>'."\n";
1040 echo '</th>'."\n";
1041
1042 echo '</tr>'."\n";
1043 echo '<tr>'."\n";
1044
1045 echo '<td>'."\n";
1046 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";
1047 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";
1048 echo '</td>'."\n";
1049
1050 echo '</tr>'."\n";
1051 echo '<tr>'."\n";
1052
1053 echo '<th>'."\n";
1054 echo '<label for="ws-plugin--s2member-login-reg-logo-src-height">'."\n";
1055 echo 'Logo Image Height:'."\n";
1056 echo '</label>'."\n";
1057 echo '</th>'."\n";
1058
1059 echo '</tr>'."\n";
1060 echo '<tr>'."\n";
1061
1062 echo '<td>'."\n";
1063 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";
1064 echo 'The pixel Height of your Logo Image.'."\n";
1065 echo '</td>'."\n";
1066
1067 echo '</tr>'."\n";
1068 echo '<tr>'."\n";
1069
1070 echo '<th>'."\n";
1071 echo '<label for="ws-plugin--s2member-login-reg-logo-url">'."\n";
1072 echo 'Logo Image Click URL:'."\n";
1073 echo '</label>'."\n";
1074 echo '</th>'."\n";
1075
1076 echo '</tr>'."\n";
1077 echo '<tr>'."\n";
1078
1079 echo '<td>'."\n";
1080 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";
1081 echo 'Set this to the Click URL for your Logo Image.'."\n";
1082 echo '</td>'."\n";
1083
1084 echo '</tr>'."\n";
1085 echo '<tr>'."\n";
1086
1087 echo '<th>'."\n";
1088 echo '<label for="ws-plugin--s2member-login-reg-logo-title">'."\n";
1089 echo 'Logo Image Title Attribute:'."\n";
1090 echo '</label>'."\n";
1091 echo '</th>'."\n";
1092
1093 echo '</tr>'."\n";
1094 echo '<tr>'."\n";
1095
1096 echo '<td>'."\n";
1097 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";
1098 echo 'Used as the <code>title=""</code> attribute for your Logo Image.'."\n";
1099 echo '</td>'."\n";
1100
1101 echo '</tr>'."\n";
1102 echo '</tbody>'."\n";
1103 echo '</table>'."\n";
1104
1105 echo '<div class="ws-menu-page-hr"></div>'."\n";
1106
1107 echo '<table class="form-table" style="margin-top:0;">'."\n";
1108 echo '<tbody>'."\n";
1109 echo '<tr>'."\n";
1110
1111 echo '<th>'."\n";
1112 echo '<label for="ws-plugin--s2member-login-reg-footer-backtoblog">'."\n";
1113 echo 'Display [Back to Home Page] Link At Bottom?'."\n";
1114 echo '</label>'."\n";
1115 echo '</th>'."\n";
1116
1117 echo '</tr>'."\n";
1118 echo '<tr>'."\n";
1119
1120 echo '<td>'."\n";
1121 echo '<select name="ws_plugin__s2member_login_reg_footer_backtoblog" id="ws-plugin--s2member-login-reg-footer-backtoblog">'."\n";
1122 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";
1123 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";
1124 echo '</select>'."\n";
1125 echo '</td>'."\n";
1126
1127 echo '</tr>'."\n";
1128 echo '<tr>'."\n";
1129
1130 echo '<td>'."\n";
1131 echo '<h3 style="margin:0;">Footer Design (i.e., Bottom)</h3>'."\n";
1132 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";
1133 echo '</td>'."\n";
1134
1135 echo '</tr>'."\n";
1136 echo '<tr>'."\n";
1137
1138 echo '<th>'."\n";
1139 echo '<label for="ws-plugin--s2member-login-reg-footer-design">'."\n";
1140 echo 'Login/Registration Footer Design (optional):'."\n";
1141 echo '</label>'."\n";
1142 echo '</th>'."\n";
1143
1144 echo '</tr>'."\n";
1145 echo '<tr>'."\n";
1146
1147 echo '<td>'."\n";
1148 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";
1149 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";
1150 echo '</td>'."\n";
1151
1152 echo '</tr>'."\n";
1153 echo '</tbody>'."\n";
1154 echo '</table>'."\n";
1155 echo '</div>'."\n";
1156
1157 echo '</div>'."\n";
1158
1159 echo '</div>'."\n";
1160
1161 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_login_registration", get_defined_vars());
1162 }
1163 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_custom_reg_fields", TRUE, get_defined_vars()))
1164 {
1165 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_custom_reg_fields", get_defined_vars());
1166
1167 echo '<div class="ws-menu-page-group" title="Registration/Profile Fields &amp; Options">'."\n";
1168
1169 echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-reg-fields-section">'."\n";
1170 echo '<h3>Custom Registration/Profile Fields (optional, for further customization)</h3>'."\n";
1171 echo '<p>Some fields are already built-in by default. The defaults are: <code>*Username*, *Email*, *First Name*, *Last Name*</code>.</p>'."\n";
1172
1173 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";
1174 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" : '';
1175 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" : '';
1176 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";
1177
1178 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_custom_reg_fields", get_defined_vars());
1179
1180 echo '<table class="form-table">'."\n";
1181 echo '<tbody>'."\n";
1182 echo '<tr>'."\n";
1183
1184 echo '<th>'."\n";
1185 echo '<label>'."\n";
1186 echo 'Custom Registration/Profile Fields:'."\n";
1187 echo '</label>'."\n";
1188 echo '</th>'."\n";
1189
1190 echo '</tr>'."\n";
1191 echo '<tr>'."\n";
1192
1193 echo '<td>'."\n";
1194 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";
1195 echo '<div id="ws-plugin--s2member-custom-reg-field-configuration"></div>'."\n"; // This is filled by JavaScript routines.
1196 echo '</td>'."\n";
1197
1198 echo '</tr>'."\n";
1199 echo '</tbody>'."\n";
1200 echo '</table>'."\n";
1201
1202 echo '<div class="ws-menu-page-hr"></div>'."\n";
1203
1204 echo '<table class="form-table">'."\n";
1205 echo '<tbody>'."\n";
1206 echo '<tr>'."\n";
1207
1208 echo '<th>'."\n";
1209 echo '<label for="ws-plugin--s2member-custom-reg-names">'."\n";
1210 echo 'Collect First/Last Names During Registration?'."\n";
1211 echo '</label>'."\n";
1212 echo '</th>'."\n";
1213
1214 echo '</tr>'."\n";
1215 echo '<tr>'."\n";
1216
1217 echo '<td>'."\n";
1218 echo '<select name="ws_plugin__s2member_custom_reg_names" id="ws-plugin--s2member-custom-reg-names">'."\n";
1219 echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_names"]) ? ' selected="selected"' : '').'>Yes (always collect First/Last Names during registration)</option>'."\n";
1220 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";
1221 echo '</select><br />'."\n";
1222 echo 'Recommended setting (<code>Yes</code>). It\'s usually a good idea to leave this on.'."\n";
1223 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" : '';
1224 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" : '';
1225 echo '</td>'."\n";
1226
1227 echo '</tr>'."\n";
1228 echo '</tbody>'."\n";
1229 echo '</table>'."\n";
1230
1231 echo '<div class="ws-menu-page-hr"></div>'."\n";
1232
1233 echo '<table class="form-table">'."\n";
1234 echo '<tbody>'."\n";
1235 echo '<tr>'."\n";
1236
1237 echo '<th>'."\n";
1238 echo '<label for="ws-plugin--s2member-custom-reg-display-name">'."\n";
1239 echo 'Set "Display Name" During Registration?'."\n";
1240 echo '</label>'."\n";
1241 echo '</th>'."\n";
1242
1243 echo '</tr>'."\n";
1244 echo '<tr>'."\n";
1245
1246 echo '<td>'."\n";
1247 echo '<select name="ws_plugin__s2member_custom_reg_display_name" id="ws-plugin--s2member-custom-reg-display-name">'."\n";
1248 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";
1249 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";
1250 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";
1251 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";
1252 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";
1253 echo '</select>'."\n";
1254 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" : '';
1255 echo '</td>'."\n";
1256
1257 echo '</tr>'."\n";
1258 echo '</tbody>'."\n";
1259 echo '</table>'."\n";
1260
1261 echo '<div class="ws-menu-page-hr"></div>'."\n";
1262
1263 echo '<table class="form-table">'."\n";
1264 echo '<tbody>'."\n";
1265 echo '<tr>'."\n";
1266
1267 echo '<th>'."\n";
1268 echo '<label for="ws-plugin--s2member-custom-reg-password">'."\n";
1269 echo 'Allow Custom Passwords During Registration?'."\n";
1270 echo '</label>'."\n";
1271 echo '</th>'."\n";
1272
1273 echo '</tr>'."\n";
1274 echo '<tr>'."\n";
1275
1276 echo '<td>'."\n";
1277 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";
1278 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" : '';
1279 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" : '';
1280 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";
1281 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";
1282 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";
1283 echo '</select>'."\n";
1284 echo '</td>'."\n";
1285
1286 echo '</tr>'."\n";
1287 echo '</tbody>'."\n";
1288 echo '</table>'."\n";
1289
1290 echo '<div class="ws-menu-page-hr"></div>'."\n";
1291
1292 echo '<table class="form-table">'."\n";
1293 echo '<tbody>'."\n";
1294 echo '<tr>'."\n";
1295
1296 echo '<th>'."\n";
1297 echo '<label for="ws-plugin--s2member-custom-reg-password-min-length">'."\n";
1298 echo 'Minimum Length/Strength for Custom Passwords:'."\n";
1299 echo '</label>'."\n";
1300 echo '</th>'."\n";
1301
1302 echo '</tr>'."\n";
1303 echo '<tr>'."\n";
1304
1305 echo '<td>'."\n";
1306 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";
1307 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";
1308 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";
1309 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";
1310 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";
1311 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";
1312 echo '</select>'."\n";
1313 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";
1314 echo '</td>'."\n";
1315
1316 echo '</tr>'."\n";
1317 echo '</tbody>'."\n";
1318 echo '</table>'."\n";
1319
1320 echo '<div class="ws-menu-page-hr"></div>'."\n";
1321
1322 echo '<table class="form-table">'."\n";
1323 echo '<tbody>'."\n";
1324 echo '<tr>'."\n";
1325
1326 echo '<th>'."\n";
1327 echo '<label for="ws-plugin--s2member-custom-reg-force-personal-emails">'."\n";
1328 echo 'Force Personal Emails During Registration?'."\n";
1329 echo '</label>'."\n";
1330 echo '</th>'."\n";
1331
1332 echo '</tr>'."\n";
1333 echo '<tr>'."\n";
1334
1335 echo '<td>'."\n";
1336 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";
1337 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";
1338 echo 'Ex: <code>info,help,admin,webmaster,hostmaster,sales,support,spam</code><br />'."\n";
1339 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";
1340 echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Affects BuddyPress registration form too.</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-fields-4bp">'."\n";
1355 echo 'Integrate Custom Registration/Profile Fields with BuddyPress?'."\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 '<div class="ws-menu-page-scrollbox" style="height:65px;">'."\n";
1364 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";
1365 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)
1366 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";
1367 echo '</div>'."\n";
1368 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>';
1369 echo '</td>'."\n";
1370
1371 echo '</tr>'."\n";
1372 echo '</tbody>'."\n";
1373 echo '</table>'."\n";
1374
1375 echo '</div>'."\n";
1376
1377 echo '</div>'."\n";
1378
1379 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_custom_reg_fields", get_defined_vars());
1380 }
1381 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_sc_s2get_shortcode", TRUE, get_defined_vars()))
1382 {
1383 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_sc_s2get_shortcode", get_defined_vars());
1384
1385 //260812 This whitelist is shared by s2Get and s2Member-List; legacy hook and element names are retained for backward compatibility.
1386 echo '<div id="ws-plugin--s2member-shortcode-user-fields-whitelist"></div>'."\n";
1387 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";
1388
1389 echo '<div class="ws-menu-page-section ws-plugin--s2member-sc-get-shortcode-section">'."\n";
1390 echo '<h3>Shortcode User Fields Whitelist (optional)</h3>'."\n";
1391 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";
1392 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";
1393 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_sc_s2get_shortcode", get_defined_vars());
1394
1395 echo '<table class="form-table">'."\n";
1396 echo '<tbody>'."\n";
1397 echo '<tr>'."\n";
1398
1399 echo '<th>'."\n";
1400 echo '<label for="ws-plugin--s2member-sc-s2get-userid-fields">'."\n";
1401 echo 'Allowed user fields:'."\n";
1402 echo '</label>'."\n";
1403 echo '</th>'."\n";
1404
1405 echo '</tr>'."\n";
1406 echo '<tr>'."\n";
1407
1408 echo '<td>'."\n";
1409 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";
1410 echo '<strong>Examples:</strong> <code>display_name, avatar, first_name, last_name, full_name</code>'."\n";
1411 echo '</td>'."\n";
1412
1413 echo '</tr>'."\n";
1414 echo '</tbody>'."\n";
1415 echo '</table>'."\n";
1416 echo '</div>'."\n";
1417
1418 echo '</div>'."\n";
1419
1420 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_sc_s2get_shortcode", get_defined_vars());
1421 }
1422 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_login_welcome_page", TRUE, get_defined_vars()))
1423 {
1424 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_login_welcome_page", get_defined_vars());
1425
1426
1427 echo '<div class="ws-menu-page-group" title="Login Welcome Page">'."\n";
1428
1429 echo '<div class="ws-menu-page-section ws-plugin--s2member-login-welcome-page-section">'."\n";
1430 echo '<h3>Login Welcome Page (required, please customize this)</h3>'."\n";
1431 echo '<p>Please create and/or choose an existing Page to use as the first page Members will see after logging in.</p>'."\n";
1432 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" : '';
1433 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";
1434 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";
1435 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_welcome_page", get_defined_vars());
1436
1437 echo '<table class="form-table">'."\n";
1438 echo '<tbody>'."\n";
1439 echo '<tr>'."\n";
1440
1441 echo '<th>'."\n";
1442 echo '<label for="ws-plugin--s2member-login-welcome-page">'."\n";
1443 echo 'Login Welcome Page:'."\n";
1444 echo '</label>'."\n";
1445 echo '</th>'."\n";
1446
1447 echo '</tr>'."\n";
1448 echo '<tr>'."\n";
1449
1450 echo '<td>'."\n";
1451 echo '<select name="ws_plugin__s2member_login_welcome_page" id="ws-plugin--s2member-login-welcome-page">'."\n";
1452 echo '<option value="">&mdash; Select &mdash;</option>'."\n";
1453 foreach(($ws_plugin__s2member_temp_a = array_merge((array)get_pages())) as $ws_plugin__s2member_temp_o)
1454 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";
1455 echo '</select><br />'."\n";
1456 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";
1457 echo '</td>'."\n";
1458
1459 echo '</tr>'."\n";
1460 echo '<tr>'."\n";
1461
1462 echo '<th>'."\n";
1463 echo '<label for="ws-plugin--s2member-login-redirection-override">'."\n";
1464 echo 'Or, a Special Redirection URL?'."\n";
1465 echo '</label>'."\n";
1466 echo '</th>'."\n";
1467
1468 echo '</tr>'."\n";
1469 echo '<tr>'."\n";
1470
1471 echo '<td>'."\n";
1472 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";
1473 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";
1474 echo '</td>'."\n";
1475
1476 echo '</tr>'."\n";
1477 echo '</tbody>'."\n";
1478 echo '</table>'."\n";
1479 echo '</div>'."\n";
1480
1481 echo '</div>'."\n";
1482
1483 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_login_welcome_page", get_defined_vars());
1484 }
1485 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_membership_options_page", TRUE, get_defined_vars()))
1486 {
1487 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_membership_options_page", get_defined_vars());
1488
1489 echo '<div class="ws-menu-page-group" title="Membership Options Page">'."\n";
1490
1491 echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-options-page-section">'."\n";
1492 echo '<h3>Membership Options Page (required, please customize this)</h3>'."\n";
1493 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";
1494 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";
1495 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";
1496 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" : '';
1497 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";
1498 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_options_page", get_defined_vars());
1499
1500 echo '<table class="form-table">'."\n";
1501 echo '<tbody>'."\n";
1502 echo '<tr>'."\n";
1503
1504 echo '<th>'."\n";
1505 echo '<label for="ws-plugin--s2member-membership-options-page">'."\n";
1506 echo 'Membership Options Page:'."\n";
1507 echo '</label>'."\n";
1508 echo '</th>'."\n";
1509
1510 echo '</tr>'."\n";
1511 echo '<tr>'."\n";
1512
1513 echo '<td>'."\n";
1514 echo '<select name="ws_plugin__s2member_membership_options_page" id="ws-plugin--s2member-membership-options-page">'."\n";
1515 echo '<option value="">&mdash; Select &mdash;</option>'."\n";
1516 foreach(($ws_plugin__s2member_temp_a = array_merge((array)get_pages())) as $ws_plugin__s2member_temp_o)
1517 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";
1518 echo '</select><br />'."\n";
1519 echo 'Please choose a Page that provides Users with a way to sign up. We recommend the following title: <code>Membership Signup</code>'."\n";
1520 echo '</td>'."\n";
1521
1522 echo '</tr>'."\n";
1523 echo '</tbody>'."\n";
1524 echo '</table>'."\n";
1525
1526 echo '<div class="ws-menu-page-hr"></div>'."\n";
1527
1528 echo '<table class="form-table">'."\n";
1529 echo '<tbody>'."\n";
1530 echo '<tr>'."\n";
1531
1532 echo '<th>'."\n";
1533 echo '<label for="ws-plugin--s2member-membership-options-page-vars-enable">'."\n";
1534 echo 'Enable MOP Vars (i.e., Membership Options Page Variables)?'."\n";
1535 echo '</label>'."\n";
1536 echo '</th>'."\n";
1537
1538 echo '</tr>'."\n";
1539 echo '<tr>'."\n";
1540
1541 echo '<td>'."\n";
1542 echo '<select name="ws_plugin__s2member_membership_options_page_vars_enable" id="ws-plugin--s2member-membership-options-page-vars-enable">'."\n";
1543 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";
1544 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";
1545 echo '</select><br />'."\n";
1546 echo 'See also: <strong>Dashboard → s2Member → API / Scripting → Membership Options Page / Variables</strong><br />'."\n";
1547 echo 'Recommended setting: (<code>Yes, enable MOP Vars</code>)'."\n";
1548 echo '</td>'."\n";
1549
1550 echo '</tr>'."\n";
1551 echo '</tbody>'."\n";
1552 echo '</table>'."\n";
1553 echo '</div>'."\n";
1554
1555 echo '</div>'."\n";
1556
1557 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_membership_options_page", get_defined_vars());
1558 }
1559 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_profile_modifications", TRUE, get_defined_vars()))
1560 {
1561 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_profile_modifications", get_defined_vars());
1562
1563 echo '<div class="ws-menu-page-group" title="Member Profile Modifications">'."\n";
1564
1565 echo '<div class="ws-menu-page-section ws-plugin--s2member-profile-modifications-section">'."\n";
1566 echo '<h3>Giving Members The Ability To Modify Their Profile</h3>'."\n";
1567 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";
1568 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";
1569 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" : '';
1570 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_profile_modifications", get_defined_vars());
1571
1572 echo '<table class="form-table">'."\n";
1573 echo '<tbody>'."\n";
1574 echo '<tr>'."\n";
1575
1576 echo '<th>'."\n";
1577 echo '<label for="ws-plugin--s2member-force-admin-lockouts">'."\n";
1578 echo 'Redirect Members away from the Default Profile Panel?'."\n";
1579 echo '</label>'."\n";
1580 echo '</th>'."\n";
1581
1582 echo '</tr>'."\n";
1583 echo '<tr>'."\n";
1584
1585 echo '<td>'."\n";
1586 echo '<select name="ws_plugin__s2member_force_admin_lockouts" id="ws-plugin--s2member-force-admin-lockouts">'."\n";
1587 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";
1588 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";
1589 echo '</select><br />'."\n";
1590 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";
1591 echo '</td>'."\n";
1592
1593 echo '</tr>'."\n";
1594 echo '</tbody>'."\n";
1595 echo '</table>'."\n";
1596
1597 echo '<div class="ws-menu-page-hr"></div>'."\n";
1598
1599 echo '<p style="margin-bottom:0;"><strong>Shortcode (copy/paste)</strong>, for an Inline Profile Modification Form:<br />'."\n";
1600 echo '<p style="margin-top:0;"><input type="text" autocomplete="off" value="'.format_to_edit('[s2Member-Profile /]').'" onclick="this.select ();" /></p>'."\n";
1601
1602 echo '<p style="margin-top:25px; margin-bottom:0;"><strong>Stand-Alone (copy/paste)</strong>, for popup window:</p>'."\n";
1603 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";
1604 echo '</div>'."\n";
1605
1606 echo '</div>'."\n";
1607
1608 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_profile_modifications", get_defined_vars());
1609 }
1610 if(apply_filters("ws_plugin__s2member_during_gen_ops_page_during_left_sections_display_url_shortening", TRUE, get_defined_vars()))
1611 {
1612 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_before_url_shortening", get_defined_vars());
1613
1614 echo '<div class="ws-menu-page-group" title="URL Shortening Service Preference">'."\n";
1615
1616 echo '<div class="ws-menu-page-section ws-plugin--s2member-url-shortening-section">'."\n";
1617 echo '<h3>URL Shortening Service API (Preference)</h3>'."\n";
1618 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";
1619 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_url_shortening", get_defined_vars());
1620
1621 echo '<table class="form-table">'."\n";
1622 echo '<tbody>'."\n";
1623 echo '<tr>'."\n";
1624
1625 echo '<th>'."\n";
1626 echo '<label for="ws-plugin--s2member-default-url-shortener">'."\n";
1627 echo 'URL Shortening Service API (Default):'."\n";
1628 echo '</label>'."\n";
1629 echo '</th>'."\n";
1630
1631 echo '</tr>'."\n";
1632 echo '<tr>'."\n";
1633
1634 echo '<td>'."\n";
1635 echo '<select name="ws_plugin__s2member_default_url_shortener" id="ws-plugin--s2member-default-url-shortener">'."\n";
1636 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";
1637 echo '<option value="none"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "none") ? ' selected="selected"' : '').'>None (Don\'t shorten the URL)</option>'."\n";
1638 echo '<option value="bitly"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "bitly") ? ' selected="selected"' : '').'>Bitly (free; API key required)</option>'."\n";
1639 echo '</select>'."\n";
1640 echo '</td>'."\n";
1641
1642 echo '</tr>'."\n";
1643 echo '<tr>'."\n";
1644
1645 echo '<td>'."\n";
1646 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";
1647 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";
1648 echo '</td>'."\n";
1649
1650 echo '</tr>'."\n";
1651 if (c_ws_plugin__s2member_utils_conds::pro_is_installed()) {
1652 echo '<tr>'."\n";
1653
1654 echo '<th>'."\n";
1655 echo '<label for="ws-plugin--s2member-default-custom-str-url-shortener">'."\n";
1656 echo 'Custom URL Shortening Service API (Optional/Advanced):'."\n";
1657 echo '</label>'."\n";
1658 echo '</th>'."\n";
1659
1660 echo '</tr>'."\n";
1661 echo '<tr>'."\n";
1662
1663 echo '<td>'."\n";
1664 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";
1665 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";
1666 echo '</td>'."\n";
1667
1668 echo '</tr>'."\n";
1669 }
1670 echo '</tbody>'."\n";
1671 echo '</table>'."\n";
1672 echo '</div>'."\n";
1673
1674 echo '</div>'."\n";
1675
1676 do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_after_url_shortening", get_defined_vars());
1677 }
1678 do_action("ws_plugin__s2member_during_gen_ops_page_after_left_sections", get_defined_vars());
1679
1680 echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
1681
1682 echo '</form>'."\n";
1683
1684 echo '</td>'."\n";
1685
1686 echo '<td class="ws-menu-page-table-r">'."\n";
1687 c_ws_plugin__s2member_menu_pages_rs::display();
1688 echo '</td>'."\n";
1689
1690 echo '</tr>'."\n";
1691 echo '</tbody>'."\n";
1692 echo '</table>'."\n";
1693
1694 echo '</div>'."\n";
1695 }
1696 }
1697 }
1698
1699 new c_ws_plugin__s2member_menu_page_gen_ops ();
1700