s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) - Version 151218

Version Description

= v151218 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

Developer JasWSInc
Plugin Icon 128x128 s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members)
Version 151218
Comparing to
See all releases

Code changes from version 151210 to 151218

changelog.md CHANGED
@@ -1,3 +1,13 @@
 
 
 
 
 
 
 
 
 
 
1
  = v151210 =
2
 
3
  - (s2Member/s2Member Pro) **WP/PHP Compat:** Updated for compatibility with WordPress 4.4 and PHP v7.0. Note that s2Member and s2Member Pro also remain compatible with WordPress 4.3 and PHP 5.2. However, PHP 5.5+ is strongly recommended.
1
+ = v151218 =
2
+
3
+ - (s2Member Pro) **Reminder Email Notification Exclusions:** It is now possible to enable/disable EOT Renewal/Reminder Email notifications on a per-user basis. You can edit a user's profile in the WP Dashboard and check "_No (exclude)_" to prevent specific users from receiving any reminder emails that you configured. Props at @patdumond @luisrock. See also [this GitHub issue](https://github.com/websharks/s2member/issues/816).
4
+
5
+ - (s2Member) **PHP v7 Compat.:** This release addresses one remaining issue with the `preg_replace` `/e` modifier as reported in [this GitHub issue](https://github.com/websharks/s2member/issues/811). Props @nerdworker for reporting. Thanks!
6
+
7
+ - (s2Member/s2Member Pro) **WP v4.4 Compat.:** This release corrects an issue that impacted sites attempting to run s2Member on a Multisite Network; i.e., it corrects a problem with the `load.php` patch against the latest release of WordPress. Props @crazycoolcam for reporting! See also [this GitHub issue](https://github.com/websharks/s2member/issues/812).
8
+
9
+ - (s2Member/s2Member Pro) **Getting Help:** This release adds a new menu page titled, "Getting Help w/ s2Member". This new section of your Dashboard provides quick & easy access to s2Member KB articles, suggestions, and our tech support department (for pro customers). Props @patdumond @raamdev. See also [this GitHub issue](https://github.com/websharks/s2member/issues/814).
10
+
11
  = v151210 =
12
 
13
  - (s2Member/s2Member Pro) **WP/PHP Compat:** Updated for compatibility with WordPress 4.4 and PHP v7.0. Note that s2Member and s2Member Pro also remain compatible with WordPress 4.3 and PHP 5.2. However, PHP 5.5+ is strongly recommended.
checksum.txt CHANGED
@@ -1 +1 @@
1
- 95ca15ddfbbd89600e1ac81f5ac3e577
1
+ 35a15209842402cdccb9dd5222d6bd47
includes/classes/menu-pages.inc.php CHANGED
@@ -154,6 +154,9 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
154
  if(apply_filters('ws_plugin__s2member_during_add_admin_options_add_start_page', TRUE, get_defined_vars()))
155
  add_submenu_page($menu, 'Getting Started w/ s2Member', 'Getting Started', 'create_users', 'ws-plugin--s2member-start', 'c_ws_plugin__s2member_menu_pages::start_page');
156
 
 
 
 
157
  if(apply_filters('ws_plugin__s2member_during_add_admin_options_add_divider_1', TRUE, get_defined_vars()))
158
  add_submenu_page($menu, '', '<span style="display:block; margin:1px 0 1px -5px; padding:0; height:1px; line-height:1px; background:#CCCCCC;"></span>', 'create_users', '#');
159
 
@@ -510,6 +513,21 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
510
  do_action('ws_plugin__s2member_after_start_page', get_defined_vars());
511
  }
512
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
513
  /**
514
  * Builds and handles the Main Multisite Options page.
515
  *
154
  if(apply_filters('ws_plugin__s2member_during_add_admin_options_add_start_page', TRUE, get_defined_vars()))
155
  add_submenu_page($menu, 'Getting Started w/ s2Member', 'Getting Started', 'create_users', 'ws-plugin--s2member-start', 'c_ws_plugin__s2member_menu_pages::start_page');
156
 
157
+ if(apply_filters('ws_plugin__s2member_during_add_admin_options_add_help_page', !is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site (), get_defined_vars()))
158
+ add_submenu_page($menu, 'Getting Help w/ s2Member', 'Getting Help', 'create_users', 'ws-plugin--s2member-help', 'c_ws_plugin__s2member_menu_pages::help_page');
159
+
160
  if(apply_filters('ws_plugin__s2member_during_add_admin_options_add_divider_1', TRUE, get_defined_vars()))
161
  add_submenu_page($menu, '', '<span style="display:block; margin:1px 0 1px -5px; padding:0; height:1px; line-height:1px; background:#CCCCCC;"></span>', 'create_users', '#');
162
 
513
  do_action('ws_plugin__s2member_after_start_page', get_defined_vars());
514
  }
515
 
516
+ /**
517
+ * Builds and handles the Getting Help page.
518
+ *
519
+ * @package s2Member\Menu_Pages
520
+ * @since 151218
521
+ */
522
+ public static function help_page()
523
+ {
524
+ do_action('ws_plugin__s2member_before_help_page', get_defined_vars());
525
+
526
+ include_once dirname(dirname(__FILE__)).'/menu-pages/help.inc.php';
527
+
528
+ do_action('ws_plugin__s2member_after_help_page', get_defined_vars());
529
+ }
530
+
531
  /**
532
  * Builds and handles the Main Multisite Options page.
533
  *
includes/classes/mms-patches.inc.php CHANGED
@@ -88,9 +88,9 @@ if (!class_exists ("c_ws_plugin__s2member_mms_patches"))
88
  else // Otherwise, we need to report that /wp-login.php could NOT be updated. Possibly a permissions error.
89
  ($display_notices) ? c_ws_plugin__s2member_admin_notices::display_admin_notice ('Your <code>/wp-login.php</code> file could NOT be patched. File NOT writable.', true) : null;
90
 
91
- $load_file = ABSPATH . WPINC . "/load.php";
92
- $load_section = "/([\r\n\t\s ]+)(if( *?)\(( *?)empty( *?)\(( *?)\\\$active_plugins( *?)\)( *?)\|\|( *?)defined( *?)\(( *?)['\"]WP_INSTALLING['\"]( *?)\)( *?)\))/";
93
- $load_replace = "\n\n\t// Modified for full plugin compatiblity.\n\t//if ( empty( \$active_plugins ) || defined( 'WP_INSTALLING' ) )\n\tif ( empty( \$active_plugins ) || ( defined( 'WP_INSTALLING' ) && !preg_match(\"/\/wp-activate\.php/\", \$_SERVER[\"REQUEST_URI\"]) ) )";
94
 
95
  if (file_exists ($load_file) && ($load = file_get_contents ($load_file)) && is_writable ($load_file))
96
  {
88
  else // Otherwise, we need to report that /wp-login.php could NOT be updated. Possibly a permissions error.
89
  ($display_notices) ? c_ws_plugin__s2member_admin_notices::display_admin_notice ('Your <code>/wp-login.php</code> file could NOT be patched. File NOT writable.', true) : null;
90
 
91
+ $load_file = ABSPATH . WPINC . "/load.php"; // WordPress v4.4 uses `wp_installing()` instead of `defined( 'WP_INSTALLING' )`
92
+ $load_section = "/([\r\n\t\s ]+)(if( *?)\(( *?)empty( *?)\(( *?)\\\$active_plugins( *?)\)( *?)\|\|( *?)(wp_installing\s*\(\s*\)|defined( *?)\(( *?)['\"]WP_INSTALLING['\"]( *?)\))( *?)\))/";
93
+ $load_replace = "\n\n\t// Modified for full plugin compatiblity.\n\t//if ( empty( \$active_plugins ) || wp_installing() )\n\tif ( empty( \$active_plugins ) || ( wp_installing() && !preg_match(\"/\/wp-activate\.php/\", \$_SERVER[\"REQUEST_URI\"]) ) )";
94
 
95
  if (file_exists ($load_file) && ($load = file_get_contents ($load_file)) && is_writable ($load_file))
96
  {
includes/classes/sc-paypal-button-e.inc.php CHANGED
@@ -77,7 +77,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_e"))
77
  $default_image = "https://www.paypal.com/" . (($attr["lang"]) ? $attr["lang"] : _x ("en_US", "s2member-front paypal-button-lang-code", "s2member")) . "/i/btn/btn_xpressCheckout.gif";
78
 
79
  $code = preg_replace ("/\<img[^\>]+\>/i", "", $code); // Remove 1x1 pixel tracking image that PayPal sticks in there.
80
- $code = preg_replace ("/(\<input)([^\>]+)(\>)/ie", "'\\1'.rtrim(stripslashes('\\2'),'/').' /\\3'", $code); // Use XHTML!
81
 
82
  $code = ($attr["image"] && $attr["image"] !== "default") ? preg_replace ('/ src\="(.*?)"/', ' src="' . c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["image"])) . '"', $code) : preg_replace ('/ src\="(.*?)"/', ' src="' . c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($default_image)) . '"', $code);
83
 
@@ -92,5 +92,10 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_e"))
92
  // Instead, use: `ws_plugin__s2member_sc_paypal_button`.
93
  return $code; // Button Code. Possibly w/ API encryption now.
94
  }
 
 
 
 
 
95
  }
96
  }
77
  $default_image = "https://www.paypal.com/" . (($attr["lang"]) ? $attr["lang"] : _x ("en_US", "s2member-front paypal-button-lang-code", "s2member")) . "/i/btn/btn_xpressCheckout.gif";
78
 
79
  $code = preg_replace ("/\<img[^\>]+\>/i", "", $code); // Remove 1x1 pixel tracking image that PayPal sticks in there.
80
+ $code = preg_replace_callback ("/(\<input)([^\>]+)(\>)/i", "c_ws_plugin__s2member_sc_paypal_button_e::_sc_paypal_button_encryption_preg_replace_xhtml_callback", $code);
81
 
82
  $code = ($attr["image"] && $attr["image"] !== "default") ? preg_replace ('/ src\="(.*?)"/', ' src="' . c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["image"])) . '"', $code) : preg_replace ('/ src\="(.*?)"/', ' src="' . c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($default_image)) . '"', $code);
83
 
92
  // Instead, use: `ws_plugin__s2member_sc_paypal_button`.
93
  return $code; // Button Code. Possibly w/ API encryption now.
94
  }
95
+
96
+ public static function _sc_paypal_button_encryption_preg_replace_xhtml_callback($m)
97
+ {
98
+ return $m[1].rtrim($m[2], " /\t\n\r\0\x0B").' /'.$m[3];
99
+ }
100
  }
101
  }
includes/classes/user-deletions.inc.php CHANGED
@@ -125,6 +125,7 @@ if(!class_exists('c_ws_plugin__s2member_user_deletions'))
125
  delete_user_option($user_id, 's2member_first_payment_txn_id');
126
  delete_user_option($user_id, 's2member_last_payment_time');
127
  delete_user_option($user_id, 's2member_auto_eot_time');
 
128
 
129
  delete_user_option($user_id, 's2member_file_download_access_arc');
130
  delete_user_option($user_id, 's2member_file_download_access_log');
125
  delete_user_option($user_id, 's2member_first_payment_txn_id');
126
  delete_user_option($user_id, 's2member_last_payment_time');
127
  delete_user_option($user_id, 's2member_auto_eot_time');
128
+ delete_user_option($user_id, 's2member_reminders_enable');
129
 
130
  delete_user_option($user_id, 's2member_file_download_access_arc');
131
  delete_user_option($user_id, 's2member_file_download_access_log');
includes/classes/users-list-in.inc.php CHANGED
@@ -205,6 +205,19 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
205
 
206
  if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
207
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
209
  do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reset_pass_resend", get_defined_vars());
210
  unset($__refs, $__v);
@@ -478,6 +491,9 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
478
  if(isset($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) && isset($auto_eot_time))
479
  update_user_option($user_id, "s2member_auto_eot_time", $auto_eot_time);
480
 
 
 
 
481
  if(isset($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
482
  {
483
  foreach($user->allcaps as $cap => $cap_enabled)
205
 
206
  if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
207
  {
208
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
209
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reminders_enable", get_defined_vars());
210
+ unset($__refs, $__v);
211
+
212
+ echo '<tr>'."\n";
213
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-reminders-enable-yes">Enable Reminder Emails?</label> <a href="#" onclick="alert(\'This setting applies only if you have configured reminder email notifications in s2Member; e.g., EOT Renewal/Reminder Emails or NPT Renewal/Reminder Emails.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
214
+ echo '<td><label><input type="radio" name="ws_plugin__s2member_profile_s2member_reminders_enable" id="ws-plugin--s2member-profile-s2member-reminders-enable-yes" value="1"'.((string)get_user_option('s2member_reminders_enable', $user_id) !== '0' ? ' checked' : '').' /> Yes</label> &nbsp;&nbsp;&nbsp; <label><input type="radio" name="ws_plugin__s2member_profile_s2member_reminders_enable" id="ws-plugin--s2member-profile-s2member-reminders-enable-no" value="0"'.((string)get_user_option('s2member_reminders_enable', $user_id) === '0' ? ' checked' : '').' /> No (exclude)</label></td>'."\n";
215
+ echo '</tr>'."\n";
216
+
217
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
218
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_reminders_enable", get_defined_vars());
219
+ unset($__refs, $__v);
220
+
221
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
222
  do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reset_pass_resend", get_defined_vars());
223
  unset($__refs, $__v);
491
  if(isset($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) && isset($auto_eot_time))
492
  update_user_option($user_id, "s2member_auto_eot_time", $auto_eot_time);
493
 
494
+ if(isset($_p["ws_plugin__s2member_profile_s2member_reminders_enable"]))
495
+ update_user_option($user_id, "s2member_reminders_enable", (string)(int)$_p["ws_plugin__s2member_profile_s2member_reminders_enable"]);
496
+
497
  if(isset($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
498
  {
499
  foreach($user->allcaps as $cap => $cap_enabled)
includes/menu-pages/code-samples/mms-patch-load.x-php CHANGED
@@ -1,4 +1,4 @@
1
  // Modified for full plugin compatiblity.
2
- //if ( empty( $active_plugins ) || defined( 'WP_INSTALLING' ) )
3
- if ( empty( $active_plugins ) || ( defined( 'WP_INSTALLING' ) && !preg_match("/\/wp-activate\.php/", $_SERVER["REQUEST_URI"]) ) )
4
- return $plugins;
1
  // Modified for full plugin compatiblity.
2
+ //if ( empty( $active_plugins ) || wp_installing() )
3
+ if ( empty( $active_plugins ) || ( wp_installing() && !preg_match("/\/wp-activate\.php/", $_SERVER["REQUEST_URI"]) ) )
4
+ return $plugins;
includes/menu-pages/help.inc.php ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Getting Help.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Menu_Pages
15
+ * @since 151218
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit ("Do not access this file directly.");
19
+
20
+ if (!class_exists ("c_ws_plugin__s2member_menu_page_help"))
21
+ {
22
+ /**
23
+ * Getting Help.
24
+ *
25
+ * @package s2Member\Menu_Pages
26
+ * @since 151218
27
+ */
28
+ class c_ws_plugin__s2member_menu_page_help
29
+ {
30
+ public function __construct ()
31
+ {
32
+ echo '<div class="wrap ws-menu-page">' . "\n";
33
+
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Getting Help w/ s2Member®</h2>' . "\n";
39
+
40
+ echo '<table class="ws-menu-page-table">' . "\n";
41
+ echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
42
+ echo '<tr class="ws-menu-page-table-tr">' . "\n";
43
+ echo '<td class="ws-menu-page-table-l">' . "\n";
44
+
45
+ do_action("ws_plugin__s2member_during_help_page_before_left_sections", get_defined_vars ());
46
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_before_help", get_defined_vars ());
47
+
48
+ echo '<div class="ws-menu-page-group" title="Getting Help w/ s2Member" default-state="open">' . "\n";
49
+
50
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-help">' . "\n";
51
+ echo '<p>s2Member is pretty easy to setup and install initially. Most of the official documentation is right here in your Dashboard (i.e., there is a lot of inline documentation built into the software). That being said, it can take some time to master everything there is to know about s2Member\'s advanced features. If you need assistance with s2Member, please search the <a href="http://s2member.com/kb/" target="_blank" rel="external">s2Member Knowledge Base</a>, <a href="http://s2member.com/videos/" target="_blank" rel="external">Video Tutorials</a>, <a href="http://s2member.com/forums/" target="_blank" rel="external">Forums</a> and <a href="http://s2member.com/r/codex/" target="_blank" rel="external">Codex</a>. If you are planning to do something creative with s2Member, you might want to <a href="http://jobs.wordpress.net" target="_blank" rel="external">hire a freelance developer</a> to assist you.</p>' . "\n";
52
+ echo '<p><strong>See also:</strong> <a href="http://s2member.com/r/common-troubleshooting-tips/" target="_blank" rel="external">s2Member Troubleshooting Guide</a> (please read this first if you\'re having trouble).</p>'."\n";
53
+
54
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
55
+
56
+ echo '<h3 style="margin-bottom:0;">Testing Server Compatibility</h3>'."\n";
57
+ echo '<p>Please download the <a href="http://s2member.com/r/server-scanner-info/">s2Member Server Scanner</a>. Unzip, upload via FTP; then open in a browser for a full report.</p>'."\n";
58
+
59
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
60
+
61
+ echo '<h3 style="margin-bottom:0;">Troubleshooting Payment Gateway Integrations</h3>'."\n";
62
+ echo '<p>Please use s2Member\'s <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Viewer</a>. Log files can be very helpful.</p>'."\n";
63
+
64
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
65
+
66
+ echo '<h3 style="margin-bottom:0;">Search s2Member KB Articles<em>!</em></h3>'."\n";
67
+ echo '<form method="get" action="http://s2member.com/kb/" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';" autocomplete="off">'."\n";
68
+ echo '<p><input type="text" name="kb_q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /> <input type="submit" value="Search" style="font-size:120%; font-weight:normal;" /></p>'."\n";
69
+ echo '</form>'."\n";
70
+
71
+ do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_help", get_defined_vars ());
72
+
73
+ echo '</div>' . "\n";
74
+
75
+ echo '</div>' . "\n";
76
+
77
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_after_help", get_defined_vars ());
78
+
79
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_before_support", get_defined_vars ());
80
+
81
+ echo '<div class="ws-menu-page-group" title="s2Member Tech. Support (for Pro Customers)" default-state="open">' . "\n";
82
+
83
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-support">' . "\n";
84
+ echo '<p style="max-width:900px;">Support for s2Member® is provided by WebSharks, Inc. Our customer support representatives are available Monday through Friday, excluding all major holidays. Or, you can discuss problems/solutions with others in our <a href="https://wordpress.org/support/plugin/s2member" target="_blank" rel="external">public community forum</a>.</p>'."\n";
85
+
86
+ echo '<ul>'."\n";
87
+ echo '<li>For pre-sale questions please see: <a href="http://s2member.com/kb/kb-tag/pre-sale-faqs/" target="_blank" rel="external">Pre-Sale FAQs</a>.</li>'."\n";
88
+ echo '<li>For installation instructions, please see: <a href="http://s2member.com/installation/" target="_blank" rel="external">Installing/Updating s2Member & s2Member Pro</a>.</li>'."\n";
89
+ echo '<li>For troubleshooting (and documentation) please <a href="http://s2member.com/kb/" target="_blank" rel="external">search our Knowledge Base</a>.</li>'."\n";
90
+ echo '<li>Paying customers in need of assistance may <a href="http://s2member.com/r/new-trouble-ticket/" target="_blank" rel="external">submit a trouble ticket</a>.</li>'."\n";
91
+ echo '<li>If you have other questions, please <a href="http://s2member.com/r/new-pre-sale-inquiry/" target="_blank" rel="external">contact our sales dept</a>.</li>'."\n";
92
+ echo '</ul>'."\n";
93
+
94
+ do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_support", get_defined_vars ());
95
+
96
+ echo '</div>' . "\n";
97
+
98
+ echo '</div>' . "\n";
99
+
100
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_after_support", get_defined_vars ());
101
+
102
+ if (apply_filters("ws_plugin__s2member_during_help_page_during_left_sections_display_pro", !c_ws_plugin__s2member_utils_conds::pro_is_installed(), get_defined_vars ()))
103
+ {
104
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_before_pro", get_defined_vars ());
105
+
106
+ echo '<div class="ws-menu-page-group" title="Upgrading to s2Member Pro<em>!</em>" default-state="open">' . "\n";
107
+
108
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-pro">' . "\n";
109
+ echo '<p>Among many other features/enhancements, <a href="http://s2member.com/" target="_blank" rel="external">s2Member Pro</a> comes pre-integrated with additional payment gateways that work with s2Member Pro-Forms (a powerful s2Member Pro feature). For instance, Stripe (most popular; also supports Bitcoin), PayPal Payments Pro, and Authorize.Net. Each of these payment gateways allow you to accept most major credit cards on-site; i.e., customers never leave your site! s2Member Pro-Forms also support PayPal Express Checkout (if you integrate with PayPal Pro); for customers who actually prefer to pay with PayPal.</p>' . "\n";
110
+ echo '<p><strong>Learn more here:</strong> <a href="http://s2member.com/features/" target="_blank" rel="external">s2Member Pro Features</a></p>'."\n";
111
+ do_action("ws_plugin__s2member_during_help_page_during_left_sections_during_pro", get_defined_vars ());
112
+ echo '</div>' . "\n";
113
+
114
+ echo '</div>' . "\n";
115
+
116
+ do_action("ws_plugin__s2member_during_start_page_during_left_sections_after_pro", get_defined_vars ());
117
+ }
118
+ do_action("ws_plugin__s2member_during_help_page_after_left_sections", get_defined_vars ());
119
+
120
+ echo '</td>' . "\n";
121
+
122
+ echo '<td class="ws-menu-page-table-r">' . "\n";
123
+ c_ws_plugin__s2member_menu_pages_rs::display ();
124
+ echo '</td>' . "\n";
125
+
126
+ echo '</tr>' . "\n";
127
+ echo '</tbody>' . "\n";
128
+ echo '</table>' . "\n";
129
+
130
+ echo '</div>' . "\n";
131
+ }
132
+ }
133
+ }
134
+
135
+ new c_ws_plugin__s2member_menu_page_help ();
includes/menu-pages/logs.inc.php CHANGED
@@ -44,40 +44,6 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
44
 
45
  do_action("ws_plugin__s2member_during_logs_page_before_left_sections", get_defined_vars());
46
 
47
- if(apply_filters("ws_plugin__s2member_during_logs_page_during_left_sections_display_help", TRUE, get_defined_vars()))
48
- {
49
- do_action("ws_plugin__s2member_during_logs_page_during_left_sections_before_help", get_defined_vars());
50
-
51
- echo '<div class="ws-menu-page-group" title="Getting Help">'."\n";
52
-
53
- echo '<div class="ws-menu-page-section ws-plugin--s2member-help">'."\n";
54
- echo '<h3>Getting Help w/ s2Member (Troubleshooting)</h3>'."\n";
55
- echo '<p>s2Member is pretty easy to setup and install initially. Most of the official documentation is right here in your Dashboard (i.e., there is a lot of inline documentation built into the software). That being said, it can take some time to master everything there is to know about s2Member\'s advanced features. If you need assistance with s2Member, please search the <a href="http://s2member.com/kb/" target="_blank" rel="external">s2Member Knowledge Base</a>, <a href="http://www.s2member.com/videos/" target="_blank" rel="external">Video Tutorials</a>, <a href="http://www.s2member.com/forums/" target="_blank" rel="external">Forums</a> and <a href="http://www.s2member.com/codex/" target="_blank" rel="external">Codex</a>. If you are planning to do something creative with s2Member, you might want to <a href="http://jobs.wordpress.net" target="_blank" rel="external">hire a freelance developer</a> to assist you.</p>'."\n";
56
- echo '<p><strong>See also:</strong> <a href="http://www.s2member.com/kb/common-troubleshooting-tips/" target="_blank" rel="external">s2Member Troubleshooting Guide</a> (please read this first if you\'re having trouble).</p>'."\n";
57
-
58
- echo '<div class="ws-menu-page-hr"></div>'."\n";
59
-
60
- echo '<h3 style="margin-bottom:0;">Testing Server Compatibility</h3>'."\n";
61
- echo '<p>Please download the <a href="http://www.s2member.com/r/server-check-tool/">s2Member Server Scanner</a>. Unzip, upload via FTP; then open in a browser for a full report.</p>'."\n";
62
-
63
- echo '<div class="ws-menu-page-hr"></div>'."\n";
64
-
65
- echo '<h3 style="margin-bottom:0;">Troubleshooting Payment Gateway Integrations</h3>'."\n";
66
- echo '<p>Please use the s2Member Log Viewer (below). Log files can be very helpful.</p>'."\n";
67
-
68
- echo '<div class="ws-menu-page-hr"></div>'."\n";
69
-
70
- echo '<h3 style="margin-bottom:0;">Search s2Member KB Articles<em>!</em></h3>'."\n";
71
- echo '<form method="get" action="http://s2member.com/kb/" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';" autocomplete="off">'."\n";
72
- echo '<p><input type="text" name="kb_q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /> <input type="submit" value="Search" style="font-size:120%; font-weight:normal;" /></p>'."\n";
73
- echo '</form>'."\n";
74
-
75
- do_action("ws_plugin__s2member_during_logs_page_during_left_sections_during_help", get_defined_vars());
76
- echo '</div>'."\n";
77
- echo '</div>'."\n";
78
-
79
- do_action("ws_plugin__s2member_during_logs_page_during_left_sections_after_help", get_defined_vars());
80
- }
81
  if(apply_filters("ws_plugin__s2member_during_logs_page_during_left_sections_display_log_settings", TRUE, get_defined_vars()))
82
  {
83
  do_action("ws_plugin__s2member_during_logs_page_during_left_sections_before_log_settings", get_defined_vars());
44
 
45
  do_action("ws_plugin__s2member_during_logs_page_before_left_sections", get_defined_vars());
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  if(apply_filters("ws_plugin__s2member_during_logs_page_during_left_sections_display_log_settings", TRUE, get_defined_vars()))
48
  {
49
  do_action("ws_plugin__s2member_during_logs_page_during_left_sections_before_log_settings", get_defined_vars());
includes/menu-pages/start.inc.php CHANGED
@@ -246,7 +246,6 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
246
  echo '<div class="ws-menu-page-group" title="Upgrading to s2Member Pro<em>!</em>" default-state="open">' . "\n";
247
 
248
  echo '<div class="ws-menu-page-section ws-plugin--s2member-pro">' . "\n";
249
- echo '<h3>s2Member Pro—A Recommended Upgrade</h3>' . "\n";
250
  echo '<p>Among many other features/enhancements, <a href="http://s2member.com/" target="_blank" rel="external">s2Member Pro</a> comes pre-integrated with additional payment gateways that work with s2Member Pro-Forms (a powerful s2Member Pro feature). For instance, Stripe (most popular; also supports Bitcoin), PayPal Payments Pro, and Authorize.Net. Each of these payment gateways allow you to accept most major credit cards on-site; i.e., customers never leave your site! s2Member Pro-Forms also support PayPal Express Checkout (if you integrate with PayPal Pro); for customers who actually prefer to pay with PayPal.</p>' . "\n";
251
  echo '<p><strong>Learn more here:</strong> <a href="http://s2member.com/features/" target="_blank" rel="external">s2Member Pro Features</a></p>'."\n";
252
  do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_pro", get_defined_vars ());
@@ -257,40 +256,6 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
257
  do_action("ws_plugin__s2member_during_start_page_during_left_sections_after_pro", get_defined_vars ());
258
  }
259
 
260
- if (apply_filters("ws_plugin__s2member_during_start_page_during_left_sections_display_help", (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()), get_defined_vars ()))
261
- {
262
- do_action("ws_plugin__s2member_during_start_page_during_left_sections_before_help", get_defined_vars ());
263
-
264
- echo '<div class="ws-menu-page-group" title="Getting Help w/ s2Member" default-state="open">' . "\n";
265
-
266
- echo '<div class="ws-menu-page-section ws-plugin--s2member-help">' . "\n";
267
- echo '<p>s2Member is pretty easy to setup and install initially. Most of the official documentation is right here in your Dashboard (i.e., there is a lot of inline documentation built into the software). That being said, it can take some time to master everything there is to know about s2Member\'s advanced features. If you need assistance with s2Member, please search the <a href="http://s2member.com/kb/" target="_blank" rel="external">s2Member Knowledge Base</a>, <a href="http://s2member.com/videos/" target="_blank" rel="external">Video Tutorials</a>, <a href="http://s2member.com/forums/" target="_blank" rel="external">Forums</a> and <a href="http://s2member.com/r/codex/" target="_blank" rel="external">Codex</a>. If you are planning to do something creative with s2Member, you might want to <a href="http://jobs.wordpress.net" target="_blank" rel="external">hire a freelance developer</a> to assist you.</p>' . "\n";
268
- echo '<p><strong>See also:</strong> <a href="http://s2member.com/r/common-troubleshooting-tips/" target="_blank" rel="external">s2Member Troubleshooting Guide</a> (please read this first if you\'re having trouble).</p>'."\n";
269
-
270
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
271
-
272
- echo '<h3 style="margin-bottom:0;">Testing Server Compatibility</h3>'."\n";
273
- echo '<p>Please download the <a href="http://s2member.com/r/server-scanner-info/">s2Member Server Scanner</a>. Unzip, upload via FTP; then open in a browser for a full report.</p>'."\n";
274
-
275
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
276
-
277
- echo '<h3 style="margin-bottom:0;">Troubleshooting Payment Gateway Integrations</h3>'."\n";
278
- echo '<p>Please use s2Member\'s <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Viewer</a>. Log files can be very helpful.</p>'."\n";
279
-
280
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
281
-
282
- echo '<h3 style="margin-bottom:0;">Search s2Member KB Articles<em>!</em></h3>'."\n";
283
- echo '<form method="get" action="http://s2member.com/kb/" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';" autocomplete="off">'."\n";
284
- echo '<p><input type="text" name="kb_q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /> <input type="submit" value="Search" style="font-size:120%; font-weight:normal;" /></p>'."\n";
285
- echo '</form>'."\n";
286
-
287
- do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_help", get_defined_vars ());
288
- echo '</div>' . "\n";
289
- echo '</div>' . "\n";
290
-
291
- do_action("ws_plugin__s2member_during_start_page_during_left_sections_after_help", get_defined_vars ());
292
- }
293
-
294
  do_action("ws_plugin__s2member_during_start_page_after_left_sections", get_defined_vars ());
295
 
296
  echo '</td>' . "\n";
246
  echo '<div class="ws-menu-page-group" title="Upgrading to s2Member Pro<em>!</em>" default-state="open">' . "\n";
247
 
248
  echo '<div class="ws-menu-page-section ws-plugin--s2member-pro">' . "\n";
 
249
  echo '<p>Among many other features/enhancements, <a href="http://s2member.com/" target="_blank" rel="external">s2Member Pro</a> comes pre-integrated with additional payment gateways that work with s2Member Pro-Forms (a powerful s2Member Pro feature). For instance, Stripe (most popular; also supports Bitcoin), PayPal Payments Pro, and Authorize.Net. Each of these payment gateways allow you to accept most major credit cards on-site; i.e., customers never leave your site! s2Member Pro-Forms also support PayPal Express Checkout (if you integrate with PayPal Pro); for customers who actually prefer to pay with PayPal.</p>' . "\n";
250
  echo '<p><strong>Learn more here:</strong> <a href="http://s2member.com/features/" target="_blank" rel="external">s2Member Pro Features</a></p>'."\n";
251
  do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_pro", get_defined_vars ());
256
  do_action("ws_plugin__s2member_during_start_page_during_left_sections_after_pro", get_defined_vars ());
257
  }
258
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  do_action("ws_plugin__s2member_during_start_page_after_left_sections", get_defined_vars ());
260
 
261
  echo '</td>' . "\n";
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 151210\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2015-12-10 11:40:46+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -1128,12 +1128,12 @@ msgctxt "s2member-front"
1128
  msgid "`strong` (i.e., use numbers, letters, mixed caSe, and punctuation)"
1129
  msgstr ""
1130
 
1131
- #: s2member/includes/classes/users-list-in.inc.php:349
1132
  msgctxt "s2member-front"
1133
  msgid "Additional Profile Fields"
1134
  msgstr ""
1135
 
1136
- #: s2member/includes/classes/users-list-in.inc.php:349
1137
  msgctxt "s2member-front"
1138
  msgid "(for this site)"
1139
  msgstr ""
@@ -4265,7 +4265,7 @@ msgctxt "s2member-front"
4265
  msgid "My Profile Summary"
4266
  msgstr ""
4267
 
4268
- #: s2member-pro/s2member-pro/includes/classes/reminders.inc.php:232
4269
  msgid "0 / non-recurring"
4270
  msgstr ""
4271
 
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 151218\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2015-12-18 16:43:20+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
1128
  msgid "`strong` (i.e., use numbers, letters, mixed caSe, and punctuation)"
1129
  msgstr ""
1130
 
1131
+ #: s2member/includes/classes/users-list-in.inc.php:362
1132
  msgctxt "s2member-front"
1133
  msgid "Additional Profile Fields"
1134
  msgstr ""
1135
 
1136
+ #: s2member/includes/classes/users-list-in.inc.php:362
1137
  msgctxt "s2member-front"
1138
  msgid "(for this site)"
1139
  msgstr ""
4265
  msgid "My Profile Summary"
4266
  msgstr ""
4267
 
4268
+ #: s2member-pro/s2member-pro/includes/classes/reminders.inc.php:239
4269
  msgid "0 / non-recurring"
4270
  msgstr ""
4271
 
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 151210
4
- Stable tag: 151210
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -25,7 +25,7 @@ Tested up to PHP: 7.0
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
28
- Contributors: WebSharks, JasWSInc, anguz, raamdev, sitegeek, kristineds
29
 
30
  Author: s2Member® / WebSharks, Inc.
31
  Author URI: http://s2member.com/
@@ -169,12 +169,22 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
169
 
170
  == Upgrade Notice ==
171
 
172
- = v151210 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
 
 
 
 
 
 
 
 
 
 
178
  = v151210 =
179
 
180
  - (s2Member/s2Member Pro) **WP/PHP Compat:** Updated for compatibility with WordPress 4.4 and PHP v7.0. Note that s2Member and s2Member Pro also remain compatible with WordPress 4.3 and PHP 5.2. However, PHP 5.5+ is strongly recommended.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 151218
4
+ Stable tag: 151218
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
28
+ Contributors: WebSharks, JasWSInc, anguz, raamdev, sitegeek, KristineDS
29
 
30
  Author: s2Member® / WebSharks, Inc.
31
  Author URI: http://s2member.com/
169
 
170
  == Upgrade Notice ==
171
 
172
+ = v151218 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
178
+ = v151218 =
179
+
180
+ - (s2Member Pro) **Reminder Email Notification Exclusions:** It is now possible to enable/disable EOT Renewal/Reminder Email notifications on a per-user basis. You can edit a user's profile in the WP Dashboard and check "_No (exclude)_" to prevent specific users from receiving any reminder emails that you configured. Props at @patdumond @luisrock. See also [this GitHub issue](https://github.com/websharks/s2member/issues/816).
181
+
182
+ - (s2Member) **PHP v7 Compat.:** This release addresses one remaining issue with the `preg_replace` `/e` modifier as reported in [this GitHub issue](https://github.com/websharks/s2member/issues/811). Props @nerdworker for reporting. Thanks!
183
+
184
+ - (s2Member/s2Member Pro) **WP v4.4 Compat.:** This release corrects an issue that impacted sites attempting to run s2Member on a Multisite Network; i.e., it corrects a problem with the `load.php` patch against the latest release of WordPress. Props @crazycoolcam for reporting! See also [this GitHub issue](https://github.com/websharks/s2member/issues/812).
185
+
186
+ - (s2Member/s2Member Pro) **Getting Help:** This release adds a new menu page titled, "Getting Help w/ s2Member". This new section of your Dashboard provides quick & easy access to s2Member KB articles, suggestions, and our tech support department (for pro customers). Props @patdumond @raamdev. See also [this GitHub issue](https://github.com/websharks/s2member/issues/814).
187
+
188
  = v151210 =
189
 
190
  - (s2Member/s2Member Pro) **WP/PHP Compat:** Updated for compatibility with WordPress 4.4 and PHP v7.0. Note that s2Member and s2Member Pro also remain compatible with WordPress 4.3 and PHP 5.2. However, PHP 5.5+ is strongly recommended.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 151210
23
- Stable tag: 151210
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -81,7 +81,7 @@ if(!defined('WPINC')) // MUST have WordPress.
81
  * @var string
82
  */
83
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
84
- define('WS_PLUGIN__S2MEMBER_VERSION', '151210' /* !#distro-version#! */);
85
  /**
86
  * Minimum PHP version required to run s2Member.
87
  *
@@ -111,7 +111,7 @@ if(!defined('WS_PLUGIN__S2MEMBER_MIN_WP_VERSION'))
111
  * @var string
112
  */
113
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
114
- define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '151210' /* !#distro-version#! */);
115
  /*
116
  Several compatibility checks.
117
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 151218
23
+ Stable tag: 151218
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
81
  * @var string
82
  */
83
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
84
+ define('WS_PLUGIN__S2MEMBER_VERSION', '151218' /* !#distro-version#! */);
85
  /**
86
  * Minimum PHP version required to run s2Member.
87
  *
111
  * @var string
112
  */
113
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
114
+ define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '151218' /* !#distro-version#! */);
115
  /*
116
  Several compatibility checks.
117
  If all pass, load the s2Member plugin.