=== s2Member ( Membership w/ PayPal® Integration ) ~ now Multisite compatible! ===

Version: 3.2.3
Stable tag: 3.2.3
Framework: WS-P-3.0

SSL Compatible: yes
bbPress Compatible: yes
WordPress Compatible: yes
BuddyPress Compatible: yes
WP Multisite Compatible: yes
Multisite Blog Farm Compatible: yes

Tested up to: 3.0.1
Requires at least: 3.0
Requires: WordPress® 3.0+, PHP 5.2+

Copyright: © 2009 WebSharks, Inc.
License: GNU General Public License
Contributors: WebSharks, PriMoThemes
Author URI: http://www.primothemes.com/
Author: PriMoThemes.com / WebSharks, Inc.
Donate link: http://www.primothemes.com/donate/

Plugin Name: s2Member
Pro Module / Prices: http://www.s2member.com/prices/
Forum URI: http://www.primothemes.com/forums/viewforum.php?f=4
Plugin URI: http://www.primothemes.com/post/s2member-membership-plugin-with-paypal/
PayPal Pro Integration: http://www.primothemes.com/forums/viewtopic.php?f=4&t=304
Professional Installation URI: http://www.s2member.com/professional-installation/
Description: Empowers WordPress® with membership capabilities. Integrates seamlessly with PayPal®. Also compatible with Multisite Networking, and even with BuddyPress if you like.
Tags: membership, members, member, register, signup, paypal, pay pal, s2member, 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

s2Member is an extremely powerful ( and free ) membership management system for WordPress®. It empowers WordPress® with membership capabilities, integrating seamlessly with PayPal®. Also compatible with Multisite Networking, and even with BuddyPress if you like.

== Installation ==

= s2Member is very easy to install ( instructions ) =
1. Upload the `/s2member` folder to your `/wp-content/plugins/` directory.
2. Activate the plugin through the `Plugins` menu in WordPress®.
3. Navigate to the `s2Member Options` panel for configuration details.

= Auto-installing through WordPress® ( memory errors? ) =
This depends on your hosting provider and/or server configuration. Some web hosting companies impose very low limits on the amount of memory available to WordPress® during the execution of a single script. Since s2Member is a larger plugin, WordPress® may exceed conservative limits set forth by shared hosting companies. Don't feel bad, it's a very common problem. The solution is to install manually, using the instructions above. Memory limits only affect the WordPress® auto-installation routine, not the actual functionality of WordPress® or s2Member.

= Is s2Member compatible with WordPress® 3.0+ Multisite Networking ? =
Yes. s2Member v3.2+, 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 ).

= What about Multisite Networking ( WPMU ), used on a Blog Farm? =
Yes, preliminary ( experimental ) support for Multisite Blog Farms has also been implemented. If you're running a Multisite Blog Farm ( i.e. you offer Blogs ), please contact s2Member.com for further details. With Multisite Networking enabled, your site could ALSO offer a Customer access to create a Blog of their own, where a Customer becomes a "Member" of your ( Main Site ), and also a Blog Owner/Administrator. With s2Member installed ( network wide ), each of your Blog Owners could offer Membership too, using a single installation of the s2Member plugin ( which is a great selling point ). We refer to this as a Multisite Blog Farm.

