PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260927
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260927
260927 260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 All 190 releases
← All changes | readme.txt +883 -343 110710 → 260927 View file →
@@ -1,420 +1,960 @@
1 -=== s2Member® ( Membership w/ PayPal® ) ===
1 +=== s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions ===
2 2
3 -Version: 110710
4 -Stable tag: 110710
5 -Framework: WS-P-110523
3 +Plugin Name: s2Member Framework
4 +Plugin URI: https://s2member.com/
5 +Tags: membership, content restriction, paid subscriptions, members only, paid access
6 +Version: 260927
7 +Stable tag: 260927
8 +Tested up to: 7.2-alpha-63947
9 +Requires at least: 4.2
10 +Requires PHP: 5.6.2
11 +Tested up to PHP: 8.5.9
12 +License: GNU General Public License v2 or later.
13 +Contributors: WebSharks, JasWSInc, raamdev, clavaque, eduan
14 +Author: s2Member
15 +Author URI: https://s2member.com/
16 +Donate link: https://s2member.com/donate/
17 +Beta link: https://s2member.com/beta-testers/
18 +Forum URI: https://s2member.com/r/forum/
19 +Privacy URI: https://s2member.com/privacy-policy/
20 +Changelog URI: https://s2member.com/changelog/
21 +Video Tutorials: https://s2member.com/r/s2member-videos/
22 +Knowledge Base: https://s2member.com/kb/
23 +More Updates: https://s2member.com/category/news-updates/
24 +Newsletter: https://s2member.com/r/subscribe/
25 +PayPal Pro Integration: https://s2member.com/r/pp-account-types/
26 +Text Domain: s2member
27 +Domain Path: /languages
6 28
7 -SSL Compatible: yes
8 -bbPress Compatible: yes
9 -WordPress Compatible: yes
10 -BuddyPress Compatible: yes
11 -WP Multisite Compatible: yes
12 -Multisite Blog Farm Compatible: yes
29 +❤️ Excellent membership plugin! Easy, quick, flexible. Monetize your site with memberships and subscriptions. Protect content instantly and securely.
13 30
14 -PayPal® Standard Compatible: yes
15 -PayPal® Pro Compatible: w/ s2Member Pro
16 -Google® Checkout Compatible: w/ s2Member Pro
17 -Authorize.Net® Compatible: w/ s2Member Pro
18 -ClickBank® Compatible: w/ s2Member Pro
19 -AliPay® Compatible: w/ s2Member Pro
20 -ccBill® Compatible: w/ s2Member Pro
31 +== Description ==
21 32
22 -Tested up to: 3.2
23 -Requires at least: 3.1
24 -Requires: WordPress® 3.1+, PHP 5.2.3+
33 +❤️ **Excellent membership plugin!** Over 15 years of experience, development, releases... Still going and growing!
25 34
26 -Copyright: © 2009 WebSharks, Inc.
27 -License: GNU General Public License
28 -Contributors: WebSharks, PriMoThemes
29 -Author URI: http://www.primothemes.com/
30 -Author: PriMoThemes.com / WebSharks, Inc.
31 -Donate link: http://www.primothemes.com/donate/
35 +**Start your membership profits!** Build your tribe, gather your followers, enroll your students, bring in your clients!
32 36
33 -Plugin Name: s2Member
34 -Video Tutorials: http://www.s2member.com/videos/
35 -Pro Module / Prices: http://www.s2member.com/prices/
36 -Forum URI: http://www.primothemes.com/forums/viewforum.php?f=4
37 -Privacy URI: http://www.primothemes.com/about/privacy-policy/
38 -PayPal Pro Integration: http://www.primothemes.com/forums/viewtopic.php?f=4&t=304
39 -Professional Installation URI: http://www.s2member.com/professional-installation/
40 -Plugin URI: http://www.primothemes.com/post/product/s2member-membership-plugin-with-paypal/
41 -Description: s2Member® (Membership w/ PayPal®). Powerful (free) membership capabilities. Protect/secure members only content w/ roles/capabilities for members.
42 -Tags: membership, members, member, register, signup, paypal, paypal pro, pay pal, s2member, authorize.net, google checkout, ccbill, clickbank, alipay, subscriber, members only, buddypress, buddy press, buddy press compatible, shopping cart, checkout, api, options panel included, websharks framework, w3c validated code, includes extensive documentation, highly extensible
37 +💵 Enjoy the benefits of getting paid repeatedly for access to your site!
43 38
44 -s2Member® (Membership w/ PayPal®). Powerful (free) membership capabilities. Protect/secure members only content w/ roles/capabilities for members.
39 +⭐⭐⭐⭐⭐ _**Brilliant** "So glad I found this. It works brilliantly for our needs... love the seamless integration with PayPal. Everything we need. Thank you so much for creating this!" -[zarverk2000](https://wordpress.org/support/topic/brilliant-1268/)_
45 40
46 -== Installation ==
41 += The best way to make money from your WordPress site! =
47 42
48 -= s2Member is very easy to install ( instructions ) =
49 -1. Upload the `/s2member` folder to your `/wp-content/plugins/` directory.
50 -2. Activate the plugin through the `Plugins` menu in WordPress®.
51 -3. Navigate to the `s2Member Options` panel for configuration details.
43 +🤩 Sell **unlimited memberships**, turn free subscribers into members (_subscriber to member → s. 2 member → s2Member_), with a single payment or recurring payments subscriptions.
52 44
53 -= Upgrading to the latest version? =
54 -Please visit [this page](http://www.primothemes.com/forums/viewtopic.php?f=36&t=247) for [easy upgrade instructions](http://www.primothemes.com/forums/viewtopic.php?f=36&t=247).
45 +**Easy and quick to use.** Protect your membership content in a moment, and a moment later be ready to get payments for member access!
55 46
56 -= Is s2Member compatible with Multisite Networking ? =
57 -Yes. s2Member, and also s2Member Pro, are BOTH compatible with Multisite Networking enabled. After you enable Multisite Networking, install the s2Member plugin. Then navigate to `s2Member -> Multisite ( Config )` in the Dashboard on your ( Main Site ).
47 +**Easy to configure and very flexible.** Protect the whole site, nothing, or just parts, even member files for paid downloads!
58 48
59 -== Description ==
49 +👉 Install s2Member now and **make money!** 😀
60 50
61 -[youtube http://www.youtube.com/watch?v=FyA8Qmm2DHY /]
51 +https://youtu.be/qlKn-I-0W6U
62 52
63 -s2Member® (Membership w/ PayPal®). Powerful (free) membership capabilities. Protect members only content. The s2Member Framework (free) integrates w/ PayPal® (very easy), and fully supports recurring billing. s2Member supports custom Pages for registration (including Custom Registration Fields), account access, and a lot more. s2Member is now compatible with Multisite Networking too, and even with BuddyPress and bbPress. In addition, with the s2Member Pro Module (an optional paid upgrade), you can add support for unlimited Membership Levels, PayPal® Pro (w/ Pro Forms), Authorize.Net® (w/ Pro Forms), ccBill®, Google® Checkout, ClickBank®, AliPay®, advanced User Import/Export tools, the ability to use Coupon Codesm, and more. Videos available at: [s2Member.com / Videos](http://www.s2member.com/videos/).
53 +⭐⭐⭐⭐⭐ _**So much capacity & great support** "I’m a novice and was able to quickly figure it out. When I got stuck I go to the support forum and Cristian is there with a quick answer to get me going again." -[blueruck](https://wordpress.org/support/topic/so-much-capacity-great-support/)_
64 54
65 -s2Member supports Free Subscribers (at Level #0), and four primary Membership Levels [1-4] (unlimited with s2Member Pro). You can label your Membership Levels anything you like. The defaults are Free, Bronze, Silver, Gold, and Platinum. s2Member also supports an unlimited number of Custom Capability Packages. Custom Capabilities are an easy way to extend s2Member in creative ways. Custom Capabilities allow you to create an unlimited number of Membership Packages, all with different Capabilities and prices.
55 +⭐⭐⭐⭐⭐ _**The very best plugin and support service** "Great plugin, neat, easy to configure, and with interesting security features. A special mention to Cristian whose support is awesome, fast, clear even to free members like myself" -[aflorarte](https://wordpress.org/support/topic/the-very-best-plugin-and-support-service/)_
66 56
67 -s2Member allows you to protect Pages, Posts, Tags, Categories, URIs, URI word fragments, URI Replacement Codes for BuddyPress, Specific Post/Page "Buy Now" Access, and even portions of content within Posts/Pages/themes/plugins. Everything is configurable through the s2Member Options Panel. This makes s2Member VERY easy to integrate into any WordPress® site. With s2Member, you can also protect downloadable files, using restrictions to control how many downloads can occur within a certain amount of time; all based on Membership Level. sMember also integrates with Amazon® S3 (optional).
57 +**Packed with features**, but not required to use them all, just those you want. Some of them:
68 58
69 -Each Membership Level can have different restrictions, and you could even integrate Conditionals within your content based on Member Level, or on Custom Capabilities. Both Simple (Shortcode) and Advanced (PHP) code samples are provided under `s2Member -> API Scripting`. s2Member has been fully integrated with Roles/Capabilities; already built into WordPress®. It is designed to be completely seamless, without code bloat. We've carefully structured the entire framework, in order to maximize s2Member's ability to operate with other plugins installed. For instance, s2Member is also compatible with BuddyPress; and can even be used to protect forums powered by bbPress.
59 +➡️ Member user levels and custom access capabilities
60 +➡️ Membership content protection (post, page, category, tag, etc)
61 +➡️ Protect anything served by WP (post types, URLs)
62 +➡️ Member file protection (sell downloads)
63 +➡️ Prevent member account sharing (limit IPs, simultaneous logins)
64 +➡️ Protect accounts (limit failed login attempts)
65 +➡️ Cool security/trust badge with your domain
66 +➡️ PayPal Standard buttons for membership payments (more in Pro)
67 +➡️ Automatic member access demotion at end of paid access time
68 +➡️ Tracking software integration (affiliates, etc)
69 +➡️ Email list services (Mailchimp, etc)
70 +➡️ Notifications (signups, payments, etc)
71 +➡️ Integrate with bbPress, BuddyPress for member communities
72 +➡️ Compatible with any well coded theme (Elementor, Divi, etc)
73 +➡️ Customize the WP login/registration look
74 +➡️ Custom redirection after member login
75 +➡️ Create custom profile fields for member accounts
76 +➡️ Customize the user welcome email
77 +➡️ And more!
70 78
71 -You can also sell Specific Post/Page Access (membership not required), using "Buy Now" buttons. You can even package multiple Posts/Pages together into one "Buy Now" transaction. Further details are provided under `s2Member -> PayPal® Buttons -> Specific Posts/Pages`. Specific Post/Page Access, is like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress®. A Specific Post/Page protected by s2Member, might contain a download link for your eBook, access to file & music downloads, access to support services, and the list goes on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress® Post/Page. For instance, you might sell an existing Member an additional item (without affecting their current Membership plan).
79 +👉 Install and start using s2Member now! 🤩
72 80
73 -New! - [s2Member Pro](http://www.s2member.com/) is an add-on for the free version of s2Member. [s2Member Pro](http://www.s2member.com/) adds support for unlimited Membership Levels, PayPal® Pro (w/ Pro Forms), Authorize.Net® (w/ Pro Forms), ccBill®, Google® Checkout, ClickBank®, AliPay®, advanced User Import/Export tools, and the ability to use Coupon Codes. Videos available at: [s2Member.com / Videos](http://www.s2member.com/videos/).
81 +⭐⭐⭐⭐⭐ _**Very Powerful Membership Plugin** "This membership plugin does a lot and has many, many configuration options to achieve whatever you want... I received extremely quick and reliable support." -[liltrucks](https://wordpress.org/support/topic/very-powerful-membership-plugin/)_
74 82
83 +⭐⭐⭐⭐⭐ _**Simple, Compatible, Secure, and Versatile!** "We are seriously impressed with this plugin and we highly recommend it... We have not found ANY limitations to what we are trying to accomplish... a very smooth process... straight-forward and user-friendly!... exceeded our expectations!" -[tips4gamers](https://wordpress.org/support/topic/simple-compatible-secure-and-versatile/)_
84 +
85 +⭐⭐⭐⭐⭐ _**Excellent plugin** "This plugin does everything it says on the box. It does it well... the functionality is absolutely spot on. The developers/maintainers are also active and helpful. Totally recommended!" -[richardfoley](https://wordpress.org/support/topic/excellent-plugin-5188/)_
86 +
87 +⭐⭐⭐⭐⭐ _**Best Membership Plugin I’ve Used** "I switched to s2 Member around 3 years ago after trying a few plugins. I found these other plugins inflexible and difficult to configure... Well worth investigating if you want a robust membership solution." -[rnwhalley](https://wordpress.org/support/topic/best-membership-plugin-ive-used/)_
88 +
89 +🤖 Not needed to know any PHP code or be a developer. Only code needed is copy-paste wp shortcodes, like for the paypal buttons... But is also developer-friendly to customize your installation if wanted.
90 +
91 += Some reasons to get s2Member Pro =
92 +
93 +✅ Membership content dripping
94 +✅ Stripe, PayPal Pro, Authorize.Net, ClickBank
95 +✅ On-site one-step checkout with pro-forms (Stripe, PayPal, Auth.Net)
96 +✅ Unlimited membership levels
97 +✅ Membership renewal reminder emails
98 +✅ Single-step member registration and payment with pro-forms
99 +✅ Custom redirection after payment
100 +✅ Coupon codes and gift/redemption codes
101 +✅ Custom member offer redirections after login
102 +✅ Pro API for new integrations
103 +✅ Public members directory
104 +✅ Members bulk import/update/exporter
105 +✅ Multisite network support
106 +✅ Login and registration forms to use in pages/posts
107 +👉 [Click here for more](https://s2member.com/features/) 🙂
108 +
109 +⭐⭐⭐⭐⭐ _**The Best Membership Plugin** "I have built with most Membership plugins and literally dozens using S2 Pro and I can tell you, bar none it is the best of all of them. Extremely powerful, anything you might want to do it can do... I highly recommend you try it out." -[antwoords](https://wordpress.org/support/topic/the-best-membership-plugin-5/)_
110 +
111 +⭐⭐⭐⭐⭐ _**Excellent plugin & top support** "We’ve used s2member pro on a few projects now & find it has met all our membership needs. Most impressive has been the support. Excellent communication, knowledgeable, friendly and super patient 🙂" -[aaee6](https://wordpress.org/support/topic/excellent-plugin-top-support-3/)_
112 +
113 +⭐⭐⭐⭐⭐ _**Awesome Support** "I’ve been using s2Member for 9 years... Amazing support of a high-end plugin and much appreciated. This is one of the reasons I stick with s2Member. Support has always been great!" -[graphichome](https://wordpress.org/support/topic/awesome-support-712/)_
114 +
115 +⭐⭐⭐⭐⭐ _**Wonderful Support** "Above and beyond. I’ve used this plugin for over ten years with various clients and whenever I need help, they’ve helped find a solution." -[germars](https://wordpress.org/support/topic/wonderful-support-68/)_
116 +
117 +The free s2Member Framework integrates with PayPal Website Payments Standard (also free). Sell "Buy Now" or Membership access to your site. Restrict access to Roles, Capabilities, Posts, Pages, or anything else in WordPress.
118 +
119 +Protect your WordPress Posts, Pages, Tags, Categories, URIs, BuddyPress, bbPress, and even portions of content within Posts, Pages, themes, plugins. **Easily configurable and highly extensible.** You can even protect downloadable files and streaming audio/video. Store files locally, or use s2Member's integration with Amazon S3/CloudFront.
120 +
121 +s2Member is powered almost entirely by WordPress shortcodes, making advanced integrations quick and easy. Sell recurring (or non-recurring) subscriptions with lots of flexibility. Or sell "Buy Now" membership access in various ways. You can also sell specific Posts/Pages, sell member access to file downloads, or sell members Custom Capabilities that provide highly configurable access to specific portions of your content.
122 +
123 +👉 Install now s2Member and **start making money!** 😀
124 +
125 +== Installation ==
126 +
127 +**NOTICE:** For help with s2Member Pro, please use [our forum](http://s2member.com/r/forum/).
128 +
129 += s2Member is very easy to install =
130 +
131 +Just like any other normal plugin:
132 +
133 +- From the WP Admin's [Plugins Add New Screen](https://wordpress.org/support/article/plugins-add-new-screen/).
134 +- Or via FTP upload the `s2member` folder from the zip to your `/wp-content/plugins/` directory.
135 +- Activate it from **Plugins** page in your WordPress Admin.
136 +
137 +Here's a [quick-start video](https://www.youtube.com/watch?v=qlKn-I-0W6U) for a simple basic setup to get you started.
138 +
139 += See also =
140 +
141 +[Detailed installation/upgrade instructions](http://s2member.com/installation/).
142 +
143 += Is s2Member compatible with Multisite Networking? =
144 +
145 +Yes, requires s2Member Pro for Unlimited Sites. After you enable Multisite Networking, with s2Member Framework and Pro active, navigate to `s2Member → Multisite (Config)` in the Dashboard on your Main Site.
146 +
75 147 == Screenshots ==
76 148
77 -1. s2Member / Screenshot #1
78 -2. s2Member / Screenshot #2
79 -3. s2Member / Screenshot #3
80 -4. s2Member / Screenshot #4
81 -5. s2Member / Screenshot #5
82 -6. s2Member / Screenshot #6
83 -7. s2Member / Screenshot #7
84 -8. s2Member / Screenshot #8
85 -9. s2Member / Screenshot #9
86 -10. s2Member / Screenshot #10
149 +1. s2Member Screenshot #1
150 +2. s2Member Screenshot #2
151 +3. s2Member Screenshot #3
152 +4. s2Member Screenshot #4
153 +5. s2Member Screenshot #5
154 +6. s2Member Screenshot #6
155 +7. s2Member Screenshot #7
87 156
88 157 == Frequently Asked Questions ==
89 158
90 -= Is there documentation available for s2Member? =
91 -Yes. You will need to install s2Member. The official documentation is built right into the plugin's configuration panels. Supplemental documentation is also built into the plugin, found in your Dashboard under: `s2Member -> API / Scripting` ( which covers MANY advanced topics ).
159 +**NOTICE:** For help with s2Member Pro, please use [our forum](http://s2member.com/r/forum/).
92 160
93 -= Are video tutorials available for s2Member? =
94 -Yes. [Video Tutorials](http://www.s2member.com/videos/) for s2Member are available [here](http://www.s2member.com/videos/).
161 += Is s2Member compatible with Multisite Networking? =
95 162
96 -= Is there a community forum for s2Member? =
97 -Yes. The [forum](http://www.primothemes.com/forums/viewforum.php?f=4) for s2Member is available [here](http://www.primothemes.com/forums/viewforum.php?f=4).
163 +Yes, s2Member Pro for Unlimited Sites is compatible with Multisite Networking. After you enable Multisite Networking, with s2Member Framework and Pro enabled, navigate to `s2Member → Multisite (Config)` in the Dashboard on your Main Site.
98 164
99 -= Is there a larger list of common problems/solutions? =
100 -Yes, many [common questions/problems/tips](http://www.primothemes.com/forums/viewforum.php?f=36) are discussed [here](http://www.primothemes.com/forums/viewforum.php?f=36).
165 += Where can I find more information? =
101 166
102 -= Where can I download older versions of s2Member? =
103 -Archived releases of s2Member are maintained [here](http://wordpress.org/extend/plugins/s2member/download/).
167 +* s2Member FAQs: <http://s2member.com/faqs/>
168 +* Knowledge Base: <http://s2member.com/kb/>
169 +* Video Tutorials: <http://s2member.com/videos/>
170 +* Community: <http://s2member.com/r/forum/>
171 +* Codex: <http://s2member.com/codex/>
104 172
105 -= Does PayPal integration work right-out-of-the-box? =
106 -Yes, it can even generate your PayPal® Subscription Buttons for you. Everything is fully integrated. You even get to create your own Pages within WordPress® to handle Membership Options, the Login Welcome Page, etc. For advanced webmasters, there are scripting techniques that are documented as well. These will help you further develop your site and tailor it to meet your specific needs. s2Member API Scripting is NOT required however.
173 += Translating s2Member =
107 174
108 -= How many Membership Levels are supported? =
109 -s2Member supports Free Subscribers (at Level #0), and four primary Membership Levels [1-4] (unlimited with s2Member Pro). You can label your Membership Levels anything you like. The defaults are Free, Bronze, Silver, Gold, and Platinum. s2Member also supports an unlimited number of Custom Capability Packages. Custom Capabilities are an easy way to extend s2Member in creative ways. Custom Capabilities allow you to create an unlimited number of Membership Packages, all with different Capabilities and prices.
175 +Please see: <http://s2member.com/r/translations/>
110 176
111 -= How can I extend s2Member beyond four Levels? =
112 -With s2Member "Pro" installed, you may configure an unlimited number of Membership Levels. You can set the number of Membership Levels by adding this line to your /wp-config.php file: `define("MEMBERSHIP_LEVELS", 4);`. Feel free to change the default value of 4 to whatever you need. The miniumum allowed value is `1`. The recommended maximum is `100`.
177 +== Upgrade Notice ==
113 178
114 -= Does s2Member utilize the PayPal® IPN system? =
115 -Yes, s2Member supports automation of account activation, welcome emails, confirmations, renewals, deactivation, refunds, etc. The integration with PayPal® is seamless. s2Member even provides API Notifications, which are an added layer of functionality. These are not to be confused with the IPN service. s2Member API Notifications make it easier to integrate back-office routines, affiliate programs, list servers, or any other 3rd-party applications that should react to certain events.
179 += v260927 =
116 180
117 -= Does s2Member support PayPal® PDT/Auto-Return? =
118 -Yes, s2Member will work with PayPal® Auto-Return/PDT (Payment Data Transfer) `On`, and also with Auto-Return/PDT `Off`. If you enable Auto-Return, you MUST also enable PDT and supply s2Member with your Identity Token. If one is enabled, the other must also be enabled; and vice-versa. There is a place to enter your PayPal® Identity Token for PDT under `s2Member -> PayPal® Options`.
181 +(SECURITY RELEASE) UPGRADE IMMEDIATELY. v260215 included a CRITICAL VULNERABILITY fix, and you shouldn't wait any longer to update if you're behind.
119 182
120 -= Can I use PayPal® Pro, Authorize.Net®, ccBill®, AliPay®, ClickBank®, Google® Checkout? =
121 -Yes. [s2Member Pro](http://www.s2member.com/) is an add-on for the free version of s2Member. [s2Member Pro](http://www.s2member.com/) adds [PayPal® Pro integration](http://www.primothemes.com/forums/viewtopic.php?f=4&t=304), a PayPal® Pro Form Generator, Authorize.Net® integration, ccBill®, Google® Checkout, ClickBank®, AliPay®, advanced User Import/Export tools, support for Coupon Codes, and more. A purchase of s2Member Pro includes free lifetime upgrades; along with full access to our [video tutorial library](http://www.s2member.com/videos/).
183 +== Changelog ==
122 184
123 -= How does s2Member protect content from public access? =
124 -s2Member allows you to protect Pages, Posts, Tags, Categories, URIs, URI word fragments, URI Replacement Codes for BuddyPress, Specific Post/Page Access ( Buy Now! ), and even portions of content within Posts/Pages/themes/plugins using Simple ( Shortcode ) or Advanced ( PHP ) Conditionals. Everything is configurable through the s2Member Options Panel. This makes s2Member VERY easy to integrate into any WordPress® site. With s2Member, you can also protect downloadable files, using special restrictions on how many downloads can occur within a certain amount of time. Each Membership Level can have different restrictions ( even Custom Capability Packages ). You can also integrate Conditionals within your content based on Capabilities. Both Simple and Advanced code samples are provided under `s2Member -> API Scripting`.
185 += v260927 =
125 186
126 -= Does s2Member support an account approval process? =
127 -s2Member does not come with an approval system. That being said, what many site owners do, is they allow Free Registration ( i.e. Open Registration: `on` ). This allows visitors to register for free at Level #0, which just gives them an account. After a manual review of Level #0 accounts, an Administrator can upgrade them to Level #1 or higher; granting them access to content you've protected at those higher Levels. So the trick is to protect your content at Level #1 or higher, then allow Open Registration at Level #0. In other words, Level #0 Members will just have an account, but not actually have access to anything until you increase their Membership Level from the default Level #0. If you would like to display a custom message ( i.e. "Your account is pending review." ), you can use s2Member's Simple Conditionals to detect a Customer's Membership Level, and to display an appropriate message on your Login Welcome Page. For further details on Simple/Advanced Conditionals, please check your Dashboard under `s2Member -> API Scripting -> Simple/Advanced Conditionals`.
187 +- (Pro) **Fix:** Improved Stripe 3D Secure recovery when browser and webhook processing overlap, or when the browser loses the final checkout response after successful authentication. s2Member now reconciles those recovery paths using the saved checkout state so successful signups can finish correctly without repeating fulfillment. Thanks to Felix for reporting it. See [thread #13627](https://f.wpsharks.com/t/13627).
128 188
129 -= Does s2Member provide an API that I can connect to? =
130 -Yes, s2Member provides many *Advanced Scripting* techniques that are fully documented within its option panels. Code samples are provided for everything. There are several API functions that you can use, along with s2Member API Constants. This allows you to access many parts of its functionality, as well as specific Member information. Theme designers are welcome to integrate their themes/plugins with s2Member using the code samples that we provide under `s2Member -> API Scripting`. s2Member even provides API Notifications, which are an added layer of functionality. These are not to be confused with the IPN service. s2Member API Notifications make it easier to integrate back-office routines, affiliate programs, list servers, or any other 3rd-party application that should react to certain events.
189 +- (Framework) **Fix:** Improved Gateway Checkout state handling so concurrent recovery paths can safely patch independent checkout data and explicitly reload newly committed state without stale request-local cache values.
131 190
132 -= Is s2Member compatible with Quick Cache or WP Super Cache? =
133 -Yes, there were some bugs in the beginning, but they have been fixed now. Both Quick Cache and WP Super Cache will remain compatible with s2Member. We have integrated two internal Constants that prevent these plugins from caching important Members Only areas of your site, no matter what your cache configuration might be. The two Constants are: `DONOTCACHEPAGE` and `QUICK_CACHE_ALLOWED = false`. We recommend Quick Cache over WP Super Cache though; simply because we actually developed Quick Cache, and we've done more extensive testing with the s2Member/Quick-Cache combination.
191 +- (Pro) **Fix:** Improved Stripe subscription recovery for new customers when payment authentication continues after the initial Pro-Form request. s2Member now keeps the pending WordPress account linked to the checkout, allowing browser or webhook recovery to complete the correct signup without losing its account association.
134 192
135 -= Is s2Member compatible with Multisite Networking? =
136 -Yes. s2Member, and also s2Member Pro, are both compatible with Multisite Networking enabled. After you enable Multisite Networking, install the s2Member plugin. Then navigate to `s2Member -> Multisite ( Config )` in the Dashboard on your ( Main Site ).
193 +- (Pro) **Fix:** In a rare Stripe pending-payment recovery case, membership processing could already be complete while the original checkout request still saw an older cached copy of the member's data and continued showing a processing state. s2Member now refreshes that data before deciding whether fulfillment has completed.
137 194
138 -= Is s2Member compatible with the BuddyPress plugin for WordPress? =
139 -Yes it is. In fact, we must say... the s2Member/BuddyPress combination is just awesome. These two plugins running together make all sorts of things possible.
195 +- (Pro) **Fix:** Stripe one-time (Buy Now) Pro-Form purchases requiring 3D Secure could lose the password entered during the initial checkout when the form resumed after authentication. s2Member now keeps the same pending WordPress account through authentication and completes it with the password the customer originally chose.
140 196
141 -= How does s2Member know when to demote a paid Member to a Free Subscriber? =
142 -s2Member uses its built-in Auto-EOT System. EOT = End Of Term. Whenever you generate a PayPal® Button with s2Member, you'll configure a length for the Subscription. Depending on the type of Subscription you choose ( recurring, non-recurring, lifetime, or fixed-term ); s2Member will either use PayPal's IPN/`subscr_payment,subscr_cancel,subscr_eot` notices, or it will set an Automatic EOT Time, which is processed automatically by s2Member via WP_Cron. For each Member, you can also override the EOT Time, by forcing a specific expiration date. To manually adjust the EOT Time for a specific Member, go to: `WordPress® -> Users`, and click the Edit link next the Member you want to work on.
197 +- (Pro) **Fix:** Closed a remaining failed-3D-Secure cleanup case where Stripe.js could return an authentication error without the PaymentIntent details used by s2Member's cleanup flow. s2Member now recovers the PaymentIntent ID from the existing Stripe client secret when needed so the incomplete subscription can still be cleaned up correctly.
143 198
144 -= How can I see more of what's going on behind-the-scene? =
145 -s2Member comes with very sophisticated logging routines for PayPal®. One for its PayPal® IPN communication ( and resulting actions ). Another logs Return-Data processing. Another logs PayPal® API communication ( i.e. for dynamic Button Encryption, if enabled; and/or for the s2Member Pro add-on communication with the PayPal® Pro API ). You can enable all of these logging routines, by going to: `s2Member -> PayPal® Options -> Account Details -> Logging`.
199 +- (Pro) **Fix:** Failed card authentication during Stripe free-trial subscription checkout could leave the pending subscription active in a trialing state at Stripe. s2Member now cancels the incomplete subscription generation so unsuccessful authentication attempts do not leave orphaned trial subscriptions behind.
146 200
147 -= When a User/Member is demoted by the Auto-EOT System, are Custom Capabilities removed too? =
148 -Yes, whenever a User/Member is demoted, s2Member resets their account back to a Free Subscriber. Any Custom Capabilities the Member had, will be removed.
201 +- (Pro) **Fix:** Immediately retrying a Stripe free-trial subscription with another card after failed authentication could overlap with cleanup of the previous attempt or fail to continue correctly. s2Member now safely finishes that cleanup, confirms the retried authentication when needed, and starts a fresh subscription attempt without browser and webhook recovery interfering with each other.
149 202
150 -= When a User/Member upgrades, are existing Custom Capabilities preserved? =
151 -No, by default, s2Member will reset their Custom Capabilities to the ones listed in the Payment Button/Form that initiates the upgrade. However, starting with s2Member v3.5+, it is now possible to start your list of Custom Capabilities with a `+` sign. This tells s2Member to (ADD) a comma-delimited list of new Custom Capabilities to any that may, or may not, already exist for a given Member. So this behavior can now be modified during Button/Form generation with s2Member.
203 +- (Pro) **Compatibility:** Improved Stripe SDK loading so s2Member does not accidentally trigger another plugin's dormant Stripe autoloader. This prevents an older Stripe library registered by another plugin from loading before s2Member Pro's bundled Stripe SDK.
152 204
153 -= Can s2Member implement a Captcha Code on my Login/Registration Forms? =
154 -Yes and no. We've left this feature out of the plugin intentionally, because many site owners prefer to use Captcha plugins that encompass all aspects of their site ( including comment forms ). We recommend this one: [SI CAPTCHA Anti-Spam](http://wordpress.org/extend/plugins/si-captcha-for-wordpress/). That being said, [s2Member's Pro Forms](http://www.s2member.com/) for PayPal® Pro and Authorize.Net® ( including Free Registration Forms ) CAN be configured to use Google's reCAPTCHA service. Just add this Attribute to any Pro Form Shortcode ( `captcha="clean"` ). For further details, please check your Dashboard under: `s2Member -> PayPal® Pro Forms -> Shortcode Attributes ( explained )`.
205 +- (Pro) **Fix:** Prevented a PHP warning during Stripe Buy Now checkouts for existing members when determining whether a previous recurring subscription should be cancelled.
155 206
156 -= What if I have other questions not covered here? =
157 -The [forum](http://www.primothemes.com/forums/viewforum.php?f=4) for s2Member is available [here](http://www.primothemes.com/forums/viewforum.php?f=4). Many [common questions/problems/tips](http://www.primothemes.com/forums/viewforum.php?f=36) are discussed [here](http://www.primothemes.com/forums/viewforum.php?f=36).
207 +- (Framework) **Compatibility:** Expanded no-cache support for caching solutions that use their own page-exclusion APIs or signals in addition to the commonly supported WordPress no-cache conventions. Added explicit compatibility for LiteSpeed Cache, FlyingPress, Super Page Cache for Cloudflare, WP Fastest Cache, and Cloudflare APO, helping prevent dynamic/private s2Member pages from being cached.
158 208
159 -== Video Tutorials ==
160 -Please visit s2Member.com for [video tutorials](http://www.s2member.com/videos/).
209 +- (Pro) **Fix:** When `[s2Member-List]` used `rlc_satisfy="ANY"` with multiple Levels, Roles, or Custom Capabilities, additional filtering on the member list could cause unrelated members to appear. Membership filters are now grouped correctly, so only members matching the requested criteria are returned. Thanks to Philip for reporting this.
161 210
162 -== Changelog ==
211 +- (Framework) **Fix:** PayPal IPN domain checks could fail on some server setups when the incoming request did not provide a usable domain, for example with some reverse-proxy setups where something like Nginx, Cloudflare, a load balancer, etc. sits in front of WordPress and affects the request host. s2Member now falls back to the site's configured domain when needed.
163 212
164 -= v110710 =
165 -* **(s2Member/s2Member Pro) Bug fix.** Some versions of PHP were generating an error `Warning: call_user_func_array()` after registration. This error was caused by a new static class method introduced in s2Member v110708, which was NOT previously declared `static` explicity. This release of s2Member v110710 corrects this bug and eliminates the error message. For further details, please check your Dashboard, under: `s2Member -> General Options -> Email Configuration`.
166 -* **(s2Member) New Feature.** It is now possible to enable/disable s2Member's customization of New User Email notifications. This may be desirable when/if you're using a plugin ( other than s2Member ) to handle this aspect of your installation. For further details, please check your Dashboard, under: `s2Member -> General Options -> Email Configuration`.
167 -* **(s2Member) New Feature.** It is now possible to customize both the Username/Password email ( e.g. the email sent to new Users/Members after registration ), and now you can ALSO customize the Administrative "New User Notification" email too. For further details, please check your Dashboard, under: `s2Member -> General Options -> Email Configuration`.
213 +- (Framework) **Fix:** Some unexpected PayPal proxy values could cause notifications to fail and be ignored. These values are now normalized before the notification is processed.
168 214
169 -= v110709 =
170 -* **(s2Member/s2Member Pro) Email Configuration ( bug fix ).** New file `/s2member/includes/functions/pluggables.inc.php` was missing in the last release, weird. This release adds the missing file that implements this new feature included in the previous Changelog. FEATURE: Some new options are now available that allow site owners to customize the email that contains the Username/Password for new Users/Members. For further details, please check your Dashboard, under: `s2Member -> General Options -> Email Configuration`.
215 +- (Framework) **Fix:** PayPal proxy notifications could fail on sites where their domain differs from the site's configured domain. s2Member now uses the appropriate site domain more consistently in these cases.
171 216
172 -= v110708 =
173 -* **(s2Member/s2Member Pro) Compatibility.** s2Member and s2Member Pro have both been updated to support WordPress® v3.2.
174 -* **(s2Member Pro) Unlimited Membership Levels.** With s2Member Pro installed, you may now configure an unlimited number of Membership Levels. You can set the number of Membership Levels by adding this line to your /wp-config.php file: `define("MEMBERSHIP_LEVELS", 4);`. Feel free to change the default value of 4 to whatever you need. The miniumum allowed value is 1. The recommended maximum is 100. For further details, please check your Dashboard, under: `s2Member -> General Options -> Membership Levels/Labels`.
175 -* **(s2Member/s2Member Pro) Email Configuration.** Some new options are now available that allow site owners to customize the email that contains the Username/Password for new Users/Members. For further details, please check your Dashboard, under: `s2Member -> General Options -> Email Configuration`.
176 -* **(s2Member/s2Member Pro) Bug fix.** A problem with certain email addresses routed through the `wp_mail()` function, containing special characters in the "Name" portion. The issue was related to the way in which `wp_mail()` handles recipient addresses in the format `"Name" <address>`. s2Member now strips double quotes dynamically ( i.e. internally ), so that `wp_mail()` and the PHPMailer class can deal with this format on their own. This bug fix should also prevent seemingly random `500 Internal Server Error` messages during checkout. One symptom of this bug was to find "Premature end of script headers" inside your Apache error log, followed by an error code of `500` reported in the browser. These issues have been corrected in this release of s2Member.
177 -* **(s2Member) Bug fix.** A bug first introduced in v110604 was preventing s2Member from setting a User's "Display Name" during Registration properly. This bug has been corrected in the latest release. In addition, a new configurable option for this behavior has been added to the s2Member General Options panel. For further details, please check your Dashboard under: `s2Member -> General Options -> Custom Registration Fields -> Display Name`.
178 -* **(s2Member) Bug fix.** A bug first introduced in v110604 was preventing s2Member from handling password strenth meters in the Stand-Alone Profile Editing Panel ( i.e. the popup version ).
179 -* **(s2Member) Documentation.** s2Member's `API Scripting` sections inside your Dashboard have been updated in various places, in support of some new API Functions/Constants introduced in the latest versions of s2Member; and also to reference relevant articles in the [s2Member Codex](http://www.primothemes.com/forums/viewforum.php?f=40).
217 +- (Framework) **Fix:** Corrected the timeout value passed to the Mailchimp API client, preventing an invalid HTTP stream configuration that could interfere with list subscription requests.
180 218
181 -= v110620 =
182 -* **(s2Member) Bug fix.** s2Member has been updated to support GMT offset in date calculations for Registration Time. In previous versions, this was addressed using `date_i18n()`, but this update now includes the proper function call to `get_date_from_gmt()`. No changes are necessary, as this update simply corrects the way Registration Times are displayed in your list of Users. Starting with v110620, s2Member will now display Registration Times with the correct GMT offset, based on your configuration of `WordPress -> General Options -> Timezone`.
219 +- (Framework) **Fix:** Avoided calling WordPress's deprecated `force_ssl_login()` helper on current WordPress versions when determining login and RPC URL schemes, preventing deprecation notices while preserving the same SSL behavior and compatibility with older WordPress versions.
183 220
184 -= v110617 =
185 -* **(s2Member) Bug fix.** A bug first introduced in s2Member v110604 has been corrected. This bug was hindering s2Member's ability to identify MIME types for protected File Downloads.
186 -* **(s2Member) HTML 5 MIME types.** s2Member has been updated to provide support through File Download protection for HTML 5 MIME types: `video/ogg` and `video/webm`.
221 +- (Framework) **Fix:** Prevented PHP notices from the `[s2Member-Security-Badge /]` shortcode when the optional `v` attribute is omitted. The shortcode now applies its default badge version before validating the value.
187 222
188 -= v110606 =
189 -* **(s2Member). MailChimp® over SSL.** s2Member has been updated to communicate with the MailChimp® API over SSL, for improved security. No action or reconfiguration is necessary, as this only affects the HTTP protocol used during communication with the MailChimp® API.
190 -* **(s2Member). Documentation update.** s2Member has been updated to mention the PHP Execution plugin, which is required to take full advantage of `"Advanced" Download Restrictions`, through the application of a File Download Key. The creation of a File Download `Key`, requires a small PHP code snippet. In order to use PHP scripting inside your Posts/Pages, you'll need to install this handy plugin ( [PHP Execution](http://wordpress.org/extend/plugins/php-execution-plugin/) ).
191 -* **(s2Member). MailChimp® data center prefix.** Starting with this release, the data center prefix ( ex: `us1`, etc ), will be recorded in s2Member's log file for MailChimp® communication. The only change here, is the inclusion of the prefix in the log file. s2Member has always used proper data center prefixes, they just weren't included in the log file until now.
192 -* **(s2Member). Amazon® S3 bug fix.** s2Member has been updated to support all regions, and not just the `US Standard`. If you were getting errors in the previous release, related to Amazon® S3 storage locations being accessed inproperly, this release of s2Member v110606 should resolve the issue for you. To put it simply, s2Member now connects to your S3 Bucket using `[bucket].s3.amazonaws.com`, instead of `s3.amazonaws.com/[bucket]`, making s2Member more compatible in this regard; and as suggested by [this documentation](http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html). This also improves the User experience, since your Bucket name will appear in the host name of the download, instead of just `s3.amazonaws.com`. For further discussion, please check [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=10054).
223 +- (Framework) **Fix:** Prevented PHP notices from the `[s2Stream /]` shortcode when the optional `player` attribute is omitted. Existing player defaults and behavior are unchanged.
193 224
194 -= v110605 =
195 -* **(s2Member). Bug fix.** If File Download protection was enabled, changes introduced in the previous release, were causing some site Administrators to receive a "File Download Limit Exceeded" error under the right circumstances. This has been corrected in the release of s2Member v110605.
225 +- (Framework & Pro) **UI:** Shortcode whitelist security notices are now more compact and easier to review, grouping detected user fields and template paths instead of repeating each shortcode occurrence, and listing the affected pages once with direct links. Thanks to Sherry for her feedback on these. _WP Admin > s2Member > General Options > Shortcode User Fields Whitelist_ and _Pro Shortcode Templates Whitelist_
196 226
197 -= v110604 ( instead of s2Member v3.6 ) =
198 -* **(s2Member/s2Member Pro). Versioning.** Starting with this release, s2Member and s2Member Pro will be released with dated versions following this format: `yymmdd`. The version for this release is: `110604`.
199 -* **(s2Member/s2Member Pro). s2Member Security Badge.** An s2Member® Security Badge ( optional ), can be used to express your site's concern for security; demonstrating to all Users/Members that your site ( and the s2Member software ), takes security seriously. However, in order to qualify your site, you MUST generate a Security Encryption Key and pass other security standards. For more information, please check your Dashboard under: `s2Member -> General Options -> Security Badge`.
200 -* **(s2Member/s2Member Pro). Custom Fields For BuddyPress.** s2Member can now integrate your Custom Fields into BuddyPress. Please check your Dashboard for all configuration options. You'll find BuddyPress integration available here: `DashBoard -> s2Member -> General Options -> Custom Registration Fields`.
201 -* **(s2Member Pro). PayPal® Pro API Updates (First Payment / Recurring Profile Behavior).** s2Member's integration with the PayPal® Pro API has been updated to API v71.0. There is also a new option available to PayPal® Pro Merchants. s2Member now provides site owners the abililty to control the way the first payment in a Recurring Profile is billed. (1)Consolidate w/ Recurring Profile or (2)— Real-Time / Direct Pay ( mission critical ) —. For further details, please check your Dashboard under: `s2Member -> PayPal Options -> Account Details`. We recommend: `Consolidate w/ Recurring Profile`, because this keeps all charges associated with a particular Customer organized in your PayPal® account. No matter which option you choose, a first Initial Payment ( when applicable ), will always be charged immediately ( improved in this release ). In cases where it is absolutely critical that a Customer NOT gain access until their first payment has been fully captured, choose: `Real-Time / Direct Pay`, which tells s2Member to authorize/capture the first payment in real-time during checkout, instead of consolidating it into the Recurring Profile.
202 -* **(s2Member). bbPress® 2.0+.** s2Member has been integrated with preliminary support for bbPress® 2.0+ ( i.e. the new plugin variation for WordPress® ). Please check your Dashboard, under: `s2Member -> Other Integrations` for further details and a list of current limitations.
203 -* **(s2Member/s2Member Pro). Field Labels.** Some additional `for=""` attributes in all Pro Form templates. This improves the reliability of s2Member's JavaScript validation routines. Existing s2Member Pro Customers with modified Pro Form templates MUST update their `for=""` attributes in order for s2Member's JavaScript API to properly validate Customer data entry in this new release. If you're running custom Pro Form templates, check this directory for the updated default templates, so you can merge any changes you've made yourself: `/s2member-pro/includes/templates/forms/`.
204 -* **(s2Member). Amazon S3 Support** Amazon® Simple Storage Service ( Amazon® S3 ). Amazon® S3 is storage for the Internet. It is designed to make web-scale computing easier for developers. Amazon® S3 provides a simple web services interface that can be used to store and retrieve any amount of data, at any time, from anywhere on the web. It gives developers access to the same highly scalable, reliable, secure, fast, inexpensive infrastructure that Amazon® uses to run its own global network of web sites. s2Member has been integrated with Amazon® S3, so that ( if you wish ), instead of using the `/s2member-files/` directory, you can store all of your protected files inside an Amazon® S3 Bucket.
205 -* **(s2Member/s2Member Pro). jQuery.** Tested s2Member against jQuery version 1.4.4+, including jQuery v1.6. Fixed a bug with `.attr()` returning undefined in jQuery v1.6.
206 -* **(s2Member). Bug fix.** Using the Replacement Code `%%current_user_login%%` in a Special Redirection URL for your Login Welcome Page would sometimes result in your Home Page being protected inadvertently, depending on configuration.
207 -* **(s2Member/s2Member Pro). IP Address Collection.** s2Member now records the original IP Address of a each User, for tracking purposes. In previous versions of s2Member, in order to integrate some tracking systems, ( such as iDevAffiliate's server-side call option ), it was required to use the `custom=""` Attribute of your Shortcode to grab a Customer's IP Address. That's no longer required, as Replacement Codes are now made available throughout all aspects of s2Member; giving you easy access to the User's IP Address.
208 -* **(s2Member Pro). Bug fix.** Buy Now Coupon descriptions for Specific Post/Page Access were returning invalid details, referencing installments. This bug has been resolved.
209 -* **(s2Member Pro). SSL.** Allow `?s2-ssl` without a value ( accept as true ). This has been implemented for advanced site owners running s2Member Pro Forms.
210 -* **(s2Member/s2Member Pro). API Functions.** New API functions for user Level, Role, Custom Capabilities. These will be documented in our official source code documentation system for s2Member ( also new ). Source code documentation will become available in the s2Member forums, shortly after the official public release of this version.
211 -* **(s2Member/s2Member Pro). New Shortcode Attribute.** For PayPal® Buttons/Forms, you can now apply Shortcode `lc="US"`. Optional 2 character Locale Code ( i.e. Country Code ). This controls the interface language used if/when a Customer chooses PayPal® Express Checkout as their payment method, or upon clicking a Standard PayPal® Button. If unspecified, the language is determined by PayPal®, when possible, defaulting to US english when not possible.
212 -* **(s2Member/s2Member Pro). New Shortcode Attribute.** For PayPal® Buttons/Forms, you can now apply Shortcode `rrt=""`. Regular Recurring Times ( i.e. a fixed number of installments ). Only valid w/ Membership Level Access. When unspecified ( the default ), any recurring charges will remain ongoing until cancelled, or until payments start failing. If this is set to 1 or higher the regular recurring charges will only continue for X billing cycles, depending on what you specify. This is only valid when `rr="1"` for recurring "Subscriptions". Please note that a fixed number of installments, also means a fixed period of access. If a Customer's billing is monthly, and you set `rrt="3"`, billing will continue for only 3 monthly installments. After that, billing would stop, and their access to the site would be revoked as well ( based on your EOT Behavior setting under: `s2Member -> PayPal® Options` ).
213 -* **(s2Member/s2Member Pro). New Shortcode Attribute.** You can now apply `rra="1"`. This has to do with reattempting failed payments. It has slightly different meanings and option values, depending on whether it's used for a PayPal® Button or a PayPal® Pro Form Shortcode. For instance, for PayPal® Pro Form Shortcodes, this also controls MAXFAILEDPAYMENTS. Please check your Dashboard under: `s2Member -> PayPal® Buttons/Forms -> Shortcode Attributes Explained`.
214 -* **(s2Member w/s2Member Pro installed). New Shortcode Attribute.** You can now apply `success="http://..."` Attribute to Standard PayPal® Buttons. Success Return URL ( optional ). s2Member handles this automatically for you. However, if you would prefer to take control over the landing page after checkout ( i.e. your own custom Thank-You Page ), you can. If supplied, this must be a full URL, starting with http://. Note, s2Member will NOT use this value if an existing account holder is being modified. s2Member handles account updates ( i.e. billing modification ) in a more dynamic way. Your Success Return URL is only applied to (new) Customers. This feature is enabled with s2Member Pro installed.
215 -* **(s2Member/s2Member Pro). Bug fix.** When using ampersands in the `success=""` Attribute, it would break Success Return URLs on some WordPress® installations. s2Member now converts these internally to avoid the issue.
216 -* **(s2Member). Redirection Status Codes.** s2Member's default behavior ( for good reason ), is to send a 301 redirection status when it moves unauthorized Visitors to your Membership Options Page. The reasons for this are well founded. This prevents duplicate content warnings from search engine spiders. However, some web browsers ( like Safari ) make an attempt to cache a 301 redirection into memory, thereby preventing some browsers from reaching the proper areas of your site after logging in, had they been redirected to the Membership Options Page prior. s2Member resolves this problem by detecting all major browser engines ( i.e. `msie|trident|gecko|webkit|presto|konqueror|playstation` ) and sending web browsers a `302` redirection, while still sending spiders/crawlers ( such as the Google® bot ), the proper `301` redirection status. For further details, please check [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=6240&p=14120#p14084).
217 -* **(s2Member). Alternative Views.** Alternative View Restrictions ( now compatible with Ajax search plugins ). For further details, please check [this thread](http://www.primothemes.com/forums/viewtopic.php?t=3087&p=9635#p12882).
218 -* **(s2Member Pro). Bug fix.** Corrected first/last name updates during Pro Form checkout/upgrade routines. s2Member Pro should use ( and update to ) the values submitted, even when already logged-in.
219 -* **(s2Member/s2Member Pro). Bug fix.** s2Member was not properly filling the `$_GET["s2member_level_req"]` parameter upon certain File Download Restrictions. For instance, s2Member would sometimes return `s2member_level_req=0`, even though you protected a File inside a Custom Capability and/or Member Level sub-directory. This bug has been corrected.
220 -* **(s2Member/s2Member Pro). Time Zone.** s2Member now displays Registration Dates in your list of Users with `date_i18n()` for localized time, as opposed to UTC time. UTC time is still the default time zone ( internally ), this is built into the WordPress® core. However, certain dates displayed on-site are easier to understand in localized time, based on your WordPress® General Settings.
221 -* **(s2Member). Password Confirmation.** s2Member now provides a Password confirmation field on the Standard Registration Form, and in other key areas, such as Profile Editing Panels.
222 -* **(s2Member/s2Member Pro). Password Strength Meters.** This version adds Password strength meters in various places ( where it's helpful ); including s2Member Pro Forms, and even the default Registration Form for WordPress®.
223 -* **(s2Member). Multisite Registration.** Cleaned up the default Multisite Registration Form ( i.e. `/wp-signup.php` ), with structural CSS to better support s2Member features.
224 -* **(s2Member/s2Member Pro). SI Captchya.** s2Member now contains default CSS styles ( just two lines ), and JavaScript validation for the popular [SI Capchya](http://wordpress.org/extend/plugins/si-captcha-for-wordpress/) plugin; and also for it's own built-in support of Google's reCAPTCHA service for s2Member Pro Forms.
225 -* **(s2Member/s2Member Pro). Custom Field Default Values.** It's now possible to set default text values for single-line and multi-line input/textarea fields too. This only affects Custom Fields you configure with s2Member.
226 -* **(s2Member/s2Member Pro). Custom Fields By Section.** Custom Fields by section ( i.e. dividers ). It's now possible to configure certain Custom Fields, so that they start a new section. Your sections can be simple dividing lines, or you can give them a title that will appear on your Registration and Profile Editing forms.
227 -* **(s2Member). Bug fix.** s2Member was creating window focus/blur issues on Profile updates through its Stand-Alone version of the Profile Editing Panel ( i.e. when it was popped open in a new window ). This was causing odd behavior Firefox® 4.
228 -* **(s2Member/s2Member Pro). Remove First/Last Name.** It is now possible to turn off First/Last/Display Name, on Registration and Profile Editing forms. For configuration options, please check your Dashboard, under: `s2Member -> Custom Registration Fields`.
229 -* **(s2Member Pro). Data Prefill.** s2Member Pro is now capable of prepopulating some Pro Form fields when/if existing Users buy a Specific Post/Page.
230 -* **(s2Member/s2Member Pro). Bug fix.** Fixed nested Custom Registration Field labels for multi option check boxes/radios. Firefox 4+ had issues with this.
231 -* **(s2Member/s2Member Pro). Registration Link Expiration.** The default is built-in, it's (2) days. We don't recommend changing this unless you know what you're doing. Some developers requested the ability to change this dynamically. s2Member now makes this Filter available: `ws_plugin__s2member_register_link_exp_time`.
232 -* **(s2Member Pro). Automatic Upgrade Routine.** s2Member Pro now places your site into maintenance mode ( temporarily ) during an s2Member Pro Upgrade routine.
233 -* **(s2Member). New API Notification.** New "Modification" Notification now available under: `s2Member -> API Notifications`. Say that three times fast!
234 -* **(s2Member/s2Member Pro). MailChimp® / AWeber® improvements.** This release fixes several bugs related to Automatic Unsubscribes, general list removals, and introduces a new feature call Automatic List Transitions. For further details, please check your Dashboard under: `s2Member -> API List Servers`.
235 -* **(s2Member). Bug fix.** PayPal® Button Codes should have been including a `charset` input variable for `UTF-8` encoding. This bug has been corrected now. If you've had trouble getting special characters to appear properly in the PayPal® interface, this version should correct those issues for you.
236 -* **(s2Member/s2Member Pro). Animated Processing... Buttons.** This release adds simple animated "processing..." messages to all form submission buttons.
237 -* **(s2Member/s2Member Pro). MailChimp® Interest Groups.** Ability to use Interest Groups with Mailchimp List IDs. For examples, please check your Dashboard under: `s2Member -> API List Servers -> MailChimp`.
238 -* **(s2Member/s2Member Pro). New EOT Behavior Option.** Automatic Extension of EOT Time whenever a Customer is upgrading a paid Subscription? For configuration options, please check your Dashboard under: `s2Member -> PayPal® Options -> EOT Behavior`.
239 -* **(s2Member/s2Member Pro). Log Entries.** WordPress® :: s2Member :: s2Member Pro versions now all reported in each log entry. In addition, s2Member now provides logging for all communications with MailChimp® and AWeber® too.
240 -* **(s2Member/s2Member Pro). s2Member Now Requires WordPress® v3.1+.** Backward compatibility for the WordPress® 3.0.x series has been removed. Also removed all `include()` references to `/wp-includes/registration.php`. Deprecated in WordPress v3.1. This file no longer needs to be included.
241 -* **(s2Member/s2Member Pro). s2Member Updates.** New built-in news updates from s2Member developers. This appears in your Dashboard automatically, inside the s2Member menu panels.
242 -* **(s2Member/s2Member Pro). Bug fix.** Custom Post Types were not appearing in s2Member's Specific Post/Page Button and Form Generators, even when configured properly. This bug has been resolved.
243 -* **(s2Member/s2Member Pro). Documentation.** Built-in documentation updated throughout.
244 -* **(s2Member/s2Member Pro). UI Panels.** Some minor UI improvements.
227 +- (Framework) **UI:** Corrected several PayPal Button Generator shortcode attribute descriptions to match current PayPal Checkout behavior, particularly the `output` and `image` attributes.
245 228
246 -= 3.5.8 =
247 -* **(s2Member). Bug fix.** The Shortcode version of s2Member's Profile Editing Panel ( i.e. `[s2Member-Profile /]` ) was not validating input fields properly. This bug was has been resolved in v3.5.8+.
248 -* **(s2Member). Compatibility.** s2Member now requires PHP v5.2.3+ instead of just PHP v5.2+. This is because `call_user_func_array()` in early versions of PHP 5.2 did not support static class methods with a scope resolution operator. If you've had trouble getting s2Member v3.5+ to run on your server, this is likely the cause. Please make sure you're running PHP v5.2.3+.
249 -* **(s2Member). Bug fix.** PayPal® Button Encryption was failing under some circumstances, because the PayPal® API Method `BMCreateButton` requires two decimal places at all times. The bug fix in this release does NOT require any changes to your Shortcode attributes. Rather, the encryption routine will now automatically convert numeric dollar amounts during encryption.
250 -* **(s2Member Pro). Compatibility.** Starting with s2Member Pro v3.5.8+, Pro Cancellation Forms will automatically detect Customers that may have signed up with a Standard PayPal® Button, and provide the Customer with a link & instructions about how to cancel their "Subscription" via PayPal®. This makes it possible for site owners upgrading to s2Member Pro, to provide their Customers with just ONE Cancellation Form, which has the ability to consider both PayPal® Standard "Subscriptions", and also "Recurring Profiles"; which are used by s2Member Pro Forms.
229 += v260917 =
251 230
252 -= 3.5.7 =
253 -* **(s2Member/s2Member Pro). Bug fix.** A bug was found in the `c_ws_plugin__s2member_systematics_sp` class file. This bug was affecting s2Member's Security Gate for WordPress® `Pages` under certain unique circumstances. One symptom of this bug ( seen with s2Member Pro installed ), was to experience a strange disappearance of (s2) Lock Icons in your list of Pages, whenever the first Page in your list was the Login Welcome Page that you configured for s2Member.
254 -* **(s2Member Pro). Bug fix.** On a Multisite Network, s2Member Pro Forms were generating an erroneous error `Please enter a username` during a Billing Modification under certain circumstances. This has been resolved in s2Member Pro v1.5.7+.
255 -* **(s2Member Pro). Bug fix.** s2Member Pro Export Files ( i.e. CSV export of Users/Members ) sometimes contained Custom Registration Fields ( e.g. at the end of each CSV line ) in a different order for each User/Member. This was NOT causing any negative effects with s2Member Pro during import/export. However, it was causing some confusion and extra work for site owners that use s2Member's export files for other operations. This has been corrected in the release of s2Member Pro v1.5.7. For more information, please see [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=2783&p=8267#p8232).
231 +- (Framework) **Performance:** Further improved searching on the _WP Admin > Users_ screen, building on the performance improvements introduced in v260909. Searches across user profiles and s2Member membership data now require substantially less database work, with the biggest benefit on sites with large member databases. This can make member administration noticeably faster while preserving the same searchable fields, sorting, and pagination.
256 232
257 -= 3.5.6 =
258 -* **(s2Member). Bug fix.** s2Member's File Download routine was failing on some installations running WordPress® with Windows® IIS 7. This was related to the fact that Windows® IIS 7 does not like it when scripts use `Content-Length` in conjunction with `Transfer-Encoding: chunked`. This has been resolved in s2Member v3.5.6+.
259 -* **(s2Member/s2Member Pro). Bug fix.** s2Member's ability to force SSL by adding the Custom Field `s2member_force_ssl = yes`, was failing to achieve the desired result for links generated during some Pro Form submissions. A symptom of this bug was to see s2Member generate Specific Post/Page Access Links in SSL mode when running together with s2Member Pro Forms. This was related to the fact that s2Member's SSL Filters, which handle SSL conversions were applied on the `template_redirect` Hook instead of earlier in the routine ( i.e. on the `init` Hook ). In order to improve the reliability of this feature, s2Member now attaches itself to both `init` and `template_redirect`; checking in both cases, and only processing on one or the other. Another change, s2Member now forces a new query string parameter in all URLs that are forced to SSL mode by s2Member ( you will see: `?s2-ssl=yes` ). This improves clarity for site owners implementing Pro Forms, and it also makes this feature more compatible with other plugins running in concert with s2Member and s2Member Pro. For advanced site owners, it is possible to modify the name of this special query string variable using s2Member's Filter: `ws_plugin__s2member_check_force_ssl_get_var_name`. If you're interested in this and need assistance, please check the [s2Member forum](http://www.primothemes.com/forums/viewforum.php?f=4).
260 -* **(s2Member Pro). Bug fix.** The Pro Login Widget for s2Member ( when integrated via PHP ), was not appearing on some sites running early versions of PHP v5.2. This bug has been resolved in s2Member Pro v1.5.6+.
233 +- (Pro) **Performance:** Significantly improved `[s2Member-List]` and `[s2Member-List-Search]` performance for member directories and searches, especially on sites with larger user databases. Member searches now require substantially less database work, with much more efficient profile-field searching, filtering, sorting, and pagination. This can make large member directories noticeably faster and more responsive while preserving the shortcodes' existing Custom Field, wildcard, filtering, pagination, and sorting features. See: [s2Member-List Shortcode Documentation](https://s2member.com/kb-article/s2member-list-shortcode-documentation/).
261 234
262 -= 3.5.5 =
263 -* **(s2Member). New feature.** It is now possible to configure Custom Registration Fields with s2Member that are NOT actually visible during the registration process. Instead, they will only be visible after registration ( i.e. during a Profile edit ). In order to accomplish this, you will need to choose this option from the dropdown menu for a specific Custom Registration Field that you configure with s2Member. This option is in the dropdown menu entitled: `Allow Profile Edits?`. You can choose: `Yes ( editable after registration / invisible during registration )`.
264 -* **(s2Member Pro). Feature Improvement.** The display of the Coupon Code field on Pro Forms has been improved ( i.e. enhanced with an icon and the "Apply Coupon" button is now floated to the right to save space ).
265 -* **(s2Member Pro). Compatibility / Bug fix.** This is related to some bug reports regarding `500 Internal Server Errors`. s2Member is now compatible ( i.e. capable of running in concert with ) other plugins that attempt actions dealing with `$current_user` on the `plugins_loaded` Hook for WordPress®. In an ideal world, other plugins should NOT be doing this, because the WordPress® core framework does not initialize `$current_user` until just before the `init` Hook is fired, which comes after the `plugins_loaded` Hook. However, in an effort to maximize s2Member's compatibility, s2Member has been modified to work around this potential bug, by delaying the initialization of its Filter against `user_has_cap` just a bit. If you were experiencing `500 Internal Server Errors` in previous releases of s2Member, you will want to upgrade to this version for improved compatibility with other plugin combinations.
266 -* **(s2Member Pro). Bug fix.** s2Member Pro Forms for Free Registration were not picking up Custom Registration Fields configured at specific Membership Levels; other than Level #0. This has been resolved in s2Member Pro v1.5.5+.
267 -* **(s2Member Pro). Feature Improvement.** This change is related to the basic ( default ) CSS rules applied to Pro Forms generated by s2Member Pro. In this release, Pro Forms now utilize the CSS3 `box-sizing` specification to correct slight imperfections in the width of forms fields ( i.e. the difference between `select` and `input` ). This specification is supported by all modern browsers, including IE8. s2Member also degrades with a "best guess" workaround for IE 7 browsers. Reference article [here](http://css-tricks.com/box-sizing/).
268 -* **(s2Member/s2Member Pro). Roadmap.** Barring any serious bug reports, this will be the last release in the 3.5.x series of s2Member and the 1.5.x series of s2Member Pro. The next releases will include substantial changes ( internally ) related to the handling of variables; further optimizing the entire codebase. In addition, there are plans to integrate some new functionality for Content Dripping in the next release. The next releases should be ready around the end of April 2011.
235 +- (Framework) **Performance:** Improved Alternative View Protection performance on sites with larger amounts of protected content. Searches, archives, menus, widgets, and other areas where restricted content needs to be filtered now do less repeated work during each page request, helping busy pages load more efficiently while preserving the same access-control behavior. _WP Admin > s2Member > Alternative View Protection_
269 236
270 -= 3.5.4 =
271 -* **(s2Member). Bug fix.** When `s2member_force_ssl = yes`, the s2Member SSL/non-SSL Filters applied to `content_url` and `plugins_url` are now off by default. These two specific areas prevent clashes with some themes.
237 +- (Pro) **Performance:** Reduced overhead when End-of-Term reminder emails are disabled. The heavier reminder processing, health, and email code is now loaded only when it is actually needed.
272 238
273 -= 3.5.3 =
274 -* **(s2Member). Feature improvement.** s2Member's Bridge integration with bbPress®. It is now possible to allow bbPress® forums to be available to the public ( with read-only access ), and to restrict participation access by Level # instead of locking everything down entirely. You now have the choice whenever you install and/or re-install the bbPress® Bridge/plugin for s2Member. In addition, s2Member makes a new API function available for bbPress® `current_wp_user_is()`. This will be useful to developers integrating bbPress® with s2Member in creative ways. For further details, please check your Dashboard under: `s2Member -> API Bridges -> bbPress®`.
275 -* **(s2Member Pro). Feature improvement.** s2Member Pro Forms for Free Registration access are now more versatile. It is now possible to configure your Pro Form Shortcode so that Free Registrants come into your site with something other than the default Level #0 Access Level. For example, if you need to, you can change the Form Attribute `level="0"`, to `level="1"`, attach Custom Capabilities with the `ccaps=""` Attribute, and even limit this access to a certain timeframe with `tp="30" tt="D"` ( i.e. 30 Days ). So this Form is very flexible now. It can be used to allow free access to just about any aspect of your service. For more information on this topic, please check your Dashboard under: `s2Member -> PayPal® Pro Forms -> Free Registration Forms`. Also works with Pro Forms for Authorize.Net®.
276 -* **(s2Member). New Filters.** s2Member v3.5.3 adds two new WordPress® Filters that allow developers to further customize the inner workings of s2Member ( among 300+ other existing Filters already established for s2Member ). You will find these two new Filters in the source code of the free version: `wp_register_location` and `ws_plugin__s2member_redirection_url_after_modification`. For Multisite Networks, there is also this Filter available: `wp_signup_location`. If you're a novice site owner, please keep tabs on our [forums](http://www.primothemes.com/forums/viewforum.php?f=4) for examples on how to utilize these new Filters. We're sure this topic will come up.
277 -* **(s2Member). New Filters.** s2Member v3.5.3 adds two new WordPress® Filters that allow developers to further customize tinyURLs generated for email confirmations. You will find these two new Filters in the source code of the free version: `ws_plugin__s2member_register_link_gen_alternative` and `ws_plugin__s2member_sp_access_link_gen_alternative`. I've posted [an example](http://www.primothemes.com/forums/viewtopic.php?f=4&t=1636&p=7677#p7677) of how to use these in the forums. So these new Filters make it possible to use a shortening service that you prefer over tinyURL ( but you will have to integrate it yourself ). In a later release, we'll try to add some pre-integrated alternatives into the Dashboard for s2Member.
278 -* **(s2Member). New Replacement Code.** s2Member's EOT/Deletion Notification now provides additional detail about the actual event that triggers this API Notification through a new Replacement Code: `%%eot_del_type%%`. For further details on this new Replacement Code, and a list of possible values, please check your Dashboard under: `s2Member -> API Notifications -> EOT/Deletion Notifications`.
279 -* **(s2Member). Bug fix.** A common error that site owners see in s2Member's log file is `unable to verify POST vars`. This is due to issues with various hosting companies not being configured with either cURL and/or `allow_url_fopen` -> `on`. However, we recently discovered that WordPress® ( i.e. via the `WP_Http` class ) will attempt to officially verify the SSL certificate issued through remote connections to Payment Gateways integrated with s2Member. This can cause an additional roadblock on some servers, because often they are not capable of officially verifying SSL certificates. They lack the extended configuration necessary to do so. In other words, this default behavior in the `WP_Http` class file can ultimately lead to `unable to verify POST vars` in s2Member. To workaround this compatibility issue, s2Member now specifies `sslverify = false` in communications to Payment Gateways. This should work to further eliminate sightings of this error in your log files. Also important to note; this does NOT pose a security issue, because all communications with Payment Gateways have authentication mechanisms already in place. Either through explicit API Key validation or through server-to-server checksum verifications related to IPN data received by s2Member silently behind-the-scene.
280 -* **(s2Member). Bug fix.** s2Member's Auto-Return/PDT handler was sometimes triggering the error `unable to verify POST vars` under special circumstances that are applicable with PayPal's Enchanced Recurring Billing service, and sometimes with Subscriptions that are paid for by credit card, instead of through a PayPal account; again related to PayPal's ERP add-on service. This has been resolved in s2Member v3.5.3+. In some special cases, PayPal® does not provide any data through PDT ( Payment Data Transfer ) and so s2Member must recover gracefully by asking the Customer to check their email. This does not affect s2Member's ability to process a Customer's transaction, but it does require s2Member's processing to take place entirely behind-the-scene via the IPN service, instead of immediately after checkout ( in a very few special cases ). This bug fix may or may not affect you, depending on what you're selling, and depending on whether you're using PayPal's ERP service or not.
281 -* **(s2Member/s2Member Pro).** Bug fix. Supression of PHP errors triggered by web hosts that disable `set_time_limit()` via `@set_time_limit()`. Also applied to `@ignore_user_abort()` within s2Member's IPN handlers that need to finish processing even when Payment Gateways break the connection early. Resolved in s2Member v3.5.3+.
282 -* **(s2Member). Bug fix.** Custom Registration Fields that are configured for s2Member as being `uneditable`; which are subsequently disabled for Users attempting to edit their Profile ( e.g. with `disabled="disabled"` ), are now excluded from s2Member's JavaScript validation routines; as they should be. Resolved in s2Member v3.5.3+.
283 -* **(s2Member). Bug fix.** On some web hosts s2Member was generating the error: `Cannot modify header information, headers already sent` during activation on a Multisite Blog Farm. Resolved in s2Member v3.5.3+.
284 -* **(s2Member Pro). Bug fix.** Invalid link corrected in PayPal® Options panel for download of `/s2m-pro-extras.zip`. Note, this file is NOT to be installed, it just contains some additional code samples and API documentation for payment gateways that is sometimes useful to developers integrating s2Member for their clients.
285 -* **(s2Member Pro). Bug fix.** Under certain scenarios, s2Member's "Force SSL" functionality was incorrectly parsing content in its output buffer; ( i.e. an issue with regex in `preg_replace_callback()` ). A symptom of this bug was to experience SSL-enabled links in navigation menus for some themes; and possibly in other areas, such as login links after a Pro Form checkout was completed successfully. s2Member's intention is only to satisfy browser requirements for SSL media and other embedded content; and NOT to convert all navigation links over to SSL. This issue has been resolved in the latest release of s2Member Pro v1.5.3+.
286 -* **(s2Member Pro). Bug fix.** s2Member Pro Forms integrated with PayPal® Pro and Authorize.Net® were not allowing flexible timeframes whenever `rr="BN"`. This was preventing advanced site owners and developers from selling fixed-term access for non-standardized term lengths. For instance, it is now possible to sell a 13 month ( fixed-term ) "Buy Now" Membership by adjusting your Pro Form Shortcode in the following way: `tp="0" tt="D" ta="0" rp="13" rt="M" ra="100.00" rr="BN"` ( BN = Buy Now ). For further details, please check your Dashboard under: `s2Member -> PayPal® Pro Forms -> Shortcode Attributes Explained`.
287 -* **(s2Member). BuddyPress Multisite Bug fix.** When s2Member was running together with BuddyPress on a Multisite Network, if s2Member's Multisite (Config) was NOT offering Blogs, it was inadvertently disabling Open Registration for BuddyPress all together; regardless of the configuration value for Open Registration. In other words, in previous versions of s2Member, the only way to run BuddyPress effectively on a Multisite Network was to choose the Blog Farm option and set Blog counts to `0`. Starting with s2Member v3.5.3, it is now possible to run s2Member/BuddyPress without choosing to allow Blog creation, and without needing to use the `0` Blog hack. This bug should be resolved in s2Member v3.5.3+.
288 -* **(s2Member). Bug fix.** Strange behavior ( i.e. 500 internal server errors ) were reported in PHP v5.2.17 / reproducible on GoDaddy servers. This quirkiness was related to the `map_meta_cap` Filter in WordPress®, where s2Member deals with permissions on a Multisite Network for Blog Farm Administrators. However, due to the nature of this quirkiness, it could also have affected standard WordPress® installations running PHP v5.2.17. This bug has been resolved by modifying s2Member's Filter against this troublesome `map_meta_cap` Filter. Instead of mapping meta capabilities, s2Member now Filters against `user_has_cap`. This technique not only avoids the troublesome behavior in PHP v5.2.17, but also optimizes s2Member on a Multisite Network just a bit further.
289 -* **(s2Member). Bug fix.** Bug related to output buffering. This was preventing large file downloads protected by s2Member on some installations; depending on other plugins running in concert with s2Member. s2Member now implements `while(@ob_end_clean())` to be sure any/ALL output buffers are cleaned before chunked file delivery begins.
239 +- (Framework & Pro) **Security & UI:** Added a prominent admin warning for outdated s2Member Pro installations that predate the current Pro updater. The Framework now warns administrators when an old Pro version may be missing recent security fixes, shows how old the installed release is, and provides a prominent link to download the latest Pro version. The warning does not disable the installed Pro add-on or its features.
290 240
291 -= 3.5.2 =
292 -* Framework updated; general cleanup.
293 -* **(s2Member/s2Member Pro). Optimizations.** Further internal optimizations applied through configuration checksums that allow s2Member and s2Member Pro to load with even less overhead now.
294 -* **(s2Member/s2Member Pro). Optimizations.** Further internal optimizations applied with Hook priorities that allow s2Member and s2Member Pro to load dynamic CSS/JS files with even less overhead now.
295 -* **(s2Member). Bug fix.** Due to changes in WordPress® 3.1+, s2Member was including it's JavaScript routines twice on the `/wp-login.php` page. This has been resolved in s2Member v3.5.2+.
296 -* **(s2Member). Hook change.** Attn WP developers: s2Member's Hook `_ws_plugin__s2member_force_ssl_buffer_tags` is now `_ws_plugin__s2member_force_ssl_buffer_tags_array`.
297 -* **(s2Member). API Constant change.** Attn WP developers: s2Member's API Constant `S2MEMBER_CURRENT_USER_SUBSCR_ID` is now accompanied with a new API Constant `S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID`. The values returned by these API Constants have changed (slightly). For further details, check your Dashboard under: `s2Member -> API Scripting -> API Constants`.
298 -* **(s2Member Pro). Bug fix.** s2Member's ccBill® DataLink routines were sometimes generating the error `Too Many Connections` due to an invalid data storage routine under a delayed scenario. This has been resolved in s2Member v3.5.2+.
241 +- (Pro) **Security:** Enforced the _Shortcode User Fields Whitelist_ for `[s2Member-List]`'s `show_fields` attribute. Fields not on the whitelist are now omitted from Member Lists, with an administrator notice identifying blocked fields that may need to be allowed. _WP Admin > s2Member > General Options > Shortcode User Fields Whitelist_
299 242
300 -= 3.5.1 =
301 -* **(s2Member). Bug fix.** Errors regarding `class-autoloader.inc.php / glob()`, which were associated with installation servers running NFS ( network file systems ) have been corrected in this release.
302 -* **(s2Member). Bug fix.** Errors regarding `ws_plugin__s2member_trim_deep()` during an upgrade from previous versions of s2Member have been corrected in this release.
243 +- (Pro) **Security:** Enforced the _Pro Shortcode Templates Whitelist_. Custom templates specified with the `template` attribute are now blocked unless specifically allowed. The shortcode uses its standard template instead, and an administrator notice identifies blocked template files that may need to be allowed. _WP Admin > s2Member > General Options > Pro Shortcode Templates Whitelist_
303 244
304 -= 3.5 =
305 -* **(s2Member/s2Member Pro). WordPress® 3.1.** Updated for full compatibility with WordPress® 3.1 ( s2Member also remains compatible with the WordPress® 3.0.x series ).
306 -* **(s2Member/s2Member Pro). Speed Optimizations.** s2Member's entire codebase has been re-organized into PHP classes containing s2Member's static functions ( dev note: all of s2Member's Hooks/Filters remain as they were ). This new infrastructure allows s2Member to take full advantage of PHP's built-in [SPL Autoload](http://php.net/manual/en/language.oop5.autoload.php) extension. This means s2Member's source code is loaded ( only on-demand ) as function calls are made within core routines. So instead of loading s2Member's entire codebase into WordPress®; only the objects/methods needed during the processing of particular page will be included. Long story short, this release of s2Member is much faster than previous versions. For advanced site owners, this will make it more feasible to run s2Member in concert many other plugins; even on shared hosting.
307 -* **(s2Member). New feature.** You can now force WordPress® to use your Membership Labels instead of referencing them by s2Member Level #. For further details on this topic, check your Dashboard under `s2Member -> General Options -> Membership Levels/Labels`.
308 -* **(s2Member). Profile Shortcode.** s2Member now provides a built-in Shortcode ( `[s2Member-Profile /]` ) that generates an inline Profile Modification Form; which can be inserted into any Post/Page ( such as your Login Welcome Page ) or even into a Text Widget if you like. This feature is ( in addition to ) the existing `/?s2member_profile=1` stand-alone version that has always been available with s2Member.
309 -* **(s2Member). New feature.** s2Member now supports Remote Header Authorization on File Downloads ( optional ). Remote Header Authorization allows access to file downloads through an entirely different approach ( again, using this is 100% optional ). Instead of asking the Member to log into your site through a browser, a Member can be prompted automatically, to log in through HTTP Header Authorization prompts; which is the same technique used in more traditional security systems via .htaccess files. In other words, Remote Header Authorization makes it possible for your Members to access files through remote applications that may NOT use a browser. This is often the case when a Member needs to access protected files through a software client like iTunes®; typical with podcasts. For further details, please check your Dashboard under `s2Member -> Download Options -> Remote Auth / Podcasting`.
310 -* **(s2Member). New feature.** s2Member now supports a new option in its Login/Registration Design panel. If you have WordPress® 3.1+ installed, you can add your own raw HTML/PHP code to the very bottom of your default Login/Registration Forms with s2Member. Please check your Dashboard under: `s2Member -> General Options -> Login/Registration Design`.
311 -* **(s2Member). New feature.** You can now tell s2Member to *encrypt* your PayPal® Buttons automatically for added security. When this feature is enabled, all of your PayPal® Button Shortcodes will produce *encrypted* PayPal® Buttons. This improves security against fraudulent transactions. To turn this feature on, please log into your Dashboard and navigate to `s2Member -> PayPal® Options -> Account Details`. You'll need to provide s2Member with your PayPal® API Username/Password/Signature; and then enable `Button Encryption`. Additional instructions are provided in your WordPress® Dashboard. NOTE: This feature does NOT require you to have a PayPal® Pro account. If you do, that's fine, but it's not a requirement. Also, this particular feature is ONLY applicable to PayPal® Buttons ( it does NOT work with Pro Forms, nor does it need to ).
312 -* **(s2Member Pro). CSV Exportation.** s2Member now provides two different export formats. 1. Default CSV ( for easy re-importation ). 2. Easy-Read CSV ( improved readability; CANNOT be re-imported ). In addition to these new options, ALL CSV export formats now include column headers too. This makes CSV files easier to read inside applications like MS Excel or OpenOffice/Calc.
313 -* **(s2Member Pro). Authorize.Net®.** s2Member Pro now provides support for Authorize.Net® integrations. Authorize.Net® is a leading provider of payment gateway services, managing the submission of billions of transactions to processing networks on behalf of merchant customers. Authorize.Net is a solution offered by the CyberSource Corporation, a wholly owned subsidiary of Visa (NYSE: V).
314 -* **(s2Member Pro). ccBill®.** s2Member Pro now provides support for ccBill® integration. ccBill® is a great choice when you need to process transactions discreetly on an adult-oriented site. Drawing on its years of experience and proven payment processing platform, ccBill® has a solution that will not only meet the requirements of your consumers, it will also help address the specific needs of your business.
315 -* **(s2Member Pro). New feature.** s2Member now allows for the inclusion of the Pro Login Widget directly into a theme/plugin file ( optional ). Example usage: `<?php echo s2member_pro_login_widget(); ?>`. It is also possible to configure widget options dynamically. For further details, please check the documentation inside this file: `/s2member-pro/includes/functions/api-functions.inc.php`.
316 -* **(s2Member/s2Member Pro). Optimization.** If/when s2Member's logging/debugging mechanisms are enabled through the Dashboard, s2Member is now capable of archiving its own log files. Oversize log files ( i.e. larger than 2MB ) are automatically renamed with `...-ARCHIVED-{time}.log` to prevent s2Member from creating ridiculously large log files that may have otherwise built up over a longer period of time.
317 -* **(s2Member/s2Member Pro). New Profile field.** A new drop-down menu has been added to the administration editing panel for User/Member Profiles. This new drop-down menu allows a site owner to specify which Payment Gateway a Member's payments are associated with. s2Member will automatically configure this field for you, but it is editable none the less. NOTE: If you are upgrading from a previous version of s2Member, you may notice that s2Member will NOT have this information on file for any existing Members that you obtained prior to installing s2Member v3.5+. You may want to go through and update the value of this field for each Member after upgrading. That being said, this new field is only provided for clarity; and for future compatibility. In other words, there is no functionality lost if the Payment Gateway field is left blank for previously existing Members.
318 -* **(s2Member). New feature.** s2Member now supports a new Replacement Code for Login Redirection URLs, and also for URI Restrictions ( `%%current_user_ccaps%%` ). This is the current User's set of Custom Capabilities. If the current User has multiple Custom Capabilities, they will be separated by hyphens; allowing this string to be used in the formulation of slugs for a Special Login Redirection URL; which could be configured differently for each Custom Capability Package that you offer.
319 -* **(s2Member). New feature.** s2Member can now automate un-subscribe/opt-out removals for any List Servers that you've integrated ( i.e. MailChimp®, AWeber® ). s2Member is also capable of handling everything based on your own personal configuration preferences. You can choose which Events you consider grounds for List Removal. For further details, please check your Dashboard under: `s2Member -> API / List Servers -> Automate Un-Subscribes`. During a paid Subscription Modification, it also possible to have Members un-subscribed from Lists at their existing Membership Level#, while at the same time; subscribing them to Lists you've configured at the Membership Level they are upgrading/downgrading to.
320 -* **(s2Member). New feature.** Brute Force IP/Login Restrictions. As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a Brute Force Attack; whereby multiple/repeated logins are strategically attempted with various Username/Password combinations until a correct guess is made. It is NOT likely that you'll be attacked in this way, but it's still a good idea to protect your system; just in case somebody tries this. s2Member thwarts this behavior by monitoring failed login attempts that occur within a short period of time. Whenever s2Member detects an IP address ( i.e. a remote user ) that is consistently failing to enter a valid Username/Password, a temporary ban is created; preventing additional attempts from taking place for 30 minutes. This temporary ban, will ONLY affect the offending IP address. For further details and configuration of this new feature, please check your Dashboard under: `s2Member -> General Options -> Brute Force IP/Login Restrictions`.
321 -* **(s2Member Pro). New feature.** The s2Member (Pro) Login Widget now includes Login/Logout Redirection options. For further details, please check your Dashboard under: `Appearance -> Widgets -> s2Member (Pro) Login Widget`.
322 -* **(s2Member/s2Member Pro). Compatibility.** s2Member now precedes all of its calls to these two functions with an @ sign ( `@ini_get` and `@ini_set` ). This suppresses errors generated by PHP whenever these functions are disabled on the installation server. This is a very minor issue, as most hosting companies DO allow these functions to be called through PHP. At any rate, the preceding @ sign now puts s2Member inline with WordPress® standards in this regard.
323 -* **(s2Member). WP 3.1 Compatibility.** When "Redirect Members away from the Default Profile Panel?" 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. Also, starting with WordPress® 3.1+, setting this to ( <code>Yes</code> ) tells s2Member to dynamically modify links/titles in the new Admin Bar that can be enabled on WordPress® 3.1+. s2Member will force links to your Login Welcome Page instead of the Default Profile Panel; and Dashboard links are removed for non-Admin accounts ( as they should be ).
324 -* **(s2Member). New feature.** It is now possible to delete/reset IP Restrictions ( i.e. temporary bans ) caused by a security breach in your configuration of s2Member's IP Restrictions. Some site owners have reported complaints from their Customers about the error `503 / Too Many IP Addresses`. This is not a bug; it is the result of a temporary ban that s2Member imposes automatically; based on your IP Restriction configuration in the General Options panel for s2Member. Improving upon this functionality in s2Member v3.5+, you can now pull up a Users account in your Dashboard and delete/reset temporary bans on a per-User basis; as needed for customer service. For further details, or to delete/reset ALL IP Restrictions at once, please check your Dashboard under: `s2Member -> General Options -> IP Restrictions`.
325 -* **(s2Member). Multisite auto-patcher.** When running on a Multisite Network with `Automatically Patch WordPress® = yes`, s2Member is now capable of hooking into the automatic upgrade routines for WordPress® so that future updates to the WordPress® core framework will remain synchronized with core patches required by s2Member ( and a notice regarding patches automatically synchronized will be displayed during the core upgrade routine in your Dashboard ). This is ONLY applicable if you're running s2Member on a Multisite Network. For further details, check your Dashboard under: `s2Member -> Multisite (Config)`.
326 -* **(s2Member Pro). Multisite Blog Farms.** On a Multisite Blog Farm, it is now possible for child Blog Administrators running s2Member Pro to utilize the advanced Import/Export routines provided by the s2Member Pro module.
327 -* **(s2Member/s2Member Pro). New feature.** It is now possible to (ADD) Custom Capabilities through a Subscription Modification Button/Form. By default, a Checkout Button or Form generated by s2Member is designed to set and/or reset a Member's Custom Capabilities to the ones you specify in the Button/Form Code. However, starting with s2Member v3.5+, you can tell s2Member to (ADD) additional Custom Capabilities to any that already exist for a particular Member. This is accomplished on a per Form/Button basis by preceding your comma-delimited list of Custom Capabilities with a (+) sign. For further details on this topic, click the [?] icon next to the Custom Capabilities field in any Button/Form Generator supplied by s2Member.
328 -* **(s2Member). Compatibility.** s2Member's data encryption routines have always used a URL-safe version of Base64 Encoding to transfer data; whereby the Base64 padding character `=` is replaced with a URL-safe `.`. This routine has been modified to replace `=` with `~` instead of `.`; making s2Member more compatible with internal WordPress® functions like `site_url()` which refuse to generate URLs containing double `..` occurrences. Backward compatibility for existing data remains intact though; so this change only serves to improve s2Member's compatibility with WordPress®.
329 -* **(s2Member). New cookie.** s2Member has always used three temporary/encrypted cookies to authenticate a newly paid Customer. Starting with s2Member v3.5, there are now four cookies all together ( `s2member_subscr_gateway`, `s2member_subscr_id`, `s2member_custom`, `s2member_level` ). The new addition is `s2member_subscr_gateway`. The value of this cookie is also stored internally; it's associated with a Customer's Paid Subscr. ID. You can edit the Paid Subscr. Gateway/ID if you'd like. You'll find a drop-down menu on the [Edit] page for each Member.
330 -* **(s2Member/s2Member Pro). New feature.** s2Member's Button and Form Generators now provide a customer service tool that allows a site owner to generate Membership Registration Access Links on their own ( if/when needed ). This tool accompanies the Specific Post/Page Link Generation tool that has been a part of previous versions of s2Member. So these tools working together, now make it possible to create Access Links for both types of functionality. Again, these tools are provided for convenience. They are only intended to help site owners with customer service issues; they are NOT a required aspect of s2Member's integration with WordPress®.
331 -* **(s2Member Pro). New feature.** If you're using Pro Forms with s2Member Pro; particularly if you run a Multisite Blog Farm, you can now set this Constant in your `/wp-config.php` file: `define('S2MEMBER_PRO_AUTO_FORCE_SSL', true);`. This tells s2Member Pro to auto-force SSL on any Post/Page that contains a Pro Form Shortcode. This is useful if you're running a Blog Farm and SSL is already provided/configured for all Site Owners on your Network. Otherwise, the method of using a WordPress® Custom Field `s2member_force_ssl = yes` on a per-Post/Page basis works fine.
332 -* **(s2Member Pro). Desc attribute change.** The maximum characters allowed in the `desc=""` attribute for Pro Form Shortcodes ( and only for Pro Forms ) is now `100` characters. In previous versions the max length was `127`. This has been lowered to `100` so that s2Member has plenty of room for dynamically generated annotations regarding discounts via coupon codes. FYI: most Payment Gateways impose an upper limit ( e.g. PayPal® 127 max total ). In other words, s2Member must reduce max characters allowed in the `desc=""` attribute so it has plenty of room for its own annotations.
333 -* **(s2Member). Compatibility.** s2Member's handling of protected file delivery through `chunks` has been updated to support the full valid protocol of `Transfer-Encoding: chunked`. This should eliminate any remaining file delivery issues on GoDaddy shared hosting accounts and the like.
334 -* **(s2Member). Compatibility.** s2Member's directory locations for `/s2member-files/` and `/s2member-logs/` are now nested into a sub-directory of `/app_data/` ONLY on Windows® servers. This way all files in these directories will be secured from public access in a Windows® environment. On a Windows® server, the `/app_data/` directory name is special. Files within a directory with this special name are automatically protected from public access, without needing to create an `.htaccess` workaround, or use a `web.config` file. In addition, s2Member now makes two WordPress® Filters available ( `ws_plugin__s2member_files_dir` and `ws_plugin__s2member_logs_dir` ) giving developers the ability to move their protected files and/or logs to a custom directory of their choosing; if/when this is needed in special cases.
335 -* **(s2Member/s2Member Pro). New Hook for Multisite Blog Farm developers.** s2Member now makes a new Hook available; allowing Multisite Blog Farms to prevent the s2Member Pro module from loading on certain child Blogs, or under other special circumstances. You'll find this Hook inside `/s2member/s2member.php` ( `ws_plugin__s2member_load_pro` ).
336 -* **(s2Member/s2Member Pro). Multisite Blog Farms.** The dynamic mutation of s2Member's built-in documentation has been updated to provide better ( i.e. more appropriate ) information to Administrators of child Blogs on a Multisite Blog Farm.
337 -* **(s2Member Pro). Instruction.** Additional instructions have been added to the s2Member Pro panel for PayPal® Pro Forms. This new information includes details regarding workarounds when you do NOT have access to a PayPal® *Pro* account. FYI: It is no longer an *absolute requirement* that a site owner have a PayPal® Pro account; you can still use Pro Forms; as long as you have PayPal® Express Checkout ( which is free ).
338 -* **(s2Member). Conflict prevention.** s2Member now provides warnings in the Dashboard whenever novice site owners attempt to configure their Login Welcome Page or Membership Options Page as their Home Page ( i.e. static page ) for WordPress®; or as the static Posts Page. These conflict warnings will appear under: `WordPress® -> Reading Options` when/if a configuration conflict arises.
339 -* **(s2Member/s2Member Pro). Documentation.** Documentation updated/improved throughout several areas of s2Member and s2Member Pro.
245 +- (Pro) **Improvement:** Hardened validation of PayPal Pro-Form `success` URLs used after subscription cancellation. Redirects are now limited to normal HTTP(S) destinations after replacement codes are processed, preventing executable or other non-web URL schemes from being used. Also hardened malformed programmatic `success` values to avoid PHP warnings.
340 246
341 -= And these bugs were corrected in v3.5 ( Changelog cont. ) =
247 +- (Framework) **Fix & UI:** Corrected Asset Health reporting when static CSS or JavaScript cannot be used because the site's current hooks or configuration require dynamic delivery. This intentional compatibility behavior is now treated as healthy instead of being reported as an unexpected fallback, and it no longer creates misleading "Latest Issues" entries. Asset Health now identifies why dynamic delivery is required, explains when the Full WordPress Dynamic Loader is necessary, and points to the "JavaScript Text Delivery" setting when it can help more pages continue using static JavaScript.
342 248
343 -* **(s2Member). Multisite bug fix.** When s2Member is installed on a Multisite Network, it is now capable of dealing with centralized Users accounts that are being shared across multiple sites in the Network. In other words, s2Member v3.5+ prevents WordPress® from generating `username/email exists` errors through front-end forms whenever a User that exists on one site attempts to register on another. In order to accomplish this, s2Member v3.5 introduces one additional Multisite patch for your `/wp-includes/ms-functions.php` file, making it possible for WordPress® to add/remove existing User accounts from one site to another (gracefully); just like that which is supported natively in the WordPress® Dashboard already. NOTE: after updating to s2Member v3.5+, please be sure to re-run your Multisite (Config) patches. You will find these patches in your Dashboard under: `s2Member -> Multisite (Config)`. And yes, this is also compatible with WordPress® v3.1.
344 -* **(s2Member). Bug fix.** The built-in Profile Editing panel for s2Member that resides at `/?s2member_profile=1` contained an extra ( i.e. double ) closing tag for the `form` element. This has been corrected in s2Member v3.5+.
345 -* **(s2Member Pro). Bug fix.** A Pro Form configuration error, `Invalid "rp, rt" attributes.`, was being triggered whenever the Pro Form Attribute `rp` was greater than 1 year; even for Buy Now (BN) transactions. This was NOT the intended behavior, as the 1 year recurring limitation applies only to PayPal® Recurring Profiles, and should NOT have been limiting Buy Now transactions under 5 years. This bug/limitation has been resolved in the latest release. Maximum Subscription length for PayPal® Pro Recurring Profiles is 1 year, and maximum Subscription length for Buy Now transactions is 5 years; or 1 Lifetime also being possible.
346 -* **(s2Member Pro). Bug fix.** A Pro Form configuration error, `attribute is "D", and "tp" ( Trial Period ) > 7` was corrected. This should have been testing for 365 days instead of 7.
347 -* **(s2Member Pro). Bug fix.** The AliPay® integration file `alipay-notify.inc.php` was updated to correct an incompatibility issue with AliPay® custom variables. A symptom of this bug was ( no email being received after AliPay® checkout ). This bug has been resolved in s2Member Pro v1.5.
348 -* **(s2Member Pro). Bug fix.** The AliPay® integration file `alipay-notify.inc.php` was not exiting with the proper `success` status in its communication with AliPay®. A symptom of this bug was repeated notifications for a single transaction; thereby causing multiple emails to each Customer under the right circumstance. This bug has been resolved in s2Member Pro v1.5.
349 -* **(s2Member Pro). Bug fix.** s2Member Pro was sometimes processing API Payment Notifications in duplicate for AliPay®, ClickBank®, ccBill®, and Google® Checkout integrations. This has been resolved in s2Member Pro v1.5+.
350 -* **(s2Member Pro). Bug fix.** s2Member Pro was sometimes delivering ClickBank® Customers to a Return-Page with a default POST vars error because of an invalid `proxy_use / ty-email` specification. This has been resolved in s2Member Pro v1.5+.
351 -* **(s2Member Pro). Bug fix.** s2Member Pro Form integration with PayPal's Pro API, was suffering from a minor glitch caused by date/time conflicts between the s2Member installation server ( i.e. your server ) and PayPal's API server. In some rare cases, s2Member was attempting to start new Recurring Profiles in the past ( at least in the eyes of the PayPal® API server ); which could be in a different time zone. s2Member Pro now avoids this potential conflict by padding start dates with 12 hour offsets; making s2Member more reliable in this regard.
352 -* **(s2Member). Bug fix.** When s2Member was running together with BuddyPress, `wp-login.php?redirect_to=` logic implemented by BuddyPress was conflicting with s2Member's handling of `wp-login.php?redirect_to=`, including Login Welcome Page redirection. s2Member v3.5 resolves this BuddyPress conflict by removing all Filters applied by BuddyPress to `login_redirect`; thereby eliminating the conflict all together. This conflict was resolved in favor of s2Member, because s2Member provides a very comprehensive option configuration for this behavior in it's General Options panel.
353 -* **(s2Member). Bug fix.** s2Member's Alternative View Protection was not working properly when the `All` setting was applied to child/sub Category restrictions. At least, not in the same way that s2Member handles all of its other child Category restrictions. This bug has been corrected in v3.5 so that all child/sub Categories of a protected parent Category are filtered by s2Member's Alternative View Protection when this option is set to `All`.
354 -* **(s2Member Pro). Bug fix.** s2Member's integration with AliPay® was attempting to process duplicate IPN responses from the AliPay® server. Apparently AliPay® finds it necessary to continue prodding the IPN handler multiple times. In order to prevent duplicate processing, s2Member now employs a Transient array of already-processed Notification IDs; allowing it to silently ignore duplicate IPNs ( they will still be logged though, as they should be ).
355 -* **(s2Member). tinyURLs.** s2Member's limited use of the tinyURL service for shrinking links inserted into email messages has been improved upon in this release. As of s2Member v3.5+, all tinyURLs are now appended with your domain name; making them easier for Customers to read, and improving their overall appearance.
356 -* **(s2Member). Bug fix.** Under certain circumstances, s2Member was generating administrative URLs with `/wp-admin/?page=...` instead of `/wp-admin/admin.php?page=...`. A common symptom of this bug was to see an error in your Dashboard, something like: `You do not have permission to access this page`. This has been resolved in s2Member v3.5+.
357 -* **(s2Member). Bug fix.** Corrected layout issue on s2Member's Multisite (Config) panel. The field for `Level #0 Blogs Allowed` was not being hidden properly under certain circumstances; depending on the Multisite configuration being applied. This has been corrected in s2Member v3.5.
358 -* **(s2Member Pro). Bug fix.** Some of the new Button Generators for ClickBank®, AliPay®, Google® Checkout were using the JavaScript `escape()` function instead of `encodeURIComponent()`; leaving the possibility for certain characters ( such as `+` signs ) to be misinterpreted when passed through a URL/query string. This bug has been resolved in s2Memeber v3.5+ and s2Member Pro v1.5+.
359 -* **(s2Member Pro). Upgrader/bug fix.** The automatic upgrader for the s2Member Pro module was inadvertently deleting itself ( sometimes ) whenever an upgrade failed through WordPress® with script memory/timeout errors. This routine has been modified to better handle it's "point of no return" by unzipping the latest distribution into a separate temporary directory. In addition to this change, the update routine now analyzes your server configuration to ensure enough memory is available before the update routine begins. In the event that your installation lacks the memory required ( at least 256M ) to unzip the s2Member Pro module, a warning to that affect will be displayed and you will need to upload the `/s2member-pro/` directory via FTP instead; following instructions in the `/readme.txt` file.
360 - IMPORTANT: Since previous versions of the automatic updater did NOT include these important enhancements, you may not be able to use the automatic updater in your current version of s2Member Pro. Long story short, we believe the issues HAVE been corrected for "future" releases, but in order to upgrade to this release, you may need to download a copy at s2Member.com and upload it manually via FTP. Full instructions are provided in the `/readme.txt` file, and on the site at s2Member.com.
249 +- (Framework) **Improvement:** EOT demotion traditionally replaced all of a member's WordPress roles, but some sites need to preserve unrelated roles. The new _Demote From_ setting can now remove only the member's s2Member Level role instead. New installations use this level-only behavior by default; existing installations keep the legacy replace-all behavior unless changed. Thanks to Craig for suggesting this. See: [thread #13494](https://f.wpsharks.com/t/13494).
361 250
362 -= 3.3.2 =
363 -* Tested against WordPress® 3.0.3. Everything looks good.
364 -* (s2Member) Bug fix. s2Member was ignoring `?redirect_to=value` upon login, in favor of the Login Welcome Page configured for s2Member. s2Member v3.3.2 has been updated to allow the use of `redirect_to`; and to simply default to the Login Welcome Page when no `redirect_to` argument is passed in. This is the intended behavior. As of s2Member v3.3.2 this now works fully as expected.
365 -* (s2Member/s2Member Pro) Bug fix. s2Member was incorrectly calculating delayed EOT Times under certain circumstances. This was related to non-recurring Subscriptions processed on PayPal® accounts opened after October 15th, 2009. Under the right scenario, PayPal's IPN responses were fooling s2Member, by immediately expiring payments; and sending a `recurring_payment_expired` IPN before the `recurring_payment` IPN. So s2Member was incorrectly calculating the EOT Time ( i.e. `last_payment_time` was not properly considered ). The logic behind s2Member's IPN handling routines has been corrected in v3.3.2 to resolve this issue.
366 -* (s2Member/s2Member Pro) SEO / Search Engine Optimization. s2Member now sends 301 redirect headers instead of the default WordPress® 302. This prevents duplicate content warnings from search engines such as Google®. In other words, when s2Member redirects visitors ( and/or search engine spiders ) to your Membership Options Page, in response to an attempt to access a secured area of your site; the `wp_redirect()` call will send a 301 redirect header instead of a 302. This prevents duplicate content warnings associated with your Membership Options Page. In addition, a universal Filter ( i.e. `ws_plugin__s2member_content_redirect_status` ) has been added to s2Member's source code, giving developers the ability to modify this behavior dynamically; if they need to.
367 -* (s2Member Pro) Bug fix. s2Member Pro's AliPay® integration was incorrectly handling Return URLs on success. This release fixes the invalid syntax inside `/functions/separates/alipay-return.inc.php`.
368 -* (s2Member Pro) Compatibility. s2Member Pro Forms are now compatible with jQuery v1.4.4. jQuery v1.4.4 introduced the need for double-quotations around all attribute/value selectors.
369 -* (s2Member Pro) New Pro Form attribute. s2Member Pro Forms now accept a new Attribute ( i.e. `template=""` ). This allows developers to integrate Pro Forms with custom template files, on a per-Form basis. For further details on this topic, please check your Dashboard under: `s2Member -> PayPal® Pro Forms -> Shortcode Attributes (explained)`.
370 -* (s2Member) Bug fix. A bug that was first introduced in v3.3 was causing AWeber integrations to fail with email addresses being picked up as the administrative address instead of the Customer's address. This was related to a previous change in v3.3 where all `mail()` commands were converted to `wp_mail()` for improved compatibility. With this release ( s2Member v3.3.2 ), the bug with AWeber integration has been resolved. Thanks to everyone for reporting this important issue.
251 +- (Framework) **Improvement:** EOT demotion normally sends members to _Subscriber / s2Member Level 0_, and using another role previously required custom code. The new _Demote To Role_ setting lets site owners choose another s2Member Level or an available custom role directly from the EOT settings. Existing customizations using the `ws_plugin__s2member_force_demotion_role` filter continue to work.
371 252
372 -= 3.3.1 =
373 -* Tested against WordPress® 3.0.2. Everything looks good.
374 -* Updated Stable Tag to v3.3.1. s2Member is compatible with WordPress® 3.0+ ( including WP 3.0.2 ).
253 +- (Pro) **Improvement:** PayPal Checkout cancellation buttons using `output="button"` can now also use a `success=""` attribute to redirect the member after a successful subscription cancellation. If no Success URL is provided, the existing cancellation confirmation remains unchanged. Thanks to Felix for suggesting this. See: [thread #13462](https://f.wpsharks.com/t/13462/7)
375 254
376 -= 3.3 =
377 -* (s2Member) Bug fix / File Downloads. Use of PHP's `fread()` function has been updated to `stream_get_contents()` with a 2MB chunk size in order to satisfy the needs of site owners delivering VERY large files ( 500MB+ ) though simulated HTTP streams "inline". For instance, an MP4 video file into a FlowPlayer/JWPlayer or another Flash-based application. In addition, s2Member is now capable of output buffering its chunked file delivery, making it possible for s2Member to deliver VERY large files through most shared hosting platforms without needing to upgrade to a private server.
378 -* (s2Member) Bug fix / BuddyPress. Bug fix. New filter added in support of BuddyPress on a Multisite installation. `add_filter ("bp_signup_usermeta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");`
379 -* (s2Member) Bug fix / BuddyPress. Improved detection of BuddyPress activation/registration slugs using `BP_ACTIVATION_SLUG`, `BP_REGISTER_SLUG` in conjunction with improved routing of `$usermeta` data inside `/s2member/includes/functions/config-user-registration.inc.php`. This resolves an issue where s2Member was not properly applying Membership Levels ( e.g. an s2 Role ) with BuddyPress installed on a Multisite Network.
380 -* (s2Member) Custom Registration Fields. s2Member's API Notifications now support custom Replacement Codes for any Custom Registration Fields that you've configured with s2Member. This makes it easier for developers to integrate 3rd party services, because s2Member's API Notifications can now be configured to send additional information that may include data entered by your Customer into a Custom Registration Field. Also, s2Member still supports the `custom="domain|cv1|cv2|cv3|etc..."` Attribute in your Shortcode too. For full details, check your Dashboard under: `s2Member -> API Notifications`.
381 -* (s2Member) Improved documentation on various Replacement Codes available for s2Member. There are also some new Replacement Codes made available in various sections/integrations.
382 -* (s2Member) In WordPress®, when you list all `Users`, you will find a search box in the upper right-hand corner of the screen. This search box now has the ability to find Members by `Username, Display Name, Nickname, s2Member / Paid Subscr. ID, Custom String, and ANY Custom Registration Field value`.
383 -* (s2Member) Advanced Content Dripping. A new PHP/API Constant has been made available for Content Dripping `S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS` ( note the addition of "PAID" ). Also, s2Member v3.3 includes an entirely new/alternative method for Dripping Content, using a new API Function called `s2member_registration_time ([level])`. You will find all of the information/documentation on this topic inside your Dashboard under: `s2Member -> API Scripting -> Content Dripping`. s2Member now has the ability to provide you with information about when a Member pays you at each specific Membership Level. That being said, there IS an issue with this... The new function `s2member_registration_time ()` will NOT return data correctly for existing Members that paid you prior to you upgrading to s2Member v3.3+. This is because s2Member did NOT record all of this information in previous versions. So it can't give you what it doesn't have on any of your existing Members. Please check the forums for workarounds.
384 -* (s2Member) API Constants. s2Member v3.3 includes some new API Constants related to PayPal® and PayPal® Pro integration. Such as the configured PayPal® API Username, Password, Signature, etc. These will make it easier for other extensions to be built on top of s2Member should the need arise.
385 -* (s2Member/s2Member Pro) Documentation updated throughout. Some minor wording changes were required here-and-there in order to prevent confusion with all of s2Member Pro's new Gateway integrations.
386 -* (s2Member/s2Member Pro) All of s2Member's Button Generators now give you the ability to set a Trial Period and a separate Trial Billing Amount. So instead of just offering a 100% free Trial Period, you can now offer an Initial Period at one price, but have the Subscription billed later at a different Regular Recurring rate.
387 -* (s2Member Pro) New configuration panel added to s2Member Pro. The new `Other Gateways` panel allows you to enable/disable other Payment Gateways that have been integrated with s2Member Pro.
388 -* (s2Member Pro) Google® Checkout. s2Member Pro has been integrated with Google® for Direct Payments and also for Recurring Billing. In order to take advantage of this new integration method, you will need to have a copy of s2Member Pro, and a Google® Checkout Account. A Google® Checkout account is free.
389 -* (s2Member Pro) ClickBank®. s2Member Pro has now been integrated with ClickBank® for Direct Payments and also for Recurring Billing. In order to take advantage of this new integration method, you will need to have a copy of s2Member Pro, and a ClickBank® Merchant Account. Otherwise, you can just use the PayPal® Standard integration that comes with the free version of s2Member.
390 -* (s2Member Pro) AliPay®. s2Member Pro has been integrated with AliPay® for Direct Payments. In order to take advantage of this new integration method, you will need to have an AliPay® Merchant Account with Direct Pay enabled ( aka: 前台自助--即时到账收款 ). This can sometimes take a couple of days to acquire. Once you've been approved at AliPay®, you'll be given a Partner ID, and a Security Code; which you'll need to configure inside your `s2Member -> AliPay® Options`.
391 -* (s2Member Pro) PayPal® Pro integration with s2Member Pro, now supports Coupon Codes that can be configured to ONLY apply to (ta) Trial Amounts, or (ra) Regular Amounts. For further details and examples, please check your Dashboard under: `s2Member -> Coupon Codes`.
392 -* (s2Member Pro) PayPal® Pro Forms with s2Member Pro, can now be configured to recur at these new intervals: Bi-Weekly, Bi-Monthly, and Quarterly recurring cycles.
393 -* (s2Member Pro) Documentation. New documentation on ALL of s2Member's Shortcode Attributes for Pro Forms, Standard Shortcodes, and other Payment Gateways; is now included inside your Dashboard. For each Payment Gateway that you enable, there will be a Button Generator available in the s2Member Menu panel. At the bottom of each Button Generating station, you'll find a detailed examination of s2Member's Shortcode Attributes. This should make s2Member even easier for developers to integrate.
255 +- (Framework) **Improvement:** Added date formatting support to the `[s2Get /]` shortcode when retrieving the current user's registration timestamps. `S2MEMBER_CURRENT_USER_REGISTRATION_TIME` and `S2MEMBER_CURRENT_USER_PAID_REGISTRATION_TIME` can now use the existing `date_format` attribute (e.g., `m/d/Y`, `default`, or `timestamp`), making these timestamps easier to display as readable dates without custom PHP. Also corrected the related scripting documentation to distinguish registration day counts from Unix timestamps. Thanks to Gerard for suggesting this. See [thread #13221](https://f.wpsharks.com/t/13221).
394 256
395 -= 3.2.9 =
396 -* Compatibility. s2Member's Custom Field interface was being negatively impacted by the Prototype library for JavaScript; which is utilized by some other popular plugins, such as WP-O-Matic. As a result, on some installations of s2Member ( depending on your plugin combination ), a few site owners were seeing a jumbled mix of fields in their General Options panel for s2Member. This conflict with the Prototype library has been resolved in s2Member v3.2.9+.
257 +- (Framework) **Improvement:** Expanded the AWS S3 region selector with several compatible regions that were missing: Canada Central (`ca-central-1`), Ohio (`us-east-2`), Mumbai (`ap-south-1`), Paris (`eu-west-3`), and Stockholm (`eu-north-1`). Sites using buckets in those regions can now select them directly. Thanks to David for the reminder. See: [thread #4706](https://f.wpsharks.com/t/4706).
397 258
398 - If ( and ONLY if ) you were experiencing this issue in previous versions of s2Member, it is recommended that you delete all of your existing Custom Fields for s2Member and re-create them. If you don't delete all of your corrupted Custom Fields and start over, the issue may *appear* to still exist; but it HAS been corrected.
259 +- (Framework & Pro) **Improvement:** Added some needed filters that were missing, giving developers more ways to customize s2Member emails and Tracking Codes.
399 260
400 -= 3.2.8 =
401 -* Unique IP Restrictions. There is a new option under: `s2Member -> General Options -> IP Restrictions` which allows a site owner to effectively disable IP Restrictions if they'd prefer. On some hosting platforms, the `$_SERVER["REMOTE_ADDR"]` variable ( i.e. a Users IP address ) is incorrectly set to the exact same thing for all visitors; which WILL prevent s2Member's IP Restrictions from working as intended. If you're on a hosting platform that has this bug, you may wish to disable IP Restrictions completely using s2Member v3.2.8+. Otherwise, under most circumstances we recommend that you leave IP Restrictions on.
261 +- (Pro) **Fix:** Resolved PHP 8.x warnings in `[s2Member-List]` caused by optional member-query arguments, including `meta_query`, not always being present.
402 262
403 -= 3.2.7 =
404 -* Custom Fields ( new features ). s2Member is now equipped with a VERY powerful set of features; designed to extend the functionality of Custom Fields. s2Member now supports Text Fields ( single/multi-line ), Checkboxes ( single/multi-option ), Radio Buttons ( single/multi-option ), and Dropdowns ( single/multi-option ). In addition, with s2Member it is now possible to configure Custom Fields differently for each Membership Level. Other tools: including Validation Formats and Visibility are also available. For full details, check your Dashboard under: `s2Member -> General Options -> Custom Fields`.
405 -* Attn Developers ( before upgrading ). Hooks/Filters ( e.g. those related to Custom Fields ) have been modified in ways that may break custom scripts you've created to work with previous versions of s2Member. We suggest dropping all of your Hooks/Filters related to Custom Fields. Instead, use the NEW improved tools w/s2Member v3.2.7+. Please see: `s2Member -> General Options -> Custom Fields`.
406 -* BuddyPress/Multisite. A plugin conflict was resolved between BuddyPress/s2Member when both of these plugins were installed on a Multisite Network together. BuddyPress bypasses the default Filter ( `pre_site_option_registration` ) and instead, it uses: `bp_core_get_site_options()`. This has been resolved in s2Member v3.2.6+.
407 -* Bug fix. A bug was found in s2Member's handling of Custom Fields columns. This minor bug was conflicting with other plugins that attempt to create User-based columns. This was been resolved in s2Member v3.2.7+.
408 -* New Shortcode attribute. s2Member's PayPal Button Shortcode now accepts a new attribute ( `ta="0.00"`, Trial Amount ). In the past, if you intended to offer a "paid" Initial Period at a different price, you had to use the Full Button Code. Now you can just change the `ta="0.00"` attribute ( which is easier ).
409 -* More informative. s2Member now generates warnings for newbies that create conflicts between their Membership Options Page and Login Welcome Page. s2Member is now capable of detecting the most common conflicts, in order to produce informative messages that assist site owners.
410 -* Login/Registration Design. s2Member v3.2.7+ includes additional customization tools that allow font sizes and font families to be configured for the Login/Registration system. In your Dashboard, go to: `s2Member -> General Options -> Login/Registration Design`.
411 -* Bug fix. The Default Profile Editing Panel ( e.g. `/wp-admin/profile.php` ) was NOT validating Custom Fields. s2Member v3.2.7 resolves this for Users/Members. Administrators are exempt ( the intended functionality ).
412 -* Better instructions inside in the General Options panel for s2Member. Just a few subtle improvements based on User feedback. Hopefully these will make life a little easier for newbies.
263 +- (Framework) **Fix:** Prevented a fatal error in the s2Member-Only dynamic CSS/JS loader when BuddyPress is detected but its `bp_is_create_blog()` helper is unavailable. This also prevents affected sites from unnecessarily falling back to the Full WordPress Dynamic asset loader.
413 264
414 -= 3.2.5 =
415 -* IP Restrictions ( reset ). Several site owners have reported issues with s2Member's IP Restrictions. A full investigation has been performed. Although no bugs were found, we suspect that recent reports on this topic are related to a combination of a.) improvements in recent versions of s2Member, with respect to IP Restrictions ( adaptive concurrency limits ); and b.) lack of support ( on the part of s2Member ) for resetting IP Restriction Logs after changes in configuration. In this release of s2Member, we've introduced a new tool for site owners, which allows you to Reset IP Restriction Logs manually, at anytime you like. For further details, please see: `s2Member -> General Options -> IP Restrictions` ( look for the new button titled: `Reset IP Restriction Logs`. ).
416 -* Compatibility. s2Member's activation/deactivation routines have been updated to support installations of WordPress® that may, or may not, already have the default WordPress® Roles installed. For instance, some installations of WordPress® are running with Role managing plugins. A site owner could have modified WordPress®, and may no longer have one, or even all of these default Roles: `administrator, editor, author, contributor, subscriber`. s2Member is now capable of dealing with this scenario gracefully upon activation/deactivation.
265 += v260913 =
417 266
418 -= v3.2.4 - 1.0 =
419 -* ... trimmed away at v3.2.4.
420 -* Initial release, v1.0.
267 +- (Framework) **Fix:** Made frontend CSS/JavaScript monitoring less impatient on sites where expected assets take a little longer to become active. Although the monitor already waited until the page had fully loaded before checking, some setups make their CSS/JavaScript become active a little later, which could cause a false alarm. This has now been fixed. Thanks to Gerard for reporting this. See: [thread #13609](https://f.wpsharks.com/t/13609)
268 +
269 +- (Framework) **Enhancement:** Expanded the frontend CSS/JavaScript monitoring introduced in the previous release into a new "CSS/JS Asset Health" system. The earlier monitoring layer is now smarter, more patient, more informative, more self-healing, quieter when the administrator does not need to intervene, and still designed to stay lightweight during normal frontend traffic.
270 + - **New overall health status:** "CSS/JS Asset Health" monitors frontend assets, including the Pro add-on's assets when installed, keeps track of recent delivery results, and summarizes the current situation as "Healthy", "Recent issue", "Working, review suggested", or "Needs attention" instead of reacting to every individual hiccup in isolation.
271 + - **More patient, configurable checks:** The original monitor checked whether expected assets had become active 1 second after the page finished loading. The default wait is now 3 seconds, and the new "Wait Before Checking Frontend Assets" setting lets site owners adjust that delay for setups where optimization, caching, networking, or other conditions make assets become active a little later.
272 + - **Smarter issue handling:** A single delayed or uncertain result no longer needs to become an immediate administrator problem. Asset Health considers both how recent and how persistent problems are, and can return to "Healthy" as normal loads continue.
273 + - **More resilient automatic recovery:** If an enabled static asset file unexpectedly disappears, s2Member will try to rebuild it automatically the moment the problem is encountered instead of waiting for the administrator to refresh it manually. Assets that need rebuilding can also be recovered during normal admin activity, avoiding an extra rebuild during a frontend page-load when possible, and relevant settings changes can trigger affected assets to be rebuilt immediately, too.
274 + - **Clearer diagnostics:** The new Asset Health panel shows each CSS/JavaScript asset and its current delivery state, including "Healthy", "Late", "Fallback", "Failed", "Not generated yet", and "Pending rebuild", with plain-language details when more information is useful. A persistent "Last issue" reminder and compact "Latest Issues" log preserve useful troubleshooting details, including affected frontend URLs, occurrence times, and repeated occurrences, with controls to clear them when they are no longer useful.
275 + - **Fallback visibility:** Asset Health understands s2Member's existing automatic fallback behavior, distinguishes successful delivery from successful fallback, and shows when the preferred delivery method could not be used but a compatible fallback kept the asset working. It can also show when the fallback itself is unavailable, even while the preferred delivery method is still working, so the administrator knows that the safety net needs attention before it's needed.
276 + - **More useful administrator notices:** Short-lived issues are given time to recover without unnecessary warnings. When a problem persists long enough to deserve attention, or is serious enough to require attention sooner, s2Member can show a compact administrator notice explaining the affected asset and link directly to the "CSS/JS Asset Health" section for review.
277 + - **Manual recovery and rechecking:** The "Refresh Static Assets" button rebuilds the enabled static files, while the "Recheck Asset Health" button performs a fresh check of the current delivery setup. Refreshing static assets also rechecks their health automatically afterward.
278 + - **Performance-conscious health tracking:** Frontend page-loads save small, independent Asset Health records without waiting for the shared health history to be updated. Those events are merged into the rolling history separately and in chronological order, preserving delayed reports and recent-issue details without making normal frontend page-loads wait on Asset Health bookkeeping.
279 +
280 +- (Framework) **UI:** Refined the CSS/JavaScript delivery controls and status presentation. Renamed the beta section to "CSS/JS Delivery & Optimization (Beta)", improved the shared health-status colors used across s2Member status sections, clarified help text and status explanations, and corrected the disabled "Refresh Static Assets" button so it remains visibly disabled when unavailable because static assets are not enabled or a configuration change needs to be saved first.
281 +
282 +- (Framework) **Fix:** Corrected a compatibility issue that could cause a PHP fatal error when another plugin printed WordPress scripts unusually early, before s2Member had finished initializing. s2Member now handles that early script output safely. Thanks to Sim Architect for reporting it.
283 +
284 +- (Pro) **Improvement:** EOT Reminder failure notices are now more actionable. Reminder Status can identify the oldest failing recipient and, when available, the related WordPress user. Persistent admin warnings can now be dismissed for the current incident, while retry and failure details remain available in the _EOT Reminder Status_ section. A materially new or escalated critical reminder problem will alert administrators again. Thanks to Matt for reporting this.
285 +
286 +- (Framework & Pro) **Fix:** Restored compatibility with WordPress 4.2–4.3 by replacing uses of `wp_parse_url()`, which wasn't introduced until WordPress 4.4.
287 +
288 += v260909 =
289 +
290 +- (Framework & Pro) **Major Improvement:** Until now, s2Member normally generated CSS/JS assets dynamically because some of their contents can change depending on the visitor or other conditions. Dynamic generation requires PHP and WordPress to load before each file can be built. s2Member can now build in advance the parts that don't change and whose contents are shared across all visitors, and save them as static files, allowing the web server to return them directly without loading WordPress for each request. In our tests, static requests were consistently more than 100× faster than dynamic delivery, helping pages load faster while reducing server work. See _WP Admin > s2Member > General Options > Performance & Caching > Static CSS/JS Optimization (beta)_.
291 + - **Flexible opt-in controls:** Enable static CSS, static JavaScript, or both. The existing _CSS/JS Lazy Loading_ option still controls which pages load s2Member's files.
292 + - **Better caching for logged-in users:** Most of s2Member's JavaScript is the same for everyone, so it can now be shared and cached instead of being rebuilt separately for each visitor. Personal/member-specific values stay with the WordPress page and are never stored in reusable static files. This lets logged-in and logged-out visitors reuse the same shared JavaScript more effectively across page views.
293 + - **Pro and gateway support:** Pro core and enabled-gateway CSS and JavaScript can use the same static delivery, combining, and minification options.
294 + - **Flexible static asset delivery:** Static Framework and Pro assets can be kept separate for more granular caching, refreshing, and monitoring, or combined into one CSS file and one JavaScript file to minimize the number of requests.
295 + - **Optional automatic minification:** Generated CSS and JavaScript can also be minified automatically. Smaller files take less time and bandwidth to download, helping pages load faster, especially on slower connections.
296 + - **Multilingual-site optimization:** Sites that change language between pages or visitors can reuse the same static JavaScript file across languages. s2Member loads translated messages and other page-varying values with each WordPress page instead, while personal/member details always remain page-specific and are never stored in reusable static files. Single-language sites can keep more site-wide values in the static JavaScript file for maximum efficiency.
297 + - **Reliable automatic fallback:** Static delivery is an optimization, not a requirement for the site to keep working. If a static file cannot be used, rebuilt, or delivered correctly, s2Member automatically falls back to a compatible dynamic delivery method instead of serving a stale or broken asset.
298 + - **Targeted refreshes and recovery:** When relevant settings change, s2Member refreshes only the affected static files. During normal WordPress admin use, s2Member also checks that active generated files are still available and working. If a problem is confirmed, it can fall back safely, show an administrator warning, and provide a Refresh Static Assets control to recreate the files.
299 + - **Troubleshooting and event logging:** When s2Member logging is enabled, a dedicated `css-js.log` records important CSS/JavaScript delivery events such as generation and refreshes, configuration changes, loader or delivery problems, automatic fallbacks and recoveries, browser-reported runtime issues, and stale-file cleanup, without logging routine page loads.
300 + - **Safer plugin updates:** s2Member keeps its generated static JavaScript synchronized with the installed Framework and Pro versions. If an older generated file no longer matches the current plugin files, s2Member rebuilds it or falls back safely instead of risking broken JavaScript after an update.
301 + - **Cache-safe cleanup:** Recently replaced static files are kept temporarily so visitors can still load pages cached with an older file URL. Older unused generations are cleaned up automatically, preventing the generated-assets directory from growing indefinitely.
302 +
303 +- (Framework & Pro) **Improvement:** Added a choice of loaders for dynamically generated CSS and JavaScript. The Lightweight s2Member Loader remains the default and avoids loading more of WordPress than necessary for better performance. A WordPress Loader option is also available, loading WordPress normally for these asset requests on sites where the server or security software blocks direct s2member-o.php requests. Configure it from _WP Admin > s2Member > General Options > Performance & Caching > Dynamic CSS/JS Loader_. See [Mod Security (Odd 403, 503, 500 Errors)](https://s2member.com/kb-article/mod-security-odd-403-503-500-errors/)
304 +
305 +- (Framework & Pro) **Fix:** Due to an earlier change in WordPress, s2Member's dynamic CSS and JavaScript loader could end up loading more of WordPress than necessary, making those files slower to load. Its original lightweight loading behavior has now been restored. See: [s2Member-Only Mode](https://s2member.com/kb-article/s2member-only-mode/)
306 +
307 +- (Framework) **Improvement:** Added a shared checkout recovery system that lets supported gateways preserve an in-progress checkout across requests, prevent overlapping processing, and recognize a checkout that already completed even if the browser lost the final response. Recovery information can be retained securely for up to 7 days by default, providing a common foundation for safer retry and recovery behavior across payment gateways.
308 +
309 +- (Pro) **Improvement:** PayPal Checkout Pro-Forms now keep a durable checkout identity across reloads, back/forward navigation, and interrupted browser requests. This gives s2Member a reliable way to reconnect the customer with the same PayPal checkout already in progress, while remaining compatible with older in-progress recovery state during the transition.
310 +
311 +- (Pro) **Security:** Hardened password handling across Pro-Forms as part of the new checkout recovery protections. Submitted passwords are not carried into reusable PayPal Checkout recovery state or repopulated if the form has to be shown again after submission. If an interrupted checkout is later recovered without the original browser session, WordPress's secure set-password flow is used instead.
312 +
313 +- (Pro) **Security:** Hardened Specific Post/Page checkout recovery by minimizing the form data saved for interrupted-checkout recovery. Sensitive payment fields are explicitly excluded from saved recovery state, adding an extra safeguard against unexpected checkout data being retained.
314 +
315 +- (Pro) **Fix:** Significantly extended Stripe Pro-Form duplicate-billing protection for interrupted or retried checkouts. If a reload, interrupted request, lost response, or 3D Secure retry leaves an existing Stripe payment or subscription in progress, s2Member now preserves enough checkout state to find and resume that same payment or subscription instead of accidentally starting another one. This extends the duplicate-charge protection added in v260829 to several additional failure and recovery paths. See [thread 13589](https://f.wpsharks.com/t/13589).
316 +
317 +- (Pro) **Fix:** Improved handling when a successful Stripe Pro-Form checkout completes on the server but the final confirmation never reaches the customer. Because the form can still appear unfinished, the customer may submit it again even though Stripe already completed the payment. Successful checkout results are now retained server-side so s2Member can recognize the completed checkout and resume from the saved result instead of treating the retry as a new payment attempt.
318 +
319 +- (Pro) **Fix:** Strengthened duplicate-subscription protection in PayPal Checkout Pro-Forms. Subscriptions are now created server-side and recorded before browser approval continues, so reloads, lost PayPal responses, interrupted callbacks, and retries can recover and reuse the subscription already created at PayPal instead of creating another one.
320 +
321 +- (Pro) **Fix:** Corrected PayPal Checkout subscription activation handling so membership access is not granted while PayPal still considers the subscription pending approval. s2Member now waits for PayPal to confirm activation, and can recover that confirmation through PayPal's webhook if the browser response is lost or delayed.
322 +
323 +- (Pro) **Fix:** Added comprehensive recovery for interrupted or delayed PayPal Checkout one-time payments. s2Member now keeps track of both the PayPal order and its payment capture, safely handles lost or ambiguous responses, keeps access pending until PayPal confirms the payment completed, and can later recover a completed payment through either the browser or PayPal's webhook without attempting a second capture. The recovery state is also kept deliberately minimal without retaining sensitive checkout data.
324 +
325 +- (Framework) **Performance:** Reduced overhead in high-frequency query and capability checks by bypassing hook and filter setup when nothing is registered and avoiding unnecessary construction of hook context variables, while preserving registered callbacks and WordPress `all` hook compatibility. Screens and operations that perform many capability checks, such as the WordPress Users list, can benefit especially from these savings.
326 +
327 +- (Framework) **Performance:** Reduced database overhead during page loads by eliminating repeated access-restriction database queries within the same request, reusing the initial lookup result.
328 +
329 +- (Pro) **Improvement:** The Pro updater now handles version mismatches more clearly when the latest Pro release is ahead of the installed Framework. It recommends updating the Framework first, or links to the [Release Archive](https://s2member.com/release-archive/) for a matching Pro version when staying on the current Framework.
330 +
331 +- (Pro) **Performance:** Moved checks for available Pro updates to a background task. The latest available Pro version is now saved locally and reused for up to a day when deciding whether to show the Pro Updater. This way, slow Pro availability checks or connection problems can't delay frontend or admin page loads. After Framework updates, a fresh background check keeps compatibility information current.
332 +
333 +- (Pro) **Performance:** Moved the Pro server environment details collection to a background task, so it can't delay normal admin page loads.
334 +
335 +- (Pro) **Performance:** Eliminated repeated cron and transient housekeeping during normal page loads when End-of-Term reminders are disabled, moving the necessary cleanup to settings changes and stale background callbacks.
336 +
337 +- (Framework) **Improvement:** End-of-Term Administrative Notes in the user's profile now use the level custom names when the "Force WordPress to use your Labels" setting is enabled. Also, if a user is already in the configured demotion role, the note now says so instead of recording a "role change" to the same role.
338 +
339 +- (Framework) **Fix:** Solved a remaining PayPal cancellation EOT issue when stored IPN Signup Vars are completely missing. An older subscription check could prevent the newer PayPal lookup from running, causing the EOT to fall back to an incorrect one-day period. s2Member now uses PayPal's next billing date when available. Thanks to Felix for reporting this. See [thread 13462](https://f.wpsharks.com/t/13462).
340 +
341 +- (Framework) **Fix:** Improved Automatic End-of-Term health warnings on low-traffic sites. A delayed WP-Cron event, which can happen when there have been few or no site visitors to trigger it, is now shown as an Attention item without triggering the admin warning by itself, while missing cron or an actual overdue EOT backlog still triggers the stronger warning. EOT warning links also now open the relevant settings panel and jump directly to the affected setting.
342 +
343 +- (Framework) **Fix:** Prevented PHP warnings during some Stripe cancellation/End-of-Term processing when currency information is missing. s2Member now recovers the stored payment currency when possible, and continues processing cleanly without PHP warnings.
344 +
345 +- (Framework) **Fix:** In some edge cases, legacy encryption/decryption could trigger a PHP 8.5 deprecation warning for certain byte values. The byte handling is now explicitly normalized while preserving compatibility with existing encrypted data.
346 +
347 +- (Framework) **Fix:** Redacting sensitive data in large multiline gateway/API logs could cause the regular-expression redaction step to fail and trigger PHP 8.1+ deprecation warnings. Redaction now handles large log entries more reliably.
348 +
349 +- (Framework) **Fix:** The bundled Mailchimp API client could trigger a PHP 8.1+ deprecation warning by passing a deprecated `null` value during query-string construction. It now uses the correct empty-string value instead, preserving the same API request behavior.
350 +
351 +- (Pro) **Fix:** ClickBank request processing could trigger PHP 8.1+ deprecation warnings by passing a deprecated `null` value during query-string construction. Those calls now use the correct empty-string value instead, preserving the same request behavior.
352 +
353 +- (Framework) **Fix:** PayPal notifications and returns could trigger PHP warnings when the optional `s2member_paypal_proxy` and `s2member_paypal_proxy_use` fields were absent. Those optional fields are now set to empty values when missing before processing, while preserving existing gateway integration behavior.
354 +
355 +- (Pro) **Fix:** Prevented a PHP warning when processing malformed Stripe webhook payloads by validating the decoded event before accessing its ID.
356 +
357 +- (Framework) **Fix:** Corrected an off-by-one issue in Brute Force Login Protection that allowed one additional login attempt after the configured failed-login limit had been reached.
358 +
359 += v260829 =
360 +
361 +- (Framework) **Major Improvement:** Rebuilt the Automatic End-of-Term processing engine so membership expirations are handled more reliably and promptly when due, even on busy sites or after delays, while making the system safer to administer and easier to review and troubleshoot.
362 + - **Faster, adaptive processing:** Instead of stopping after 6 users, the new engine uses the safe processing time available in each run and adapts to current speed, allowing it to handle hundreds of users in one pass.
363 + - **Rapid queue catch-up:** s2Member processes each member as promptly as practical after their actual EOT time is reached. If work remains, it continues about a minute later instead of waiting for the next regular 10-minute check. In our stress testing, a 1,000-user queue was processed in under 2 minutes, while the old 6-user limit would take almost 28 hours.
364 + - **More resilient processing:** Overlapping runs are prevented, interrupted or stale runs recover cleanly, and unfinished work remains available for the next pass instead of being lost or unnecessarily delayed.
365 + - **Safer "Delete" behavior and review:** Automatic Delete now removes membership access and moves the user account to Pending Deletion instead of permanently deleting it, preserving useful payment/subscription details for review before single/bulk deletion. Irreversible automatic deletion can still be enabled with the `ws_plugin__s2member_allow_eot_user_deletion` filter. _WP Admin > Users > Pending Deletion_
366 + - **New End-of-Term user lists:** Added separate Current and Previous lists with EOT Time, Last EOT, and EOT Demotion columns. Current shows users with an EOT, earliest first; Previous shows prior EOTs, most recent demotion first. Older demotion times are recovered from Administrative Notes where possible. _WP Admin > Users > End-of-Term Current / End-of-Term Previous_
367 + - **Better demotion history:** EOT actions, including moves to Pending Deletion, now leave more useful Administrative Notes with the role change, removed Custom Capabilities, subscription details, and the EOT that triggered the action. For example: _2026-08-31 00:03 EDT s2Member: Demoted from Level 1 to Subscriber (removed ccaps: courses). PayPal I-ABC123. EOT 2026-08-31 00:01 EDT._
368 + - **Visible health and automatic recovery:** A new Automatic Behavior Status shows pending and overdue EOTs, recent processing activity, the next scheduled run, and the current processing runtime, making delays and other problems visible instead of silent. s2Member repairs a missing WP-Cron schedule automatically when possible, and alerts administrators when a problem persists and needs attention.
369 +
370 +- (Pro) **Major Improvement:** Rebuilt the End-of-Term Reminder Email processing engine so renewal notices have a better chance of going out promptly on their intended day, even after WP-Cron delays or temporary email sending problems that could previously prevent them from being sent.
371 + - **Fast, adaptive processing:** The new engine replaces the old 6-member limit with safe runtime-based processing, prevents overlapping runs, recovers interrupted ones, and continues about a minute later when more work remains. On our test server, 1,000 reminders were handed off through WordPress's mail system in about 42 minutes, while the old engine would need almost 28 hours.
372 + - **Independent reminder engine:** Reminders based on stored End-of-Term dates now have their own schedule and processing engine, so they no longer depend on membership-expiration processing completing first and aren't held up by a large or stalled End-of-Term queue.
373 + - **Forgiving timing and smart retries:** Reminder eligibility now uses calendar days, giving s2Member opportunities throughout the intended send day plus an extra recovery day in case of delays. Failed sends are retried after about 10 minutes, 30 minutes, 1 hour, and then every 3 hours while still eligible, with each recipient tracked independently to avoid duplicate resends.
374 + - **Visible health and automatic recovery:** A new End-of-Term Reminder Status shows scheduling activity, recent successful delivery, and recipients currently being retried, with additional failure and recovery details when something goes wrong. s2Member repairs a missing reminder schedule when possible, retries failed recipients automatically, and alerts administrators when problems persist and need attention.
375 +
376 +- (Framework & Pro) **Fix:** Fixed the long-standing issue where the Automatic End-of-Term setting could appear blank when its WP-Cron event was missing. The saved setting now remains visible while s2Member reports and repairs the scheduling problem separately.
377 +
378 +- (Pro) **Fix:** End-of-Term renewal reminders are no longer sent when membership access ended because of a refund, payment reversal, or chargeback. These payment exceptions are now distinguished from normal membership expirations so they don't trigger inappropriate renewal notices.
379 +
380 +- (Pro) **Enhancement:** Modernized s2Member Pro-Forms with PayPal Checkout, using PayPal's current REST APIs and Smart Payment Buttons for off-site payments. When PayPal Checkout is enabled in s2Member, it replaces the legacy PayPal Express Checkout integration for payments completed on PayPal's site. Existing Pro-Form shortcodes work as-is (no edits required). Enable it under _WP Admin > s2Member > PayPal Options > PayPal Checkout (Beta)_.
381 +
382 +- (Framework) **Improvement:** Strengthened PayPal Checkout REST order validation, capture reliability, retry handling, and payment processing safeguards.
383 +
384 +- (Framework) **Improvement:** Better PayPal Checkout button feedback with clearer, more visible error and status messages below the button.
385 +
386 +- (Framework) **Improvement:** Better compatibility for sites using PayPal Checkout while older PayPal subscriptions remain active. Since PayPal subscriptions generally need the integration that created them, s2Member now uses the appropriate one for next payment dates, reminder emails, `[s2EOT]`, and cancellations.
387 +
388 +- (Framework) **Security:** Strengthened PayPal Checkout return validation and payment-flow integrity.
389 +
390 +- (Framework) **Fix:** Improved PayPal Checkout subscription fulfillment retry handling, preventing failed payment notifications from being incorrectly marked complete and allowing browser or webhook recovery to retry safely.
391 +
392 +- (Framework) **Fix:** PayPal Checkout now registers all required webhook events. Existing configured webhooks are updated automatically after upgrading, adding notifications for subscription activation/updates, payment refunds/reversals, and disputes/chargebacks.
393 +
394 +- (Pro) **Fix:** Strengthened Stripe Pro-Forms against duplicate charges from concurrent or repeated submissions of the same rendered checkout. Stripe requests now use a stable per-checkout idempotency ID, simultaneous submissions are blocked while payment processing is in progress, and a failed update to an existing PaymentIntent no longer falls through to creating another one. Thanks to DrCheap for the detailed report and investigation. See [thread 13589](https://f.wpsharks.com/t/13589).
395 +
396 +- (Pro) **Fix:** Fixed a Stripe compatibility issue that could cause `[s2Member-Profile /]` and Stripe billing-update forms to crash when retrieving an existing subscription with newer Stripe API responses/SDK behavior. Thanks to Tim Hibberd for reporting it and providing a patch. See [thread 13575](https://f.wpsharks.com/t/13575).
397 +
398 +- (Pro) **UI:** Updated Stripe Webhook/IPN setup guidance to list all seven events s2Member handles. Sites with an existing Stripe webhook configured for selected events should make sure all seven are selected, including `charge.dispute.created`, so disputes/chargebacks can follow the configured Reversals/Disputes EOT behavior.
399 +
400 +- (Pro) **Improvement:** Added an optional `placeholder` attribute for Authorize.Net, PayPal, and Stripe Pro-Form Checkout Options. This allows a Pro-Form to start with a non-payable prompt instead of automatically selecting the first Checkout Option, requiring the customer to choose a real option before the full checkout form is shown.
401 +
402 +- (Framework & Pro) **Fix:** Improved shortcode attribute handling when editors replace straight quotes with smart/curly quotes. s2Member now also normalizes literal smart quotes so values such as `attribute=“0”` are interpreted correctly. Thanks to Vincent for reporting it. See [thread 13572](https://f.wpsharks.com/t/13572).
403 +
404 +- (Framework) **Enhancement:** Added a hook after profile modifications are saved and s2Member refreshes the user data, allowing integrations to read freshly updated user and custom profile fields. Thanks to Craig for bringing attention to this use case. See [thread 13515](https://f.wpsharks.com/t/13515).
405 +
406 +- (Framework & Pro) **Improvement:** Bumped PHP version compatibility up to PHP 8.5.9 after addressing the remaining deprecation notices and related compatibility issues, while maintaining support for older PHP versions.
407 +
408 +- (Framework) **Fix:** Hardened PayPal recurring-payment handling for missing optional IPN fields and memberships without Custom Capabilities, preventing PHP warnings and deprecation notices.
409 +
410 +- (Framework) **Fix:** Hardened gateway notification and return handlers against missing or null optional transaction fields, preventing PHP warnings and deprecation notices.
411 +
412 +- (Framework) **Fix:** Prevented PHP warnings during registrations or membership updates when optional details (like Custom Capabilities or EOT) weren't used.
413 +
414 +- (Framework) **Fix:** Corrected an edge case in subscription modifications where an optional EOT component could end up in the Custom Capabilities value.
415 +
416 +- (Framework) **Fix:** Fixed PHP 8 compatibility issues in legacy OpenSSL/RSA signing and the Markdown fallback that could fail in some cases.
417 +
418 += v260814 =
419 +
420 +- (Framework) **Improvement:** Better s2Member Security Encryption Key handling and related guidance in the admin panel.
421 +
422 +- (Framework) **Improvement:** Hardened input validation and sanitization for the `s2Key`, `s2File`, `s2Stream`, and `s2Member-PayPal-Button` shortcodes.
423 +
424 +- (Framework & Pro) **Improvement:** Renamed and expanded the `s2Get` shortcode's user-field whitelist into the shared _Shortcode User Fields Whitelist_ setting, now used for `s2Get`'s `user_id` attribute and `s2Member-List`'s `show_fields` attribute. Administrators are warned when either shortcode attempts to display an un-whitelisted field's value that doesn't belong to the current user viewing the page.
425 +
426 +- (Framework & Pro) **Security:** Improved validation and hardened handling of serialized data throughout s2Member.
427 +
428 +- (Pro) **Improvement:** Hardened input validation and sanitization for the `s2Member-Login`, `s2Member-Summary`, `s2Member-Gift-Codes`, `s2Member-List`, `s2Member-List-Search-Box`, and `s2Member-Pro-ClickBank-Button` shortcodes, as well as the Pro Login Widget.
429 +
430 +- (Pro) **Security:** Added stricter handling for `s2Member-List`'s `show_fields` attribute. s2Member will warn administrators about detected fields that still need review. Fields not whitelisted will not be displayed. Sites using `show_fields` should review _General Options > Shortcode User Fields Whitelist_ and allow the fields their Member Lists are intended to display.
431 +
432 +- (Pro) **Security:** Added safer handling and a whitelist for the `template` shortcode attribute, used by the `s2Member-List`, `s2Member-List-Search-Box`, and Stripe, PayPal, and Authorize.Net Pro-Forms shortcodes. s2Member will warn administrators about detected templates that still need review. Templates not whitelisted will not be used, and the standard template will be used instead. Sites using custom templates should review _General Options > Pro Shortcode Templates Whitelist_ and allow their custom template files.
433 +
434 +- (Pro) **Fix:** Prevented the Pro updater from offering or installing a Pro release newer than the installed s2Member Framework, avoiding compatibility issues until the Framework is updated first.
435 +
436 +- (Pro) **Fix:** Prevented Stripe payment processing from continuing after Pro-Form validation rejects a submission, avoiding misleading Stripe card-field errors when other required form fields are missing.
437 +
438 +- (Pro) **Fix:** Updated Stripe Pro-Forms to use the shortcode's `validate_zipcode` attribute correctly, so it can override the default setting to collect and validate the card's postal code.
439 +
440 += v260805 =
441 +
442 +- (Framework) **Improvement:** Replaced TinyURL-based shortening for generated Registration Access and Specific Post/Page Access URLs with new built-in s2Member short links, stored temporarily with WordPress transients. Existing TinyURL settings now use the built-in shortener automatically, avoiding TinyURL’s deprecated no-key API endpoint and extra third-party pages shown before the destination.
443 +
444 +- (Framework) **Improvement:** Better PayPal Checkout cancellation button handling when stored IPN Signup Vars are missing. s2Member now checks PayPal subscription details via API before cancellation, uses PayPal's next billing time plus the configured EOT grace period for the EOT time, and falls back to PayPal's subscription management page when a safe local cancellation cannot be completed. See [thread 13462](https://f.wpsharks.com/t/13462).
445 +
446 +- (Framework) **Security:** Hardened the `[s2Stream]` shortcode against executable JavaScript injection by users with post-editing privileges. Attributes used to configure JW Player are sanitized and validated more strictly, and custom `player_path` values must now be explicitly whitelisted using the `ws_plugin__s2member_sc_get_stream_player_paths` filter.
447 +
448 +- (Framework) **Security:** Improved sanitization of sensitive data in s2Member debug logs.
449 +
450 +- (Framework) **Fix:** Prevented a PHP 8+ fatal error during PayPal Standard PDT/IPN return handling when PayPal reports an invalid or unexpected charset. PayPal return data is now converted to UTF-8 defensively, with fallback handling when the reported charset is not accepted by `mb_convert_encoding()`.
451 +
452 +- (Pro) **Improvement:** Added safer handling for rare Stripe Pro-Form subscription checkouts where the first payment or setup confirmation remains pending. s2Member now delays paid-access changes until Stripe confirms the subscription is ready, helping avoid premature access while reducing the chance of confirmed Stripe subscriptions not matching s2Member access.
453 +
454 +- (Pro) **Fix:** Fixed validation of zero-like trial period values such as `tp="0.00"`, so they are treated the same as `tp="0"` instead of being rejected as an invalid trial period.
455 +
456 += v260508 =
457 +
458 +- (Framework) **Fix:** PayPal Checkout cancellation shortcodes now keep `output="anchor"` clickable for logged-out visitors. Only `output="button"` requires the member to be logged in. See [thread 13450](https://f.wpsharks.com/t/13450)
459 +
460 +- (Framework) **Fix:** PayPal Checkout no longer aborts if the customer's IP address changes during checkout. IP mismatches are logged, but valid checkouts continue processing.
461 +
462 +- (Framework) **Fix:** Prevent false Auto-EOT demotions when a stored Auto-EOT time is `0`, and improve logging for invalid Auto-EOT values. See [thread 13412](https://f.wpsharks.com/t/13412)
463 +
464 +- (Framework) **Fix:** Prevented a PHP 8.1+ deprecation notice while reading registration times when the stored value is missing or false.
465 +
466 +- (Framework) **Improvement:** Improved PayPal Checkout button loading with a client-side fallback when the PayPal SDK is missing from the final page output.
467 +
468 +- (Pro) **Fix:** Prevented deprecation notices on newer PHP versions, which could interfere with automatic login/redirects after Stripe checkout.
469 +
470 +- (Pro) **UI:** Improved cancellation pro-form submit button text. Cancellation forms now say “Cancel Subscription” instead of the generic “Submit Form”. See [thread 13438](https://f.wpsharks.com/t/13438)
471 +
472 += v260410 =
473 +
474 +- (Framework) **Fix:** Reduced the upfront requirements for processing PayPal Standard `subscr_cancel` IPNs so valid cancellations are not ignored when supporting values are missing, stale, or non-membership-specific.
475 +
476 +- (Framework) **Fix:** Prevent incorrect s2Member notifications in some PayPal Checkout cases where several webhooks are received about the same subscription.
477 +
478 +- (Framework) **Fix:** Prevent duplicate processing and notifications when PayPal sends both a webhook and an IPN for the same PayPal Checkout subscription payment.
479 +
480 +- (Framework) **Fix:** Added subscription modification cancellation support to the Framework, which was previously only available in the Pro addon.
481 +
482 +- (Pro) **Fix:** Made subscription modification cancellation gateway-aware, preventing orphaned active subscriptions when a member starts a replacement subscription through a different gateway.
483 +
484 +- (Pro) **Fix:** Prevented rare cases where subscription modification processing could cancel the newly created subscription by mistake.
485 +
486 +- (Pro) **Fix:** Improved Stripe customer lookup during checkout retries by falling back to email when the stored Stripe customer ID is missing, stale, or no longer retrievable.
487 +
488 += v260325 =
489 +
490 +- (Framework) **Fix:** Improved PayPal Checkout webhook idempotency to prevent duplicate processing during repeated/concurrent webhooks, while preserving normal behavior.
491 +
492 +- (Framework) **Fix:** Resolved a PayPal IPN issue where some `subscr_cancel` notifications were ignored because the cancellation handler failed before it had fully identified the recurring subscription.
493 +
494 +- (Framework) **Improvement:** Added IPN Signup Var lookups for missing PayPal cancellation IPN values like `period1`, `period3`, `item_number`, `item_name`, and `payer_email`, preventing valid `subscr_cancel` notifications from being ignored.
495 +
496 +- (Framework) **Improvement:** Moved s2Member's translation files to `/languages`, following the WordPress standard, and updated `.mo` loading to support that directory while continuing to support the standard and legacy WordPress locations.
497 +
498 +- (Framework) **Improvement:** Hardened PayPal Standard IPN endpoint response handling and added debug logging for hosts/security layers that incorrectly return HTTP 403 after successful processing.
499 +
500 +- (Framework) **Enhancement:** Added `ukpostcode` as an expected-value option for Custom Registration/Profile Fields, with matching server-side and client-side validation for UK postcode input. The validation is designed to be reasonably broad, including standard UK formats and related special cases. Thanks to Gerard Earley for contributing the patch. See [thread 12200](https://f.wpsharks.com/t/12200)
501 +
502 +- (Framework) **Enhancement:** Added a new __General Options > s2Get Shortcode__ setting to allow `user_id` for whitelisted user fields, defaulting to current-user. Also updated the s2Get KB article accordingly.
503 +
504 +- (Pro) **Fix:** Updated Stripe card charge and PaymentIntent requests to use `statement_descriptor_suffix` instead of `statement_descriptor`, fixing card-payment errors where Stripe no longer accepts `statement_descriptor` for card payments.
505 +
506 +- (Pro) **Fix:** Corrected Stripe subscription checkout so resumed PaymentIntent flows no longer go through the wrong intent-status handler.
507 +
508 +- (Pro) **Fix:** Stripe now stops cleanly after card declines, instead of continuing into secondary intent/payment-method errors.
509 +
510 +- (Pro) **Fix:** Improved Stripe recurring-payment setup to better support future-charge authorization requirements, fixing failures in countries with stricter payment rules, including India.
511 +
512 +- (Pro) **Fix:** Stripe now updates recurring default payment methods only after a successful intent result, instead of earlier in checkout.
513 +
514 +- (Pro) **Fix:** Billing-update SetupIntent creation failures in Stripe now return the proper error response.
515 +
516 +- (Pro) **Fix:** Prevent duplicate/retried Stripe webhook events from being processed more than once, including near-simultaneous retries of the same Stripe event ID
517 +
518 +- (Pro) **Fix:** prevent Stripe billing modification/replacement from triggering EOT behavior for the cancelled old subscription while s2Member is still updating the member account with the new subscription.
519 +
520 +- (Pro) **Fix:** Removed a trailing-comma syntax issue in Stripe subscription update code that could cause PHP compatibility errors on older supported PHP versions.
521 +
522 +- (Pro) **Fix:** s2Member now cleans up incomplete subscriptions left behind by failed 3D Secure authentication attempts during Stripe checkout, and gives the customer a more clear payment failure message.
523 +
524 +- (Pro) **Improvement:** Added dedicated s2 Stripe log entries for non-fatal failures while updating the default payment method after successful intent completion.
525 +
526 += v260312 =
527 +
528 +- (Framework) **Fix:** Prevent a PHP 8.1+ deprecation notice from appearing above the admin Users table in some cases.
529 +
530 +- (Framework) **Security:** Improved debug log sanitization.
531 +
532 +- (Framework) **Improvement:** PayPal Checkout credential test and OAuth failure log entries now include client_len_hash / secret_len_hash values (length_hash, e.g. 80_4d9a7c1b2e8f4a21) to help compare attempted credentials during troubleshooting without exposing raw values.
533 +
534 +- (Framework) **Enhancement:** Added a new _No-Cache Headers Behavior_ option under _General Options > Performance & Caching_, making no-cache behavior configurable from the admin UI. It includes:
535 + - `Always` mode, the legacy safe default that prevents caching site-wide in case user-conditional output appears.
536 + - `Selective` mode, which was previously available only through a filter and may improve caching for guests, but can miss some runtime no-cache triggers.
537 + - The new `Evaluative` beta mode, which evaluates the page with more runtime information and may allow more pages to be cached safely for guests.
538 + - An optional debug header to help troubleshoot no-cache behavior.
539 +
540 +- (Framework) **UI:** Clarified the Download Options text to explain that unique download limits are counted in the last X days (rolling window), reducing confusion about whether the limit resets on fixed calendar dates.
541 +
542 +- (Framework) **UI**: Improved the PayPal Checkout credentials test failure message.
543 +
544 +- (Framework) **UI:** Fixed the PayPal button encryption admin notice so that it shows only to administrators in the WP Admin area, not non-admin users.
545 +
546 += v260301 =
547 +
548 +- (Framework) **Bug Fix:** Fixed mismatched `<label for="">` and `<input id="">` attributes for checkbox/radio options in Custom Registration/Profile Fields; this also restores proper client-side validation for required checkbox/radio groups.
549 +
550 +- (Framework) **Fix:** Hardened the Edit User Profile screen on PHP 8+ to avoid errors if a user’s Auto-EOT time is stored as a date string (e.g. YYYY-MM-DD) rather than a Unix timestamp (as can happen after imports/migrations).
551 +
552 +- (Framework) **Fix:** Fixed PHP 8+ "Undefined array key" warnings related to membership level label constants (including guest/non-logged-in access label handling).
553 +
554 +- (Framework) **Fix:** Resolved an issue that prevented PayPal Buttons "Generate Button Code" from working in some installations.
555 +
556 +- (Framework) **Fix:** Some PayPal Checkout log entries were missing the environment (sandbox/live), and now include it to help with troubleshooting.
557 +
558 +- (Framework) **Fix:** PayPal Checkout webhooks can continue processing existing subscriptions even if new sales are switched back to PayPal Standard.
559 +
560 +- (Framework) **Fix:** PayPal Checkout webhooks now also handle refunds, reversals, and additional subscription lifecycle events, improving user EOT/access updates and subscription state handling.
561 +
562 +- (Framework) **Fix:** Improved PayPal Checkout amount decimal normalization to prevent one-time payment validation mismatches.
563 +
564 +- (Framework) **Fix:** Updated PayPal Checkout webhook handling to prevent one-time payment captures from being processed as recurring payments.
565 +
566 +- (Framework & Pro) **Fix:** Prevent PHP 8.1+ deprecation warnings in gateway Pro-Forms and related checkout processing (Stripe, PayPal Pro, Authorize.Net), and in custom registration fields, by ensuring optional form/template values are cast to strings before escaping/processing.
567 +
568 +- (Framework) **Security:** Improved debug log sanitization (passwords, API secrets, auth credentials) and reduced post-registration plaintext password exposure.
569 +
570 +- (Framework) **Improvement:** PayPal Standard and PayPal Checkout cancellation buttons now use PayPal’s subscription management page when needed.
571 +
572 +- (Framework) **Improvement:** Better HTTPS detection in s2Member’s PayPal Checkout setup for sites using Cloudflare (or other reverse proxies), reducing false setup failures when enabling or configuring PayPal Checkout.
573 +
574 +- (Pro) **Improvement:** Hardened the Advanced Importer to normalize Auto-EOT values given as date strings (e.g. YYYY-MM-DD) into Unix timestamps when a date is used instead of the expected timestamp format.
575 +
576 +- (Pro) **Improvement:** PayPal Checkout buttons now support `accept="card"` in Pro button attributes, enabling card funding/guest checkout where PayPal makes it available.
577 +
578 += v260215 =
579 +
580 +- (Framework) **Bug Fix:** Prevent PHP fatal error when multiple PayPal Checkout buttons appear on the same page (PHP 8+).
581 +
582 +- (Framework) **Bug Fix:** PayPal Checkout admin actions (Test Credentials / Webhook / Clear Cache) now submit via POST instead of redirecting (avoids “headers already sent” warnings).
583 +
584 +- (Framework) **Bug Fix:** PayPal cancellation notifications now backfill missing membership mapping fields (`item_number`, `item_name`, `period1`, `period3`) from stored IPN Signup Vars using the subscription ID ( `recurring_payment_id` / `subscr_id` ), so Auto-EOT is set correctly on cancel.
585 +
586 +- (Framework) **Bug Fix:** Auto-EOT PayPal status checks now query PayPal Checkout subscriptions via PayPal’s REST Subscriptions API (instead of PayPal's legacy “Recurring Payments” API), preventing “11592” errors and allowing Auto-EOT to detect inactive PayPal Checkout subscriptions.
587 +
588 +- (Framework) **Security:** PayPal Checkout webhook environment inference now validates the `paypal-cert-url` host before using it (hardens environment inference used during verification).
589 +
590 +- (Framework) **Security:** PayPal Checkout cancel redirect now validates the destination URL and safely falls back to the site home URL.
591 +
592 +- (Framework) **Security:** PayPal Checkout tokens now use s2Member’s hardened unserialize routine.
593 +
594 +- (Framework) **Security:** Harden unserialization of stored custom capabilities metadata when loading user access rules.
595 +
596 +- (Framework) **Security:** Harden the registration password handler.
597 +
598 +- (Framework) **Improvement:** Harden PayPal Checkout endpoint behavior on problematic hosts; return consistent JSON errors (HTTP 500) on notify-proxy failures.
599 +
600 +- (Framework) **Improvement:** Harden PayPal Checkout REST API/webhook handling for network failures and unexpected/non-JSON responses (avoids PHP 8+ warnings).
601 +
602 +- (Framework) **Improvement:** PayPal Checkout webhook setup now treats "no change" updates and existing webhook URLs as success (adopts the existing webhook ID automatically).
603 +
604 +- (Framework) **Improvement:** PayPal Checkout webhook signature verification now auto-detects Sandbox vs Live from inbound headers (so webhooks validate correctly even if the site’s current environment setting differs).
605 +
606 +- (Framework) **Improvement:** PayPal Checkout logging now includes `env_setting` (site setting) and `env_webhook` (inferred from inbound webhook headers) for clearer Sandbox/Live environment troubleshooting.
607 +
608 +- (Framework) **Improvement:** PayPal Checkout webhook idempotency cache (event/txn transients) now retains entries for 1 year (reduces long-term option bloat while preserving replay protection).
609 +
610 +- (Framework) **Improvement:** s2Member’s PayPal “Unsubscribe” button links to PayPal’s subscription management page, and with the new PayPal Checkout integration, when `output="button"` and a PayPal subscription ID is present, s2Member will attempt to cancel the subscription directly.
611 +
612 +- (Framework) **UI:** Add a description for `paypal-checkout.log` in the Log Viewer dropdown (so it’s not “No description available”).
613 +
614 +- (Pro) **Improvement:** PayPal Checkout buttons now support `accept="card"` to enable guest debit/credit card payment in the PayPal-hosted checkout experience when available (availability depends on PayPal settings/eligibility and browser privacy protections).
615 +
616 += v260127 =
617 +
618 +- (Framework) **PayPal Enhancement**: Modernized s2Member’s PayPal integration by adding support for PayPal Checkout with their latest REST APIs, Smart Buttons, and webhook event handling. This release introduces PayPal’s current Checkout platform as an optional, reliable alternative to the legacy PayPal Standard buttons. Existing s2Member PayPal button shortcodes continue to work as-is (no edits required). See: _WP Admin > s2Member > PayPal Options > PayPal Checkout (Beta)_. Thanks to the beta testers, especially Sim Architect.
619 +
620 += v260101 =
621 +
622 +- (Framework) **Security**: Improved sanitization and normalization of attribute values for the s2Eot, s2Stream and s2Member-Security-Badge shortcodes.
623 +
624 +- (Framework) **Security**: Improved sanitization of replacement values for confirmation and notification emails.
625 +
626 += v251005 =
627 +
628 +- (Framework) **Security**: Improved sanitization for Tracking API replacement values.
629 +
630 +- (Framework) **Fix**: Use the site URL host instead of HTTP_HOST for proxy key when Skip Domain Check is enabled.
631 +
632 +- (Framework) **Fix**: Ensure the Fallback IPN Signup Vars provide a valid item_number for cancellation handling.
633 +
634 += v250905 =
635 +
636 +- (Framework) **Security**: Improve handling of registration fields in multisite.
637 +
638 +- (Framework & Pro) **UI**: Add a Help panel with contact form to all admin pages.
639 +
640 += v250701 =
641 +
642 +- (Framework & Pro) **Enhancement**: s2Member now supports sending emails in HTML format, allowing for richer, styled messages with formatting, links, and branding. You can enable this feature under _General Options > Email Configuration > Enable HTML Emails_. When disabled, emails continue to use plain text as before. This feature is currently in beta, so feedback is welcome!
643 +
644 += v250607 =
645 +
646 +- (Framework & Pro) **Enhancement**: Added a new option to skip the domain validation for notifications from the payment gateways. This allows continued processing of incoming notifications even if the domain in the `custom` value doesn't match the current site's. Useful for subscriptions originated outside of s2Member, or under a different domain. The setting is available under: _WP Admin > s2Member > PayPal Options > PayPal IPN / Instant Payment Notifications_
647 +
648 +- (Pro) **UI**: Added the recent IPN Signup Vars Fallback and new Skip Domain Validation to all the gateway options pages.
649 +
650 +- (Framework) **Enhancement**: Added the site's language code when loading the reCaptcha.
651 +
652 +- (Pro) **UI**: Added a page refresh after the Pro Updater finishes installing the latest Pro release, to update the WP Admin interface and not show the Pro Updater again.
653 +
654 +- (Pro) **UI**: Added a page refresh after the Other Gateways options are saved, to update the WP Admin left menu.
655 +
656 += v250525 =
657 +
658 +- (Framework & Pro) **Fix**: Some translations were being applied too early, causing PHP notices since WP 6.7. Now all translations are only loaded at the `init` hook or later. See [thread 12813](https://f.wpsharks.com/t/12813)
659 +
660 += v250511 =
661 +
662 +- (Framework) **Fix**: Improved the admin notices handler to prevent a PHP 8.1+ error in rare cases when the data wasn't an array as expected.
663 +
664 +- (Framework) **Enhancement**: Added sanitization to the admin notices handler for improved safety.
665 +
666 +- (Framework & Pro) **Fix**: Updated all uses of preg_split() with `-1` instead of `NULL` as the limit to prevent PHP 8.1+ deprecation warnings.
667 +
668 +- (Pro) **Fix**: Fixed an s2Member-List database query with a typo that prevented some custom searches from working as expected.
669 +
670 +- (Pro) **Fix**: Removed a check in Stripe pro-forms that blocked using the same details for trial and regular payments for subscriptions. See [thread 12818](https://f.wpsharks.com/t/12818).
671 +
672 += v250502 =
673 +
674 +- (Pro) **Enhancement**: Added optional fallback behavior for missing IPN Signup Vars during Stripe webhook processing. When enabled, s2Member will generate a makeshift IPN vars array if none are stored for the user. This helps support migrated or manually imported subscriptions. The setting is available under _s2Member Pro > Stripe Options > Stripe Webhook/IPN Integration_. See [thread 11334](https://f.wpsharks.com/t/11334).
675 +
676 +- (Framework) **UI**: Removed admin notice about Easter promo for Pro add-on.
677 +
678 += v250424 =
679 +
680 +- (Framework) **Enhancement**: Added additional sanitation/validation to the Logs Viewer, although only Administrators have access to it.
681 +
682 += v250419 =
683 +
684 +- (Pro) **Enhancement**: Improved the new coupon code limit per user which prevents a user from applying a coupon code unlimited times, Instead of single use, it can now be limited to more uses, e.g. 3. It's been renamed from "User Once" to "User Max", max number of times a user can use that coupon. This is optional and leaving it blank will give the default "no limit".
685 +
686 +- (Pro) **Enhancement**: Improved validation of the template attribute in the s2Member-List-Search-Box shortcode.
687 +
688 +- (Framework) **UI**: Temporary admin notice about Easter promo for Pro add-on at 20% off.
689 +
690 += v250214 =
691 +
692 +- (Pro) **Enhancement**: Improved coupon usage logging for better tracking.
693 +
694 +- (Pro) **Enhancement**: Added a new single-use per user option for coupons. Thanks to Carl Borsani for sponsoring this.
695 +
696 +- (Pro) **Enhancement**: Coupons can now be limited to specific pro-forms. Thanks to Carl Borsani for sponsoring this.
697 +
698 +- (Framework) **Fix**: s2Get can now handle s2Member’s custom profile fields. Thanks to Gerard Earley for reporting this.
699 +
700 +- (Framework) **Fix**: Updated the admin notice about the PayPal button encryption setting.
701 +
702 +- (Pro) **Enhancement**: Improved data handling in the Remote Operations API. Props to István.
703 +
704 +- (Pro) **Enhancement**: Improved validation of the template attribute in pro-forms and s2Member-List shortcodes. Props to István.
705 +
706 += v241216 =
707 +
708 +- (Framework) **Enhancement**: Added extra attribute validation to the s2Get shortcode. Props to wcraft.
709 +
710 +- (Framework) **Enhancement**: Improved New User email preparation before send. Props to Hakiduck.
711 +
712 += v241114 =
713 +
714 +- (Framework & Pro) **Fix**: An error could happen on PHP8 during Pro activation. Fixed in this release.
715 +
716 +- (Framework) **Enhancement**: s2Get shortcode can now be used to show s2's current user constants. E.g. `[s2Get constant="S2MEMBER_CURRENT_USER_DISPLAY_NAME" /]` _WP Admin > s2Member > API / Scripting > s2Member PHP/API Constants_
717 +
718 += v240325 =
719 +
720 +- (Framework) **Fix**: Some sites were getting a warning from v240315's restriction improvement when the WP REST request doesn't include a type or ID. Fixed in this release. See [thread 11347](https://f.wpsharks.com/t/11347)
721 +
722 +- (Pro) **Enhancement**: Checkout success redirection URLs are now validated as safe with WordPress' _wp_validate_redirect_. To use a domain different than the site's, it can be allowed with wp's filter [allowed_redirect_hosts](https://developer.wordpress.org/reference/hooks/allowed_redirect_hosts/).
723 +
724 +- (Framework) **Enhancement**: Additional validation to prevent an invalid s2Member Level role during registration.
725 +
726 += v240315 =
727 +
728 +- (Framework) **Enhancement**: Improved access restrictions applied to WP REST requests.
729 +
730 += v240218 =
731 +
732 +- (Framework) **Fix**: PayPal button encryption default changed to "disabled".
733 +
734 +- (Framework) **Fix**: Mailchimp interest groups integration wasn't working correctly all the time. Fixed in this release.
735 +
736 += v230815 =
737 +
738 +- (Framework) **Fix**: Added some missing functions to the list of conditionals allowed by default for s2If (e.g. `current_user_days_to_eot_less_than`, `current_user_gateway_is`). See also: https://s2member.com/kb-article/s2if-simple-shortcode-conditionals/#toc-5bb69568
739 +
740 +- (Pro) **Enhancement**: New s2If whitelist option for custom conditional functions to be allowed. _s2Member Pro > Restriction Options > Simple Shortcode Conditionals > Whitelist_
741 +
742 +- (Framework) **Enhancement**: Handle s2If conditional problems more gracefully. Instead of giving an error that prevents loading the rest of the page, it now just doesn't display that s2If's block, and enters a message in the error log (e.g. `/wp-content/debug.log`).
743 +
744 +- (Framework & Pro) **Enhancement**: Prevent output from s2If conditions, only _true_ or _false_.
745 +
746 +- (Framework) **UI**: Update the Mailchimp example from `Group Title` to `Group Category`, to match Mailchimp's current name in their settings. _s2Member > API / List Servers > Mailchimp_
747 +
748 += v230808 =
749 +
750 +- (Framework) **Fix**: Potential security issue under rare circumstances. Fixed in this release.
751 +
752 +- (Framework) **Fix**: Mailchimp's groups/interests were not transitioning correctly with the updated integration. Fixed in this release.
753 +
754 +- (Framework) **UI**: Added a notice about PayPal giving trouble with encrypted buttons recently, recommending to not encrypt them for now. You may need to disable button encryption, and allow non-encrypted payments. _s2Member > PayPal Options > Account Details > Button Encryption_
755 +
756 +- (Framework) **UI**: Brought back the "Expand All" and "Collapse All" buttons for the admin panels. See [thread 10796](https://f.wpsharks.com/t/10796)
757 +
758 +- (Framework) **UI**: Updated the link to the PayPal IPN configuration.
759 +
760 +- (Framework) **UI**: Added link to PayPal's IPN History page. _s2Member > PayPal Options > PayPal IPN > More Information_
761 +
762 +- (Pro) **Fix**: Stripe's billing update pro-form gave an error sometimes. Fixed in this release. See [thread 10752](https://f.wpsharks.com/t/10752)
763 +
764 += v230530 =
765 +
766 +- (Framework) **Enhancement**: Updated the Mailchimp integration to v3 of their API. I made it so you shouldn't need to change anything, it should work with your existing configuration. Still worth doing a test or checking that things are normal after the update, and report any issues you notice. See: [thread 10666](https://f.wpsharks.com/t/10666)
767 +
768 += v230504 =
769 +
770 +- (Pro) **Fix**: Stripe subscriptions weren't using customer cards updated with the Billing Update pro-form. The subscription saved the first card, instead of defaulting to the card in the customer's profile. This release fixes that. The card is not added to a new subscription anymore, only to the customer's profile, and updating his profile's card with the Billing Update pro-form, will also update the subscription so it uses it. Thanks to Jim Antonucci for his help with this.
771 +
772 +- (Pro) **Enhancement**: The Stripe Billing Update pro-form now includes a field for the cardholder's name (i.e. Name On Card). Adding the name to the card will improve successful subscription charges. Thanks to Andy Johnsen for the idea.
773 +
774 += v230425 =
775 +
776 +- (Framework) **Fix**: Fixed domain name format validation for custom profile fields.
777 +
778 +- (Framework) **Fix**: Fixes to markdown parser for PHP8 compatibility.
779 +
780 +- (Framework) **Fix**: Fixed HTML near AWeber's API key field.
781 +
782 += v230413 =
783 +
784 +- (Pro) **Bug Fix**: An error could happen on PHP8 during Pro installation in a multisite network. Fixed in this release.
785 +
786 +- (Framework) **Bug Fix**: An error could happen on PHP8 when saving an edited user profile. Fixed in this release.
787 +
788 +- (Framework) **UI Enhancement**: In the List Servers admin page, removed mentions of the AWeber email parser, which isn't available any more.
789 +
790 += v221103 =
791 +
792 +- (Framework) **Bug Fix**: Removed latest changes to gateway notification and return handlers, that were causing difficulties with member access in some scenarios.
793 +
794 += v221031 =
795 +
796 +- (Framework) **Bug Fix**: Fix PayPal IPNs being ignored because a bug in the last release. After updating to this release, you may want to [review your latest IPNs](https://www.paypal.com/merchantnotification/ipn/history) since updating to v221028, and re-send them from PayPal. See [thread 10208](https://f.wpsharks.com/t/10208)
797 +
798 += v221028 =
799 +
800 +- (Framework) **Fix**: Initialized some array keys to prevent PHP warnings in PayPal notify and return files. Thanks Greg M. for your help.
801 +
802 +- (Framework) **UI**: Widened the Logs viewer. Thanks Sim. See [thread 10064](https://f.wpsharks.com/t/10064)
803 +
804 +- (Framework) **UI**: Framework auto-update is now allowed when Pro add-on installed.
805 +
806 +- (Pro) **UI**: The Pro updater now shows when a newer version available, not just when required.
807 +
808 += v220925 =
809 +
810 +- (Pro) **UI Enhancement**: In ClickBank Options admin page, added note about keeping IPN encryption disabled.
811 +
812 +- (Pro) **Enhancement**: Removed ClickBank's name from the notify, return, and success URLs, replaced with just `cb`. Kudos to Eduardo for telling me about this. See [thread 9910](https://f.wpsharks.com/t/9910)
813 +
814 +- (Pro) **Enhancement**: Added a PayPal payment request ID to help prevent random/rare PayPal duplicate charges. Kudos to Nathan for his help. See [thread 7999](https://f.wpsharks.com/t/7999/27)
815 +
816 +- (Framework) **UI Enhancement**: Admin page panels widened for larger displays.
817 +
818 +- (Framework) **UI Enhancement**: Simplified Getting Started and Getting Help admin pages.
819 +
820 +- (Framework) **UI Enhancement**: In PayPal Options admin page, updated paths and links to PayPal settings.
821 +
822 +- (Framework) **Bug Fix**: Removed the Security Badge's link to the old Flash powered page on s2Member's site.
823 +
824 +- (Pro) **UI Enhancement**: Small improvements to the Pro upgrader.
825 +
826 += v220809 =
827 +
828 +- (Framework) **Enhancement**: New `current_user_days_to_eot_less_than` function for conditionals. Useful when you want to show a message to a user on his last days of access before the EOT time in his profile. E.g. `[s2If current_user_days_to_eot_less_than(31)]Please renew your membership[/s2If]`. Kudos to Felix for his help, see [post 6783](https://f.wpsharks.com/t/6783).
829 +
830 += v220421 =
831 +
832 +- (Framework & Pro) **Enhancement**: Improved PHP compatibility to 8.1.
833 +
834 +- (Framework) **UI Fix**: `More Updates` link fixed.
835 +
836 += v220318 =
837 +
838 +- (Framework) **Enhancement**: New `current_user_gateway_is` function for conditionals. Useful for sites using more than one gateway. E.g. `[s2If current_user_gateway_is(stripe)] ...`
839 +
840 +- (Pro) **UI Fix**: Removed "Image Branding" setting from s2's Stripe options, not used in current integration.
841 +
842 += v210526 =
843 +
844 +- (s2Member Framework & Pro) **UI Enhancement**: Started improving the admin interface. Lightened up the colors, and changed the layout a little bit.
845 +
846 +- (s2Member Framework) **UI Enhancement**: Added title tag to buttons to manage custom profile fields in admin, to improve use with screen-reader. [Thread 8836](https://f.wpsharks.com/t/8836/12)
847 +
848 +- (s2Member Pro) **UI Fix**: Fixed typo in pro-form `rrt` attribute description. [Issue 1204](https://github.com/wpsharks/s2member/issues/1204)
849 +
850 +- (s2Member Framework) **Bug Fix**: Registration Date sometimes wasn't formatted correctly with the s2Get shortcode. [Thread 8730](https://f.wpsharks.com/t/8730)
851 +
852 += v210208 =
853 +
854 +- (s2Member Pro) **Enhancement**: In the Stripe integration, cancelling a subscription in the last minutes of a period, may cause the invoice for the new period to remain there and still be charged later. Now s2Member Pro attempts to find a draft or open invoice for the subscription being cancelled, and void it. Thanks Alan for reporting it. See [post 8386](https://f.wpsharks.com/t/8098).
855 +
856 +- (s2Member Pro) **UI Enhancement**: Improved Stripe pro-form error message when trying to create a subscription with a bad card. Thanks everyone that reported it. See [issue #1184](https://github.com/wpsharks/s2member/issues/1184), [post 6043](https://f.wpsharks.com/t/6043), and [post 8386](https://f.wpsharks.com/t/8386).
857 +
858 +- (s2Member Pro) **Enhancement**: Added the new action hooks `ws_plugin__s2member_pro_before_stripe_notify_event_switch` and `ws_plugin__s2member_pro_after_stripe_notify_event_switch` in the Stripe endpoint to allow customizations, e.g. new event handlers.
859 +
860 +- (s2Member Pro) **UI Fix**: Removed some leftover mentions of Bitcoin support in Stripe's options.
861 +
862 +- (s2Member Pro) **UI Fix**: Removed a couple of deprecated shortcode attributes from the documentation for Stripe's pro-form, leftovers from the old integration. Kudos to Debbie for bringing my attention to them. See [post 8053](https://f.wpsharks.com/t/8053).
863 +
864 +- (s2Member Framework) **UI Fix**: Fixed some broken links and video players in the admin pages.
865 +
866 +- (s2Member Framework) **Bug Fix**: Resolved a warning given when changing users role in bulk from the WP Admin > Users page.
867 +
868 +- (s2Member Server Scanner) **Bug Fix**: Updated the [Server Scanner](https://s2member.com/kb-article/server-scanner/) to remove some outdated warnings.
869 +
870 += v201225 =
871 +
872 +- (s2Member Framework) **Bug Fix**: View Password icon WP's login page was not displaying correctly. Kudos to Beee4life for reporting it. See [issue #1187](https://github.com/wpsharks/s2member/issues/1187)
873 +
874 +- (s2Member Framework and Pro) **Enhancement**: Refactored PHP's deprecated _create_function_ with anonymous functions. Kudos to Berry for reporting it, see [post 6069](https://f.wpsharks.com/t/6069)
875 +
876 +- (s2Member Framework) **Bug Fix**: Added a check for empty return variable before trying to use it in paypal-utilities.inc.php.
877 +
878 +- (s2Member Framework) **Bug Fix**: Added checks for undefined indexes before trying to use them in paypal-return-in-subscr-or-wa-w-level.inc.php.
879 +
880 +- (s2Member Framework) **Bug Fix:** Added a check for undefined index before using it to define a couple of s2 constants. Kudos to Berry for reporting it, see [post 8181](https://f.wpsharks.com/t/8181/)
881 +
882 +- (s2Member Pro) **Bug Fix**: s2's payment notification when creating a Stripe subscription, was being sent twice. Added a check to ignore the webhook for the subscription's on-session first payment; s2's webhook endpoint is for off-session events.
883 +
884 +- (s2Member Framework) **Enhancement**: Added a new hook for the payment notification on subscription creation or buy now payments.
885 +
886 +- (s2Member Pro) **Bug Fix**: Stripe paid trials were accumulating on failed payment attempts, causing a larger charge when it finally succeeded. Kudos to Alan for his help through the many attempts to fix this one, see [post 7002](https://f.wpsharks.com/t/7002).
887 +
888 +- (s2Member Pro) **Enhancement**: Stripe duplicate payments were happening randomly to a few site owners, apparently from bad communication between their server and Stripe's. Added idempotency to prevent duplicates. Kudos to Alan and everyone in the forum that reported and gave details on this behavior, see [post 7002](https://f.wpsharks.com/t/7002)
889 +
890 += v200301 =
891 +
892 +- (s2Member Pro) **Enhancement:** Added "Powered by Stripe" to Stripe pro-form's payment card field. Kudos to Josh, see [post 6716](https://f.wpsharks.com/t/6716).
893 +
894 +- (s2Member Pro) **Bug Fix:** Stripe subscription cancellations were not happening when they should. This release updates the API integration for it and fixes that behavior. Kudos to Matt for reporting it, see [post 6909](https://f.wpsharks.com/t/6909).
895 +
896 +- (s2Member Pro) **Bug Fix:** Updating the card with Stripe's pro-form sometimes gave an incorrect "missing billing method" error. Kudos to Corey, see [post 7058](https://f.wpsharks.com/t/7058).
897 +
898 +- (s2Member Pro) **Small fix:** Removed Bitcoin mention next to Stripe in Gateways list. Missed it in [v191022](https://s2member.com/s2member-v191022-now-available/).
899 +
900 += v200221 =
901 +
902 +- (s2Member Pro) **Bug Fix:** In some rare cases, another plugin loaded Stripe's class before s2Member, so when s2 tried loading it there'd be an error. This release fixes the check for the class before trying to load it. See [issue #1170](https://github.com/wpsharks/s2member/issues/1170)
903 +
904 + **Note:** s2Member won't have control over what version of the Stripe SDK was loaded by the other plugin. You'll need to get that other plugin to have an up-to-date version. If you don't have another plugin loading Stripe, this is not relevant to you.
905 +
906 +- (s2Member Pro) **Bug Fix:** When using a 100% off coupon, requiring no payment, the Stripe pro-form was still loading the card field and requiring it, preventing the free signup. That's fixed in this release. See [issue #1171](https://github.com/wpsharks/s2member/issues/1171)
907 +
908 +- (s2Member Pro) **Bug Fix:** The Stripe pro-form, when given an invalid card, didn't give a clear error message for it, and instead just "invalid parameter". Now it shows the correct card error, making it possible for the customer to try a different card to complete the payment.
909 +
910 +- (s2Member Pro) **Feature Update:** The Indian Rupee was added to the list of currency symbols.
911 +
912 +- (s2Member Pro) **Feature Enhancement:** The s2Member Pro add-on, not being a regular plugin was not uploadable via the WP plugin manager. This made it necessary to FTP, which is complicated for some site owners. In this release I made it possible for the plugin manager to upload or remove the Pro add-on.
913 +
914 + **Note:** It still is not a regular plugin. The activation link or status in the plugins manager is irrelevant, but I couldn't find how to remove it. s2Member Pro activates automatically when its version matches the Framework's, and it'll be mentioned next to the Framework's version in the plugins manager.
915 +
916 += v191022 =
917 +
918 +- (s2Member Pro) **Feature Enhancement:** The Stripe pro-forms can now handle 3D Secure 2 for [Strong Customer Authentication](https://stripe.com/guides/strong-customer-authentication), as required by the new European regulation that came into effect recently. Props to those in the beta testing group, especially Brice and Felix. See [thread 5585](https://f.wpsharks.com/t/5585/).
919 +
920 +- (s2Member Pro) **Feature Enhancement:** The Stripe pro-form now has the card field inline, instead of opening a modal to enter it. Before it required clicking the link to open the modal, enter the card details, submit that, and then submit the pro-form. Now you enter the card details as part of the pro-form. See [issue #588](https://github.com/wpsharks/s2member/issues/588).
921 +
922 +- (s2Member Pro) **Stripe Integration Updates:** Upgraded the Stripe PHP SDK from v1.18 to v7.4.0, and the API from 2015-07-13 to 2019-10-08. Upgraded the integration from the Charges API to the latest Payment Intents API. Upgraded the card input from the old Stripe Checkout modal, to the new Stripe.js and Elements.
923 +
924 +- (s2Member Pro) **Optimization:** Stripe's JavaScript now only gets included if the page has a Stripe pro-form.
925 +
926 +- (s2Member Pro) **Removed Stripe Bitcoin**: Stripe [dropped Bitcoin](https://stripe.com/blog/ending-bitcoin-support) last year, it's not available anymore. This update removes the Bitcoin options and mentions from the s2 admin pages.
927 +
928 +- (s2Member Pro) **Bug Fix:** Subscriptions without at trial were showing a "trialing" status in Stripe for the first period. This behavior has now been solved. It will only say trialing when you set a trial period (free or paid) in your Stripe pro-form shortcode. See [issue #1052](https://github.com/wpsharks/s2member/issues/1052).
929 +
930 +- (s2Member Pro) **Bug Fix:** The Stripe pro-form installments via the `rrt` shortcode attribute were charging an extra payment before ending the subscription. There was an error in the time calculation for this. This is solved in this release. Props to Brice. See [thread 5817](https://f.wpsharks.com/t/5817/).
931 +
932 +- (s2Member Pro) **Bug Fix:** Some payments through the Stripe pro-form were creating a new Stripe customer when the user was already a customer. The Stripe customer ID was not being saved correctly in the user's profile. This is solved in this release. Props to demeritcowboy for reporting it.
933 +
934 += v190822 =
935 +
936 +- (s2Member) **PayPal Integration Update:** PayPal deprecated the subscription modification button. Using the old possible values for this, now gives an error on PayPal's site. This button has been removed from the PayPal Standard integration in s2Member. Props to Tim for reporting it, see [forum thread 5861](https://f.wpsharks.com/t/5861), and [issue #1157](https://github.com/wpsharks/s2member/issues/1157).
937 +
938 +- (s2Member) **Bug Fix:** PayPal would sometimes return the customer without the Custom Value expected by s2Member, incorrectly triggering an error. A small delay has now been added when needed to wait for PayPal to provide the missing value, so that the customer is met with the correct success message on return. Props to Josh Hartman for his help. See [forum thread 5250](https://f.wpsharks.com/t/5250).
939 +
940 +- (s2Member) **Bug Fix:** Google's URL shortening service has been [discontinued](https://developers.googleblog.com/2018/03/transitioning-google-url-shortener.html). The s2Member integration with it was removed in this release. Props to Felix Hartmann for reporting it.
941 +
942 +- (s2Member) **Feature Enhancement:** The popular URL shortening services have been abused in spam emails, and this can cause your site's emails with shortened signup URLs to end up in the spam folder. It's now possible to disable URL shortening when trying to avoid this problem. Props to Felix Hartmann for suggesting it. See [forum thread 5697](https://f.wpsharks.com/t/5697).
943 +
944 +- (s2Member Pro) **New Feature:** It is now possible to use a custom URL shortener other than the defaults in the s2Member Framework. This is particularly useful to use [YOURLS](http://yourls.org/) for your links, making them unique to your site, looking more professional and avoiding the spam filters issue mentioned above. For more info see this [forum post](https://f.wpsharks.com/t/5697/19).
945 +
946 += v190617 =
947 +
948 +- (s2Member Pro) **Authorize.Net Hash Upgrade:** Authorize.Net [announced](https://support.authorize.net/s/article/MD5-Hash-End-of-Life-Signature-Key-Replacement) the end-of-life for their MD5 Hash in favor of their new SHA512 Signature Key. Support for this has been added to s2Member Pro. The MD5 Hash is not provided by Authorize.Net any more, so the field for it in s2Member has been disabled. Props @krumch for his work. For further details see [forum thread 5514](https://f.wpsharks.com/t/5514).
949 +
950 + **Note:** For those that already used the MD5 Hash in their configuration, it is kept there and will keep working while Authorize.Net accepts it, which will not be much longer. It's important to update your integration with the new Signature Key. Once you have your Signature Key in the s2Member configuration, it will be favored over the old MD5 Hash._
951 +
952 +- (s2Member Pro) **Bug Fix:** The multisite patch for `wp-admin/user_new.php` wasn't finding the code to replace because of changes in the latest releases of WordPress. It has now been updated, as well as the instructions in the Dashboard for those that prefer to apply it manually. Props @crazycoolcam for reporting it. For further details see [Issue #1132](https://github.com/wpsharks/s2member/issues/1132).
953 +
954 + **Note:** If you already had patched this file in the past, it's recommended that you remove the previous patch restoring it to the original file, and let s2Member Pro patch it again now, otherwise you risk getting it patched over the previous one and ending up with errors. After the new patch, please review that file to verify that it's correct._
955 +
956 +- (s2Member Pro) **Bug Fix:** The search results for `s2Member-List` were not being ordered as specified in the `orderby` attribute when this was a field from the `usermeta` table in the database, e.g. `first_name`, `last_name`. This is now fixed and working correctly. Props to @stevenwolock for reporting it. For further details see [Issue #1103](https://github.com/wpsharks/s2member/issues/1103).
957 +
958 +- (s2Member) **WP 5.2 Compat. Enhancement:** s2Member has been tested with WP up to 5.2.2-alpha. With `WP_DEBUG` enabled, only one "notice" was found. In `wp-login.php` it said 'login_headertitle is deprecated since version 5.2.0! Use login_headertext instead.' This release now uses `login_headertext` and doesn't get that notice anymore. Props Azunga for reporting it. See [forum thread 5962](https://f.wpsharks.com/t/5962).
959 +
960 +You can find the [full changelog here](https://s2member.com/changelog/).