You can get started now, by turning on [Multisite Networking](http://codex.wordpress.org/Create_A_Network) inside your installation of WordPress®. Then, install the s2Member plugin ( network wide ). In the Dashboard for your Main Site, see: `s2Member -> Multisite ( Config )`. Before you go live, please contact [s2Member.com](http://www.s2member.com/contact/) for full documentation on Multisite Blog Farms. There is some additional functionality that can be enabled for security on a Blog Farm installation; and also some menus/documentation/functionality that can be disabled.

== Upgrading To The Latest Version ==

You can either (upgrade automatically) by going to `WordPress® -> Plugins` and clicking "upgrade automatically". If that fails with memory errors, you can upgrade manually by following these instructions:

1. Go to: `s2Member -> General Options -> Deactivation Safeguards`. Turn Safeguards `on`, click Save.
2. Now you can safely deactivate s2Member by going to `WordPress® -> Plugins -> s2Member`.
3. Login via FTP, and delete the entire `/wp-content/plugins/s2member` directory.
	You can leave `/plugins/s2member-logs/` and `/plugins/s2member-files/`.
4. Now upload the latest `/s2member` folder to `/wp-content/plugins/`.
5. Go to: `WordPress® -> Plugins -> s2Member`, and reactivate.
6. That's it. All existing options will remain intact.

= Why do I get memory errors during automatic upgrade? =
This depends on your hosting provider and/or server configuration. Some web hosting companies impose very low limits on the amount of memory available to WordPress® during the execution of a single script. Since s2Member is a larger plugin, WordPress® may exceed conservative limits set forth by shared hosting companies. Don't feel bad, it's a very common problem. The solution is to upgrade manually. Memory limits only affect the WordPress® auto-installation/upgrade routine, not the actual functionality of WordPress® or s2Member.

== Description ==

s2Member is an extremely powerful ( and free ) membership management system for WordPress®. The s2Member Framework ( free ) integrates seamlessly with PayPal® ( very easy ), and fully supports recurring billing, with the ability to track affiliate commissions on a recurring basis. s2Member supports custom Pages for registration ( including Custom Registration Fields ), account access, and a whole lot more. Now compatible with Multisite Networking too, and even with BuddyPress if you like!

s2Member supports Free Subscribers ( at Level #0 ), and up to four Primary Membership Levels, [1-4]; plus unlimited Custom Capability Packages. Custom Capabilities allow you to create an unlimited number of Membership Packages, all with different Capabilities and prices. You can label your Membership Levels anything you like. The defaults are Free, Bronze, Silver, Gold, and Platinum.

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®-powered site. With s2Member, you can also protect downloadable files, using special restrictions on how many downloads can occur within a certain amount of time; all based on Membership Level.

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 &amp; Capabilities that are already built into WordPress®. No new tables :-) 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.

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 -> Special Posts/Pages`.

New! - [s2Member Pro](http://www.s2member.com/) is an add-on module 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, advanced User Import/Export tools, support for Coupon Codes, and more. Your purchase of s2Member Pro includes free lifetime upgrades; along with full access to our [video tutorial library](http://www.s2member.com/videos/).

== Screenshots ==

1. s2Member / Screenshot #1
2. s2Member / Screenshot #2
3. s2Member / Screenshot #3
4. s2Member / Screenshot #4
5. s2Member / Screenshot #5
6. s2Member / Screenshot #6
7. s2Member / Screenshot #7
8. s2Member / Screenshot #8
9. s2Member / Screenshot #9
10. s2Member / Screenshot #10

== Frequently Asked Questions ==

= Are video tutorials available for s2Member? =
Yes. [Video Tutorials](http://www.s2member.com/videos/) for s2Member are available [here](http://www.s2member.com/videos/).

= Is there a discussion forum for s2Member? =
Yes. The [Support Forum](http://www.primothemes.com/forums/viewforum.php?f=4) for s2Member is available [here](http://www.primothemes.com/forums/viewforum.php?f=4).

= Does s2Member install any new database tables? =
No, s2Member has been fully integrated with the Roles &amp; Capabilities that are 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.

= Does the PayPal integration work right-out-of-the-box? =
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.

= How many Membership Levels are supported? =
s2Member supports Free Subscribers ( at Level #0 ), and up to four Primary Membership Levels [1-4]; plus unlimited Custom Capability packages. Custom Capabilities allow you to create an unlimited number of Membership Packages, all with different Capabilities and prices. You can label your Membership Levels anything you like. The defaults are Free, Bronze, Silver, Gold, Platinum. s2Member also makes it possible to sell an unlimited number of Specific Post/Page Access Links using "Buy Now" buttons. Further details are provided under `s2Member -> PayPal® Buttons -> Specific Posts/Pages`.

= Does s2Member utilize the PayPal® IPN system? =
Yes, s2Member supports automation of account activation, welcome emails, confirmations, renewals, de-activation, 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.

= Does s2Member support PayPal® PDT/Auto-Return? =
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`.

= How does s2Member protect content from public access? =
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®-powered 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`.

= Does s2Member provide an API that I can connect to? =
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.

= Is s2Member compatible with Quick Cache or WP Super Cache? =
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.

= Is s2Member compatible with WordPress® 3.0+ Multisite Networking ? =
Yes. s2Member v3.2+, 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 ).

= What about Multisite Networking ( WPMU ), used on a Blog Farm? =
Yes, preliminary ( experimental ) support for Multisite Blog Farms has also been implemented. If you're running a Multisite Blog Farm ( i.e. you offer Blogs ), please contact s2Member.com for further details. With Multisite Networking enabled, your site could ALSO offer a Customer access to create a Blog of their own, where a Customer becomes a "Member" of your ( Main Site ), and also a Blog Owner/Administrator. With s2Member installed ( network wide ), each of your Blog Owners could offer Membership too, using a single installation of the s2Member plugin ( which is a great selling point! ). We refer to this as a Multisite Blog Farm.

You can get started now, by turning on [Multisite Networking](http://codex.wordpress.org/Create_A_Network) inside your installation of WordPress®. Then, install the s2Member plugin ( network wide ). In the Dashboard for your Main Site, see: `s2Member -> Multisite ( Config )`. Before you go live, please contact [s2Member.com](http://www.s2member.com/contact/) for full documentation on Multisite Blog Farms. There is some additional functionality that can be enabled for security on a Blog Farm installation; and also some menus/documentation/functionality that can be disabled. NOTE ~ You will be asked to make a donation, or to purchase a Support Package for s2Member.

= Is s2Member compatible with the BuddyPress plugin for WordPress? =
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.

= How does s2Member know when to demote a paid Member to a Free Subscriber? =
s2Member uses its built-in Auto-EOT System ( new ). 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_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.

= Do I need the s2Clean Theme? =
No. Both s2Member ( the [free version](http://www.primothemes.com/post/s2member-membership-plugin-with-paypal/) ), as well as the [s2Member Pro Module](http://www.s2member.com/prices/) will work in just about ANY WordPress® theme. That being said, if you're starting a brand new site, we DO suggest the [s2Clean Theme](http://www.primothemes.com/post/s2clean-theme-for-wordpress/), because it has already been setup specifically for s2Member, which will cut down on your development time. For example, the s2Clean Theme comes with a login box built into the site, and it also comes with pre-built Page Templates for s2Member's Login Welcome Page. You could create both of these inside WordPress® using any theme, even without Templates; but the s2Clean Theme makes it all much easier to work with.

= Why do I get memory errors during installation and/or upgrade? =
This depends on your hosting provider and/or server configuration. Some web hosting companies impose very low limits on the amount of memory available to WordPress® during the execution of a single script. Since s2Member is a larger plugin, WordPress® may exceed conservative limits set forth by shared hosting companies. Don't feel bad, it's a very common problem. The solution is to upgrade manually. Memory limits only affect the WordPress® auto-installation/upgrade routine, not the actual functionality of WordPress® or s2Member.

= How can I see more of what's going on behind-the-scene? =
s2Member comes with two very sophisticated logging systems. One for its PayPal® IPN communications ( and resulting actions ). The other logs Return-Data processing. You can enable them both, by going to: `s2Member -> PayPal® Options -> Account Details -> Logging`.

= When a User/Member is demoted by the Auto-EOT System, are Custom Capabilities removed too? =
Yes, whenever a User/Member is demoted, s2Member resets their account back to a Free Subscriber. Any Custom Capabilities the User/Member had - will be removed; as they should be.

= Where can I download older versions of s2Member? =
Archived releases of s2Member are maintained [here](http://wordpress.org/extend/plugins/s2member/download/).

= Is the free version of s2Member still being supported by WebSharks, Inc? =
Yes, without a doubt. The free version of s2Member ( aka: the s2Member Framework ), is the foundation on which the s2Member Pro Module, and future development will occur.

= s2Member does this, but I want it to do that. Is that possible? =
We get this type of question a lot. The answer is most definitely **yes**. The entire s2Member Framework is extremely versatile. For instance, the s2Member Pro Module is built on top of the free s2Member Framework; on top of the worlds' most powerful publishing platform ( WordPress® ). That being said, you WILL need be familiar with PHP, and/or WordPress® Hooks/Filters in order to accomplish advanced customizations. We suggest hiring a freelance developer at Elance.com, or hiring Jason Caldwell ( our own Lead Developer ) @ PriMoThemes.com / WebSharks, Inc. [Jason Caldwell](http://www.primothemes.com/post/author/websharksinc-jason/) is the Lead Developer behind the s2Member plugin, and also the s2Member Pro Module.

= Can s2Member be used with ClickBank® or Google® Checkout? =
Not yet. This is coming soon though. It will be included in a future release of the s2Member Pro Module, which already works with PayPal® Pro; using direct ( on-site ) credit card processing for Visa®, MasterCard®, American Express®, Discover®, Maestro®, Solo®, and PayPal® Express Checkout. [s2Member Pro](http://www.s2member.com/) is an add-on module for the [free version](http://www.primothemes.com/post/s2member-membership-plugin-with-paypal/) of s2Member. s2Member Pro adds full PayPal® Pro integration, a PayPal® Pro Form Generator, User Import/Export tools; along with full access to our [video tutorial library](http://www.s2member.com/videos/).

== Upgrade Notice ==

= 3.2+ =
* Upgrade highly recommended. New features, Multisite Networking, and several bug fixes.

== Changelog ==

= 3.2.3 =
* New Feature - "Alternative View Protection". Check your Dashboard: `s2Member -> General Options -> Alternative View Protection`. This new feature deals with some long awaited (protection) for things like: search results, RSS/XML feeds, and custom queries; where excerpts of protected content may slip through, depending on your theme. This feature is NEW, and still in an experimental state. It is disabled by default, but we encourage you to try it with different settings, and report back to us through the support forums for s2Member.
* New Feature - "Query Conditionals" for developers. Check your Dashboard: `s2Member -> API Scripting -> Query Conditionals`. s2Member now provides several built-in API Functions that are tailored to meet the needs of developers integrating s2Member into their themes. Such as: `is_category_protected_by_s2member($cat_id)`, `is_category_permitted_by_s2member($cat_id)`, `is_tag_protected_by_s2member($tag_id [slug or tag name])`, `is_tag_permitted_by_s2member($tag_id [slug or tag name])`, `is_post_protected_by_s2member($post_id)`, `is_post_permitted_by_s2member($post_id)`, `is_page_protected_by_s2member($page_id)`, `is_page_permitted_by_s2member($page_id)`, `is_uri_protected_by_s2member($uri [or full url])`, `is_uri_permitted_by_s2member($uri [ or full url])`. In addition, there are two special functions that can be applied by theme authors before making custom queries: `attach_s2member_query_filters()`, `detach_s2member_query_filters()`. These can be used before and after a call to `query_posts()` for example. s2Member will automatically filter all protected content ( not available to the current User/Member ). Further details on these functions is available under the `API Scripting` section in your Dashboard. You can also have a look at this file: `/s2member/includes/functions/api-functions.inc.php`.
* Compatiblity. s2Member is now compatible with the [Page Tagger](http://wordpress.org/extend/plugins/page-tagger/) plugin for WordPress®. Installing this plugin will allow you to protect Pages with Tags ( optional ). s2Member is also compatible with HeadSpace2 SEO, which can also enable Tags for Pages.
* Bug fix. A bug was found in s2Member's handling of PayPal® EOT responses. This bug was affecting site owners with newer PayPal® accounts ( i.e. their Subscription IDs start with `I-` ). These newer PayPal® accounts trigger `subscr_eot` events upon last payment, instead of when time has actually expired. s2Member v3.2.3 has been updated to correct its handling of `subscr_eot` events in this scenario. An obvious symptom of this bug, was to sell a non-recurring Subscription, and have that Subscription EOT on the very same day as the first payment ( which was also the last payment ), because it was non-recurring. This has been resolved in s2Member v3.2.3+.
* New API Notification. s2Member v3.2.3 includes a new API Notification that can provide details about Refund/Reversal events, which are related to transactions for "Specific Post/Page Access". s2Member has always provided Refund/Reversal Notifications, but NOT for Specific Post/Page Access. There are now two API Notifications for Specific Post/Page Access. One for initial Sales, and another for Refunds/Reversals ( i.e. chargebacks ).
* Replacement Codes. s2Member v3.2.3 adds two additional Replacement Codes to the API Notification for cancellations. These two additional Replacement Codes are: `%%item_number%%`, and `%%item_name%%`. See: `s2Member -> API Notifications -> Cancellations` for further details.
* Optimization. Some of s2Member's larger routines have been moved into the `/functions/separates/` directory, and they're now loaded "as needed", as opposed to being loaded by default. This will further optimize sites powered by s2Member. In addition, ( FYI for developers ) there are plans to implement `SPL Autoload` into a future release of s2Member, through classes assigned to various parts of the s2Member software package.
* Improvement. s2Member's Meta Box panels in the Post/Page editing stations are now designed to disable themselves automatically on special Pages that are handled automatically by s2Member; ( i.e. the Membership Options Page, Login Welcome Page, Download Limit Exceeded Page ). s2Member also provides site owners with a clearer picture of how it handles these special Pages through the Meta Box panel.
* General Maintenance. These two files `paypal-notify.inc.php`, and `paypal-return.inc.php` have BOTH been through another round of testing. Log file analysis ( with the help of other site owners ) indicated there were a few tweaks needed here and there. Minor changes were performed to improve compatibility for both PayPal® Standard and PayPal® Pro IPN handling ( across both old and new PayPal® accounts ). Things like `product_name` vs. `item_name` vs. `item_name1`; and `item_number` vs. `item_number1`, vs. `rp_invoice_id` parsing.
* New Shortcode Attribute. s2Member now accepts another PayPal® Button Shortcode attribute ( `ns="1"` ) is s2Member's default setting. This controls the `no_shipping` variable in your PayPal® Button. `0` – to prompt for a shipping address, but NOT require one ( enables shipping details via IPN ). `1` – to NEVER prompt for a shipping address. `2` – to prompt for a shipping address, AND require one ( enables shipping details via IPN ).
* Coming soon. Improvements to s2Member's support for Custom Fields did NOT make it into the official release of s2Member v3.2.3. Further beta testing is required. Support for selects, radios, checkboxes, and other improvements will come in s2Member v3.2.5.
* Additional changes in "s2Member Pro" have been [recorded here](http://www.s2member.com/).

= 3.2.2 =
* Simple Conditionals ( completely re-written ). Simple Conditionals, first introduced in s2Member v3.2.1; have been completely re-written to support a wider range of features. The **new Shortcode** is `s2If`. The older Shortcodes have now been deprecated: `s2All, s2Any` ( do NOT use ). The older Shortcodes will continue to work with backward compatiblity, but they'll be removed in a future release of s2Member. Please update any existing Shortcodes referencing `s2All,s2Any` ( do NOT use ), by switching them all over to `s2If` instead. We apologize for the drastic changes to this new feature; but it was a necessary step forward. The initial release of Simple Conditionals was very buggy, and NOT as extensible as the new `s2If` logic is now. If you've been using Simple Conditionals, you will need to re-review all documentation and code samples. The new `s2If` Shortcode is fully documented, inside your WordPress® Dashboard under: `s2Member -> API Scripting -> Simple Conditionals`.
* Starting with s2Member v3.2.3, "Simple Conditionals" are now available to you from within WordPress®, using Shortcodes that are fully compatible with both the Visual Editor, and also the HTML Tab in WordPress®. We've been through all of the documentation for s2Member, and updated (again) ALL code samples to provide you with Shortcode equivalents. You can learn more about this new feature in your WP Dashboard, under: `s2Member -> API Scripting -> Simple Conditionals`. Simple Conditionals are a NEW feature, and they'll have no affect on Advanced Conditionals; which have always been available for s2Member.
* Bug Dodging. A call to `get_defined_constants(true)` inside `css-js-w-globals.inc.php` was causing a segfault on some installations of PHP 5.2. Bug reports at PHP.net indicate this is caused by the `(true)` argument being passed; and under the right conditions ( e.g. with the right combination of PHP extensions installed ) this can result in a segfault. In this release of s2Member ( v3.2.2 ), we've dodged this PHP bug completely, by implementing a different method for tracking the integrity of API Constants, thereby circumventing this odd behavior on some Apache/PHP installations. s2Member no longer makes any calls to the `get_defined_constants()` function.
* New Feature. s2Member can now send automatic API Notification Emails, which include a full Transaction Log for each API Notification event. In other words, you can now tell s2Member to send emails to different addresses, for each of s2Member's API Notification events. For further details, see: `s2Member -> API Notifications`. Look for "Email Transaction Log" under each sub-section. This new feature will make it easier to integrate s2Member with back-office routines, and in particular, easier to integrate with 3rd-party list servers - other than MailChimp/AWeber, which s2Member already supports natively. This new feature also makes it easier to build confidence in s2Member. As a Site Owner, you may configure email notifications for each event, and monitor s2Member's behavior.
* New API Notification. s2Member can now process separate API Notifications for "Cancellation" events. For further details, see: `s2Member -> API Notifications -> Cancellations`. Using this feature in conjunction with the new Email Transaction Logs, you can be notified via email; each time a Cancellation occurs.
* Bug fix. On a Multisite Blog Farm, s2Member was missing an important Hook/Filter ( `signup_hidden_fields` ) during a registration that included both an account, and also a Blog. This bug has been resolved with s2Member v3.2.2+.

= 3.2.1 =
* Feature. s2Member now comes equipped with an advanced behavioral setting; specifically geared toward two special events ( Refunds/Reversals ). With s2Member v3.2.1+, you will find a new option which gives you more control over the way s2Member handles these two events. In your WP Dashboard, see: `s2Member -> PayPal® Options -> EOT Behavior`.
* Bug fix. s2Member's bbPress Bridge integration was using a hard-coded reference to `wp_capabilities`, instead of using an option call to determine the WordPress® table prefix that was needed for some installations. This was affecting installations of WordPress® that were using a non-standard `wp_` prefix. Corrected in s2Member v3.2.1. In addition, another bug was found, causing the error: `missing argument` in preg_replace. This has also been corrected with s2Member v3.2.1+.
* Bug fix. Invalid method `WP_User->hap_cap()`. This should have been `WP_User->has_cap()`. This was negatively affecting the new Custom Capabilities per-Post/Page introduced in the previous release of s2Member v3.2. This bug has been resolved with s2Member v3.2.1+.
* Hooks/Filters. Several new Hooks/Filters for Custom Fields. The upcoming release of s2Member v3.3 will include many new features for Custom Fields. In the mean time, these new Hooks/Filters integrated into `/includes/functions/register-access.inc.php` will make it easier for developers to maniuplate the display of Custom Fields. One such example is the Filter `ws_plugin__s2member_during_custom_registration_fields_during_custom_fields_display`.
* Forcing SSL w/ PayPal® Pro integration. The Custom Field `s2member_force_ssl=yes` is now more powerful. s2Member is now capable of forcing SSL ( i.e. `https://` ) on certain Posts/Pages, WITHOUT causing a site-wide conversion to https. In other words, s2Member can now buffer content without affecting href tags within that content, and/or in your navigation menus. Improvements to this routine make integrations of PayPal® Pro Forms easier than ever. Just add this Custom Field to any Post/Page that you want to force SSL on: `s2member_force_ssl=yes`. This is compatible with almost ANY WordPress® theme. Or, if your host requires a specific port number in the URL, use this instead: `s2member_force_ssl=443`. This Custom Field can be added in your Post/Page editing stations; inside WordPress®. ( * This is also compatible with the Quick Cache plugin for WordPress®, so that PayPal® Pro Forms can be cached initially for speed optimization. )
* IP Restrictions ( i.e. `s2Member -> General Options -> IP Restrictions` ), have been enhanced to provide better security against slower attacks that may span several weeks/months. s2Member's IP Restrictions are now capable of internal concurrency timeouts on a per-IP basis, as opposed to just a per entry-point basis. In addition, s2Member is now smarter about the way it enforces your configured Punishment Period. Some additional documentation on how IP Restrictions work, is now available in your s2Member General Options panel. There's nothing you need to change though; just review the updated details on this topic in your General Options panel for s2Member.
* Bug fix. The new Meta Box panel that was made available in the previous release of s2Member ( e.g. in your Post/Page editing stations ), was saving an empty array when there were no Custom Capabilities being specified/required. This is/was harmless; however, it WAS causing `s2member_ccaps_req` to appear in the Custom Fields drop-down menu for each Post/Page; even with no Custom Capabilities were required. This confusing behavior has been resolved with s2Member v3.2.1+.
* Bug fix. A new feature added in the previous release of s2Member, making it possible to Add A User through WordPress® ( including all s2Member fields initially, without a subsequent Edit ), was working with Multisite enabled, but broken WITHOUT Multisite enabled. This has been resolved with s2Member v3.2.1+. This feature is now working with or without Multisite Networking enabled.

= 3.2 =
* New Feature. s2Member now provides a small panel ( aka: `meta box` ) inside your Post/Page editing stations. This new panel makes it possible for you to restrict access to a Post/Page, or even a Custom Post Type ( on-the-fly ) without having to go back to your General Options panel all the time. Starting with s2Member v3.2+, you can also tell s2Member to require Custom Capabilities on a per Post/Page basis. So now, s2Member ( if you prefer ) can handle Custom Capabilities for you! Whenever you edit a Post/Page, you can tell s2Member to require certain Custom Capabilities that you type in, using comma delimited format. In other words, you will need to type in some of the trigger words that you used whenever you created your PayPal® Pro Forms and/or Standard PayPal® Buttons. This way your Members will have the proper Capabilities to view different kinds of content that you offer. All of this is optional.
* Compatibility. s2Member, and also the s2Member Pro Module; have both been tested under WordPress® 3.0.1. Everything looks good - no conflicts.
* Multisite Networking. s2Member, and also the s2Member Pro Module; are now compatible with WordPress® 3.0+ Multisite Networking, formerly known as WPMU. In addition, preliminary ( experimental ) support for Multisite Blog Farms has also been implemented. If you\'re running a Multisite Blog Farm ( i.e. you offer Blogs ), please contact s2Member.com for further details.
* A new panel is made available under `s2Member -> Multisite ( Config )`, whenever [Multisite Networking](http://codex.wordpress.org/Create_A_Network) is enabled. This is where a Super Administrator ( operating on the Main Site ) can decide to offer Membership only, or Membership with Blog creation as well. In other words, your site could ALSO offer a Customer access to create a Blog of their own, where a Customer becomes a "Member" of your ( Main Site ), and also a Blog Owner/Administrator. With s2Member installed ( network wide ), each of your Customers could offer Membership too, using a single installation of the s2Member plugin ( which is a great selling point! ). We refer to this as a Multisite Blog Farm.
* Bug fix. The s2Member Framework has been updated to fully support installations of WordPress® that have two different URLs configured in their `WP Settings -> General` section. This bug was related to `bloginfo("url")` vs. `bloginfo("wpurl")`. In previous versions of s2Member, a major symptom of this bug was an unexpected redirection to the Home Page after checkout, instead of a formal response to the Customer. This bug was only affecting installations of WordPress® that were using a different Site Address URL, inside their `Settings -> General` panel. This has been resolved in s2Member v3.2+.
* Bug fix. An issue related to protected File Downloads, where a site owner was using sub-directories to guard specific files from specific Levels, was sometimes resulting in an invalid redirection to the Membership Options Page, with a query string indicating `21`, ( i.e. `s2member_level_req=21` ). This bug has been corrected in s2Member v3.2+.
* Videos. Over six hours of detailed [Video Tutorials](http://www.s2member.com/videos/) are now available for s2Member. Additional videos will be released over the coming days and weeks ahead; covering more advanced topics, marketing tips, and an in-depth look at the [s2Member Pro Module](http://www.s2member.com/prices/), plus Multisite Networking; which is also evolving rapidly.
* API Behavior. s2Member's API Notification for EOT/Deletions, has been changed slightly. In previous versions, the EOT/Deletion notification was only processed for a ( paid ) Member, who reached the end of their term, OR ... if a ( paid ) Member was manually deleted by an Administrator through the Dashboard. Starting with s2Member v3.2+, an EOT/Deletion Notification will be processed, EVEN if the account is NOT currently associated with a ( paid ) Member. In other words, starting with s2Member v3.2, if you delete an account manually ( through your WP Dashboard ) this will ALWAYS trigger s2Member's EOT/Deletion Notification; no matter what. For further details, check your Dashboard: `s2Member -> API Notifications -> EOT/Deletion`.
* Bug fix. Login message filter ( `login_messages` ) applied to registrations with a custom password entered during the registration process. `Registration complete. Please log in.` This Hook/Filter was renamed to just ( `login_message` ) with the release of WordPress® 3.0.1. Very minor issue, but this has been corrected with s2Member v3.2+ - in support of WordPress® 3.0.1+.
* Feature. Custom Registration Fields for s2Member, now support an Un-editable Mode ( in other words, if you want specific fields to be un-editable after registration ), you can wrap those Custom Fields inside ^carets^. In your WP Dashboard, see: `s2Member -> General Options -> Custom Fields` for additional documentation and examples.
* Profile Editing Panel. The Stand-Alone Profile Modification Page ( provided by s2Member ); now includes a password confirmation field ( in other words, a NEW password must be typed in twice as a confirmation ).
* BuddyPress/MailChimp. The first/last name fields were NOT being populated into the MailChimp® integration with BuddyPress installed. This has been resolved with s2Member v3.2+.
* Logging routines. s2Member's logging routines have been updated to support Multisite Networking. When Multisite Networking is enabled, s2Member will keep separate log files for each domain/path.
* Validation. The JavaScript validation routine for the `wp-login.php` file, now includes the Username/Email Address to help Customers avoid confusion.
* Feature. Integration of Custom Fields into the `Users -> Add New` panel. An account can now be created manually, with all details included initially. As opposed to the old way, where you had to go back and Edit the account manually, after the initial creation.
* Feature. s2Member now exposes its `s2member_custom` field inside the admin panel. You can go to your `Dashboard -> Users` panel, and click Edit next to a Member. The Custom String is now editable. You're NOT likely to need this, but s2Member makes it editable anyway. Possibly for advanced usage by a developer.
* Feature. Integration of Custom Fields into `/wp-signup.php` has been completed. This is only for Multisite Networking; where s2Member is being used in a Blog Farm environment.
* PayPal®. In the admin panel, a few subtle references to "PayPal®" have been changed to just "Paid"; leaving room for additional gateway integration possibilities that are coming soon.
* Feature. In the admin panel, there is now a shortcut link inside the s2Member menu panel; which leads a Site Administrator to `Add A Member` using manual entry.
* Compatibility. On a Multisite Network; s2Member is NOT compatible with configurations that use a different Dashboard Blog; other than the Main Site. This is NOT a good idea to try this with s2Member; it opens the door for all sorts of issues. s2Member now forces your Dashboard Blog to the Main Site for sanity/compatibility/security.
* Compatibility. Added support for this Conditional Tag `current_user_can_for_blog( $blog_id, $capability )` in support of Multisite Networking integration. As well as `$user->for_blog( $blog_id )`.
* Compatibility. Updated function calls with `usermeta` to `user_option`; including `get_user_option()`, `update_user_option()`, `delete_user_option()`. The `usermeta` functions were deprecated as of WP 3.0. The new `get_user_option()` function is also Multisite compatible. If you're a developer, you can take a look at s2Member's source code for examples. Or read [this article](http://codex.wordpress.org/Function_Reference/get_user_option).
* Important Database Change. In previous versions of s2Member, data about each Member was stored inside the `wp_usermeta` table automatically; and it STILL is. However, the `meta_key` names are now prefixed with `$wpdb->prefix`, which on most installations of WordPress® this translates to `wp_` ( e.g. `wp_s2member_subscr_id`, `wp_s2member_custom`, etc, etc. ). s2Member will automatically update your database tables upon re-activation. However, if you're a developer, and you've been using `get_usermeta($user_id, "s2member_subscr_id")`, you should now use `get_user_option("s2member_subscr_id", $user_id)` instead. No need to specify the `wp_` prefix in that function, it's handled internally by WordPress® through the `get_user_option()` call. For more information, please read [this article](http://codex.wordpress.org/Function_Reference/get_user_option).
* Bug fix. s2Member's PayPal® IPN processor was logging `Skipping Auto-EOT for now ...`, with Refund/reversal IPNs; when a particular Member already had an EOT-Time set. This was NOT the intended behavior in this scenario. In this release, s2Member has been updated to ignore existing Auto-EOT Times under this one special circumstance ( Refund/Reversal ). A Refund/Reversal will ALWAYS trigger an immediate EOT now.
* IPN Proxy Keys. s2Member's implementation of the optional Proxy Key for simulated IPN responses, has been updated to support Multisite Networking; through a new PayPal® utility function `ws_plugin__s2member_paypal_proxy_key_gen ()`. For further details, check your Dashboard under `s2Member -> PayPal® Options -> IPN Integration -> Proxy Key`.
* UI Improvement. The tabindex property for [?] icons in the admin panel have been set to `tabindex="-1"` to prevent an annoyance.
* Compatibility. On a Windows® server, the cURL extension is usually NOT compatible with SSL communications. s2Member now signals to the WP_Http class, that it should temporarily disable the cURL transport when a remote URL is being processed with an `https://` prefix. This allows the WP_Http class to recover gracefully (automatically) and fall back on the FOPEN method. If you're running WordPress® on a Windows® server, you should make sure that you have this inside your php.ini file. ( `allow_url_fopen = on` ). A symptom of this bug, was to see an error in your paypal-ipn.log file, with something like: `Unable to verify _POST vars...`.
* Compatibility. s2Member's menu inside WordPress® now requires the `create_users` capability, instead of the more restrictive `edit_plugins`. This provides improved compatibility across various installations/configurations.
* API Notifications. s2Member's API Notification for Refund/Reversals, now includes a negative `%%-fee%%` Replacement Code; referencing the `mc_fee` variable sent through PayPal® IPN responses.
* General Maintenance. A full review of s2Member's source code was completed in this release. Including, but not limited to: general maintenance, code cleanup, optimizations.
* Login/Registration Design. Inside the General Options panel for s2Member, under `Login/Registration Design` there is a new option that allows you to configure the type of `Background Tiling` you prefer.
* Compatibility. The s2Member routine that responds to the `delete_user` Hook for WordPress®, has been safeguarded against duplicate processing via plugins ( or even WordPress® itself ).
* Improvement. s2Member now makes your Custom Fields available to a User/Member on the default Profile Editing Panel; the one inside WordPress®. Using this panel is still optional though; because s2Member includes a stand-alone panel as well ( see: `Profile Modifications, inside your s2Member -> General Options` ).
* API Notifications. s2Member's API Notification for Registration events, now (ALSO) includes ANY type of account that is created inside your Dashboard, under the `Users -> Add New` panel. In previous versions, the API Notification was NOT triggered for new accounts that were assigned a Role of Administrator/Editor/Author/Contributor in the Dashboard. Starting with s2Member v3.2+, they do! In conjunction with this change, comes a new Replacement Code `%%role%%` indicating the Role ID ( e.g. `subscriber, s2member_level[1-4], administrator, editor, author, contributor` ) associated with the new User. The Replacement Code `%%level%%` has been deprecated, please use `%%role%%` instead.
* Security Relaxation. In previous versions, s2Member has always prevented its processing routines from running on accounts with an Administrator/Editor/Author/Contributor Role. However, starting with v3.2+, s2Member WILL now process its routines for Editors/Authors/Contributors. Administrators will still NOT be processed under ANY circumstance though. The reason for this security relaxation, is to provide developers ( using Hooks/Filters ), with the ability to integrate s2Member in even more creative ways.
* Function removed. The function `ws_plugin__s2member_has_wp_role()` has been removed. It is no longer necessary. If you're a developer, and you've been using this function in previous versions... we suggest switching over to `current_user_can("[role name or capability])` instead. For more information, you can read [this article](http://codex.wordpress.org/Roles_and_Capabilities).
* Security hardening. s2Member's routines for analyzing and authenticating the validity of the three encrypted Cookies that it grants to a paying Customer - has been improved with s2Member v3.2.
* Replacement Codes. The `%%user_id%%` Replacement Code has been added to several other API Notifications now. Also, there are two new Replacement Codes for Payment Notifications ( `%%subscr_payment%%`, `%%subscr_payment_user_id%%` ). For further details, see: `s2Member -> API Notifications` in your Dashboard.
* Bug fix. The Default Password Nag that is built into WordPress® was not being suppressed whenever you allow Custom Passwords during registration. This has been resolved with s2Member v3.2+.

= 3.1.5 =
* Bug fix. The Replacment Code ( `%%current_user_level%%` ); which works in conjunction with a Login Welcome Page URL, and also with URI Level Access was always returning `-1`. This has been corrected in v3.1.5+.
* General cleanup and improved routines inside `/includes/file-download-access.inc.php`. No functionality changes, just subtle improvements in the logic behind s2Member's File Download Restrictions.
* New Replacement Code for s2Member's Registration API Notification. The Replacement Code ( `%%user_id%%` ) is now available to developers.

= 3.1.4 =
* Bug fix. Conditional check against `DOING_AJAX` added as an exclusion to the admin lockout routines for s2Member. This allows `/wp-admin/admin-ajax.php` to receive Ajax requests at all times, as it should be.

= 3.1.3 =
* Bug fix. Comparison between `$_SERVER["HTTP_HOST"]` and a PayPal® Custom/Proxy was failing on some servers that force a host port number into the `$_SERVER["HTTP_HOST"]` environment variable. MediaTemple® does this. If you're hosted by MediaTemple®, and you're using the s2Member Pro Module, you should upgrade to v3.1.3+.
* Bug fix. The WP_Http class, which is responsible for handling cURL, ExtHTTP, and/or fopen functionality for connections to PayPal®, was defaulting to a `5` second stream timeout. Under certain conditions, this was too low ( i.e. slow responses from PayPal®, and/or a WordPress® MySQL database ). The default timeout has now been increased to `20` seconds; which is designed to give high priority status to IPN processing routines; thereby reducing the chances of a connection timeout considerably, and improving the overall reliability of the s2Member checkout experience.
* Localhost support. s2Member now supports "localhost" installations of WordPress®; tested against WAMP and MAMP. Thanks to [ScriptyGoddess](http://www.scriptygoddess.com/) for reporting this, and for her assistance with testing against her MAMP installation.
* General UI cleanup. In particular, the PayPal® Option panels have been cleaned up a bit; making these important panels "less intimidating" to site owners that are brand new to s2Member.
* Support for File Download Restrictions, based on specific Member Level Sub-directories. For full details, please check your WP Dashboard, under: `s2Member -> API Scripting -> "Custom Capability and Member Level Files"`.
* The file `/includes/s2member.js` is now a development source file. The live version is now optimized, inside: `/includes/s2member-min.js`. This helps to further reduce the s2Member footprint.
* Virtual terminal support `(txn_type=virtual_terminal)` has been added to the s2Member IPN processor. This provides developers with access to Hooks/Filters on Virtual Terminal transactions.
* Internal optimization of s2member.css. These optimizations are designed to further reduce the footprint of s2Member.
* Bug fix. A bug was discovered in the PayPal® IPN routines; specifically with `payment_status`. Under the right conditions, it was possible for a declined echeck payment to slip through with a `Failed` payment status. s2Member v3.1.3+ corrects this bug.

= 3.1.2 =
* Updated minimum requirements to WordPress® 3.0+. There were changes in v3.1.1 that now require WP 3.0+ ( `apply_filters_ref_array` ). WordPress 2.9.2 is no longer compatible. If for some reason, you can't upgrade to WP 3.0, you can [grab older versions of s2Member here](http://wordpress.org/extend/plugins/s2member/download/).

= 3.1.1 =
* New feature. Now you can use `s2member_force_ssl -> yes` as a Custom Field with any Post/Page. This feature comes in handy if you need to force SSL on pages hosting PayPal® Pro Forms, implemented by the s2Member Pro Module. You can set `s2member_force_ssl -> yes` to force *https://*. If your server runs SSL over a special port number, or your server requires the port number to actually be in the URL ( i.e. HOST:port ), you can set `s2member_force_ssl -> 443`; or to whatever port you need. In addition to forcing *https://*, s2Member is also capable of forcing SSL compatibility in your theme, and in other quirky plugins. If your theme is NOT 100% compatible with SSL, s2Member can sometimes correct flaws automatically, but not always. For maximum compatibility with SSL, we recommend a premium WordPress® theme from PriMoThemes.com, or from another trusted source that states "SSL Compatible".
* Bug fix. References to the Constant `WP_CONTENT_URL` have been removed, in favor of `content_url()`, which is SSL-friendly.
* Tweak. References to `$_SERVER["HTTPS"]` have been abandoned, in favor of `is_ssl()`, which is native to WordPress®.
* Windows®. Although full testing on Windows® IIS is not completed, one bug report indicated a problem with `["dir_url"]`. This has been corrected in v3.1.1, using `DIRECTORY_SEPARATOR`.
* Bug fix. PHP 5.3.x reference value on option filters. The `apply_filters()` call was changed to `apply_filters_ref_array()`. This has been corrected in v3.1.1.
* Localhost support. s2Member now supports "localhost" installations of WordPress®; tested against WAMP and MAMP. Thanks to [ScriptyGoddess](http://www.scriptygoddess.com/) for reporting this, and for her assistance with testing against her MAMP installation.

= 3.1 =
* bbPress® compatiblity. There is a new internal Bridge that can be installed into bbPress® by s2Member. This new bbPress® (Bridge/plugin) makes it possible for s2Member Levels [0-4] to be converted into bbPress® "Members" on-the-fly, and it will guard your forums against unauthorized access; including forum registrations, which are redirected to your Membership Options Page for s2Member. To install this Bridge Integration, check your WordPress® Dashboard, under: `s2Member -> Bridge Integrations`.
* New plugin that is HIGHLY recommended for s2Member. Get [WP Show IDs](http://www.primothemes.com/post/wp-show-ids-plugin/). Simple, yet elegant. Shows IDs for Posts, Pages, Media, Links, Categories, Tags, and Users in the admin tables for easy access. Very lightweight. Also supports Custom Post Types / Taxonomies.
* New feature. There is a new Replacement Code available for the Login Welcome Page. You can now set a Special Redirection URL, which includes `%%current_user_level%%`, making it possible to have a separate Login Welcome Page for each Membership Level that you plan to offer. For further details, log into your WP Dashboard, and go to: `s2Member -> General Options -> Login Welcome Page`.
* New feature. s2Member now supports 3rd-party IPN integrations, where you can have another service, such as PayDotCom® send simulated IPN transactions to your s2Member installation. For further details, log into your WordPress® Dashboard, and go to: `s2Member -> PayPal Options -> IPN Integration` ( at the bottom of that sub-section, you'll find your Proxy IPN Key ). Full instructions for services like PayDotCom® &amp; eJunkie® will be provided in the next release. The framework is in place, but full documentation has not been written yet.
* New feature. s2Member now allows you to customize a list of Recipients for both the Signup Confirmation Email, and also the Specific Post/Page Confirmation Email. This makes it possible to prevent these emails from going out ( definitely NOT recommended though ). More importantly, it allows you to have copies of these messages sent to various departments, or even to a list server; such as AWeber/MailChimp. It should also be noted that your list of Recipients, your Subject Line, and your Messages; can all be modified easily, and ALL of these fields support the full list of Replacement Codes listed in those sections. For further details, see: `s2Member -> PayPal® Options`.
* Bug fix. A redirection loop was found within s2Member's security restrictions. A redirection loop was possible, whenever s2Member was running with an incomplete configuration ( i.e. no Membership Options Page was configured ). This has been corrected in v3.1. A new warning notice will be issued should you attempt to save your General Options without configuring a Membership Options Page. Also, s2Member will NOT enforce any of its security restrictions until this Page has been configured successfully. See: `s2Member -> General Options -> Membership Options Page`. If you see no warning notice after updating your options, you're good. ~ Not a huge issue, but this was catching a few newbies by surprise.
* Support for third-party integrations that need to determine the location of your Membership Options Page, without having direct access through a plugin. Third-party applications may now send a request to your site like this: `http://www.example.com/?s2member_membership_options_page=1`, and s2Member will automatically redirect that request to the real Membership Options Page that you've configured.
* Compatibility. Back in s2Member v3.0.5, the s2Member Menu panel was moved up to sit just beneath the Users menu in WordPress®. This has been reverted back down near the bottom, because other plugins tend to conflict with this approach. The application of a specific menu postition could be overridden by another plugin that loads up after s2Member is initialized; causing the s2Member menu to dissapear. This has been resolved in v3.1.
* Bug fix. s2Member was reporting `Anyone Can Register = 1` on the General Options page for WordPress®, no matter what. This was not hurting anything internally, but the display of this incorrect information in some circumstances ( depending on configuration ) was leading to confusion for site owners. This has been resolved in v3.1+.
* New feature. It is now possible to protect files that are NOT even a part of WordPress®. You can accomplish this by placing any set of files/folders inside the `/plugins/s2member-files/` directory. Then, you can configure Inline Extensions under, `s2Member -> Download Options -> Inline Extensions`. Using this technique, you can now protect ANY file, using Download Keys and Inline Extensions. For full details, see: `s2Member -> Download Options`. Note, don't be fooled by the word "Download", this feature is much more powerful than it seems at first glance. If you get confused, please write in on the forums for assistance from the community.

= 3.0.9 =
* Bug fix. Inside `/includes/s2member.js`, there was an incorrect reference to `S2MEMBER_CURRENT_USER_IS_LOGGED_IN_AS_MEMBER`. This has been changed to `S2MEMBER_CURRENT_USER_IS_LOGGED_IN`, making s2Member's File Download prompts compatible with Free Subscriber permissions at Level #0.
* Bug fix. In the new Download Keys feature, first introduced in v3.0.5, a bug was discovered. The function `s2member_encrypt()` was being used inside `s2member_file_download_key()`, instead of `s2member_xencrypt()`. Download Keys need `s2member_file_download_key()`, with xencryption, for proper hash comparison. This has been resolved in v3.0.9. Thanks to Drew Kissinger for reporting this. For further details/instructions, check your WP Dashboard, under: `s2Member -> Download Options -> Advanced`.
* Bug fix. Calls spread throughout s2Member's Framework to the function `ws_plugin__s2member_nocache_constants()`, have been updated to `ws_plugin__s2member_nocache_constants(true)`; forcing compatiblity with Quick Cache and WP Super Cache inside protected "members only" areas. The `true` argument was added to force this behavior in certain circumstances, rather than asking s2Member to continously detect it. This also optimizes s2Member's security routines.

= 3.0.8 =
* Framework updated to support a special %%modification%% Replacement Code in proxy IPN Return URLs; used by the s2Member Pro Module.

= 3.0.7 =
* Support for IPN Proxy Return URLs has been added to the s2Member Framework. This makes it possible for proxy IPN requests to receive variables back in a custom return URL. This is used by the s2Member Pro Module.

= 3.0.6 =
* Bug fix. The file `paypal-button.html` was renamed in s2Member v3.0.5, to `paypal-checkout-button.html`. The "missing file error" has been corrected in v3.0.6.

= 3.0.5 =
* s2Member v3.0.5 is the first version of s2Member that is fully compatible with the s2Member Pro Module. Available now @ [s2Member.com](http://www.s2member.com/).
* New Level #0. s2Member now supports a new reserved Level #0 for Free Subscribers. s2Member has always supported Free Subscribers, but in past versions it was not possible to set custom permissions in the s2Member configuration panels for Level #0. Now you can. See: `s2Member -> General Options -> Open Registration`. You can now set Page, Post, Tag, Category, and even URI restrictions for Level #0.
* New feature. You can now create a "demo" account for public testing. Demo accounts ( where the Username MUST be "demo" ), will NOT be allowed to change their password. This will allow you to share a demo `username` / `password` with potential Customers, without having to worry about the password for the special "demo" account being changed during a demonstration. Any other restrictions you need to impose, if any; must be done through custom programming, using s2Member's Advanced Conditionals. See `s2Member -> API Scripting -> Advanced Conditionals`.
* New filter. s2Member now provides a well-hidden feature where a developer can use a WordPress® Filter to modify the default demotion Role. In other words, instead of having Members who cancel, demoted to a Free Subscriber by the s2Member Auto-EOT System, it is now possible through custom programming to modify this using `ws_plugin__s2member_force_demotion_role`.
* New feature. s2Member now supports Custom Capability Sub-directories for protected file downloads. See: `s2Member -> API Scripting -> Custom Capability Files`.
* New feature. s2Member now supports site-specific/time-sensitive and unique "Download Keys", which can be created for specific files that you've protected with s2Member. For full details, see: `s2Member -> Download Options -> Advanced Restricions`.
* Deprecated. The method `md5(s2member_xencrypt())` for protected file Keys has been deprecated; in favor of `s2member_file_download_key("location of file")`. For full details, see: `s2Member -> Download Options -> Advanced Restricions`. The older md5 method still works, but it will be removed in a future release of s2Member, so please update your site if you've been using Download Keys.
* Bug fix. When s2Member is configured to allow Custom Passwords during registration, instead of asking the User to check their email after registering, the message after registration now reads: `Registration complete. Please log in.` Since the Customer chose their own password during registration, asking them to check their email before logging in is a bit weird. This has been resolved in s2Member v3.0.5.
* Bug fix. A bug was found in two regex patterns that matched against the PayPal® `item_number` field. This was causing the registration system to fail under certain conditions, with the error: `Registration is currently not allowed`. This has been resolved in s2Member v3.0.5.
* Bug fix. Some regex patterns were being processed incorrectly by the function `preg_replace()`. This was only happening when a dollar sign was used within the second argument value. A new function has been added: `ws_plugin__s2member_esc_ds()`, which resolves the issue by escaping dollar signs before regex pattern matching is performed.
* Improvement. Improved validation routines in the PayPal® Button Generator. This helps to catch potential problems for novice/beginning site owners.
* General cleanup / attribute escaping. The function `esc_attr()` is now applied to all Shortcode processing attributes. This prevents conflicts with some plugins.
* CKEditor. It appears that the CKEditor plugin does not preserve WordPress® Shortcodes on some installations we've seen. s2Member has been updated to strip `&quot;` from Shortcode attributes, which helps to fight against this issue. That being said, we highly recommend the default WordPress® Editor. Should you install a custom Editor plugin, you may have unexpected results with WordPress® Shortcodes.
* Framework in place for additional gateways to be added in future releases of the s2Member Pro Module.
* Bug fix. A minor bug was found in a few Hooks called upon inside `menu-pages/paypal-buttons.inc.php`. These were incorrectly referencing the `options_page`. This bug was first introduced in v3.0.4 and has been corrected in v3.0.5.
* Interface. By popular demand, the background color of the Profile Modification Page has been changed from light grey, to pure white.
* Bug fix. A Special Redirection URL in the s2Member API Constant ( `S2MEMBER_LOGIN_WELCOME_PAGE_URL` ) was not being filled with possible Replacement Codes. This was only affecting the API Constant, and not the internal functionality of s2Member. None the less, this has been corrected in v3.0.5.
* API Constants. Some new API Constants have been added in support of Level #0. See: `s2Member -> API Scripting -> API Constants`.
* Positioning of the s2Member Menu panels has been moved up, so it now sits just beneath the Users menu in WordPress®.
* Bug fix. Forced type casting (int) on API Constants `S2MEMBER_CURRENT_USER_REGISTRATION_TIME` and `S2MEMBER_CURRENT_USER_REGISTRATION_DAYS`.
* Bug fix. A couple of routines using `WP_User` were not checking for the correct instantiation of the `WP_User` class. This has been corrected in v3.0.5.
* Improvement. Additional routines added to various functions in order to further optimize database queries.
* Utility function. A new function was added to `utilities.inc.php`. See: `ws_plugin__s2member_esc_dq()`.
* IPN routines cleaned up a bit. Now supports s2Member Pro/PayPal® Pro integrations - when the s2Member Pro Module is installed.
* Bug fix. IPN processing routines were sending API / Signup Notifications and creating Signup Tracking Codes whenever an account was being updated through a subscr_signup response with advanced update vars ( on0, os0 ). This was not the intended behavior. Signup Notifications and Signup Tracking Codes should only be processed ONE time for each Customer. This has now been resolved in v3.0.5.
* Bug fix. Hooks/Filters were not being given a chance inside `profile.inc.php` because s2Member was loading this on `init`, instead of through `template_redirect`. This has been resolved now in v3.0.5.
* Conditional fix. Possible Registration URL failure during IPN processing was not reporting anything in the logs. There was not much chance of this happening, but, at any rate; the log reporting mechanism has now been corrected in v3.0.5.
* Internal feature. The IPN processing routines are now capable of self-verifying proxy requests through `$_GET["s2member_paypal_proxy"]` and `$_GET["s2member_paypal_proxy_verification"]`. This is useful only for advanced site owners who are extremely familiar with s2Member. The s2Member Pro Module uses this feature.
* New Replacement Codes for Signup Confirmation Emails. These new Replacement Codes are now available: `%%initial_cycle%%`, `%%regular_cycle%%`, `%%recurring/regular_cycle%%`. These are available only for the Signup Confirmation Email; making it easier; since conditional analysis is not possible for email templates.
* FAQs updated. See: `s2Member -> s2Member Info` inside your WordPress® Dashboard.
* Changelog trimmed away at version v2.0.

= 3.0.4 =
* Over 100 new Hooks/Filters have been added to the s2Member framework. Many of these Hooks/Filters now pass variables by reference.
* All of s2Member's function calls have been wrapped inside `if(!function_exists()){}`. This gives developers the ability to override built-in functions - as needed. We suggest using Hooks/Filters, but when all else fails, you can now override built-in functions.
* IMPORTANT: ( Attention Developers ) All of s2Member's internal Hooks/Filters have been prefixed with `ws_plugin__` starting with v3.0.4. Given the number of Hooks/Filters spread throughout the s2Member framework ( now over 200 ); it was important to establish a standard for prefixing all Hooks/Filters. This will prevent future namespace clashes. If you've hooked into s2Member using your own custom programming routines, please update all of your Hooks/Filters by prefixing them with `ws_plugin__`.
* Security fix. It was possible for a Customer to use a Registration Access Link generated by s2Member; coming from a previously canceled purchased, to re-register under certain circumstances. This has been resolved in v3.0.4.

= 3.0.3 =
* Framework updated to WS-P-3.0.

= 3.0.2 =
* Feature for developers. All of s2Member's internal Hooks &amp; Filters have been updated to support `get_defined_vars()` as a single argument on Hooks, and as a secondary argument on Filters. The PHP function: `get_defined_vars()` provides plugin developers with full access to all defined variables - within the scope of a function that is calling upon Hooks/Filters.
* Bug fix. A bug was found in a regex pattern that matched against the PayPal® `item_number` field. This was causing the IPN system to fail under certain conditions. This has been resolved in s2Member v3.0.2.
* Bug fix. A bug was found in remote calls on some servers that use `zlib.output_compression`. This was affecting s2Member's ability to read data returned by `wp_remote_request()` whenever gzinflate failed on strings starting with these two bytes `\x78\x9c`.
* Framework updated to WS-P-2.3.

= 3.0.1 =
* Compatibility. The function `ws_plugin__s2member_curlpsr()` has been replaced by `ws_plugin__s2member_remote()`, which makes use of `wp_remote_request()` through the WP_Http class. This removes s2Member's absolute dependency on the cURL extension for PHP. Removing this dependency, allows s2Member/WordPress® to work out the best method of communication; based on what the installation server has available.
* Compatibility. The MailChimp® API Class has also been modified to use `ws_plugin__s2member_remote()`. In previous versions of s2Member, the MailChimp® API required `allow_url_fopen = on` because it used the fsockopen method to communicate with the MailChimp® server. Removing this dependency on fsockopen, allows s2Member/WordPress® to work out the best method of communication; based on what the installation server has available.
* Compatibility. s2Member's Auto-EOT System is no longer absolutely dependent on WP-Cron. A new option has been added that allows you to run s2Member's Auto-EOT System through a server-side Cron Job - if you wish to. This makes s2Member compatible with hosting providers that disable WP-Cron for one reason or another.
* Updated minimum requirements to WordPress® 2.9.2.
* Framework updated to WS-P-2.2.

= 3.0 =
* Naming convention change. s2Member's Single-Page Access, is now referred to as "Specific Post/Page Access". The reason for this will become obvious after reading through some of the other changes in this version. Among other things, "Posts" are now supported, instead of just Pages. Custom "Post-Types" are also supported now. Custom Post-Types are coming in WordPress® 3.0+. WordPress® 3.0 is scheduled for official release in May 2010.
* Specific Post/Page Access. s2Member now supports "Specific Post/Page Packages" too ( optional ). You can choose a "Leading" Post/Page, and also include "Additional" Posts/Pages. Customers will still land on your Leading Post/Page; BUT, they'll ALSO have access to any Additional Posts/Pages you've packaged together into one transaction. See: `s2Member -> PayPal® Buttons -> Specific Post/Page Buttons` for further details.
* Fixed-Term Buy Now Access. s2Member now supports Buy Now Access with fixed term lengths. In previous versions of s2Member, it was possible to create a Buy Now Button for Lifetime Membership Access, but now you can create Buy Now Buttons for specific time periods. Anything from 1 day, up to 5 years. The Lifetime option is also still available.
* Improvement. Registration Configuration routines have been re-organized for a higher level of compatibility across a wide array of s2Member configurations. No functionality changes here, just smarter configuration routines in `ws_plugin__s2member_configure_user_registration()`. This will make s2Member even more compatible with other plugins.
* Tracking Codes. s2Member has improved the way in which Tracking Codes are injected after returning from PayPal®. For full details, see: `s2Member -> API Tracking -> Signup Tracking Codes`. s2Member also supports Tracking Codes for Specific Post/Page Access now. Some additional Replacement Codes are also available through s2Member's Tracking API.
* AWeber® integration. s2Member now sends AWeber® some additional details, including: `EMail Address, First Name, Last Name, Full Name, IP Address, and Membership Level`. You can map these fields using a Custom Email Parser for AWeber® - if you wish to. Otherwise, the default "PayPal® Parser" for AWeber® will do fine. Please see: `s2Member -> API List Servers -> AWeber®` for full details.
* Security fix. Although unlikely, it was possible for a Site Administrator, testing extensively in the Sandbox; to perform a Subscription Modification while logged in as an Administrator; or an (Editor/Author/Contributor). The result was that their account could have been upgraded to an s2Member Role, depending on Button Configuration. This ran the risk of a built-in WP Role being locked out of their account. If this happened to you in a previous version of s2Member, please read [this article](http://codex.wordpress.org/Resetting_Your_Password) for assistance. Additional security routines have been added to prevent s2Member from EVER being able to modify an account belonging to any Administrator/Editor/Author/Contributor, under ANY circumstance.
* Typo auto-correction. A typo in the default Email Confirmation template for Specific Post/Page Access, which was first introduced in v2.8.7, and later corrected in v2.8.8 ( `%%sp_access_url%%` ). The incorrect value ( `%%access_url%%` ) was lingering if v2.8.7 was installed at some point in the past. s2Member v3.0 auto-corrects this typo ( should be `%%sp_access_url%%` ), just in case it still exists from a prior installation of s2Member v2.8.7.
* PayPal® Buttons. The Shortcode format for PayPal® Buttons, now supports a new attribute: `image="default"`. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal® image. This works for all types of PayPal® Buttons, including Member Levels 1-4, Cancellations, Modifications; and even Specific Post/Page Access Buttons.
* Registration Form. s2Member now makes the Registration Form available to any Site Administrator who is logged-in, even when `Allow Free Subscribers` is set to `false`. This makes the Registration Form easier to test during configuration; and it prevents confusion for site owners that are new to the s2Member plugin. This will NOT affect the functionality of s2Member otherwise, and should have NO impact on existing installations of s2Member.
* Specific Post/Page Access. s2Member now uses Specific Post/Page sessions ( i.e. cookies ). After clicking through to a Specific Post/Page, using a Specific Post/Page Access Link ( `%%sp_access_url%%` ) via email; the Customer is now authenticated for that specific Post/Page, using cookies. This allows the Customer to navigate through other areas of your site, and later return to the Specific Post/Page they paid for, without being forced to re-enter the Specific Post/Page with an encrypted link all over again. This does NOT change Specific Post/Page functionality, it just makes your site more user-friendly to Customers. They won't have to keep going back to their email to find their Access Link all the time. They click an Access Link once, then they're authenticated by cookies until their access expires ( based on your configuration ).
* References to the WordPress® function `human_time_diff()` have been replaced with an improved function: `ws_plugin__s2member_approx_time_difference()`; supporting human time differences in minutes, hours, days, weeks, months, years.
* References to s2Member's `append_query` function have been removed in favor of the WordPress® native function `add_query_arg()`. This was a redundant function, because WordPress® already provides this capability in its core.
* Bug fix. Missing admin APIs in `paypal-notify.inc.php`. This was causing an unknown function error `wp_delete_user()` on some s2Member installations; depending on the configuration. This has been corrected in v3.0.
* Optimized Post, Page, Tag, Category, and URI Level Access routines. Stress testing s2Member revealed some minor performance issues. Nothing major, but s2Member v3.0 has been further optimized to reduce CPU time.
* Custom Post-Types are now supported by s2Member Post Level Access Restrictions. Custom Post-Types are coming in WordPress® 3.0+. WordPress® 3.0 is scheduled for official release in May 2010.
* Notes field. s2Member now has a Notes field available for each account. See: `WordPress® -> Users -> Edit User`. This allows you to keep a list of Notations related to specific accounts.
* IP Access Restrictions. As with any membership system, it is possible for one Member to signup, and then share their Username or Access Links with someone else. s2Member now provides protection against this. See: `s2Member -> General Options -> IP Access Restrictions` for full details and configuration options.
* EOT demotions. Whenever s2Member demotes a Member to a Free Subscriber in response to an EOT event, s2Member now leaves a Note on the account, indicating the date/time the demotion occurred.
* EOT bug fix &amp; improvements. ( 2010 PayPal® accounts ). EOT = End Of Term. s2Member has been updated to support newer PayPal® accounts ( those opened after Oct 15th, 2009 ). Newer PayPal® accounts do NOT send an IPN/`subscr_eot` in all cases. This has been reported to PayPal® by several developers. At any rate, s2Member can deal with this gracefully now, by keeping a record of payments/periods/changes, and monitoring other signals sent by PayPal®. This allows s2Member to take control of the situation, at the appropriate time, using s2Member's built-in Auto-EOT System ( new ). The communication from PayPal® -> s2Member is seamless ( once again ); even in PayPal® accounts created after October 15th, 2009. These changes will NOT negatively effect existing installations of s2Member. If anything, it will improve your experience. More importantly, if your PayPal® account was established in 2010, you will definitely want to upgrade to s2Member v3.0+.
 
 s2Member's Auto-EOT System has been integrated in favor of reliance on PayPal®. That is, s2Member no longer relies solely on `subscr_eot` responses; which is a good thing. The new Auto-EOT System, also makes it possible to set a manual EOT Time for each Member. Whenever you edit a Member, you'll see a new field ( `Automatic EOT Time` ) where you can override s2Member's decision, using a specific date/time that you supply. This is optional, but very powerful. In other words, you can now have a manual expiration date that does NOT have to be tied to a PayPal® Subscription.
 
 Important: If you're upgrading from a previous version of s2Member, please enable s2Member's EOT System after you upgrade. Go to: `s2Member -> PayPal® Options -> EOT Behavior`. Enable the EOT System and click Save. That's it!

= 2.9.4 =
* Bug fix in `%%current_user_login%%` for Special Redirection URLs. Was not processing correctly. This has been resolved in 2.9.4+.
* Bug fix in AWeber®/MailChimp® integration for Free Subscriber registrations. Specifically, those originating from the front-end.
* Extra security hardening. `MCRYPT_RIJNDAEL_256 / CBC` now being utilized in Registration Access Cookies.
* New feature. s2Member now supports a custom Double Opt-In Checkbox for its List Server integrations. See `s2Member -> API List Servers -> Double Opt-In`. This is also compatible with BuddyPress registration forms.

= 2.9.3 =
* Documentation fix. `s2Member -> API Scripting -> Advanced Conditionals -> Example #5` contained a PHP syntax error. This has been corrected in v2.9.3.
* Bug fix. Infinite redirection loop on Download Limit Exceeded Page. This was possible under certain circumstances, based on configuration. Resolved in v2.9.3.
* s2Member fully tested under WordPress® 3.0-beta2. Everything looks good. If you find any bugs, please report them [here](http://www.primothemes.com/forums/viewforum.php?f=4).
* New feature. A couple of Replacement Codes are now supported in the s2Member URI Level Access Restrictions. See: `s2Member -> General Options -> URI Level Access` for further details. This can be useful if you're running BuddyPress. For example, if you're using BuddyPress, and want to protect BuddyPress Groups, you could add URI protection, like this: `/members/%%current_user_login%%/groups/`
* New feature. For protected File Downloads, you may now specify a list of file extensions that should be displayed Inline ( in your browser ) as opposed to being downloaded as an attachment. See: `s2Member -> Download Options -> Inline Extensions`. A new API Constant was also added, which reflects the value of this option: `S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS`.
* Documentation change. This is only relevant if you've been using the `s2member_xencrypt()` function to provide free access to specific files. The documentation for this has been changed. You should now use `s2member_free_file_download_key=<?php echo md5(s2member_xencrypt("file")); ?>`, instead of just `s2member_xencrypt()` by itself ( which is now deprecated ). The addition of the MD5 hash improves the security of s2Member on a whole, and also makes your links shorter. Please update your links. In future versions of s2Member, the older method will no longer be supported.
* Compatibility fix. Calls to the PHP `mail()` function have been modified to exclude additional flag parameters. This makes s2Member more compatible with a variety of MTAs across different hosting providers.
* New feature. A couple of Replacement Codes are now supported in the s2Member Login Redirection URL. See: `s2Member -> General Options -> Login Welcome Page -> Special Redirection` for further details. This can be useful if you'd like to redirect Members to their BuddyPress Profile, if/when BuddyPress is installed together with s2Member. For example, if you're using BuddyPress, and you want to redirect Members to their BuddyPress Profile page after logging in, you would setup a Special Redirection URL, like this: `http://www.example.com/members/%%current_user_login%%/profile/`
* Please note. BuddyPress is NOT required to use s2Member. However, the combination of BuddyPress + s2Member is a popular choice among site owners.

= 2.9.2 =
* Bug fix. A bug in the PayPal® Auto-Return routine for PDT ( Payment Data Transfer ) has been resolved. This bug was generating a message that read: `Unable to verify POST vars`. This was actually not a bug, but rather, a [limitation in PDT transmissions](https://www.x.com/message/34450#34450) from PayPal®. s2Member has been updated, with a work-around for this limitation. This bug was very elusive, because it was not affecting all PayPal® accounts. In some cases, it was only affecting PayPal® accounts opened after October 2009.

= 2.9 =
* This release is all about security and bug fixes, with very few feature additions.
* Bug fix, `%%registration_url%%` in the Signup Confirmation Email was being replaced with `1`, instead of the full URL. This bug was first introduced in s2Member v2.8.7. This has been corrected in v2.9.
* s2Member now uses `MCRYPT_RIJNDAEL_256 / CBC` through `mcrypt_encrypt()` when it's available on your server. XOR encryption is used as a fallback for hosts that do not have the mcrypt extension installed. The `MCRYPT_RIJNDAEL_256` algorithm provides much better security.
* A full security review of s2Member has been completed, in anticipation of the s2Member Pro Module; being released later this month ( May 2010 ). A new panel under: `s2Member -> General Options -> Security Encryption Key` should be configured. Just click the `auto-generate` button there. s2Member will assign a special Security Key to your installation.
* Please join us in discussion. A new [Support Forum](http://www.primothemes.com/forums/viewforum.php?f=4) has been created for s2Member ( May 2010 ). Feel free to submit code samples, error messages, feature requests, etc.
* Please report all bugs. If you have any trouble with this release, you can always revert back to a [previous version](http://wordpress.org/extend/plugins/s2member/download/) until the issue is corrected.

= 2.8.9 =
* Bug fixed in the Single-Page Access routines. Some Single-Page Access links were reporting "Link Expired". This has been resolved in s2Member v2.8.9.

= 2.8.8 =
* Integration instructions for iDevAffiliate® and ShareASale® are now available under: `s2Member -> API Tracking`.
* Fixed a bug in the new Email Confirmation template for Single-Page Access. The replacement code: `%%access_url%%` has been changed to `%%sp_access_url%%`. This was a typo. The variable remains the same as it was, but the typo in the default template was corrected.
* Added a new replacement code to the Single-Page Email Confirmation template. See: `s2Member -> PayPal® Options -> Single-Page`. The new replacement code is: `%%sp_access_exp%%`, indicating a human readable duration for link validity.
* High priority bug fixed with s2Member Hook/Filter on Login Design. This bug was just introduced in v2.8.7. This bug was preventing a customized Login Design from being displayed properly. Corrected in v2.8.8.
* Bug fix in PayPal® Button Generator. The modify="" parameter was being set to a value of "1" in some rare cases, depending on button configuration. It should always default to a value of "0", and only be set to a value of "1" or "2" whenever a Subscription Modification Button is being generated. This bug was introduced in v2.8.6. Corrected in v2.8.8.

= 2.8.7 =
* Over 100 WordPress® Hooks and Filters have been added to the s2Member framework. In addition to its API Constants, s2Member now makes several Hooks/Filters available throughout its framework. This makes it possible to build onto ( or even modify ) s2Member in lots of different ways. If you need to add custom processing routines, modify the behavior of existing processing routines, or tinker with things otherwise; you should use API Hooks/Filters. API Hooks &amp; Filters, give you the ability to "hook into", and/or "filter" processing routines, with files/functions of your own; instead of editing the s2Member plugin files directly. If you don't use a Hook/Filter, and instead, you edit the plugin files for s2Member, you'll have to merge all of your changes every time a new version of s2Member is released.
* You can now set a custom expiration time for Single-Page Access links. Instead of the default 72 hours, you may now choose an option that works best for your site. Anywhere from 2 hours, up to 5 years.

= 2.8.6 =
* Powerful new feature! - s2Member now supports unlimited Custom Capabilities. This allows you to create an unlimited number of Membership Packages, all with different Capabilities ( customized specifically for what your site offers ). Custom Capabilities can also be configured on a per-User basis through your WordPress® Dashboard, under `Users`. For further details, see: `s2Member -> API Scripting -> Custom Capability Packages`.
* Powerful new feature! - Now you can sell Single-Page Access too, using "Buy Now" buttons. Single-Page Access works independently from Member Level Access. That is, you can sell an unlimited number of Pages using "Buy Now" Buttons, and your Customers will NOT be required to have a Membership Account with your site in order to receive access. If they are already a Member, that's fine, but they won't need to be. Further details are provided under `s2Member -> PayPal® Buttons`.
* MailChimp® integration. s2Member can now be integrated with MailChimp®. MailChimp® is an email marketing service. MailChimp® makes it easy to send email newsletters to your Customers, manage your MailChimp® subscriber lists, and track campaign performance. Although s2Member can be integrated with almost ANY list server, we highly recommend MailChimp®; because of their powerful API for MailChimp® services. In future versions of s2Member, we plan to build additional features into s2Member that work with, and extend, MailChimp® services.
* AWeber® integration. As a secondary option, s2Member can also be integrated with AWeber®. AWeber® is an email marketing service. Whether you're looking to get your first email campaign off the ground, or you're a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber's got just what you need to make email marketing work for you.
* Bug fix. Some of the %%replacement_codes%% for email messages were returning URL-encoded values. Replacement codes DO return URL-encoded values for API Notifications, because those are designed for use within URLs. However, they should NOT be encoded for email messages. This has been corrected in s2Member v2.8.6.
* Bug fix. `S2MEMBER_LOGIN_WELCOME_PAGE_URL` was missing in the s2Member JavaScript API. This has been corrected in s2Member v2.8.6.
* Important change. The API Constant: `S2MEMBER_CURRENT_USER_FIELDS` is now a JSON-encoded array, rather than a serialized array. Check `s2Member -> API Scripting` for code samples. This makes `S2MEMBER_CURRENT_USER_FIELDS` compatible with the PHP API, and also with the s2Member JavaScript API. In PHP, use `json_decode()` instead of `unserialize()`.
* Important change. The API Constant: `S2MEMBER_CURRENT_USER_IS_LOGGED_IN` works a little bit differently than it has in previous versions. Starting with s2Member v2.8.6, you should change any existing references to: `S2MEMBER_CURRENT_USER_IS_LOGGED_IN`, into this new API Constant: `S2MEMBER_CURRENT_USER_IS_LOGGED_IN_AS_MEMBER`. These two API Constants are documented under `s2Member -> API Scripting`. We're not getting rid of `S2MEMBER_CURRENT_USER_IS_LOGGED_IN` ( it's still useful ), but it does work a bit differently than it has in previous versions. Check the documentation if you're unsure, and we're sorry for the change-up.
* Under `s2Member -> General Options`, there is a new configuration option for Profile Modifications.
* Under `s2Member -> PayPal® Options`, there is a new configuration option for EOT behavior.
* The `s2Member -> API Tracking` field for Signup Confirmation, now supports PHP code too!
* The PayPal® Button Generator for s2Member, now supports Subscription Modification Buttons.
* The PayPal® Button Generator for s2Member, now supports Subscription Cancellation Buttons.
* A new s2Member API Notification event has been added for Single-Page Access.
* The PayPal® Button Generator for s2Member, now supports "Buy Now" Buttons.
* A new s2Member API Notification event has been added for Registrations.
* We've added a new Quick Start Guide for site owners.
* Documentation and code samples updated throughout.
* Support for WordPress® MU has been dropped, for now. Once WP 3.0 is released, we will come back to this. If anyone can help contribute to this effort, I would be very appreciative.

= 2.8.5 =
* Bug fix. A bug was causing the First &amp; Last Name of a new User to be excluded whenever a new User was created manually through the WordPress® Dashboard by an Administrator. This bug was first introduced in v2.8.2 and has now been resolved in v2.8.5.
* Internal references to `?s2AC` and `?s2ABC` have been removed. These have been deprecated since v1.6 anyway. They have now been removed completely in favor of `qcAC` and `qcABC`. These two variables are ONLY used internally, in order to provide compatibility with the Quick Cache plugin for WordPress®. This will have no impact on existing installations of s2Member; UNLESS you're using the Quick Cache plugin. If you ARE using the Quick Cache plugin, you should make sure that you're using Quick Cache 2.1.4+ for the highest level of compatibility with s2Member.

= 2.8.4 =
* A new option was added under `s2Member -> General Options -> De-Activation Safeguards`. This new option allows you to disable the de-activation routines for the s2Member plugin, so that s2Member Roles, Capabilities, and your Configuration Options will be preserved in case s2Member is deactivated inadvertently. We recommend that you Safeguard all s2Member data on your system; so please have a look at this new option.
* A bug was found in the Shortcode processor, related specifically to Buy Now buttons for Lifetime access. This bug has been corrected in s2Member v2.8.4.
* Stable tag updated in support of tagged releases within the repository at WordPress.org.

= 2.8.3 =
* A bug was found in the PayPal Button Generator, including the Shortcode processor. This has been resolved in v2.8.3. It was related to regex parsing. More specifically, it was related to Unix-style newlines vs. Windows-style newlines. For some site owners ( depending on how certain files were uploaded to their server ), this was resulting in an error at checkout that read "A1, P1, T1"; Invalid Trial. This bug has been corrected by modifying the regex parsing routines so that they're no longer dependent on multiline mode /m. The file `/button.html` has also been converted to Unix format to match the rest of the s2Member files.
* The action priority has been raised to (1) for `template_redirect` hooks inside `hooks.inc.php`. These hooks are responsible for access control routines that protect Pages, Posts, Tags, Categories, and URIs. This increase in the action priority gives s2Member greater compatibility with BuddyPress and other plugins that attempt to use `template_redirect` as a hook into their application. A plugin such as s2Member should always be given top priority in this chain of events, because it is protecting content from public access.

= 2.8.2 =
* Bug fix. A bug was found &amp; resolved in the activation/de-activation routines for s2Member. This bug was first introduced in the initial release of s2Member v2.8.0, and has been resolved in this release ( v2.8.2 ). This bug was preventing the s2Member Roles from being created properly on some WordPress® installations.
* Dependency on the pluggable function `wp_new_user_notification()` has been dropped, making s2Member compatible with MailPress and other plugins that need `wp_new_user_notification()`. Some site owners were encountering conflicts specifically with MailPress. This issue has been resolved in s2Member v2.8.2. s2Member now uses a work-around that bypasses the need for `wp_new_user_notification()`.
* A new configuration option has been added to `s2Member -> General Options -> Login Welcome Page`. This new configuration option, makes it possible for you to redirect Members to a Special URL after logging in ( and not just to a WordPress® Page ). For example, you could now have Members redirected to their BuddyPress profile after logging in, or to ANY other URL for that matter.
* Default values for the Login Welcome Page &amp; Membership Options Page are now empty when s2Member is first installed. Site owners just getting started with s2Member will appreciate this, because this tends to be less confusing if you're configuring s2Member for the first time.

= 2.8.1 =
* The PayPal® Button Generator now provides built-in JavaScript validation; preventing invalid Trial subscription configurations that could potentially cause `A1, P1, T1 errors` at checkout.
* The new Shortcode Format for PayPal Buttons is now the default format. The more advanced version ( the full Button Code ) is still made available; but only for theme designers and plugin developers.
* The resulting PayPal Button Code is now W3C compliant under XHTML Strict mode.

= 2.8 =
* s2Member now supports Custom Fields, and ALSO *required* Custom Fields. If you would like to make specific fields *required* during registration, you can! See: `s2Member->General Options->Custom Registration Fields`.
* Your Custom Fields are now visible inside `WordPress® -> under Users`. With s2Member installed, you'll now have the ability to view &amp; manipulate Custom Fields from your WordPress® Dashboard. In previous versions of s2Member, this information could only be obtained through the s2Member API. Version 2.8 makes everything available inside the WordPress® UI now. We also have plans to build onto this functionality in the next release. A CSV export would be nice, and also a history of file downloads. These are coming soon. Waiting for additional contributors.
* The `S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL` ( which is a PHP Constant included with the s2Member API ), has been updated to support *required* Custom Fields. It has also been updated to support IFRAME implementations. Documentation and code samples for IFRAME implementation are available under `s2Member->API Scripting->Constants`.
* Support for Content Dripping has been added in s2Member v2.8. Please see: `s2Member->API Scripting->Content Dripping`. Two new API Constants make this possible. These are `S2MEMBER_CURRENT_USER_REGISTRATION_DAYS` and `S2MEMBER_CURRENT_USER_REGISTRATION_TIME`. If you're dripping content, you should use `S2MEMBER_CURRENT_USER_REGISTRATION_DAYS`, it's easier.
* s2Member v2.8 includes support for Free Subscribers ( without going through PayPal® ). See: `s2Member->General Options->Login Welcome Page->Allow Free Subscribers`. You can now allow Users to register for FREE, and then upgrade them later using the instructions provided under `s2Member->Flow Of Events->Upgrading`.
* The PayPal® Button Generator has been improved significantly. It now supports MANY new options for Subscription Lengths. All the way up to 5 years &amp; also Lifetime Access.
* The PayPal® Button Generator now supports LIFETIME Subscriptions using `Buy It Now` buttons. Just choose `Lifetime` from the drop-down menu. This allows you to charge a Customer ONCE, and they'll never expire. It also makes the checkout experience more user-friendly, whenever your intention is to provide them lifetime access; as opposed to a specific number of days/weeks/months/years with recurring charges. s2Member now supports all of these methods.
* The PayPal® Button Generator now supports over 20 different international currencies.
* The PayPal® Button Generator now provides an alternative `Shortcode` method of insertion into Posts/Pages. If you were having problems associated with the Visual Editor for WordPress® ( i.e. raw code getting corrupted ), please use the new alternative format. This new format is made available after you click `Generate`. The Shortcode syntax is a more elegant solution than the Raw HTML plugin many of you were forced to use in previous versions of s2Member. The Alternative Shortcode syntax is every bit as powerful, without the headaches. The Shortcode syntax is also compatible with WordPress® Multisite KSES filters.
* Under `s2Member->General Options->Login Customizations`, you can now use a wider Logo Image, which automatically forces the Login/Registration forms to become wider overall. This adds a nice touch whenever you're using lots of Custom Fields. Otherwise you'll end up with a tall/narrow stack of form fields that really does not look nice :-). Try using a Logo Image about 550px wide.
* Documentation updated throughout. Many files modified. Some minor changes in the menu structure and naming conventions. Stay tuned! Have fun, and make some money!
* Please thank [Jennifer Stuart](http://scriptygoddess.com/) for a generous donation that helped make s2Member v2.8 possible.
* Also thank Stree Overlord with LARGE Inc. for his generous contribution that helped make s2Member v2.8 possible.
* Also thank Martin B. for his donation too. You'll find him the Comment threads. Say thanks!
* For more info, feature requests, etc; Visit: http://www.primothemes.com/post/s2member-membership-plugin-with-paypal/

= 2.7.2 =
* WebSharks Framework for Plugins has been updated to P-2.1.
* The s2Member file download headers (`file-download-access.inc.php`) has been updated to support CGI/FastCGI implementations. s2Member has been tested with HostGator, BlueHost, (mt)MediaTemple (gs) and (dv), The Rackspace Cloud, and several dedicated servers running with Apache; including support for both `mod_php` and also `CGI/FastCGI` implementations. s2Member should work fine with any Apache/PHP combination. Please report all bugs through the [Support Forum](http://www.primothemes.com/forums/viewforum.php?f=4).

= 2.7.1 =
* A bug in Custom Registration Fields has been corrected. This bug was introduced in v2.7, and has been corrected in v2.7.1. This bug was causing a mysterious [Empty Registration Field](http://www.primothemes.com/post/s2member-membership-plugin-with-paypal/comment-page-3/#comment-312) to appear on the form; when a new Customer registers their Username. Please thank [Jeffrey Nichols](http://jeffreyanichols.com/) for reporting this important issue.

= 2.7 =
* s2Member is now compatible with BuddyPress :-) And I must say... the s2Member/BuddyPress combination is just awesome. These two plugins running together make all sorts of things possible.
* A decision has been made to release this version, and future versions of s2Member as open source. We originally had plans to release this version privately as s2Member Pro. Instead, we've decided to keep future versions of s2Member licensed as GPL, and allow s2Member to be used freely by the entire WP community. We welcome any and all [contributions](http://www.primothemes.com/donate/) so that s2Member may remain publicly available. If you contribute more than `200.00`, your feature requests will be given high priority, and you will also receive 5 WordPress® themes ( of your choosing ) from PriMoThemes.com, along with a PriMoThemes.com T-shirt, and special credits in the next release of s2Member.
* All Option Panels have been given a makeover. The General Options Panel now includes a new section that provides you with the ability to collect and reference Custom Fields during user registration. The s2Member registration form now includes fields for First Name &amp; Last Name by default. These are the default, built-in Custom Fields.
* The Profile Modification Page ( `S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL` ), has been updated to support the new Custom Fields added to the General Options.
* A new PHP Constant has been added to the s2Member API ( `S2MEMBER_CURRENT_USER_FIELDS` ). Documentation for this PHP Constant is available under `s2Member -> Advanced Scripting`. This provides programmatic access to all fields, including Custom Fields.
* The PayPal® Button Generator that is built into s2Member, now supports both recurring and NON-recurring charges with various membership subscription terms. s2Member has always supported ANY type of PayPal subscription, whether it be recurring or non-recurring. However, this update makes it possible for you to configure additional options using the Button Generator, instead of having to tweak the code it generates manually.
* There is a new section under `s2Member -> PayPal® Options` that provides you with several tools to help you customize the Signup Confirmation email Subject Line and Message Body templates.
* Support for Custom Payment Pages has been improved, along with further documentation built into the PayPal® Button Generator. Click the [?] icons for additional details about how to brand Custom Payment Pages for checkout.
* Under `s2Member -> General Options -> Login/Registration Design` we've added some easy-to-use buttons that open your Media Library ( then press Insert to save time ); this allows you to pull images out of your Media Library easily.
* Multiple files updated. The most significant changes were in: `/includes/hooks.inc.php, /includes/profile.inc.php, /functions/register-access.inc.php, /functions/profile-modifications.inc.php, /functions/constants.inc.php, /menu-pages/buttons.inc.php, /menu-pages/menu-pages.js`.
* Coming soon... in v2.8 we will be including some pre-built templates that will further assist you in creating your Membership Options Page and Login Welcome Page for s2Member. If you don't know any PHP at all, and you are totally confused by the s2Member API instructions, these pre-built templates will help kick start your experience with s2Member. Stay tuned for the latest. We also have plans to release WP themes that are pre-integrated with s2Member in creative ways.
* Please thank [Greg Eland](http://gregeland.com/) for a generous contribution that made s2Member v2.7 possible.

= 2.6 =
* The security-enabled directory that protects downloadable files, has been moved outside the main plugin folder, and into a new directory `wp-content/plugins/s2member-files`. If you're using a previous version of s2Member to protect files inside the old directory `wp-content/plugins/s2member/files/`, you will need to move them into the new directory.

 s2Member will attempt to create this new directory for you automatically. However, if your `wp-content/plugins` directory is not writable, s2Member will fail silently, and you'll need to create that directory yourself. A warning will be displayed inside your WordPress® Dashboard, on the `Download Options` page if the security-enabled directory ( `s2member-files` ) is non-existent or unprotected. Instructions will be provided at that time about how to create this directory manually.

 It should also be noted... any of your existing links that use the `?s2member_file_download` variable will remain unaffected by this change. You can leave those links the way they are, just move your files into the new directory and you're good.
* The `File Download Options` page has been cleaned up a bit, and some additional instruction has been added to this configuration page.
* Enhanced logging routines for PayPal® IPN connections and sub-routines. Added PayPal® Return logging routines. Both of these logs can be turned on/off under `PayPal® Options`.
* Added some additional instructions to the `PayPal® Options` page, detailing step-by-step how to enable PayPal® IPN reporting, and optional Auto-Return w/ Payment Data Transfer.

= 2.5 =
* Bug fixed in PayPal® IPN routine. This bug was related to alias email addresses being paid through PayPal®, but then the primary (business) email address being returned in the IPN response. This bug was affecting some users who have multiple email addresses associated with a single PayPal® account. If they decided to use a non-Primary address with s2Member, it was causing a conflict. The validation routines have been corrected so that this is no longer an issue. One of the symptoms of this bug, was a simple Thank-you message after checkout, and a redirect to the login screen instead of to the registration page. Bug resolved.
* Another minor bug was found in the IPN routine. The IPN routine was not utilizing the `Email From Name` set in the `s2Member General Options`. A cleaning routine was completely losing the name field on one particular sub-routine associated with subscription signups. This bug has also been corrected.
* Files modified: `/functions/paypal-return.inc.php`, `/functions/paypal-notify.inc.php`, `/functions/email-hacks.inc.php` renamed to `email-configs.inc.php`.

= 2.4 =
* Fixed a bug in the PayPal® IPN and Auto-Return routines where it was possible for a conflict to arise whenever a subscription modification from one of these two routines jumped ahead of the other. This bug would have only affected site owners that were using the advanced `on0` and `os0` variables to allow members to upgrade from one membership level to another. This advanced technique is described in greater detail on the `Flow Of Events` page under `s2Member Options`.
* Applied the use of `add_query_arg()` ( a native WordPress® function ) to redirection after a successful signup. Some site owners reported problems with the `?action=register` parameter not being passed through correctly. The `add_query_arg()` function handles the `?` vs. `&` appendages more reliably.
* Added a fallback to the PayPal® IPN sub-routine for email receipts. By default, s2Member uses tinyURL.com to compress the longer URL into an email-friendly format. This new fallback will revert to using the longer version when/if tinyURL.com becomes temporarily unavailable for some reason.

= 2.3 =
* Fixed a bug related to compatiblity with `WP Super Cache` and the more modern `Quick Cache` plugin. We recommend `Quick Cache` because there has been more extensive testing performed with `Quick Cache`. That being said, s2Member should work fine with either of them installed. s2Member is compatible with both of these plugins. s2Member will prevent protected areas of your site from being cached by these plugins. To maximize compatiblity, please make sure that you're using friendly Permalinks; which is recommended anyway if you're using a caching plugin of any kind.
* Renamed `api-constants.inc.php` to just `constants.inc.php`.
* Renamed `nocache-headers.inc.php` to just `nocache.inc.php`.
* Modified `hooks.inc.php` to reflect these changes.

= 2.2 =
* Further optimized API routines that provide access to PHP Constants. Reduced queries from five down to just one.
* Fixed Tag Level Access issue; related to tag/slug conversion in the `General Options Panel`. This was not really a bug, but it was confusing to people, because tags were being converted to slugs automatically. This still happens internally, but they are no longer auto-converted within the `General Options Panel` because it was too confusing to site owners. If you are/were protecting certain tags, those tags will continue to be protected. This change will have NO impact on existing installations of s2Member.

= 2.1 =
* Re-organized core framework. Updated to: P-2.0.
* Updated to support WP 2.9+.

= v2.0 - 1.0 =
* ... trimmed away at v2.0.
* Initial release, v1.0.