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

Version Description

= v160801 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 161129 to 170221

Files changed (39) hide show
  1. CHANGELOG.md +0 -915
  2. README.md +0 -7
  3. readme.txt +33 -19
  4. s2member.php +9 -13
  5. src/includes/classes/css-js-themes.inc.php +22 -0
  6. src/includes/classes/custom-reg-fields.inc.php +1 -1
  7. src/includes/classes/menu-pages-rs.inc.php +1 -7
  8. src/includes/classes/menu-pages-tb.inc.php +1 -5
  9. src/includes/classes/paypal-notify-in.inc.php +3 -0
  10. src/includes/classes/paypal-return-in-proxy-x-preview.inc.php +1 -1
  11. src/includes/classes/readmes.inc.php +4 -4
  12. src/includes/classes/sc-files-in.inc.php +153 -5
  13. src/includes/hooks.inc.php +1 -0
  14. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3-rtmp-only.x-php +1 -1
  15. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3-rtmp.x-php +1 -1
  16. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3.x-php +1 -1
  17. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4-rtmp-only.x-php +1 -1
  18. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4-rtmp.x-php +1 -1
  19. src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4.x-php +1 -1
  20. src/includes/menu-pages/code-samples/jwplayer-standard-mp4.x-php +5 -3
  21. src/includes/menu-pages/code-samples/jwplayer-streaming-mp4-sca.x-php +5 -4
  22. src/includes/menu-pages/code-samples/jwplayer-streaming-mp4-webm.x-php +4 -3
  23. src/includes/menu-pages/code-samples/jwplayer-streaming-mp4.x-php +4 -3
  24. src/includes/menu-pages/down-ops.inc.php +16 -14
  25. src/includes/menu-pages/gen-ops.inc.php +7 -8
  26. src/includes/menu-pages/help.inc.php +2 -2
  27. src/includes/menu-pages/logs.inc.php +1 -1
  28. src/includes/menu-pages/paypal-ops.inc.php +4 -4
  29. src/includes/menu-pages/res-ops.inc.php +12 -12
  30. src/includes/menu-pages/scripting.inc.php +19 -19
  31. src/includes/menu-pages/start.inc.php +1 -1
  32. src/includes/menu-pages/trk-ops.inc.php +7 -7
  33. src/includes/templates/players/jwplayer-v7-rtmp-only.php +42 -0
  34. src/includes/templates/players/jwplayer-v7-rtmp.php +42 -0
  35. src/includes/templates/players/jwplayer-v7.php +42 -0
  36. src/includes/translations/README.md +0 -19
  37. src/includes/translations/s2member.pot +7 -7
  38. src/vendor/autoload.php +1 -1
  39. src/vendor/composer/autoload_real.php +3 -3
CHANGELOG.md DELETED
@@ -1,915 +0,0 @@
1
- = v161129 =
2
-
3
- - (s2Member Pro) **Bug Fix:** Stripe refund notifications via the Stripe Webhook were always interpreted by s2Member as full refunds. This release corrects this bug so that s2Member will handle partial refunds via the Stripe API properly in all cases. Props @raamdev for reporting.
4
-
5
- - (s2Member/s2Member Pro) **Bug Fix:** Updating profile via `[s2Member-Profile /]` when changing email addresses may leave the old email address on configured email list servers in some scenarios. Props @renzms for reporting. For further details see [issue #1007](https://github.com/websharks/s2member/issues/1007).
6
-
7
- - (s2Member/s2Member Pro) **SSL Compatibility & Option Deprecation:** In previous versions of s2Member there was a setting in the UI that allowed you to force non-SSL redirects to the Login Welcome Page. By popular demand, this setting has been deprecated and removed from the UI.
8
-
9
- _**New Approach:** The new approach taken in the latest release of s2Member is to automatically detect when a non-SSL redirection should occur, and when it should not occur (i.e., when the default WordPress core behavior should remain as-is)._
10
-
11
- _s2Member does this by looking at the `FORCE_SSL_LOGIN` and `FORCE_SSL_ADMIN` settings in WordPress, and also at your configured `siteurl` option in WordPress. If you are not forcing SSL logins, or your `siteurl` begins with `https://` (indicating that your entire site is served over SSL), non-SSL redirects will no longer be forced by s2Member, which resolves problems on many sites that serve their entire site over SSL (a growing trend over the past couple years)._
12
-
13
- _Conversely, if `FORCE_SSL_LOGIN` or `FORCE_SSL_ADMIN` are true, and your configured `siteurl` option in WordPress does NOT begin with `https://` (e.g., just plain `http://`), then a non-SSL redirect **is** forced, as necessary, in order to avoid login cookie conflicts; i.e., the old behavior is preserved by this automatic detection._
14
-
15
- _Overall, this new approach improves compatibility with WordPress core, particularly on sites that serve all of their pages over `https://` (as recommended by Google)._
16
-
17
- _**Backward Compatibility:** As noted previously, the old option that allowed you to configure s2Member to force non-SSL redirects to the Login Welcome Page has been officially deprecated and removed from the UI. However, the old option does still exist internally, but only for backward compatibility. A WordPress filter is exposed that allows developers to alter the old setting if necessary. You can use the filter to force a `true` or `false` value._
18
-
19
- ```php
20
- <?php
21
- add_filter('ws_plugin__s2member_login_redirection_always_http', '__return_true');
22
- // OR add_filter('ws_plugin__s2member_login_redirection_always_http', '__return_false');
23
- ```
24
-
25
- - (s2Member/s2Member Pro) **Bug Fix:** Username/password email being sent to users whenever Custom Passwords are enabled in your s2Member configuration and registration occurs via the default `wp-login.php?action=register` form. Fixed in this release. See also: [issue #870](https://github.com/websharks/s2member/issues/870) if you'd like additional details.
26
-
27
- - (s2Member Pro) **Bug Fix:** In the `[s2Member-List /]` search box shortcode an empty `action=""` attribute produces a warning due to invalid syntax in HTML v5. Fixed in this release. See [Issue #1006](https://github.com/websharks/s2member/issues/1006)
28
-
29
- - (s2Member/s2Member Pro) **IP Detection:** This release improves s2Member's ability to determine the current user's IP address. s2Member now searches through `HTTP_CF_CONNECTING_IP`, `HTTP_CLIENT_IP`, `HTTP_X_FORWARDED_FOR`, `HTTP_X_FORWARDED`, `HTTP_X_CLUSTER_CLIENT_IP`, `HTTP_FORWARDED_FOR`, `HTTP_FORWARDED`, `HTTP_VIA`, and `REMOTE_ADDR` (in that order) to locate the first valid public IP address. Either IPv4 or IPv6. Among other things, this improves s2Member's compatibility with sites using CloudFlare. See also: [issue #526](https://github.com/websharks/s2member/issues/526) if you'd like additional details.
30
-
31
- - (s2Member Pro) **JSON API:** In the pro version it is now possible to use the s2Member Pro Remote Operations API to send and receive JSON input/output. This makes the Remote Operations API in s2Member compatible with a variety of scripting languages, not just PHP; i.e., prior to this release the Remote Operations API required that you always use PHP's `serialize()` and `unserialize()` functions when making API calls. The use of `serialize()` and `unserialize()` are no longer a requirement since input/output data is now sent and received in the more portable JSON format. For new code samples, please see: **Dashboard → s2Member → API / Scripting → Pro API For Remote Operations**. See also: [issue #987](https://github.com/websharks/s2member/issues/987) if you'd like additional details on this change.
32
-
33
- _**Note:** The old s2Member Pro Remote Operations API has been deprecated but will continue to function just like before (via `serialize()` and `unserialize()`) for the foreseeable future. Moving forward, we recommend the new JSON code samples. Again, you will find those under: **Dashboard → s2Member → API / Scripting → Pro API For Remote Operations**_
34
-
35
- - (s2Member/s2Member Pro) Enforce data types when determining PHP constants. See [this GitHub issue](https://github.com/websharks/s2member/issues/989) if you'd like further details.
36
-
37
- - (s2Member/s2Member Pro) **Phing Build Routines:** Starting with this release, developers working on the s2Member project are now able to perform builds of the software via the `websharks/phings` project; i.e., the structure of the plugin directories has been changed (slightly) to conform to Phing and PSR4 standards. This makes it easier for our developers to prepare and release new versions of the software in the future.
38
-
39
- = v160801 =
40
-
41
- - (s2Member/s2Member Pro) **WP v4.6 Compatibility.** A full round of tests was performed against this release of s2Member, s2Member Pro, and the upcoming release of WordPress v4.6. In particular, the new HTTP API needed testing, along with the new optimized loading sequence in WordPress v4.6. Our tests indicate there are no compatibility issues, and we therefore encourage all s2Member site owners to upgrade to WordPress v4.6 whenever it becomes available publicly.
42
-
43
- - (s2Member/s2Member Pro) **Bug Fix:** Allow for `<` and `>` to work in the `[s2If php="" /]` shortcode attribute as expected. Some Visual Editors convert these into `&lt;` and `&gt;`, so it's necessary to interpret them as such whenever the shortcode is parsed by s2Member.
44
-
45
- - (s2Member/s2Member Pro) **JS API:** Reducing the number of variables provided by the s2Member JavaScript API by default, and adding a new filter that allows them to all be enabled when/if desirable: `ws_plugin__s2member_js_api_constants_enable`. Props @JeffStarr for reporting.
46
-
47
- = v160503 =
48
-
49
- - (s2Member/s2Member Pro) **Security Enhancement:** This release forces `CURLOPT_SSL_VERIFYPEER` to a value of `TRUE` in the AWeber SDK that is used when/if you integrate with AWeber. In short, this forces AWeber to have a valid/verifiable SSL certificate before any data is exchanged between s2Member and the AWeber API behind-the-scenes. Props at WordPress security team for reporting this.
50
-
51
- = v160424 =
52
-
53
- - (s2Member/s2Member Pro) **PHP Compat./Bug Fix:** This follow-up release includes a patch that will prevent fatal errors when s2Member and/or s2Member Pro are installed on a site running PHP v5.2 or PHP v5.3; i.e., this release corrects a bug that was causing fatal errors on these older versions of PHP. _Note that s2Member and s2Member Pro are once again compatible with PHP v5.2+, up to PHP v7.0._ Props @krumch. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/938) for details.
54
-
55
- = v160423 =
56
-
57
- - (s2Member/s2Member Pro) **WP v4.5 Compatibility.** This release offers full compatibility with the latest release of WordPress v4.5. Nothing major was changed for standard WordPress installations, but there were a few subtle tweaks here and there to improve v4.5 compatibility. We encourage all users to upgrade right away.
58
-
59
- **NOTE: WP v4.5 for Multisite Networks running s2Member Pro:** This release corrects a bug first introduced in the previous release of s2Member Pro that resulted in an error message (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) when updating to WP v4.5. It has been corrected in this release, but in order to avoid this problem altogether please follow this procedure when upgrading WordPress.
60
-
61
- **WP v4.5 Multisite Upgrade Procedure:**
62
-
63
- - Upgrade s2Member and s2Member Pro ​_before_​ updating WordPress core.
64
- - Then upgrade WordPress core and observe that Multisite Patches are applied properly.
65
-
66
- _If you have already upgraded to WP v4.5 and worked past this issue by patching manually, that's fine. You can still upgrade s2Member and s2Member Pro. After the upgrade you may feel free to enable automatic patching again if that's desirable._
67
-
68
- - (s2Member/s2Member Pro) **Bug Fix:** This release corrects a bug first introduced in the previous release which was causing a PHP warning about `cf_stream_extn_resource_exclusions`. A symptom was to have mysterious problems with `[s2Stream /]` or the `[s2File /]` shortcode. Fixed in this release. Props at @raamdev @renzms for reporting. See also [this GitHub issue](https://github.com/websharks/s2member/issues/901) for details.
69
-
70
- - (s2Member/s2Member Pro) **PayPal SSL Compatibility:** This release of s2Member provides an `https://` IPN URL for PayPal IPN integrations. It also provides a helpful note (in the Dashboard) about a new requirement that PayPal has with respect to the IPN URL that you configure at PayPal.com. s2Member has been updated to help you with this new requirement.
71
-
72
- **New PayPal.com IPN Requirement:** PayPal.com is now requiring any new IPN URL that you configure to be entered as an `https://` URL; i.e., if you log into your PayPal.com account and try to configure a _brand new_ IPN URL, that URL _must_ use `https://`. PayPal.com will refuse it otherwise.
73
-
74
- However, the `notify_url=` parameter in standard PayPal buttons should continue to work with either `http://` or `https://`, and any existing configurations out there that still use an `http://` IPN URL should continue to work as well. So this is about planning for the future. We have been told that PayPal will eventually _require_ that all IPN URLs use an `https://` protocol; i.e., they will eventually stop supporting `http://` IPN URLs altogether (at some point in the future), they are not giving anyone a date yet. For this reason we strongly suggest that you [review the details given here](https://github.com/websharks/s2member/issues/914).
75
-
76
- Since PayPal is moving in a direction that will eventually require all site owners to have an SSL certificate in the future, s2Member's instructions (and the IPN URL it provides you with) will now be presented in the form of an `https://` URL with additional details to help you through the process of configuring an IPN handler for PayPal.
77
-
78
- See: **Dashboard → s2Member → PayPal Options → PayPal IPN Integration**
79
-
80
- Props @codeforest for reporting. See [this GitHub issue](https://github.com/websharks/s2member/issues/914) for further details.
81
-
82
- - (s2Member/s2Member Pro) **Bug Fix:** Email field on Registration page not shown as required via `*` symbol like other fields in this form. Caused by a change in WordPress core. Fixed in this release. Props @spottydog63 @renzms. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/907) for details.
83
-
84
- - (s2Member/s2Member Pro) **Bug Fix:** `E_NOTICE` level errors in cache handler when running in `WP_DEBUG` mode. Props at @KTS915 for reporting. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/917).
85
-
86
- - (s2Member/s2Member Pro) **i18n Compatibility:** This release of s2Member moves the `load_plugin_textdomain()` call into the `plugins_loaded` hook instead of it being run on `init`. Props @KTS915 for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/899) for details.
87
-
88
- - (s2Member Pro) **Multisite Patches:** Fixed a bug (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) whenever WordPress was being updated and Multisite Patches were being applied in the pro version of s2Member. See: [this GitHub issue](https://github.com/websharks/s2member/issues/929) for details.
89
-
90
- - (s2Member/s2Member Pro) **Security Enhancement:** This release of s2Member defaults PayPal Button Encryption to a value of `on` instead of `off`; i.e., there is a new default behavior. Existing s2Member installations are unaffected by this change, but if you install s2Member on a new site you will notice that (if using PayPal Buttons), Button Encryption will be enabled by default.
91
-
92
- _Note that in order for Button Encryption to work, you must fill-in the API credentials for s2Member under: **Dashboard → s2Member → PayPal Options → PayPal Account Details**_
93
-
94
- = v160303 =
95
-
96
- - (s2Member/s2Member Pro) **Comet Cache Compat.:** This release improves compatibility with Comet Cache (formerly ZenCache), whenever you have it configured to cache logged-in users. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/888). Props @KTS915 for reporting!
97
-
98
- - (s2Member Pro) **ClickBank IPN v6 Compat.:** Version 6 of the ClickBank IPN system was recently updated in a way that causes it to return `transactionType = CANCEL-TEST-REBILL` in test mode, instead of the previous value, which was: `TEST_CANCEL-REBILL`. s2Member Pro has been updated to understand either/or. See also [this GitHub issue](https://github.com/websharks/s2member/issues/882) for further details.
99
-
100
- - (s2Member Pro) **Stripe Bug Fix:** This release corrects a bug caused by typos in the source code that were preventing refunds from being processed as expected whenever Stripe was integrated. Props @YearOfBenj for reporting this important issue. Props @patdumond for relaying vital information. See also [this GitHub issue](https://github.com/websharks/s2member/issues/874) if you'd like additional details.
101
-
102
- - (s2Member Pro) **PayPal Bug Fix:** Under some conditions, the EOT behavior in s2Member Pro (when integrated with PayPal Pro) would immediately terminate access whenever a customer's subscription naturally expires. Recent versions of the Payflow system set the status to `EXPIRED`, and this was handled as an immediate EOT instead of as a delayed EOT that is subject to date calculations to determine the correct date on which a customer should lose access; i.e., based on what they have already paid for. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/873) if you'd like additional details.
103
-
104
- - (s2Member Pro) **One-Time Offer Bug Fix:** This release corrects some inconsistencies in the One-Time Offers system that comes with s2Member Pro. Symptoms included seemingly unpredictable behavior whenever redirections were configured without a specific Membership Level. Props @jacobposey for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/855) if you'd like additional details.
105
-
106
- - (s2Member/s2Member Pro) **Bug Fix:** s2Member was not properly respecting `DISALLOW_FILE_MODS` in a specific scenario related to GZIP. Props @renzms @kristineds. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/832) for further details.
107
-
108
- - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
109
-
110
- - (s2Member/s2Member Pro) **PayPal Sandbox:** This release updates the inline documentation under the PayPal Account Settings section of s2Member. We now suggest that instead of enabling PayPal Sandbox Mode (sometimes buggy at best), that site owners run tests with low-dollar amounts against a live PayPal account instead; e.g., $0.01 test transactions in live mode work great also. See [this GitHub issue](https://github.com/websharks/s2member/issues/891) if you'd like additional details. Props @raamdev for mentioning this again.
111
-
112
- = v160120 =
113
-
114
- - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
115
-
116
- - (s2Member) **Multisite Support:** This release of s2Member (the free version only) removes full support for Multisite Networks, which is now a Pro feature; i.e., only available in the Pro version.
117
-
118
- ##### Is s2Member still compatible with WordPress Multisite Networking?
119
- Multisite support is no longer included in the s2Member Framework. However, it is available with s2Member Pro. s2Member Pro is compatible with Multisite Networking. After you enable Multisite Networking, install the s2Member Pro Add-On. Then, navigate to `s2Member → Multisite (Config)` in the Dashboard of your Main Site. You can learn more about s2Member Pro at [s2Member.com](http://www.s2member.com/).
120
-
121
- ##### I was using the free version in a Multisite Network before. What happened?
122
- s2Member (when running on a Multisite Network) requires minor alterations in WordPress core that are not compatible with plugins available at WordPress.org (i.e., not allowed) at this time. For this reason, full support for Multisite Networks is now available only in the pro version.
123
-
124
- ##### What if I already configured Multisite options on a site running the free version?
125
- If you already customized s2Member's Multisite Network configuration options in a previous release, those settings will remain and still be functional over the short-term; i.e., the functionality that makes s2Member compatible with Multisite Networking is still included, even in the s2Member Framework. However, the routines that deal with core patches, and those that allow you to change Multisite options are no longer available. You will need to acquire the Pro version. Or, you can revert to [a previous release](http://s2member.com/release-archive/). s2Member Framework v151218 is suggested if you go that route.
126
-
127
- _See also: [this GitHub issue](https://github.com/websharks/s2member/issues/850) for further details._
128
-
129
- = v151218 =
130
-
131
- - (s2Member Pro) **Reminder Email Notification Exclusions:** It is now possible to enable/disable EOT Renewal/Reminder Email notifications on a per-user basis. You can edit a user's profile in the WP Dashboard and check "_No (exclude)_" to prevent specific users from receiving any reminder emails that you configured. Props at @patdumond @luisrock. See also [this GitHub issue](https://github.com/websharks/s2member/issues/816).
132
-
133
- - (s2Member) **PHP v7 Compat.:** This release addresses one remaining issue with the `preg_replace` `/e` modifier as reported in [this GitHub issue](https://github.com/websharks/s2member/issues/811). Props @nerdworker for reporting. Thanks!
134
-
135
- - (s2Member/s2Member Pro) **WP v4.4 Compat.:** This release corrects an issue that impacted sites attempting to run s2Member on a Multisite Network; i.e., it corrects a problem with the `load.php` patch against the latest release of WordPress. Props @crazycoolcam for reporting! See also [this GitHub issue](https://github.com/websharks/s2member/issues/812).
136
-
137
- - (s2Member/s2Member Pro) **Getting Help:** This release adds a new menu page titled, "Getting Help w/ s2Member". This new section of your Dashboard provides quick & easy access to s2Member KB articles, suggestions, and our tech support department (for pro customers). Props @patdumond @raamdev. See also [this GitHub issue](https://github.com/websharks/s2member/issues/814).
138
-
139
- = v151210 =
140
-
141
- - (s2Member/s2Member Pro) **WP/PHP Compat:** Updated for compatibility with WordPress 4.4 and PHP v7.0. Note that s2Member and s2Member Pro also remain compatible with WordPress 4.3 and PHP 5.2. However, PHP 5.5+ is strongly recommended.
142
-
143
- - (s2Member Pro) **New Feature! EOT Renewal/Reminder Email Notifications:** This release adds a long-awaited feature which allows you to configure & send EOT Renewal/Reminder Email notifications to your customers; to let them know their account with you will expire soon.
144
-
145
- It's possible to configure one or more notifications, each with a different set of recipients, and a different subject and message body. Notifications can be sent out X days before the EOT occurs, _the day_ of the EOT, or X days after the EOT has already occurred; e.g., to encourage renewals.
146
-
147
- See: **Dashboard → s2Member → Stripe Options → EOT Renewal/Reminder Email(s)**
148
- _Also works with PayPal Pro, Authorize.Net, and ClickBank._
149
-
150
- Props @clavaque @KTS915 @raamdev @patdumond @kristineds @pagelab @chronicelite @csexplorer17 @radven, and all of our great supporters. See [this GitHub issue](https://github.com/websharks/s2member/issues/122#issuecomment-161531763).
151
-
152
- - (s2Member/s2Member Pro) **Cleanup:** This release improves the list of Other Gateways; moving deprecated payment gateways to the bottom of the list and improving the display of the list overall. Props @kristineds @clavaque. For further details, see [this GitHub issue](https://github.com/websharks/s2member/issues/715).
153
-
154
- - (s2Member/s2Member Pro) **Bug Fix:** This release corrects an "Insecure Content Warning" that may have appeared in certain portions of the s2Member Dashboard panels whenever you accessed your Dashboard over the `https` protocol. The issue was seen in Google Chrome and it was simply a `<form>` tag that referenced the s2Member mailing list. This is now hidden by default if you access the Dashboard over SSL, in order to avoid this warning. Props @patdumond for reporting. Props @renzms for fixing. See also [this GitHub issue](https://github.com/websharks/s2member/issues/678) if you'd like additional details.
155
-
156
- - (s2Member Pro) **Stripe Locale:** This release adjusts the Stripe overlay so that it will automatically display in the language associated with a visitor's country. This was accomplished by setting the Stripe Checkout variable `locale: 'auto'` as suggested in [this GitHub issue](https://github.com/websharks/s2member/issues/728). Props @renzms
157
-
158
- - (s2Member Pro) **Stripe Bug Fix:** This release improves the way Stripe Image Branding and Stripe Statement Descriptions are applied whenever you intentionally leave them empty. It also changes the default value of Stripe Image Branding to an empty string; which will tell Stripe to use the account-level default value that you configured in your Stripe Dashboard in favor of that which you configure with s2Member. The choice is still yours, but this release sets what others have told us are better default values. See also [this GitHub issue](https://github.com/websharks/s2member/issues/666) if you'd like additional details.
159
-
160
- - (s2Member Pro) **Stripe Enhancement:** This release makes it possible to configure the Stripe "Remember Me" functionality with s2Member; i.e., it is now possible to turn this on/off if you so desire. See also [this GitHub issue](https://github.com/websharks/s2member/issues/357) for details.
161
-
162
- - (s2Member Pro) **Stripe Enhancement:** This release makes it possible for you to tell Stripe to collect a customer's full Billing Address and/or full Shipping Address. See [this GitHub issue](https://github.com/websharks/s2member/issues/667) for additional details.
163
-
164
- - (s2Member/s2Member Pro) **UI Clarity:** This release improves the way the New User Email Notification panel behaves whenever you also have Custom Passwords enabled with s2Member. The New User Email Notification is only sent when Custom Passwords are off, so this panel should disable itself whenever that is the case. Fixed in this release. Props @raamdev See also: [this GitHub issue](https://github.com/websharks/s2member/issues/739) if you'd like additional details.
165
-
166
- - (s2Member/s2Member Pro) **Bug Fix:** This release resolves a minor issue for developers running Vagrant and VVV with symlink plugins. Props @magbicaleman ~ See [this GitHub issue](https://github.com/websharks/s2member/issues/717) for further details.
167
-
168
- - (s2Member Pro) **Conflict Resolution:** This release resolves a conflict with the WP Full Stripe plugin and any other plugins that already load an existing copy of the Stripe SDK at runtime; in concert with s2Member Pro. See [this GitHub issue](https://github.com/websharks/s2member/issues/750) if you'd like additional details.
169
-
170
- - (s2Member/s2Member Pro) **New Log File:** This release of s2Member adds a new log file that keeps track of all automatic EOTs that occur through the underlying CRON job. The new log file is named: `auto-eot-system.log` and you can learn more about this file and view it from: **Dashboard → s2Member → Log Files (Debug) → Log Viewer**. Props @raamdev ~ See [this GitHub issue](https://github.com/websharks/s2member/issues/759) if you'd like additional details.
171
-
172
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves a problem in the `[s2Member-List /]` shortcode whenever it is configured to search Custom Fields generated with s2Member. Props @patdumond @renzms. See [this GitHub issue](https://github.com/websharks/s2member/issues/765) if you'd like additional details.
173
-
174
- - (s2Member Pro) **Stripe Enhancement:** This release updates s2Member's Stripe integration so that any Buy Now transaction spawns a Stripe popup with the amount and full description filled within the popup itself as well. Props @raamdev. See [this GitHub issue](https://github.com/websharks/s2member/issues/749) for further details.
175
-
176
- - (s2Member/s2Member Pro) **WP v4.3 Compat.** This release addresses a minor conflict between functionality provided by s2Member and that of the WordPress core itself. Whenever you change a user's password by editing their account, you can choose to send them an email about this change (or not). Since WordPress v4.3, the WordPress core will _also_ send a more vague email to notify the user of a password change, which is not customizable. This release disables that default email notification in favor of the more helpful and customizable email message that can be sent by s2Member. Simply tick the "Reset Password & Resend New User Email Notification" checkbox whenever you are editing a user. Props @patdumond for reporting. See also [this GitHub issue](https://github.com/websharks/s2member/issues/777) if you'd like additional details.
177
-
178
- - (s2Member/s2Member Pro) **PayPal Compat.** This release resolves a conflict between s2Member and a nasty bug at PayPal.com that came to light recently. In some cases, customers reported that clicking the "Continue" button at PayPal.com simply reloaded the page and gave no response. We found that this was attributed to a bug on the PayPal side (see [792](https://github.com/websharks/s2member/issues/792)). To work around this bug, we are using a new default value for the `ns="1"` shortcode attribute in PayPal Pro-Forms and PayPal Buttons. The new default value is `ns="0"`, which seems to work around this bug for the time being. Props @patdumond @raamdev for reporting and testing this fix. See also [full report here](https://github.com/websharks/s2member/issues/792).
179
-
180
- - `ns="0"` (**new default**) = prompt for a shipping address, but do not require one
181
- - `ns="1"` (old default) = do not prompt for a shipping address whatsoever
182
-
183
- See also: **Dashboard → s2Member → PayPal Pro-Forms → PayPal Shortcode Attributes (Explained)**
184
-
185
- - (s2Member/s2Member Pro) **Getting Started:** The old Quick Start Guide was renamed to "Getting Started" in this release. It was also cleaned up and improved a bit; i.e., brought up-to-date. In addition, there is a new welcome message for first-time users of the software that invites them to read over the Getting Started page before they begin. Props @raamdev. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/655).
186
-
187
- - (s2Member Pro) **Stripe Bug Fix:** This release corrects a problem with Stripe refund and chargeback notification handling. s2Member Pro will now receive and handle Stripe refund and/or chargeback events (through your existing Webhook) as expected.
188
-
189
- See: **Dashboard → s2Member → Stripe Options → Automatic EOT Behavior** for options that allow you to control the way in which s2Member should respond whenever a refund is processed, or when a dispute (chargeback) occurs at Stripe.
190
-
191
- Props @ElizWS and @tubiz w/ AffiliateWP. See also [this GitHub issue](https://github.com/websharks/s2member/issues/706).
192
-
193
- - (s2Member Pro) **`[s2Member-List /]`** Added the ability to search usermeta data too. For instance, you can now search `first_name`, `last_name`, `nickname`, `description`, `s2member_subscr_id`, `s2member_custom`, etc, etc. See [this GitHub issue](https://github.com/websharks/s2member/issues/596).
194
-
195
- _**Note:** The `first_name`, `last_name`, and `nickname` columns are now a part of the default value for the `search_columns=""` attribute in the `[s2Member-List /]` shortcode. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/596). Props @patdumond for her ideas._
196
-
197
- - (s2Member Pro) **`[s2Member-List /]`** There are some new `orderby=""` options. You may now choose to order the list by: `first_name`, `last_name`, or `nickname`.
198
-
199
- - (s2Member Pro) **`[s2Member-List /]`** It is now possible to search through s2Member Custom Registration/Profile Fields that may contain an array of values; i.e., you can now search _any_ Custom Registration/Profile Field in s2Member. For instance, if a field is designed to accept multiple selections, or you provide a set of multiple checkbox options. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/555).
200
-
201
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** Meta fields that contained a timestamp were being displayed by the `date_i18n()` function in WP core. However, the time offset calculation was wrong; i.e., not a match to the local time configured by your installation of WordPress. Fixed in this release.
202
-
203
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** Minor formatting corrections for replacement codes made available for the `link_*=""` attributes in the `[s2Member-List /]` shortcode.
204
-
205
- - (s2Member Pro) **`[s2Member-List /]`:** It is now possible to search for an exact match by surrounding your search query with double quotes; e.g., `"john doe"` (in quotes, for an exact match), instead of the default behavior, which is `*john doe*` behind-the-scenes; i.e., a fuzzy match.
206
-
207
- - (s2Member Pro) **`[s2Member-List /]`:** Several behind-the-scenes performance enhancements.
208
-
209
- - (s2Member/s2Member Pro) **PHP 7 Compat.** This release of s2Member removes its use of the `/e` modifier in calls to `preg_replace()`, which was deprecated in PHP 5.5 and has been removed in PHP 7. Props @bridgeport. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/415).
210
-
211
- = v150925 =
212
-
213
- - (s2Member/s2Member Pro) **WP v4.3 Compat.** This release corrects a minor backward compatibility issue with versions of WordPress before v4.3, and for installations of s2Member that still use the `%%user_pass%%` Replacement Code in their New User Email notification. See [this GitHub issue](https://github.com/websharks/s2member/issues/710) if you'd like additional details.
214
-
215
- - (s2Member/s2Member Pro) **WP v4.3.1 Compat.** This release corrects a compatibility issue whenever you run s2Member together with WordPress v4.3.1+. Note that WordPress v4.3 made changes to the `wp_new_user_notification()` function in WordPress core. Then, a later release of WP v4.3.1 changed it again; breaking compatibility in both instances. This release brings s2Member up-to-date with WordPress v4.3.1 and preserves backward compatibility with WordPress v4.3, as well for versions prior. Props @bridgeport. See [this GitHub issue](https://github.com/websharks/s2member/issues/732) if you'd like additional details.
216
-
217
- - (s2Member/s2Member Pro) **Bug Fix**: Fixed a bug where the s2Member CSS and JS was not loaded on the Dashboard when WordPress was installed in a subfolder that was different from the Home URL. Props @magbicaleman. See [Issue #696](https://github.com/websharks/s2member/pull/696).
218
-
219
- - (s2Member Pro) **Bug Fix:** This release corrects a security issue related to the Pro Upgrade Wizard for s2Member Pro being displayed without checking `current_user_can('update_plugins')`. Resolved. Props @raamdev for identifying this and working to implement the fix. See [this GitHub issue](https://github.com/websharks/s2member/issues/697) if you'd like additional details.
220
-
221
- - (s2Member Pro) **Bug Fix:** This release corrects a bug impacting the `wp_lostpassword_url()` function whenever s2Member is configured to run in a Multisite Network. The link is now adjusted automatically so that a lost password is always recovered from the current site, not the Main Site in the network. Props to @raamdev See also: [this GitHub issue](https://github.com/websharks/s2member/issues/711) for further details.
222
-
223
- - (s2Member Pro) **Bug Fix:** Stripe Pro-Forms presented after a long block of text on a page, were not returning to the proper hash location after a Coupon Code was applied. Fixed in this release. Props @raamdev See also: [this GitHub issue](https://github.com/websharks/s2member/issues/730) if you'd like additional details.
224
-
225
- - (s2Member/s2Member Pro) **SSL Edge Case:** This release corrects an SSL + Protected File Download problem that may have occurred in rare circumstances. Reproducing this required that you have a user with an ISP that changed their IP address whenever they accessed a site over `https` instead of `http`, and that an s2Member Protected File Download link is presented on an HTTPS page. And, that you were using s2Member's own force-SSL filters. A symptom of this issue was to receive mysterious reports of a user getting a 503 error when trying to access a protected file. Resolved in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/702) if you'd like additional details.
226
-
227
- = v150827 =
228
-
229
- - (s2Member/s2Member Pro) **WordPress v4.3 Compat./Bug Fix** This release of s2Member alters the way New User Notification Emails are sent, and in how they should be formatted in WordPress v4.3+.
230
-
231
- The New User Notification Email is now sent (to a user) only if they did _not_ set a Custom Password during their registration; i.e., only if they need this email to set their password for the first time. In short, s2Member now follows the same approach used by WordPress v4.3+.
232
-
233
- See: **Dashboard → s2Member → General Options → Email Configuration → New User Notification**
234
-
235
- So the purpose of this particular email has changed just a bit; i.e., the New User Notification Email. Instead of it being sent to every new user, it is only sent to users who need it for the purpose of obtaining a password which grants them access to their account for the first time.
236
-
237
- **Upgrading to WordPress v4.3 and the latest release of s2Member?**
238
-
239
- Please review this section of your Dashboard carefully:
240
- **s2Member → General Options → Email Configuration → New User Notification**
241
-
242
- - If you are using s2Member to customize the New User Notification email, you should try to update this message so that it includes the new `%%wp_set_pass_url%%` Replacement Code.
243
-
244
- See also: [this comment at GitHub about the recent changes, with screenshots](https://github.com/websharks/s2member/issues/689#issuecomment-134563230).
245
-
246
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release corrects a bug in the `[s2Member-List /]` shortcode that was causing `levels="0"` not to work, and in fact any use of a `0` in the `levels=""` attribute was broken. See [this GitHub issue](https://github.com/websharks/s2member/issues/663) if you'd like additional details. Props to @patdumond for reproducing, reporting and testing this issue.
247
-
248
- - (s2Member/s2Member Pro) **Emoji Bug Fix:** This release corrects a bug in s2Member's SSL filters that can be applied with the Post/Page Custom Field `s2member_force_ssl` being set to `yes`. A symptom of this bug was to see an SSL warning in the latest release of WordPress related to the new Emoji library. See [this GitHub issue](https://github.com/websharks/s2member/issues/674) if you'd like additional details.
249
-
250
- = v150722 =
251
-
252
- - (s2Member/s2Member Pro) **New Shortcode:** This release introduces a powerful new shortcode which allows you to display a user's EOT (End of Term) or NPT (next payment time) in a WordPress Post or Page. For further details and some minor limitations, please see [`[s2Eot /]` Shortcode Documentation](http://s2member.com/kb-article/s2eot-shortcode-documentation/). Props to @raamdev and @patdumond for their strategic assistance, feedback, and ideas for this shortcode.
253
-
254
- - (s2Member/s2Member Pro) **Strong Password Enforcement:** This release of s2Member makes it possible for a site owner to enforce strong passwords; i.e., to require a minimum number of characters and a specific strength (i.e., mix of required characters). The default minimum length in s2Member changed from `6` to `8` characters minimum. The default password strength minimum is `good`. To customize, please see: **s2Member → General Options → Registration/Profile Fields & Options**. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/573) if you'd like additional details. Props to @patdumond and @KTS915 for ideas and feedback.
255
-
256
- - (s2Member Pro) **reCAPTCHA v2 Upgrade:** This release of s2Member comes with an updated reCAPTCHA™ integration in order to take advantage of No CAPTCHA reCAPTCHA and other enhancements provided by the v2 update on Google's end.
257
-
258
- _Existing s2Member installations that already have an old set of reCAPTCHA v1 Public/Private keys will continue to function as before. However, it is suggested that you configure reCATPCHA v2 keys in order to put s2Member Pro-Forms into the v2 mode moving forward. Please see: **Dashboard → s2Member → General Options → CAPTCHA Anti-Spam Security** where you will find instructions._
259
-
260
- - (s2Member/s2Member Pro) **PayPal IPN Compat.** This release addresses a problem with IPN connection failures that result in a 500 Internal Server Error on the PayPal side; occurring whenever s2Member attempts to verify IPN data. Please see: [this GitHub issue](https://github.com/websharks/s2member/issues/610) if you'd like additional details.
261
-
262
- - (s2Member Pro) **Stripe Bug Fix:** This release corrects a bug in Stripe Pro-Form Checkout Options, where a Free Registration option could cause other paid Checkout Options to result in a checkout error under the right conditions. See [this GitHub issue](https://github.com/websharks/s2member/issues/569) for further details.
263
-
264
- - (s2Member/s2Member) **Google Analytics Compat.** This release automatically preserves `utc_` variables that are used by Google Analytics whenever a Membership Options Page redirection occurs. i.e., if a visitor comes to the site with `utc_` variables and is redirected to the Membership Options Page, because the content they were trying to access is protected; the `utc_` variables are preserved during this redirection, and delivered as part of the Membership Options Page redirect.
265
-
266
- - (s2Member Pro) **Authorize.Net Endpoint Filters:** This release adds two new WordPress Filters (i.e., Hooks) that can be used by developers in certain rare cases. Hook names are `ws_plugin__s2member_pro_authnet_aim_endpoint_url` and `ws_plugin__s2member_pro_authnet_arb_endpoint_url `. See [this GitHub issue](https://github.com/websharks/s2member/issues/575#issuecomment-104077606) if you'd like additional details and a quick example of use.
267
-
268
- - (s2Member Pro) **Authorize.Net AIM Compat.:** This release addresses a compatibility issue that came to light recently, which was actually attributed to a bug in s2Member Pro that has been sliding through unnoticed until now. The format for an expiration date sent to the Authorize.Net AIM API should be `MM-YYYY`. The format for ARB API calls is `YYYY-MM`. s2Member Pro was sending `YYYY-MM` to both APIs. Fixed in this release. Props to @raamdev for investigating this. See also [this GitHub issue](https://github.com/websharks/s2member/issues/576) if you'd like additional details.
269
-
270
- - (s2Member Pro) **`[s2Member-List /]` Bug:** This release corrects an issue in the `[s2Member-List /]` shortcode that was preventing the `display_name` DB column from being searchable. This release also adds the `display_name` to the list of default `search_columns=""` that are considered by the `[s2Member-List /]` shortcode. Props to @patdumond for researching this. See [this GitHub issue](https://github.com/websharks/s2member/issues/578) for further details.
271
-
272
- - (s2Member/s2Member Pro) **Bug Fix:** This release corrects an issue where s2Member would fail to subscribe customers to configured mailing list IDs whenever an existing customer is upgrading and you have the Double Opt-In Checkbox turned off entirely. Fixed. See [this GitHub issue](https://github.com/websharks/s2member/issues/581) if you would like additional details.
273
-
274
- - (s2Member Pro) **Stripe Bug Fix:** This release corrects a bug in s2Member's Stripe Pro-Forms, related to having multiple Checkout Options. The bug resulted in a missing error message whenever one of the Checkout Options was submitted incorrectly, and also resulted in the default Checkout Option being magically selected instead of the one that a customer was working with. Props to @patdumond and @bryanthankins. See: [this GitHub issue](https://github.com/websharks/s2member/issues/586) if you'd like additional details.
275
-
276
- - (s2Member/s2Member Pro) **Bug Fix:** This release fixes an issue where the s2Drip shortcode was requiring PHP 5.3+; this fix allows the shortcode to work properly with PHP 5.2+.
277
-
278
- - (s2Member Pro) **Compat.** A call to `WP_Widget` was updated to support WordPress v4.3+. See [this GitHub issue](https://github.com/websharks/s2member/issues/607) if you'd like additional details.
279
-
280
- - (s2Member/s2Member Pro) **Bug Fix:** This release corrects a bug in the s2Member IPN handler that processes full refunds. In your s2Member EOT Behavior options, if you choose the `refunds,partial_refunds,reversals` option it results in a full refund not being processed; i.e., an EOT does not occur as expected. s2Member was incorrectly recording that your configured preference was not to process refunds whenever a full refund occurs. Fixed in this release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/614) if you'd like additional details.
281
-
282
- - (s2Member/s2Member Pro) **Wikpedia Links:** Updated throughout to use an `https://` protocol. Now the Wikipedia default. This impacts mostly the back-end of s2Member which references a few articles at the Wikipedia. However, it also impacts Pro-Forms where a link is provided to users with more information about Security Codes that appear on the back of credit cards. See [this GitHub issue](https://github.com/websharks/s2member/issues/617) if you'd like additional details.
283
-
284
- - (s2Member/s2Member Pro) **qTranslate X Compat.** This release includes a minor update that improves compatibility with qTranslate X. See [this GitHub issue](https://github.com/websharks/s2member/issues/618) if you'd like additional details.
285
-
286
- - (s2Member/s2Member Pro) **AWeber Compat.** This release resolves an issue with AWeber rejecting subscribers that have IPv6 addresses. Until such time as AWeber adds support for IPv6 addresses, s2Member will simply send an empty IP address whenever it encounters an IPv6 address. This behavior was requested by the AWeber team. See [this GitHub issue](https://github.com/websharks/s2member/issues/611) if you'd like additional details.
287
-
288
- - (s2Member Pro) **Coupon Code Expiration:** This release improves the way coupons that are set to expire are handled. Instead of expiring at midnight the day before the configured expiration date, coupon codes now expire at the end of the configured day. As always, all times are calculated from GMT/UTC time, the same as WordPress itself. In short, if you set a coupon to expire Dec 5th, the coupon will now expire Dec 5th, at the end of the day (UTC time). The old behavior, was for the coupon to expire Dec 4th at midnight UTC time, which led to confusion in many cases. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/612) if you'd like additional details.
289
-
290
- - (s2Member/s2Member Pro) **IPN Proxy Key Bug:** This release corrects a minor bug in s2Member's IPN Proxy Key generation that was causing problems in just a few edge cases. This bug may have impacted your site if you had a domain name being accessed with a `Host:` header containing mixed caSe. Not normal behavior, but there are a few edge cases where it's important for s2Member to get this right in order to avoid an "Unable to verify $_POST vars." error. See [this GitHub issue](https://github.com/websharks/s2member/issues/590) if you'd like additional details.
291
-
292
- - (s2Member/s2Member Pro) **Password Reset Layout:** This release improves the layout/CSS applied to the WordPress password reset form in order to better separate the password strength indicator from the instructions provided by WordPress. See [this GitHub issue](https://github.com/websharks/s2member/issues/585) if you'd like additional details. Props to @patdumond, @BugRat, and @raamdev for discovering this.
293
-
294
- - (s2Member) **Back-end UI Quick Links:** This release resolves an overlap in the display of the quick links atop each menu page in the Dashboard. This bug impacted the lite version only. If you'd like additional details, please see [this GitHub issue](https://github.com/websharks/s2member/issues/589). Props to @raamdev for discovering this.
295
-
296
- - (s2Member Pro) **Username Compat.:** This release updates s2Member's own validation against usernames in order to bring it inline with the most recent versions of WordPress core; i.e., we now allow whitespace in usernames. This release was updated so that usernames are validated only by the WordPress core function: `sanitize_user()`, which does allow single whitespace characters in usernames. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/566) if you'd like additional details.
297
-
298
- - (s2Member Pro) **Message After Modification:** This release improves the default response that a customer who is upgrading/downgrading receives after having completed checkout using a Pro-Form. Instead of asking the customer to "log back in", s2Member simply says, "Thank you. Your account has been updated.". There is no reason for a customer to log back in; i.e., this is not necessary, and that message was leading to some confusion. Note also that with Pro-Forms you can provide a Custom Return URL on Success using the `success=""` shortcode attribute. Thus, this message is simply a default. We suggest that you customize in all cases. See [this GitHub issue](https://github.com/websharks/s2member/issues/580) if you'd like additional details. Props to @patdumond for reporting this important issue.
299
-
300
- - (s2Member Pro) **Documentation Update:** This releases improves the documentation for the `rrt=""` shortcode attribute in all Pro-Form implementations; e.g., PayPal Pro-Forms, Authorize.Net Pro-Forms, and Stripe Pro-Forms. The `rrt=""` attribute can be somewhat misleading, so we added the following: **IMPORTANT NOTE:** If you don't offer a trial period; i.e., the first charge occurs when a customer completes checkout, you should set this to the number of additional payments, and NOT to the total number. For instance, if I want to charge the customer a total of 3 times, and one of those charges occurs when they complete checkout, I set should this to `rrt="2"` for a grand total of three all together.
301
-
302
- - (s2Member/s2Member Pro) **Bug Fix:** This release corrects an issue with EOT calculations under a specific circumstance. If a customer registered on the site for free, and later made a purchase that included a free trial period, and they canceled within the trial period, the EOT was being incorrectly calculated based on the user's WordPress registration time instead of being based on the time that their trial began. This resulted in an immediate EOT (due to it being a date in the past), instead of being set to the end of the trial. Fixed in this release.
303
-
304
- - (s2Member/s2Member Pro) **Documentation Update:** This release replaces a specific symbol that has been used throughout the Dashboard with s2Member. Instead of the `⥱` symbol we are now using the more compatible `→` symbol instead. This is used to indicate a Dashboard path.
305
-
306
- - (s2Member/s2Member) **E_NOTICE:** Several `E_NOTICE`-level warnings were resolved in this release. Note that `E_NOTICE`-level warnings only show up in `WP_DEBUG` mode for developers, but they are frustrating nonetheless. Props to @raamdev for reporting some of these.
307
-
308
- - (s2Member Pro) **Bug Fix:** PayPal Pro-Forms selling to customers who choose a Maestro/Solo card may experience problems in some circumstances. GBP currency conversion was partially failing due to a change in the underlying API that s2Member calls upon. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/605) if you'd like additional details.
309
-
310
- - (s2Member/s2Member Pro) **Opt-In Bug Fix:** This release of s2Member corrects a bug that was causing members to be automatically unsubscribed from your mailing list whenever you choose to hide the Double Opt-In Box. A customer updating their profile later without this box, was being unsubscribed inadvertently. Fixed in this release. Props to @raamdev for his work in reproducing and reporting this bug. See [this GitHub issue](https://github.com/websharks/s2member/issues/633) if you'd like additional details.
311
-
312
- - (s2Member Pro) **Stripe Bug Workaround:** It came to our attention that some Stripe API calls that simply update the `name`, `address_state`, `address_zip`, and `address_country` for tax reporting purposes were resulting in a card decline even after Stripe approved the transaction. We suspect this is a bug in the Stripe API. It has been reported to Stripe. For now though, we are working around this issue by failing gracefully in such a scenario. This simple update is there only for tax reporting purposes, so if it fails it does not warrant a refusal to complete the transaction.m It is simply logged by s2Member for analysis. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/535) where a deeper investigation is underway for our next maintenance release.
313
-
314
- - (s2Member Pro) **Stripe API Update:** This release of s2Member takes advantage of the latest Stripe API version. Moving from `v2015-02-18` to `v2015-07-13`. See [this article at Stripe](https://stripe.com/docs/upgrades#api-changelog) if you'd like additional details. _Remember that s2Member's API calls to Stripe will always use this specific version of their API (`v2015-07-13`), even if your Stripe account is configured with an older default version. This is to ensure that s2Member works as intended for all site owners._
315
-
316
- - (s2Member Pro) **Stripe Prepaid Cards:** This release makes it possible for site owners to reject prepaid cards if they choose to do so. Stripe has the ability to determine if a credit/debit card is backed by a prepaid funding source. If it is, you can choose to reject or allow this type of card. The default behavior is to accept it. See: **Dashboard → s2Member → Stripe Options → Account Details → Reject or Allow Prepaid Cards** for further details. See also: [this GiHub issue](https://github.com/websharks/s2member/issues/505) if you'd like more information. Props to @raamdev for determining the feasibility of this feature.
317
-
318
- - (s2Member Pro) **Bug Fix:** `Notice: Undefined index: password1` in `paypal-registration-in.inc.php`. This was another `E_NOTICE`-level warning that was cleaned up in this release. Props to @raamdev See [this GitHub issue](https://github.com/websharks/s2member/issues/634) if you'd like additional details.
319
-
320
- - (s2Member Pro) **Stripe Bug Fix:** This release fixes a bug in Stripe Pro-Forms where upon a customer applying a 100%-off coupon code, the customer is met with an erroneous error regarding a missing state/zipcode--and only when a site owner has defined a tax configuration file also. Fixed in this release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/548) if you'd like additional details.
321
-
322
- - (s2Member Pro) **Automatic Update Compat.:** [Automatic Background Updates](https://codex.wordpress.org/Configuring_Automatic_Background_Updates) were introduced in WordPress v3.7 and while by default only WordPress core updates are updated automatically in this special way, it's still possible to enable automatic background updates for everything; including themes and plugins. For instance, some web hosting companies enable automatic/background plugin updates in an attempt to improve overall security.
323
-
324
- That's fine. However, when s2Member Pro is installed, it works as an add-on for the s2Member Framework plugin, and any update of the Framework plugin requires a manual or interactive update of the Pro add-on. Otherwise your site is left with only a portion of its original functionality until you complete the update. For that reason, starting with this release of s2Member, automatic background updates of the s2Member Framework are disabled automatically when you are also running s2Member Pro.
325
-
326
- Props to @raamdev for addressing this issue and providing the source code which made this enhancement possible. See also [this GitHub issue](https://github.com/websharks/s2member/issues/523) if you'd like additional details.
327
-
328
- _See also: [Instructions for Updating s2Member and s2Member Pro](https://s2member.com/updating/)_
329
- - (s2Member Pro) **`[s2Member-Login /]` Shortcode:** This release includes a new shortcode that allows you to display a login box on any Post/Page that you create with WordPress. It can also double as a way to display a user's profile summary; including their avatar. See: [`[s2Member-Login /]` Shortcode Documentation](http://s2member.com/kb-article/s2member-login-shortcode-documentation/) for further details.
330
-
331
- - (s2Member Pro) **`[s2Member-Summary /]` Shortcode:** This release includes a new shortcode that allows you to display a user's profile summary (including avatar) in any Post/Page that you create with WordPress. It can also double as a way to display a login box in case the user is not logged in yet (optional). See: [`[s2Member-Summary /]` Shortcode Documentation](http://s2member.com/kb-article/s2member-summary-shortcode-documentation/) for further details. Props to @patdumond for her ideas and feedback on this new feature.
332
-
333
- - (s2Member/s2Member Pro) **Avatar via Shortcode:** The `[s2Get /]` shortcode has been updated in support of user avatars, to make it easier for site owners to include a member's avatar in any WordPress Post/Page of their choosing; e.g., `[s2Get user_field="avatar" size="96" /]` produces an `<img />` tag with the user's avatar. See also: [`[s2Get /]` Shortcode Documentation](http://s2member.com/kb-article/s2get-shortcode-documentation/) for further details/examples. Props to @patdumond for her ideas and feedback on this feature.
334
-
335
- - (s2Member/s2Member Pro) **`[s2Get date_format="" /]` Now Possible:** The `[s2Get /]` shortcode was updated to support date formats whenever the `user_field=""` key that you want to display ends with `_time`; e.g., `[s2Get user_field="s2member_last_payment_time" date_format="M jS, Y, g:i a T" /]` produces: `Mar 5th, 2022, 12:00 am UTC` instead of a UNIX timestamp. See also: [`[s2Get /]` Shortcode Documentation](http://s2member.com/kb-article/s2get-shortcode-documentation/) for further details/examples, including PHP equivalents.
336
-
337
- _See also: [New `[s2Eot /]` Shortcode](http://s2member.com/kb-article/s2eot-shortcode-documentation/) with EOT-specific date/time functionality enhancements._
338
-
339
- - (s2Member/s2Member Pro) **WordPress v4.3-beta Compat.:** This release was tested against WordPress v4.2+, including WordPress v4.3-beta. A few minor adjustments were made to improve support in the upcoming release of WordPress v4.3 based on beta releases made available to us.
340
-
341
- - (s2Member/s2Member Pro) **goo.gl URL Shortener:** This release addresses a problem with the Google URL Shortening API. Google now requires that you configure an API key. Otherwise, API calls will fail often and s2Member reverts back to tinyURL instead. Starting with this release, if you enable the Google URL Shortener, you will need to supply an API key for it to work as expected. See: **s2Member → General Options → URL Shortening Service Preference** for further details. See also [this GitHub issue](https://github.com/websharks/s2member/issues/587) if you'd like additional details. Props to @bridgeport for reproducing and reporting this bug.
342
-
343
- - (s2Member/s2Member Pro) **Bitly URL Shortener:** This release adds support for Bitly to be used as your preferred URL Shortening service. Bitly has become very popular for many reasons. One reason to choose Bitly over others is that you can configure your Bitly account to use a custom domain of your choosing; i.e., shortened URLs may contain [a domain that you configure](https://bitly.com/a/settings/advanced). See: **s2Member → General Options → URL Shortening Service Preference** for further details.
344
-
345
- - (s2Member Pro) **Other Gateways:** Starting with this release, when you install the s2Member Pro add-on for the first time, there are two Pro gateways enabled by default. When you first install s2Member Pro (first-time users only), both the Stripe and PayPal Pro payment gateways will already be enabled for you. This is to help site owners avoid confusion. In addition, first-time users will be greeted by s2Member Pro with a reminder to configure your "Other Gateways". See also [this GitHub issue](https://github.com/websharks/s2member/issues/528) if you'd like additional details. Props to @raamdev for identifying this usability issue and providing feedback/suggestions.
346
-
347
- - (s2Member Pro) **Stats Collection:** Starting w/ this release of s2Member Pro, we are now collecting important/anonymous server details that will help us better understand which versions of PHP/MySQL are most widely used by site owners running the pro version of our software. For further details, please see: [What anonymous information does s2Member Pro report to WebSharks, and why?](http://s2member.com/kb-article/what-information-does-s2member-pro-report-to-websharks/)
348
-
349
- = v150311 =
350
-
351
- - (s2Member/s2Member) **Bug Fix:** The list of users in the WordPress Dashboard was going blank in a particular scenario where a search was attempted in concert with a sortable s2Member column. Fixed in this release. Props to @bridgeport for finding this. See also [this GitHub issue](https://github.com/websharks/s2member/issues/496#issuecomment-76821470) if you'd like technical details.
352
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent changes in the `WP_User_Query` class. See [this GitHub issue](https://github.com/websharks/s2member/issues/493) if you'd like additional details.
353
- - (s2Member Pro) **Remote Operations API (Bug Fix):** If a remote API call was made to find a user by `user_login`, and that username was all numeric, the `WP_User` class treated it like a user ID instead of as an actual username. Resolved in this release by calling `new WP_User(0, [user login])` as the second argument to the constructor. Thereby forcing `WP_User` to consider it a username. See also [this GitHub issue](https://github.com/websharks/s2member/issues/498) if you'd like technical details.
354
- - (s2Member Pro) **Stripe Bug Fix:** Stripe Pro-Forms for Specific Post/Page Access should not disable the email address field for logged-in users. Resolved in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/500) if you'd like technical details.
355
- - (s2Member Pro) **Stripe Pro-Forms:** This release corrects a bug first introduced in the last release that prevented custom templates for Stripe Pro-Forms from working as intended. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/510) if you'd like additional details.
356
- - (s2Member Pro) **Bug Fix for Gift/Redemption Codes:** This release of s2Member corrects a bug that impacted the generation of Gift/Redemption Codes whenever they were sold with Specific Post/Page Access. See also [this GitHub issue](https://github.com/websharks/s2member/issues/512) if you'd like additional details.
357
-
358
- = v150225 =
359
-
360
- - (s2Member Pro) **Accept Bitcoin via Stripe!** This release of s2Member Pro comes integrated with the latest version of the Stripe API, where it is now possible to accept Bitcoin right along with most major credit cards—made possible by [Stripe's latest update to support Bitcoin](https://stripe.com/bitcoin). It's as easy as flipping a switch :-) Please see: `Dashboard → s2Member Pro → Stripe Options → Account Details → Accept Bitcoin`. Referencing [this GitHub issue](https://github.com/websharks/s2member/issues/482); i.e., the original feature request.
361
- - (s2Member Pro) **Stripe API Upgrade:** This release of s2Member Pro updates the Stripe SDK and Stripe API to the latest version (Stripe API version: `2015-02-18`). In addition, this release forces a specific version of the Stripe API in all communication between Stripe and s2Member; thereby avoiding a scenario where the Stripe API could be updated again in the future, in ways that might prevent s2Member Pro from operating as intended. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/484) if you'd like technical details. Props to @pauloz1890 for reporting this.
362
- - (s2Member/s2Member Pro) **Security Badge Sizes:** This release of s2Member corrects an issue with the `[s2Member-Security-Badge v="1" /]` shortcode. If you set `v="2"` or `v="3"`, the dimensions were miscalculated. Props to @Mizagorn See [this GitHub issue](https://github.com/websharks/s2member/pull/466) if you'd like additional details.
363
- - (s2Member Pro) **Bug Fix:** Opt-in checkbox state (and some custom fields) were losing state when switching from one type of Pro Form to another—whenever Pro Form Checkout Options were in use. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/468) if you'd like additional details. Props to @zenzoidman for finding this!
364
- - (s2Member) **Bug Fix:** Alt. View Restrictions stopped working on navigation menu items in the previous release of s2Member v150203 due to a default argument value being misinterpreted by a sub-routine. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/475) if you'd like further details.
365
- - (s2Member/s2Member Pro) **Bug Fix:** Some site owners reported "paying" customers being left with a Membership Level of `0` at seemingly random times that may have occurred only once in every 300+ transactions. The issue was related to a regular expression being performed against encrypted binary data with an ungreedy `?` in the regex pattern. Certain characters in the binary output would be lost when specific character sequences were encountered; resulting in a random failure to decrypt cookies set by s2Member. In short, the underlying cause was identified and corrected in this release. Thanks to all who reported this. Our appreciation goes out to everyone who helped to test for this elusive bug. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/397) if you'd like additional technical details.
366
- - (s2Member/s2Member Pro) **UI Enhancements:** This release includes an enhanced UI, along with many subtle improvements to the inline documentation/instructions provided within the WordPress Dashboard.
367
- - (s2Member Pro) **Retiring Google Wallet:** Google [announced that they are retiring Google Wallet for Digital Goods](https://support.google.com/wallet/business/answer/6107573). s2Member Pro continues to support Google Wallet, but this release updates the "Other Gateways" section in the Dashboard to make it clear that Google Wallet will not be supported in future versions of s2Member Pro. In fact, Google Wallet for Digital Goods will [close March 2nd, 2015](https://support.google.com/wallet/business/answer/6107573).
368
- - (s2Member/s2Member) **bbPress Bug Fix:** This release resolves a security issue when running a Multisite Network with bbPress + s2Member. Level 0 access was being granted by the bbPress plugin across all sites in a network. That behavior is fine for bbPress, but is unexpected when s2Member is running in a Network environment. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/465) if you'd like additional details. **IMPORTANT TIP:** If you experienced this issue, please read through [these important comments](https://github.com/websharks/s2member/issues/465#issuecomment-76039842) about bbPress Participants needing to be removed from child blogs in order to fully rid yourself of this problem; i.e., once you complete the update of s2Member, you should [also read this please](https://github.com/websharks/s2member/issues/465#issuecomment-76039842).
369
- - (s2Member/s2Member Pro) **404 / Alt. Views Bug Fix:** This release of s2Member corrects a rare issue where the Membership Options Page (or other pages) can produce random 404 errors whenever s2Member's Alt. View Restrictions are enabled, and there is another plugin installed which runs a DB query using the `WP_Query` class _before_ the Main WP Query has been run. Resolved through the use of `->is_main_query()` instead of tracking it statically via `$initial_query`. See also [this GitHub issue](https://github.com/websharks/s2member/issues/481) if you'd like additional technical details.
370
-
371
- = v150203 =
372
-
373
- - (s2Member Pro) **Gift/Redemption Codes:** This release adds a powerful new shortcode: `[s2Member-Gift-Codes /]`. This makes it easy to generate and sell access to gift codes (i.e., gift certificates) and/or to a list of redemption codes. For instance, where a single team leader might like to purchase multiple accounts they can distribute to others on a team, or in a group. Video demo here: http://s2member.com/r/giftredemption-codes-video/ ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/386) for additional technical details.
374
- - (s2Member Pro) **User-Specific Coupon Codes:** This release of s2Member makes it possible to configure Pro-Form Coupon Codes that are connected (i.e., only valid) when entered by specific Users/Members who are logged into the site. See: `Dashboard → s2Member → Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/403) for additional technical details.
375
- - (s2Member Pro) **Coupon Code Max Uses:** This release of s2Member Pro adds the ability to set a maximum number of times that a Coupon Code can be used. This makes it easy to create Coupon Codes that are designed to be used only one time, for instance; or for X number of times. After a Coupon Code is used X number of times, it will expire automatically. See: `Dashboard → s2Member → Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
376
- - (s2Member Pro) **Coupon Code Usage Tracking:** This release of s2Member Pro adds the ability to track the number of times that each of your Coupon Codes have been used. It is also possible to alter the number of uses, and/or set a maximum number of uses. See: `Dashboard → s2Member → Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
377
- - (s2Member Pro) **Coupon Code Active/Expires Dates:** This release of s2Member Pro makes it possible to establish both a start and end time for each of your Pro Coupon Codes. In previous versions of s2Member, it was only possible to set an expiration date. You can now create Coupon Codes that will become active at some point in the future automatically. See: `Dashboard → s2Member → Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
378
- - (s2Member Pro) **Coupon Code UI Enhancements:** This release of s2Member Pro comes with an updated UI that makes it easier to manage your Pro Coupon Codes. See: `Dashboard → s2Member → Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
379
- - (s2Member Pro) **Store Coupon Codes for Each User:** s2Member Pro now stores a list of all coupon codes that a customer has used on your site. See: `Dashboard → Users → Choose User [Edit]`. Scrolling down to the set of s2-related fields will reveal a new list of coupon codes. This list will be filled for new customers only; i.e., s2Member does not have this data for past purchases; only for new customers that you acquire after updating to the latest release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/462) if you'd additional details.
380
- - (s2Member/s2Member Pro) **EOT Custom Value:** In this release of s2Member, the `get_user_option('s2member_custom')` value is preserved after an EOT has taken place, making it possible for site owners to continue to read this value (along with any custom pipe-delimited values they have injected there), even after an EOT has taken place. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/449).
381
- - (s2Member/s2Member Pro) **JW Player Broken Links:** This release corrects some broken links referenced by the inline documentation for s2Member in the WordPress Dashboard. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/448) if you'd like further details.
382
- - (s2Member/s2Member Pro) **Security:** This release of s2Member checks for the existence of the WordPress PHP Constant: `WPINC` instead of looking for the less reliable `$_SERVER['SCRIPT_FILENAME']`. Some site owners reported this was causing trouble in a localhost environment during testing, or when running s2Member on some hosts that are missing the `SCRIPT_FILENAME` environment variable; e.g., some Windows servers. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/454) if you'd like additional details.
383
- - (s2Member Pro) **Advanced Import/Export Compat:** This release of s2Member Pro includes compatibility and a bug fix when running on WordPress v4.1+. Three PHP notices during importation, along with some quirky behavior associated with the `role` CSV column have been corrected. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/455) for technical details.
384
- - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent improvements to the search functionality. See [this GitHub issue](https://github.com/websharks/s2member/issues/155#issuecomment-69403120) if you'd like additional details.
385
- - (s2Member Pro) **`[s2Member-List /]` Enhancement:** This release improves search functionality in the `[s2Member-List /]` shortcode, making it so that all searches default to `*[query]*`; i.e., are automatically wrapped by wildcards. If a user enters a wildcard explicitly (or a double quote), this default behavior is overridden and the search query is taken as given in such a scenario. This makes the search functionality easier for end-users to work with, since it no longer requires an exact match. Default behavior is now a fuzzy match. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/394) if you'd like further details.
386
- - (s2Member/s2Member Pro) **AWS v4 Authentication:** This release of s2Member adds AWS v4 Authentication support for Amazon Web Service Regions that only accept the AWS v4 authentication scheme. If you had trouble in the recent past when attempting to integrate s2Member with S3 Buckets (or with CloudFront) in regions outside the USA, this release should resolve those issues for you. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/440) if you'd like additional technical details.
387
- - (s2Member Pro) **Bug Fix:** Pro-Form Checkout Options not working in all cases whenever they are used together with Free Registration Forms. Resolved in this release.
388
-
389
- = v150102 =
390
-
391
- - (s2Member/s2Member Pro) **Custom Field Mapping:** This release of s2Member adds an internal mapping from s2Member's Custom Field values for each user, to the `get_user_option()` function in the WordPress core. This makes it possible to retrieve user custom field values like always via `get_user_field()` or now through the native `get_user_option()` function also. The benefit of this is that s2Member's custom fields are now more compatible with other themes/plugins for WordPress.
392
- - (s2Member Pro) **[s2Member-List /] Shortcode:** It is now possible to search through custom fields created with s2Member using the `search_columns=""` attribute; e.g., `search_columns="user_login,user_email,s2member_custom_field_MYFIELDID"`; where `MYFIELDID` can be replaced with a field ID that you generate with s2Member via `Dashboard → s2Member → General Options → Registration/Profile Fields`. See also: [this KB article](http://www.s2member.com/kb/s2member-list-shortcode/) for further details. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/155) for details regarding this improvement.
393
- - (s2Member/s2Member Pro) **MailChimp Bug Fix** This release fixes a bug first introduced in the previous release, which was causing Interest Groups configured w/ s2Member to not be added properly. Resolved in this release. Props to @ethanpil Thanks!
394
- - (s2Member Pro) **ccBill Buttons** This release updates all ccBill button graphics. The MasterCard logo has been removed, and a new set of buttons was created to improve upon the set provided in previous versions of s2Member Pro. See: [this GitHub issue](https://github.com/websharks/s2member/issues/392) if you'd like further details.
395
- - (s2Member Pro) **Authorize.Net** The `AUD` currency code is now supported by Authorize.Net, and thus, s2Member Pro has been updated to support the `AUD` currency code for Pro-Forms integrated with Authorize.Net. See [this GitHub issue](https://github.com/websharks/s2member/issues/383) if you'd like further details.
396
- - (s2Member Pro) **Subscr. CID for Stripe** This release corrects a bug which made it impossible to update the Subscr. CID value (for Stripe) using the user edit form in the Dashboard. For further details, please see [this GitHub issue](https://github.com/websharks/s2member/issues/380).
397
- - (s2Member/s2Member Pro) **Bug fix** s2Member's membership access times log was failing to collect all required access times under certain scenarios where multiple CCAPS were being added or removed in succession within the same process, but across multiple function calls. This resulted in unexpected behaviors (in rare cases) when attempting to use the `[s2Drip /]` shortcode. Fixed in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/406) for technical details.
398
- - (s2Member/s2Member Pro) **Compatibility** This release includes a fix for s2Member's Multisite Network patches applied to the `wp-admin/user-new.php` file whenever you configure s2Member on a Multisite Network. This change makes s2Member compatible with the coming release of WordPress v4.1 and v4.2-beta as it exists now. See: [this GitHub issue](https://github.com/websharks/s2member/issues/410) if you'd like additional details.
399
- - (s2Member Pro) **Bug Fix:** A feature that was previously introduced in v140816, which made it possible for site owners to set a failed payment threshold (in s2Member's Authorize.Net integration), was suffering from an off-by-one issue during total failed payment calculations. Fixed in this release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/416) if you'd like further details.
400
- - (s2Member Pro) **Feature Enhancement:** Whenever a failed payment threshold is reached (in s2Member's Authorize.Net integration), not only will s2Member terminate on-site access, but now the underlying ARB (Automated Recurring Profile) is cancelled at the same exact time. This way future billing attempts on the Authorize.Net side will not be possible; i.e., it ensures that a failed payment threshold will always terminate both on-site access and the ARB itself together at the same time, as opposed to allowing the ARB termination to occur automatically via Authorize.Net, _whenever_. See also [this GitHub issue](https://github.com/websharks/s2member/issues/416) if you'd like further details.
401
- - (s2Member Pro) **ClickBank Disclaimer:** This release of s2Member adds a default Auto-Return Header Template (customizable from `s2Member → ClickBank Options` in the Dashboard) which includes a disclaimer that ClickBank requires of most merchants before final approval.
402
-
403
- _This default template should help to reduce the time it takes new merchants to receive final approval from ClickBank when first starting out in the ClickBank network. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/412) if you'd like further details._
404
- - (s2Member Pro) **Bug Fix:** PayPal Pro-Forms for Specific Post/Page Access, and configured with `accept="paypal"` (i.e., to accept PayPal only) were not hiding the entire Billing Method section as intended. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/399) if you'd like further details.
405
- - (s2Member Pro) **Bug Fix:** PayPal Pro-Forms using Express Checkout for Billing Agreements under a non-native currency (i.e., under a different currency than their own PayPal account) were failing under some scenarios (notably with the `BRL` currency code). Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/414) if you'd like technical details.
406
- - (s2Member Pro) **Stripe API:** s2Member's Stripe integration has been updated to use the new `statement_descriptor` field in favor of the now deprecated `statement_description`. See [this GitHub issue](https://github.com/websharks/s2member/issues/422) for technical details.
407
- - (s2Member Pro) **Stripe Bug Fix:** In the case of a global tax rate having been applied to the total cost, there were certain scenarios where s2Member Pro would kick back an error message, "Invalid Parameters to Stripe". Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/425) if you'd like technical details.
408
- - (s2Member/s2Member Pro) **WP Core Compat.:** This version of s2Member forces the `wptexturize` filter off in WordPress, due to a bug that was introduced in recent versions of the WordPress core; which results in broken shortcodes in some scenarios. Until the underlying bug is fixed in the WP core, the `wptexturize` filter must be disabled to prevent corruption of any WordPress shortcode that may contain `<` or `>` symbols.
409
-
410
- See [this GitHub issue](https://github.com/websharks/s2member/issues/349) for further technical details. Also referencing: [this WordPress core bug report](https://core.trac.wordpress.org/ticket/29608).
411
- - (s2Member/s2Member Pro) **Alt. Views:** This release fixes a bug that caused `wp_list_pages()` not to be filtered properly under certain scenarios. A symptom of this bug was to apply s2Member's Alt. View protection for "Pages", but for this not work properly in all cases. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/372) if you'd like technical details.
412
- - (s2Member/s2Member Pro) **Currency Code/Symbol:** All email templates, API Notifications (except cancellation/EOT notifications), and all Custom Return URLs on Success; across all payment gateways; now support two additional Replacement Codes: `%%currency%%` and `%%currency_symbol%%`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/314) if you'd like additional details.
413
- - (s2Member Pro) **Coupon Codes:** All transaction-related email templates now support three additional Replacement Codes: `%%full_coupon_code%%`, `%%coupon_code%%`, and `%%coupon_affiliate_id%%`. These have been documented in your Dashboard in places where transaction-related email templates are configured. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/384) if you'd like additional details.
414
- - (s2Member Pro) **Stripe Tax Info:** s2Member now attaches metadata to Stripe Charges and to Stripe Subscriptions which includes a JSON-encoded object containing two or more properties when tax applies.
415
-
416
- These metadata properties can be found in your Stripe Dashboard with the metadata key: `tax_info`; which contains the following JSON-encoded properties: `tax` (total tax that was or will be charged on the regular amount), `tax_per` (tax percentage rate that was applied based on your configuration of s2Member Pro); along with `trial_tax` and `trial_tax_per` in the case of a Stripe Subscription that includes an initial/trial period that requires payment; i.e., the tax applied (if any) to an initial/trial payment on a Subscription.
417
-
418
- We hope this additional information being recorded by s2Member and stored securely within your Stripe account will make it easier for you to maintain accurate bookkeeping records moving forward. This additional metadata is generated for new customers only. It will not be backfilled for any past transactions.
419
-
420
- - (s2Member Pro) **Stripe Tax Info:** s2Member now passes the tax location; i.e., `address_state`, `address_zip`, and `address_country` to each Stripe Card object associated with a Stripe Customer.
421
-
422
- We hope this additional information being recorded by s2Member and stored securely within your Stripe account will make it easier for you to maintain accurate bookkeeping records moving forward. This additional cardholder data is collected and stored for new customers only; it will not be backfilled for any past transactions.
423
-
424
- - (s2Member Pro) **Stripe IP Address:** s2Member now attaches the customer's IP address (as detected via `$_SERVER['REMOTE_ADDR']` on your server) into each Stripe Customer object, along with the customer's full name. These metadata properties can be found in your Stripe Dashboard with the metadata keys: `name` and `ip`.
425
-
426
- - (s2Member Pro) **Stripe Coupon Code:** s2Member now attaches metadata w/ a coupon code used by your customer (if applicable) to each Stripe Charge and/or Stripe Subscription object.
427
-
428
- This metadata property can be found in your Stripe Dashboard with the metadata key: `coupon`; which contains the following JSON-encoded property: `code` i.e., the full coupon code used by your customer. This additional metadata is generated for new customers only. It will not be backfilled for any past transactions. Filled only for transactions that use a coupon code.
429
- - (s2Member Pro) **Stripe Invoice:** This release corrects a bug in s2Member's Stripe integration whereby `subscr-signup-as-subscr-payment` was not always being forced into the core gateway processor; resulting in a miscalculation of the `last_payment_time` under certain scenarios. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/396) if you'd like additional details.
430
-
431
- = v141007 =
432
-
433
- - (s2Member Pro) **ClickBank IPN v6:** This release enables a new integration option for site owners integrated with ClickBank. You may now choose to integrate with v6 of ClickBank's IPN service, since all previous versions are slowly being phased out by ClickBank. Please see: `Dashboard → s2Member → ClickBank Options → IPN Integration` for v6 config. options. See also [this GitHub issue](https://github.com/websharks/s2member/issues/256) if you'd like further details regarding this topic. See also: [this article @ ClickBank](https://support.clickbank.com/entries/22803622-instant-notification-service).
434
- - (s2Member/s2Member Pro) **AWeber API Integration:** This release of s2Member adds a new option for site owners using AWeber. It is now possible to integrate with the new [s2Member App](http://www.s2member.com/r/aweber-api-key) for AWeber; i.e., via the AWeber API instead of via email-based communication. For further details, please see: `Dashboard → s2Member → API / List Servers → AWeber Integration`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/303) if you'd like additional details.
435
- - (s2Member/s2Member Pro) **Bug Fix:** The EOT Behavior option for `refunds,partial_refunds,reversals` was not being accepted by s2Member. Fixed in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/345) if you'd like further details.
436
- - (s2Member/s2Member Pro) **MailChimp API Wrapper:** This release of s2Member comes with an updated API wrapper class for MailChimp integration. No change in functionality, just a smoother, slightly faster, and more bug-free interaction with the MailChimp API. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/303) if you'd like further details regarding this improvement. See also: [the official MailChimp API class](https://bitbucket.org/mailchimp/mailchimp-api-php); i.e., what s2Member has been updated to in this release.
437
- - (s2Member/s2Member Pro) **URI Restrictions caSe-insensitive (Security Fix)** This release of s2Member changes the way URI Restrictions work. All URI Restrictions are now caSe-insensitive (i.e., `/some-path/` is now the same as `/some-Path/`), allowing s2Member to automatically pick up different variations used in attempts to exploit the behavior of certain slugs within the WordPress core. You can also change this new default behavior, if you prefer. Please see: `Dashboard → s2Member → Restriction Options → URI Restrictions`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/354) for the details about why this was changed in the most recent copy of s2Member.
438
- - (s2Member/s2Member) **AWeber Role-Based Emails:** In this release we're adding a note in the s2Member UI regarding role-based email addresses being rejected by AWeber. AWeber does not allow role-based emails like: `admin@` or `webmaster@` to be subscribed. It is suggested that you enable s2Member's config. option: "Force Personal Emails" if you intend to integrate with AWeber. Please see: `Dashboard → s2Member → General Options → Registration/Profile Fields`; where you can tell s2Member for force personal email addresses when someone registers on-site. This will prevent a potential subscriber from entering something like `admin@example.com` as their email address.
439
-
440
- = v140921 =
441
-
442
- - (s2Member/s2Member Pro) **WP v4 over SSL Compat.** A compatibility issue with the `home_url()` function in the latest release of WordPress has been resolved with this release. Some site owners reported that their s2Member menu pages were appearing without any CSS/JavaScript being loaded; i.e., the graphical UI was not appearing as one would expect under certain scenarios.
443
- - (s2Member/s2Member Pro) **WP v4 Compat.** This release brings s2Member up-to-date with the latest changes to the `like_escape()` function in WP v4.0. The `like_escape()` function is now deprecated in favor of `wpdb::esc_like()`. s2Member has been updated in this release, but also remains compatible with previous versions of WordPress. See [this GitHub issue](https://github.com/websharks/s2member/issues/329) if you'd like further details.
444
- - (s2Member Pro) **[s2MOP /] Shortcode Enhancment** The `[s2MOP /]` shortcode allows for a new `required_value=""` attribute. Please see [this KB article](http://www.s2member.com/kb/s2mop-shortcode/) for details about the `[s2MOP /]` shortcode. See also: [this GitHub issue](https://github.com/websharks/s2member-pro/issues/51) if you'd like further details.
445
-
446
- = v140909 =
447
-
448
- - (s2Member/s2Member Pro) **Compatibility:** Several instances of `site_url()` (a WordPress core function) have been converted to `home_url()` instead. This provides better compatibility with WordPress installations running from a sub-directory. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/293) if you'd like further details.
449
- - (s2Member Pro) **Bug Fix:** Ampersands; i.e., `&` symbols in a ClickBank button `desc=""` attribute are now converted to the word `and` automatically. The symbol itself causes issues in ClickBank's IPN processing. Fixed in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/253) if you'd like further details.
450
- - (s2Member) **Bug Fix:** Improving compatibility with Mozilla/Firefox for the default `wp-login.php?action=register` handler. This release corrects an issue where `<select>` fields contained text with too large a font-size for Mozilla browsers to deal with. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/244) if you'd like further details.
451
- - (s2Member) **WP v4.0 / bbPress Compat.** A conflict between WordPress v4.0, bbPress v2.5.4 and the previous release of s2Member has been resolved. A symptom of this issue was to see the leading topic post missing from your bbPress forum threads.
452
-
453
- This was a complex issue related to changes in the most recent copy of WordPress where `WP_Query::$is_search` is flagged as `TRUE` when the `s` key `isset()` instead of `!empty()`. s2Member has implemented a workaround so that the conflict will no longer cause this problem for site owners running s2Member/bbPress.
454
-
455
- However, please note that some other 3rd-party plugins may still conflict in this way; when running the latest version of bbPress under WordPress v4.0. We are working to notify bbPress and other plugin authors about this issue; just to help others avoid the problem. While unconfirmed, some site owners reported that the Relevanssi search plugin may have some trouble with this also.
456
- For further details, please see <http://bbpress.org/?p=151839>. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/321) if you'd like all of the details regarding this workaround in the s2Member software.
457
- - (s2Member) **WP v4.0 Compat.** Updating s2Member's use of the now-deprecated `get_all_category_ids()`. Using `get_terms()` instead. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/322) if you'd like further details.
458
- - (s2Member Pro) **Stripe Bug Fix:** This release corrects an issue with Stripe Pro-Forms and a `$0` trial period. A symptom of this bug was to find a customer's Stripe token value missing from their Customer object in the Stripe Dashboard. This issue impacted Pro-Forms whenever a 100% free trial was offered (i.e., with a `$0` sale amount). Resolved by this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/326) if you'd like the details.
459
-
460
- = v140816 =
461
-
462
- * (s2Member/s2Member Pro) **bbPress Forum Compatibility** Woohoo! This release of s2Member improves s2Member's compatibility with bbPress Forums/Topics/Replies. It is now possible to protect a Forum with s2Member, and have all Topics within that Forum protected automatically. No changes necessary to enable this feature. If you protect a bbPress Forum, this is how s2Member will behave automatically. It's a parent/child relationship that s2Member is now compatible with.
463
-
464
- *WARNING: If you have been running s2Member together with bbPress in the past, this change may impact you. Any bbPress Forums that are protected by s2Member will now also protect all Topics within that Forum. This improvement also impacts s2Member's Alt. View Restrictions. If you are using s2Member's Alt. View Restrictions, any bbPress Topics that live within a protected Forum will automatically be hidden from Alternative Views configured with s2Member.*
465
-
466
- Please see [this GitHub issue](https://github.com/websharks/s2member/issues/116) if you'd like more info.
467
- * (s2Member Pro) **[s2Stream /] Resolutions** Awesome! This release introduces a new Shortcode Attribute (`player_resolutions=""`). See [this screenshot](http://bit.ly/1uASNau) of the details and [this screenshot](http://bit.ly/1uASY5M) of the functionality.
468
-
469
- This is an s2Member Pro feature that allows a site owner to offer multiple resolutions of a video through the `[s2Stream /]` Shortcode implemented with s2Member's Download Restrictions. Please see [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes) and choose the **"Shortcode Attributes (Explained)" tab** for all the details, along with an example of `player_resolutions=""` in the `[s2Stream /]` Shortcode.
470
-
471
- See also: [this GitHub issue](https://github.com/websharks/s2member/issues/179) if you'd like more info.
472
- * (s2Member Pro) **Authorize.Net** This release introduces a new configurable EOT Behavior option for site owners integrated with Authorize.Net. It is now possible to configure a Max Failed Payments threshold; after which s2Member will automatically trigger an EOT (End Of Term). See: `Dashboard → s2Member → Authorize.Net Options → EOT Behavior`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/141) if you'd like more info.
473
- * (s2Member/s2Member Pro) **Enhancement** A new Replacement Code (`%%current_user_nicename%%`) has been introduced by s2Member to improve compatibility with plugins like BuddyPress and bbPress. If you are currently using a Special Login Redirection URL as your s2Member Login Welcome Page, and you've used `%%current_user_login%%` (i.e., the old way), we suggest that you update your Special Redirection URL to use `%%current_user_nicename%%`. Please see [Jason's comments here](https://github.com/websharks/s2member/issues/276#issuecomment-51706582) for further details. See also: `Dashboard → s2Member → General Options → Login Welcome Page`. It is this area of your Dashboard where a Special Redirection URL can be configured.
474
- * (s2Member Pro) **Pro Login Widget** There are some new Replacement Codes available for the "My Account" page URL, and the "My Profile" page URL whenever you configure the s2Member Pro Login Widget in WordPress. s2Member Pro now supports things like `%%current_user_nicename%%` and `%%current_user_level%%` in these customizable URLs. See: `Dashboard → Appearance → Widgets → s2Member Pro Login Widget` for further details. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/276#issuecomment-51706582) if you'd like more info.
475
- * (s2Member Pro) **Stripe Bug Fix** Wrapping multiple Stripe Pro-Form Shortcodes together as "Checkout Options" was not working properly in the previous release. The dropdown for Checkout Options was not maintaining the underlying variable needed to keep a Checkout Option selected. Fixed in this release. If you'd like more info, please see [this GitHub issue](https://github.com/websharks/s2member/issues/296).
476
- * (s2Member Pro) **Stripe Bug Fix** A few site owners reported issues between s2Member's integration with Stripe and other plugins that also depend on the Stripe SDK for PHP. Fixed in this release. If you'd like more info, please see [this GitHub issue](https://github.com/websharks/s2member/issues/295).
477
- * (s2Member Pro) **Pro Cancellation Forms** This release introduces a new Shortcode Attribute that can be used with Pro Cancellation Forms. The new Shortcode Attribute is `unsub=""`. Setting this to a value of `unsub="1"` will enable an automatic unsubscribe upon cancellation. To clarify, this is related to any List Servers (e.g., MailChimp, AWeber, GetResponse) that you integrate with s2Member. If `unsub="1"` when a customer cancels future billing they will also be removed from the mailing list they are currently subscribed to, according to your List Server configuration in s2Member. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/238) if you'd like more info.
478
- * (s2Member/s2Member Pro) **Child Theme Compabitility** Portions of s2Member (e.g., Return-Page templates, s2Stream templates, Pro-Form templates, IP Restriction templates, and more) allow advanced site owners to use custom templates of their own. In the past these templates *had* to be created inside the parent theme directory or inside of your `/wp-content/` directory. Starting with this release, s2Member will also look for custom templates inside of your current Child Theme directory too (i.e., `get_stylesheet_dir()`). Please see [this GitHub issue](https://github.com/websharks/s2member/issues/271) if you'd like more info.
479
- * (s2Member/s2Member Pro) **S3/CloudFront Compatibility** The latest release of s2Member has been made compatible with the latest changes at Amazon S3/CloudFront [regarding IAM users](http://aws.amazon.com/blogs/aws/updated-iam-console/). If you've been running s2Member together with Amazon S3/CloudFront there are no changes necessary in s2Member configuration. If you are just integrating s2Member with Amazon S3/CloudFront you are advised to setup an IAM user instead of using your AWS Root Keys. s2Member will continue to work with either Root Keys or with IAM user keys. Either are fine. If you'd like more info, please see [this GitHub issue](https://github.com/websharks/s2member/issues/297).
480
- * (s2Member/s2Member Pro) **MySQLi Compatiblity** This release brings s2Member into full compatibility with the MySQLi extension. In the previous release it was reported that one specific routine in s2Member that checks the total number of users in your WordPress database was incompatible with MySQLi. Resolved in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/274) if you'd like more info.
481
- * (s2Member/s2Member Pro) **Amazon CloudFront** s2Member now makes a new button [Reset CloudFront Configuration] available inside of your WP Dashboard under: `s2Member → Download Options → Amazon CloudFront`. This button allows a site owner (if necessary) to do a quick reset of s2Member's current integration with Amazon CloudFront Distributions. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/270) if you'd like more info.
482
- * (s2Member/s2Member Pro) **Bug Fix** This release corrects a bug in s2Member's log of a user's WordPress Capability access times. This bug had no serious impact on previous releases of s2Member. However, it was a bug that needed fixing nonetheless. Resolved in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/237) if you'd like more info.
483
- * (s2Member/s2Member Pro) **Responsive Compatibility** This release of s2Member makes the `/wp-login.php` file (the WordPress Login/Registration system) Responsive; i.e., more compatible with mobile devices and tablets. This only impacts site owners that use s2Member's Login/Registration Design options to improve and customize the appearance of this core WordPress component. No changes necessary to existing installations for this to kick-in. It's automatic (assuming you are using this s2Member feature). Please see [this GitHub issue](https://github.com/websharks/s2member/issues/211) if you'd like more info.
484
- * (s2Member Pro) **Remote Operations API** This release of s2Member makes it possible to change the API Key assigned to your WordPress installation. The Pro Remote Operations API is one way for developers to integrate with some of s2Member's functionality. See: `Dashboard → s2Member → API / Scripting → Remote Operations API`. This is where it's possible to change your API Key if you'd like to. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/206) if you'd like more info.
485
- * (s2Member/s2Member Pro) **Enhancement** s2Member's Auto-Return system (i.e., default Thank-You page handler) which integrates with: PayPal Standard Buttons, ClickBank, and Google Wallet; has been updated in this release. If a customer happens to find their way back to a self-expiring Auto-Return URL (a rare occurrence); instead of an unfriendly error message about duplicate return data, s2Member now provides a more friendly note that asks the customer to check their email for the details needed to access what they paid for. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/205) if you'd like more info.
486
- * (s2Member/s2Member Pro) **Enhancement** s2Member's Security Encryption Key configuration panel in the Dashboard was updated to include additional details related to the use of your Security Encryption Key. This additional information explains s2Member's use of this key in greater detail. See: `Dashboard → s2Member → General Options → Security Encryption Key`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/182) if you'e like more info.
487
- * (s2Member Pro) **One-Time-Offers Upon Login** This release resolves a conflict between s2Member's Pro Login Widget and One-Time-Offers (Upon Login)—a feature that can be configured with s2Member Pro. One-Time-Offers (Upon Login) now take precedence over certain automatic login redirections that can occur through the Pro Login Widget, removing the chance of a conflict. If a visitor logs into their account with a default login redirection URL (i.e., a redirection URL formulated dynamically by the Pro Login Widget that is not related to a visitor's request to access a specific page of the site), and a One-Time-Offer is triggered at the same time, the One-Time-Offer will take precendence. The visitor will see the One-Time-Offer instead of being redirected to the default location specified by the Pro Login Widget. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/119) if you'd like more info.
488
-
489
- = v140725 =
490
-
491
- * (s2Member Pro) **NEW: Stripe Pro-Forms (Beta)** Holy hula hoop! s2Member now has a deep integration with Stripe for on-site credit card processing that uses a Stripe overlay. Stripe is an almost-free service that is super easy to setup and work with. We think you'll find that Stripe is quickly becoming the MOST popular of all payment gateways in the industry. A few bugs have [already been zapped](https://github.com/websharks/s2member/issues?milestone=5&page=1&state=closed) prior to this release after some initial beta testing was completed over the last few weeks. Everything is looking great so far, but please do [report any new issues via GitHub](https://github.com/websharks/s2member/issues?page=1&state=open).
492
-
493
- **If you are an s2Member Pro site owner** you can upgrade to the latest version of s2Member Pro at anytime you like; then enable Stripe as an additional payment gateway option. See: `Dashboard → s2Member Pro → Other Gateways`.
494
-
495
- **Questions About Stripe?** Please watch [this video](http://www.s2member.com/videos/L0aJz4-9mNanxemFZ_3G2-SIn-xAoiwD/) by Lead Develoer Jason Caldwell regarding s2Member's new integration with Stripe payment processing. It's never been easier! Jason answers several questions about Stripe in this video also. You might _also_ find it interesting to hear the [latest news regarding Stripe and Bitcoin](https://stripe.com/blog/bitcoin-the-stripe-perspective). We look forward to supporting Bitcoin in s2Member (via Stripe) very soon.
496
-
497
- * (s2Member Pro) **NEW: Advanced Import/Export Tools Option** This release introduces a new "Advanced" set of user import/export tools. We think you'll find this to be an extremely helpful and much more powerful way to deal with user import/export in WordPress. Please see `Dashboard → s2Member → Import/Export` and click the link to enable the new Advanced Import/Export Tools. See also: [this KB article](http://www.s2member.com/kb/advanced-import-tools/) which documents the new tools. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/149) if you'd like further details about the development behind this new feature.
498
- * (s2Member Pro) **ClickBank Bug Fix** Nillable fields causing some issues (only under one specific scenario) after a recent change in the ClickBank API. Fixed in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/250) if you would like further detais.
499
- * (s2Member Pro) **Compatibility** Resolved a minor single-quote issue in the Visual Editor. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/228) if you'd like further details.
500
- * (s2Member/s2Member Pro) **Bug Fix** Non-HTML whitespace being trimmed inside the `[s2If /]` shortcode. Resolved in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/224) if you'd like further details.
501
- * (s2Member Pro) **Pro-Forms Bug Fix** Related to List Server processing during an upgrade. This bug impacted all payment gateways integrated with s2Member's Pro-Forms; including PayPal, Authorize.Net and now Stripe. Resolved in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/216) if you'd like further details.
502
- * (s2Member Pro) **Bug Fix** An `array_intersect()` error in the `[s2MOP /]` shortcode under the right conditions. Fixed in this release. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/204) if you'd like further details.
503
- * (s2Member Pro) **Enhancement** Free Registration Pro-Forms can now be included in a list of nested Checkout Option drop-downs. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/197) if you'd like further details. See also: `Dashboard → s2Member → [Your Payment Gateway] Pro-Forms → Checkout Options`; where there is more information about how to use Checkout Options with s2Member Pro-Forms.
504
- * (s2Member/s2Member Pro) **Bug Fix / List Servers** This release corrects a bug that may cause members to be unsubscribed from a List Server if they forget to check the box again while editing their profile. In the previous release we introduced a feature that allows the checkbox to be pre-checked if the user already chose to subscribe once before. However, the internal tracking for this was not as reliable as it could be. There is still more work to be done on this front, but the immediate issue has now been resolved. Please see [this GitHub issue](https://github.com/websharks/s2member/issues/196) if you'd like further details.
505
- * (s2Member/s2Member Pro) **WP_DEBUG Compat.** Some older portions of s2Member's codebase were cleaned up and reformatted in this update. This is an ongoing process to bring s2Member into full compatibility with `WP_DEBUG` mode in WordPress. This is intended to help other developers in the WP community. Much progress has been made on this front now, but still some more work to do. We will continue to update s2Member's codebase little-by-little with each release.
506
- * (s2Member/s2Member Pro) **Uninstall vs. Deactivation** s2Member has always made a strong effort to cleanup after itself should you decide (for whatever reason) to uninstall it. However, we are also very concerned with preserving any data associated with such a powerful plugin that comes with so many options. Nobody wants accidental data loss, right!?
507
-
508
-
509
- In the past, s2Member came with a feature called "Deactivation Safeguards". These (if disabled) attached themselves to a plugin "deactivation" hook within WordPress and they would uninstall s2Member when you deactivated the plugin. Starting with this release ,s2Member's Deactivation routines have been changed. We now attach them to the WordPress "uninstall" hook—which is triggered only on plugin deletion.
510
-
511
- In this way, deactivating s2Member will never result in a loss of any data. Instead of "Deactivation Safeguards", s2Member now calls this feature "Plugin Deletion Safeguards". In short, to tell s2Member to uninstall itself (including any data/options associated with s2Member), you can simply disable s2Member's Plugin Deletion Safeguards under: `s2Member → General Options`, and then deactivate _and delete_ the s2Member plugin entirely. Whenever you delete the plugin this automatically and silently triggers s2Member's uninstaller which cleans up after itself nicely :-)
512
-
513
- = v140630 =
514
-
515
- - (s2Member Pro) **Stripe Payment Gateway** Hooray! s2Member Pro now integrates with [Stripe](http://www.s2member.com/r/stripe). s2Member Pro-Forms, Coupon Codes, Tax Settings, Checkout Options, and all of the other great features provided by s2Member Pro are now compatible with Stripe. To enable Stripe in your installation of s2Member, please see: `Dashboard → s2Member → Other Gateways → Stripe`.
516
-
517
- We expect Stripe to become the most popular payment gateway integration for s2Member Pro over the next few months. Stripe is nearly free; it's easier to setup, easier to maintain; and just more flexible overall in our opinion.
518
-
519
- _See also: [this GitHub issue](https://github.com/websharks/s2member/issues/177) where efforts to integrate with Stripe took place. A quick tutorial video and KB articles will come soon at s2Member.com; once beta testing is complete._
520
- - (s2Member Pro) **Bug Fix; [s2MOP /]** This release corrects a bug in the `[s2MOP /]` `restriction_type` attribute. See [this GitHub issue](https://github.com/websharks/s2member/issues/204) if you'd like further details.
521
-
522
- = v140614 =
523
-
524
- * (s2Member/s2Member Pro) **Quick Cache Compat.** This release makes it possible for Quick Cache to cache content protected by s2Member. If, and only if, you have [Quick Cache Pro](http://www.websharks-inc.com/product/quick-cache/) configured to enable user-specific caching; i.e., to cache when users are logged into the site. See [this GitHub issue](https://github.com/websharks/s2member/issues/172) if you'd like further details.
525
- * (s2Member Pro) **ClickBank API Compat.** This release brings s2Member's ClickBank integration into full compatibility with a recent change in the ClickBank API. Under the right conditions, a symptom of this bug was to see an error regarding an unexpected `txnType` upon returning from checkout via ClickBank. Resolved in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/199) if you'd like further details.
526
-
527
- = v140603 =
528
-
529
- * (s2Member/s2Member Pro) **Profile Sync to List Servers** If you have a supported List Server integrated with s2Member (e.g., MailChimp, GetResponse, AWeber), the opt-in checkbox will now also be displayed in user profile editing panels (i.e., by the `[s2Member-Profile /]` shortcode, or if you integrate s2Member with BuddyPress profiles).
530
-
531
- If a user updates their profile, their profile on the List Server is updated too (i.e., s2Member updates their first name, last name, along with any merge vars or customs you've integrated through s2Member hooks/filters). If a user changes their email address, they will be subscribed with the new email address. Leaving the box unchecked during a profile update will effectively unsubscribe the user from the lists you have configured at their current Membership Level.
532
-
533
- *s2Member's AWeber integration does not yet support profile updates (i.e., changes in first/last name or other details); it only supports the ability to either subscribe or unsubscribe; and/or changes in email address.*
534
-
535
- See [this GitHub issue](https://github.com/websharks/s2member/issues/146) if you'd like further details.
536
- * (s2Member/s2Member Pro) **BuddyPress Compatibility** This release makes s2Member and s2Member Pro compatible with the latest release of BuddyPress. BuddyPress v2.01 broke some of s2Member's previous integration. Fixed in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/162) if you'd like further details.
537
- * (s2Member/s2Member Pro) **Multisite Lost Password URL** In a multisite environment (given the WordPress default behavior), a lost password URL generated by WordPress will force all users to recover their password from the Main Site in the Network; which is usually NOT desirable. This release of s2Member fixes this odd behavior in the WordPress core by allowing users to recover their password in the UI for the current Child Blog they are accessing. See [this GitHub issue](https://github.com/websharks/s2member/issues/138) if you'd like further details and ways to enable/disable; or even customize this further.
538
- * (s2Member/s2Member Pro) **Default EOT Behavior** By popular demand, this release changes s2Member's default EOT (End Of Term) Behavior option with respect to refunds/chargebacks. The new default behavior (assuming you have not yet configured s2Member) is to force an EOT on chargebacks only; not on a refund of any kind. A refund is just a refund (in many cases) and an EOT (if one should occur) is something that a site owner generally should decide on their own; i.e., to review refunds manually and if an EOT should occur, the site owner will mostly like prefer to terminate a user's account access on their own; and on a case-by-case basis.
539
-
540
- **Further clarification...** EOT (End Of Term) is meant to occur when a subscription ends, and since a refund doesn't necessarily end a subscription, it's not the default anymore to trigger an automatic EOT on a refund event. Site owners that want an EOT on refunds still have that option available to them however. See `Dashboard → s2Member → [Payment Gateway] Options → Auto EOT Behavior → Chargebacks/Refunds`.
541
-
542
- See also: [this GitHub issue](https://github.com/websharks/s2member/issues/183) if you'd like further details.
543
- * (s2Member/s2Member Pro) **Currency Conversion** s2Member's integration with the Google Currency Converter went stale after some changes to the Google API. This release updates s2Member's internal currency conversion routines to correct the issue. See [this GitHub issue](https://github.com/websharks/s2member/issues/169) if you'd like further details.
544
- * (s2Member/s2Member Pro) **Bug Fix** This release corrects a sortable User column issue in the WordPress Dashboard; with respect to numeric values stored in the WordPress meta table. A symptom of this bug was to see sortable columns for Last Login Time, Total Logins, or EOT Time just a bit out of whack in some scenarios. Fixed in this release. See [this GitHub issue](https://github.com/websharks/s2member/issues/164) if you'd like further details.
545
- * (s2Member/s2Member Pro) **Bug Fix** Updating the inline documentation for the `[s2Drip /]` shortcode in the Dashboard to match the most recent improvements to this feature; and to bring it up-to-date with [this KB article](http://www.s2member.com/kb/s2drip-shortcode/). See [this GitHub issue](https://github.com/websharks/s2member/issues/163) if you'd like further details.
546
- * (s2Member Pro) **Enhancement** This release enhances the UI and error reporting for the `[s2Member-List /]` shortcode. See [this GitHub issue](https://github.com/websharks/s2member/issues/161) if you'd like further details. See also [this KB article](http://www.s2member.com/kb/s2member-list-shortcode/).
547
- * (s2Member Pro) **Bug Fix** This release corrects an issue with the `[s2Member-List /]` shortcode when used on a site that does not use fancy permalinks. See [this GitHub issue](https://github.com/websharks/s2member/issues/160) if you'd like further details.
548
- * (s2Member/s2Member Pro) **Bug Fix** This release adds width/height attributes to the image tags used in the s2Member Security Badges that display on-site (if you enable them); allowing them to pass a W3C validation. See [this GitHub issue](https://github.com/websharks/s2member/issues/157) if you'd like further details.
549
- * (s2Member Pro) **Logging Enhancement** This release improves s2Member's log files with respect to Recurring Profiles created through PayPal Pro (Payflow Edition) and/or Authorize.Net. s2Member's automatic polling routines will now log scenarios where a user's account record is missing the original IPN Signup Vars that should be present on a site running s2Member Pro. See [this GitHub issue](https://github.com/websharks/s2member/issues/104) if you'd like further details.
550
-
551
- = v140520 =
552
-
553
- * (s2Member Pro) **`[s2Member-List /]` Shortcode** Amazing new feature! It is now possible to list members using a powerful shortcode, and even make it possible for members to view and search for each other. See [this KB article](http://www.s2member.com/?p=62860) for all the details on this feature. Very cool!
554
- * (s2Member/s2Member Pro) **Server-Side Validation** For Registration/Profile Fields that you configure on your own (using the s2Member software), there is now support within all areas of the s2Member codebase for both JavaScript and *now server-side validation too*. In the past, all validations applied to custom fields was via JavaScript only. With server-side validation too, now it is impossible for required and/or invalid fields that you configure to go missing. This also resolves a few issues related to spam bots attempting to bypass JavaScript validation. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/99) if you'd like further details.
555
- * (s2Member Pro) **Button Processing Animation**. Improving the processing animation used in submit buttons across Pro-Forms. Instead of a script-based solution (rather jumpy), we are now taking advantage of CSS3 for a much smoother animation. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/114) if you'd like further details.
556
- * (s2Member Pro) **`[s2Drip /]` Shortcode Enhancement** This release adds support for a new `access=""` shortcode attribute that can parse `and` / `or` logic. Also, it is now possible for `[s2Drip /]` to be used with Custom Capabilities too! See [this KB article](http://www.s2member.com/kb/s2drip-shortcode/) for all the details.
557
- * (s2Member/s2Member Pro) **Bug Fix, Custom Fields UI** This release corrects a bug related to the `jquery/.htaccess` file that ships with s2Member. A symptom was to have issues with the Registration/Profile Fields UI and find a JS error in the browser's developer console. Fixed in this release. See also, [this GitHub issue](https://github.com/WebSharks/s2Member/issues/144#issuecomment-43198045) if you'd like further details.
558
- * (s2Member Pro) **Bug Fix, Clickbank HTTPS** This release corrects a bug in the default Auto-Return Page for ClickBank, when/if it's served over the `https` protocol. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/145) if you'd like further details.
559
- * (s2Member/s2Member Pro) **Sortable User Columns** This release adds support for sortable user columns in the Dashboard, where possible. Things like EOT Time, Registration Time, Last Login Time, Total Logins, etc. NOTE: it is currently NOT possible to sort by Custom Registration/Profile Fields (yet). See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/147) if you'd like further details.
560
- * (s2Member/s2Member Pro) **Hook Priority for Translations** This release corrects a bug related to Gettext translations. There were a couple of areas within s2Member that weren't picking up all of the translation entries; caused by a conflict in hook priority. Fixed in this release. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/132) if you'd like further details.
561
- * (s2Member Pro) **`[s2MOP /]` Shortcode Enhancement** A new Replacement Code was added: `%%REQUIRED_LEVEL_LABEL%%`. See [this KB article](http://www.s2member.com/kb/s2mop-shortcode/) and [this GitHub issue](https://github.com/WebSharks/s2Member/issues/129) if you'd like further details.
562
-
563
- = v140423 =
564
-
565
- * (s2Member/s2Member Pro) **WP v3.9 Compatibility**. Resolving an incompatibility between s2Member and WP v3.9 where s2Member was attempting to use the jQuery `highlight` effect no longer available by default; starting with WP v3.9. A symptom of this bug was to have problems closing the dialog box when creating new Registration/Profile Fields with s2Member in the WP Dashboard. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/108).
566
- * (s2Member Pro) **User Export Limitation**. Adding an option to the Import/Export panel used to export Users from your installation of WordPress. This new option makes it possible to specify an exact number of maximum rows to export; instead of the previous behavior which forced to a value of `1000` max. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/80).
567
- * (s2Member Pro) **s2Drip Enhancement**. Updating the s2Drip shortcode to allow for a time frame that specifies `from_day="1" to_day="1"`. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/103). For instructions on how to use the `[s2Drip]` shortcode see [this KB article](http://www.s2member.com/kb/s2drip-shortcode/).
568
- * (s2Member Pro) **s2Drip Enhancement**. Adding support for nested shortcodes inside the `[s2Drip]` conditional shortcode tags. See [this commit](https://github.com/WebSharks/s2Member-Pro/commit/3d042250736a074136924afd5b4030065aff881e) for detailed changes. For instructions on how to use the `[s2Drip]` shortcode see [this KB article](http://www.s2member.com/kb/s2drip-shortcode/).
569
- * (s2Member Pro). **s2MOP Enhancement**. Adding an optional `%%POST_EXCERPT%%` Replacement Code to the `[s2MOP]` shortcode. For further details see [this GitHub issue](https://github.com/WebSharks/s2Member-Pro/pull/11). For instructions on how to use the `[s2MOP]` shortcode see [this KB article](http://www.s2member.com/kb/s2mop-shortcode/).
570
- * (s2Member Pro). **s2MOP Enhancement**. Improving `[s2MOP]` Replacement Codes overall by converting internal slugs into textual labels for an improved user experience. Also making it possible to filter the default labels. See [this GitHub issue](https://github.com/WebSharks/s2Member-Pro/pull/10). For instructions on how to use the `[s2MOP]` shortcode see [this KB article](http://www.s2member.com/kb/s2mop-shortcode/).
571
- * (s2Member Pro) **s2MOP Enhancement**. Adding support for nested shortcodes inside the `[s2MOP]` shortcode. For instructions on how to use the `[s2MOP]` shortcode see [this KB article](http://www.s2member.com/kb/s2mop-shortcode/).
572
- * (s2Member/s2Member Pro) **Time Tracking**. This release begins tracking some additional timestamps to be used by features coming in a future version of s2Member. A new routine was added internally to go ahead and begin tracking some additional timestamps associated with the addition and/or removal of specific Membership Levels and/or Custom Capabilities. A future release of s2Member will take advantage of this data in some of it's shortcodes and API Functions (coming soon). See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/84).
573
- * (s2Member/s2Member Pro) **Bug Fix**. A bug related to domain validation against some of the latest TLDs like `.photography` or `.solutions` has been resolved with this release. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/98).
574
- * (s2Member) **Bug Fix**. The declaration `function ksort_deep` should be `public static function ksort_deep`. Fixed in this release.
575
- * (s2Member/s2Member Pro) **Bug Fix**. s2Member preventing some fields from making it into results provided by `WP_User_Query` on the front-end of a site utilizing this core class. Fixed in this release. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/95).
576
- * (s2Member Pro). **Authorize.Net Trial Limitation**. Updating s2Member Pro to support a 100% free trial period of any length when integrating with Authorize.Net. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/106).
577
- * (s2Member/s2Member Pro) **WP_DEBUG Compatibility**. Resolving several `E_NOTICE` level messages in an ongoing effort to satisfy `WP_DEBUG` mode. For further details, please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/97). See also [issue #105](https://github.com/WebSharks/s2Member/issues/105). See also [issue #91](https://github.com/WebSharks/s2Member/issues/91).
578
-
579
- = v140409 =
580
-
581
- * (s2Member Pro) **s2MOP Shortcode**. A new shortcode is now available for site owners running s2Member Pro: `[s2MOP]`. For further details, please check your Dashboard under: `s2Member → API / Scripting → Membership Options Page / Variables`. See also: [this KB article](http://www.s2member.com/kb/s2mop-shortcode/).
582
- * (s2Member/s2Member Pro) **Compatibility**. Reviewed by Lead Developer Jason Caldwell for full compatibility against WordPress v3.9. s2Member also remains backward compatible with WP v3.3 - 3.8.
583
- * (s2Member/s2Member Pro) **Security Review**. Reviewed by Lead Developer Jason Caldwell to look closer at any portions of s2Member which might be impacted by the [OpenSSL Heartbleed bug](http://heartbleed.com/). Please note, the Heartbleed bug is NOT an s2Member bug. It is a bug in the OpenSSL library used by many services across the web. Please see this [GitHub issue](https://github.com/WebSharks/s2Member/issues/90) where Jason posted a few tips for site owners running the s2Member software.
584
- * (s2Member/s2Member Pro) **s2 MOP Vars**. The format of s2Member's MOP Vars has been updated in this release. Backward compatibility remains for the older formats, so this should not cause any problems for site owners using the older formats provided by previous versions of s2Member. For further details, please check your Dashboard under: `s2Member → API / Scripting → Membership Options Page / Variables`.
585
- * (s2Member/s2Member Pro) **s2 MOP Vars**. s2Member MOP Vars are now an optional feature. It is now possible to disable the additional variables that s2Member appends to the end of your Membership Options Page URL when it redirects a visitor without access to something you've restricted. To configure this new option, please check your Dashboard under: `s2Member → General Options → Membership Options Page`.
586
- * (s2Member/s2Member Pro) **Bug Fix**. Updating core IPN handler to correct a PHP warning `array to string conversion`. A symptom was to see warnings in your PHP error log when using a custom Thank-You page. Fixed in this release.
587
- * (s2Member/s2Member Pro) **Bug Fix**. Updating the new EOT Time column in the list of WP Users so it displays a human readable date and time; as opposed to a UNIX timestamp. Fixed in this release.
588
-
589
- = v140328 =
590
-
591
- * (s2Member/s2Member Pro) **Compatibility**. Updated to support WordPress v3.9. Nothing significant, just minor UI tweaks to make s2Member fully compatible with WP v3.9.
592
- * (s2Member) **Compatibility**. Updating for backward compatibility with WordPress v3.8 - 3.3 by tweaking calls to `get_post()`. See this [commit](https://github.com/WebSharks/s2Member/commit/7b8c8aecc3e8d0d0bada3e80f41615b968a763f8) for further details.
593
- * (s2Member/s2Member Pro) **Translations**. Updating the `includes/translations/s2member.pot` [file](https://github.com/WebSharks/s2Member/tree/000000-dev/s2member/includes/translations) to include the entire set of translation strings for both s2Member and s2Member Pro. Some translation entries from JS files were missing in the previous release due to a glitch in our WP i18n processor. Fixed in this release.
594
- * (s2Member) **Server Check Tool**. Updating the [s2Member Server Scanner](https://www.s2member.com/kb/server-scanner/) to exclude checksum validations against README files. This release includes other scanning improvements also, which allow the tool to do a better job of scanning for compatibility issues.
595
- * (s2Member Pro) **GetResponse Integration**. This release adds support for GetResponse™ as an email service provider. s2Member now comes preintegrated with GetResponse™ (requires s2Member Pro), MailChimp® and AWeber™ too.
596
- * (s2Member) **Double Opt-In Article**. Updating inline documentation to include further details about Double Opt-Ins via [this KB article](http://www.s2member.com/kb/double-opt-in-checkbox/).
597
- * (s2Member) **Compatibility**. Adding support for `$_SERVER['WP_DIR']` (to help developers with a particular edge case). For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/39).
598
- * (s2Member) **Auto-EOT Time Column**. This release adds an Auto-EOT Time column to the list of Users in the WordPress Dashboard. Note: it is possible to show/hide specific columns with the Screen Options tab in WordPress.
599
- * (s2Member) **HTML Trimming**. Adding a new utility method to the s2Member codebase. This [method](https://github.com/WebSharks/s2Member/commit/aa19d23511e9c34a5cc00628285107da9a565594) helps cleanup HTML-based whitespace (and extra line breaks) that are injected inadvertently by some themes when site owners use the `[s2If]` shortcode.
600
- * (s2Member) **Bug Fix**. Fixing an issue related to Login Redirections over SSL. For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/59).
601
- * (s2Member) **All Custom Capabilities**. If your site offers many different CCAPS (Custom Capabilities) and you'd like a way to sell someone access to all of them at once (without needing to list each of them one-by-one); this is now possible. This is accomplished by selling a customer the special CCAP `all_ccaps`. If the `current_user_can('access_s2member_ccap_all_ccaps')`, they will be granted access to ALL Custom Capabilities that you've implemented on the site (now, and in the future). For instance, if the `current_user_can('access_s2member_ccap_all_ccaps')` they can also `access_s2member_ccap_music` even if they don't actually have CCAP `music`. In short, `all_ccaps` grants a customer access to all CCAPS automatically.
602
- * (s2Member) **E_NOTICE**. Updating several areas of the s2Member codebase in an ongoing effort to make s2Member behave as expected when running in `WP_DEBUG` mode. Note that `WP_DEBUG` is NOT recommended for a production site (this mode is reserved for developers only please).
603
- * (s2Member) **Bug Fix**. Fixing a bug related to redirections over SSL in an edge case. See [this GitHub commit](https://github.com/WebSharks/s2Member/commit/881a8f513ff00d1932f33928c771cab38ab84dc7) if you'd like further details.
604
- * (s2Member) **Bug Fix**. Fixing a bug in the way s2Member handles IP Restrictions in one particular area of the source code. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/63) if you'd like further details.
605
- * (s2Member) **File Downloads (Content-Encoding)**. Adding a new configurable option for site owners that use protected File Downloads with s2Member. There is a known issue on some hosting platforms; and this new configurable option provides a workaround that is related to the `Content-Encoding` header. Please see: `Dashboard → s2Member → Download Options → Preventing GZIP Conflicts` to configure this new setting. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/70) if you'd like further details.
606
- * (s2Member) **Apache Compatibility**. Updating s2Member's `.htaccess` files to provide support for the `Require` directive supplied by the `authz_core_module` in the most recent versions of Apache. s2Member also maintains backward compatibility for the `allow/deny` directives used in previous versions of Apache.
607
- * (s2Member Pro) **Gateway-Specific Variables**. Adding gateway-specific variables for use in email templates configured with s2Member. For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/25).
608
- * (s2Member) **Cosmetics**. Updating s2Member's adminitrative menu pages to enhance their appearance in the most recent versions of WordPress. Nothing significant, just minor tweaks.
609
- * (s2Member Pro) **PayPal IPNs**. Adding support for `txn_type` values: `merch_pmt`, `mp_signup`, and `mp_cancel` to enhance s2Member's support for Billing Agreements when integrated together with a PayPal Pro (Payflow Edition) account that processes Express Checkout transactions. This also resolves a bug related to cancellation IPN processing in a specific scenario. Fixed in this release.
610
- * (s2Member Pro) **[s2If][else]**. Requires s2Member Pro. This release adds support for a new `[else]` condition when using the `[s2If]` shortcode to protect parts of your content. For examples, please see: `Dashboard → s2Member → API Scripting → Simple Shortcode Conditionals`. See also: `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`.
611
- * (s2Member Pro) **[s2If php=""]**. Requires s2Member Pro. This release adds support for a new `php` Shortcode Attribute; e.g., `[s2If php=""]`. This makes it possible to use arbitrary PHP code in your `[s2If]` shortcodes. For examples, please see: `Dashboard → s2Member → API Scripting → Simple Shortcode Conditionals`. **Note: this feature is disabled by default.** You must enable the `php` attribute for this to work as expected. Please see: `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals` (with s2Member Pro installed).
612
- * (s2Member) **Bug Fix**. Correcting an issue related to Login Redirections and an E_NOTICE. Please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/75) if you'd like further details.
613
- * (s2Member Pro) **[s2Drip]**. Requires s2Member Pro. This release adds support for a new easy-to-use shortcode that can drip content to paying Members based on their Membership Level. For examples, please see: `Dashboard → s2Member → API Scripting → Content Dripping`.
614
- * (s2Member Pro) **ClickBank**. Adding support for the `vtid` parameter in ClickBank Button Shortcodes. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/44) if you'd like further details.
615
- * (s2Member Pro) **PayPal Express Checkout**. Updating PayPal Express Checkout cancellation links so they will automatically use the PayPal Merchant ID supplied by a site owner (i.e., PayPal's recommended behavior). If you'd like further details please see [this GitHub commit](https://github.com/WebSharks/s2Member-Pro/commit/5efbe35eed352868a956c94e51ab09f8e561892a).
616
- * (s2Member Pro) **Pro-Forms**. Adding a new filter for developers `s2member_pro_cancels_old_rp_before_new_rp`. This is true by default. If you'd like to prevent s2Member from terminating an existing Recurring Profile (before creating a new one); i.e., during an upgrade... you can set this to a FALSE value. Not recommended, but there are a few edge cases where it could be helpful for developers. See also [this GitHub commit](https://github.com/WebSharks/s2Member-Pro/commit/19a84c81070bb0e1869b5dbd9d0325cc458fd016).
617
- * (s2Member Pro) **ClickBank Bug Fix**. Adding support for alphabetics in ClickBank Item Numbers. This bug impacted the ClickBank Button Generator only, it did not prevent alphabetics from being used in a raw Shortcode. Still, this has been resolved now. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/46).
618
- * (s2Member Pro) **PayPal Mobile Bug Fix**. This release corrects a bug related to the `MAXAMT` PayPal specification that is sent via Express Checkout on a mobile device. A symptom of this bug was to sometimes see PayPal's awkward default amount of `$25` when completing checkout on a mobile device. Fixed in this release.
619
- * (s2Member Pro) **PayPal Express Checkout**. This release addresses an issue where a customer reaches PayPal.com with an item description that inadequately reads "Future payment" (i.e., missing the description provided by a site owner). PayPal's latest improvements have made it possible for s2Member to get this right. Resolved in this release.
620
- * (s2Member/s2Member Pro) **Partial Refunds**. This release adds support for Partial Refunds in the s2Member EOT Behavior Options. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/40).
621
-
622
- = v140105 =
623
-
624
- * (s2Member/s2Member Pro) **Compatibility**. Updated to support WordPress v3.8. Nothing significant, just minor UI tweaks in the Login/Registration Design for WordPress v3.8; e.g., `wp-login.php` got some minor improvements in this release of s2Member and s2Member Pro.
625
- * (s2Member) **Compatibility**. PayPal's API for Subscription Cancellation Buttons was changed recently. PayPal now requires a Merchant ID instead of the site owner's email address. This issue has been causing an error when a user attempts to cancel a PayPal Subscription through an s2Member-generated PayPal Subscription Cancellation "Button" (i.e., this affects Buttons only, not Pro-Forms). Fixed in this release. Site owners using PayPal Buttons should update their PayPal Merchant ID for s2Member. Please see: `Dashboard → s2Member → PayPal Options → Account Details`.
626
- * (s2Member/s2Member Pro) **Compatibility**. Default s2Member option value for CSS/JS Lazy Loading is now off instead of on; e.g., s2Member's CSS/JS JavaScript libraries are now loaded on every page by default. Lazy loading must now be enabled by a site owner as a performance enhancement (optional). For further details, please see: `Dashboard → s2Member → General Options → CSS/JS Lazy Loading`.
627
- * (s2Member Pro) **Remote Operations API**. This release introduces two new API methods; `auth_check_user` and `get_user`. These methods (combined with those which already exist in s2Member Pro) now make s2Member Pro's Remote Operations API a pleasure to work with. For further details, please see: `Dashboard → s2Member Pro → API Scripting → Pro Remote Operations API`. Here you will find the API Key for your installation, along with several code samples.
628
- * (s2Member/s2Member Pro) **Logging**. s2Member's core payment gateway processors now log to files `gateway-core-ipn.log` and `gateway-core-rtn.log`. These log file names were changed in this release. In previous versions of s2Member these log entries were kept inside `paypal-ipn.log` and `paypal-rtn.log`.
629
- * (s2Member/s2Member Pro) **Updates**. The XML/RSS feed box for the most recent s2Member Updates (for site owners only; in the Dashboard); has been updated to our newest feed location at: `http://feeds.feedburner.com/s2member`.
630
- * (s2Member/s2Member Pro) **Bug Fix**. s2Member should follow redirects in API calls to Amazon.com. See: <https://github.com/WebSharks/s2Member/issues/35> for further details.
631
- * (s2Member/s2Member Pro) **Bug Fix**. By default, do not count login IP Restrictions against users who can `edit_posts`. See: <https://github.com/WebSharks/s2Member/issues/32> for further details.
632
- * (s2Member/s2Member Pro) **Bug Fix**. Sleep offset to `10` seconds for `subscr_eot`. See <https://github.com/WebSharks/s2Member/issues/34> for further details.
633
- * (s2Member/s2Member Pro) **Enhancement**. Updating the "s2" icon in the Dashboard to our most recent version.
634
- * (s2Member Pro) **Bug Fix**. s2Member Pro now accepts `TOO MANY FAILURES` as an EOT response type status under PayPal Pro (Payflow Edition) accounts. This was previously causing a problem against newer PayPal Pro accounts (w/ the Payflow Edition); whereby some customers who were reaching Max Failed Payments were not being demoted properly in all cases. Fixed in this release.
635
- * (s2Member/s2Member Pro) **Compatibility**. Adding support for `$_SERVER['HTTP_AUTHORIZATION']` when s2Member is used for Remote Auth file hosting. Some servers do not support `$_SERVER['PHP_AUTH_USER']`. Instead, s2Member can get the username/password by parsing them out of `$_SERVER['HTTP_AUTHORIZATION']` when/if necessary. Fixed in this release.
636
- * (s2Member/s2Member Pro) **PHP Debug Notices.** Updating s2Member's source code to further prevent PHP debug notices when running in `WP_DEBUG` mode. This is part of an ongoing effort keep s2Member running smoothly in PHP strict mode; and to maintain conformity with WordPress standards.
637
- * (s2Member Pro) **Bug Fix**. Define `abbr_bytes()` method as static to prevent issues during automatic upgrades of s2Member Pro. Please see <https://github.com/WebSharks/s2Member/issues/37> for further details.
638
- * (s2Member/s2Member Pro) **Backward Compatibility.** Updating calls to `get_post()`. We're adding a `NULL` argument via `$null` to prevent warnings in older releases of WordPress where an argument was required; e.g., `$null = NULL; get_post($null)`.
639
-
640
- = v131126 =
641
-
642
- * (s2Member Pro) **Google Wallet.** s2Member Pro now supports [Google Wallet for Digital Goods](https://developers.google.com/commerce/wallet/digital/).
643
-
644
- In the past we offered support for Google "Checkout" (Google "Checkout" is no longer available as of November 2013). s2Member's previous integration with Google Checkout has now been fully updated to support Google "Wallet" for Digital Goods. To enable Google Wallet in your installation of s2Member Pro, please see: `Dashboard → s2Member Pro → Other Gateways → Google Wallet`. For setup instructions, please see: `Dashboard → s2Member Pro → Google Options`.
645
-
646
- At the time of this writing, there are no KB articles related to Google Wallet at s2Member.com (yet); these will come soon. Until then, you might find it helpful to review dev notes by Jason Caldwell (Lead Developer). Please see: <https://github.com/WebSharks/s2Member/issues/19>.
647
-
648
- We also suggest that you review the documentation in your Dashboard under: `s2Member Pro → Google Options` and `s2Member Pro → Google Buttons`. If you were previously using Google "Checkout", please review [this notice posted by Google](https://support.google.com/checkout/sell/answer/3080449?hl=en).
649
- * (s2Member/s2Member Pro) **Bootstrap Compatibility.** s2Member has been updated throughout to support the [Twitter Bootstrap](http://getbootstrap.com/) CSS framework when running on a WordPress theme that's been built on Bootstrap. For instance; profile editing forms, custom registration/profile fields, s2Member Pro-Forms for checkout/registration; these will now look good on sites powered by Bootstrap. This change has no impact on functionality, only on appearance; and only IF your site is powered by Bootstrap. Throughout s2Member's HTML code we've added CSS class names that follow a Bootstrap standard. These Bootstrap classes are blended together with default structural styles that makes s2Member compatible with all WordPress themes. This way s2Member (and s2Member Pro) can produce a clean/professional appearance on just about any WordPress theme; and now Bootstrap is supported too!
650
- * (s2Member Pro) **Configurable Emails.** We've added new configuration panels into the s2Member UI for a Modification Confirmation Email and also for the Custom Capability Confirmation Email. These are now configurable for all payment gateways integrated with s2Member Pro; e.g., AliPay, ccBill, ClickBank, Google Wallet, Authorize.Net, PayPal Standard, and PayPal Pro. These emails have always existed, but up until now customization required a WordPress filter. Now it's easier, you can customize these from the Dashboard! Please note: this feature comes only with s2Member Pro. As one example, please check your Dashboard under: `s2Member Pro → PayPal Options → Modification Confirmation Email`.
651
- * (s2Member/s2Member Pro) **Snippets/Redirects.** Snippets and Redirects no longer carry the s2Member Restriction Options meta box in the Post/Page editing station; there's no need for Restrictions against these two special Post Types. This change, together with the latest improvements in these two plugins: [WP Snippets](http://wordpress.org/plugins/wp-snippets/) and [WP Redirects](http://wordpress.org/plugins/wp-redirects/) (also produced by our team) offer a more powerful solution now that all of these plugins are more compatible with each other.
652
- * (s2Member/s2Member Pro) **Backward Compatibility.** Updating calls to `get_post()`. We're adding a `NULL` argument to prevent warnings in older releases of WordPress where an argument was required; e.g., `get_post(NULL)`.
653
- * (s2Member/s2Member Pro) **Forward Compatibility.** Adding support for the `relative` scheme in SSL filters that deal with `set_url_scheme()` in the latest versions of WordPress. This improves s2Member's "force SSL mode" where a site owner sets the Custom Field for a Post/Page; e.g., `s2member_force_ssl` is set to `yes`. This change will better support themes/plugins that use absolute relative paths together with WordPress core functions like `site_url()` and `home_url()`.
654
- * (s2Member/s2Member Pro) **PHP Debug Notices.** Updating s2Member's source code to further prevent PHP debug notices when running in `WP_DEBUG` mode. This is part of an ongoing effort keep s2Member running smoothly in PHP strict mode; and to maintain conformity with WordPress standards.
655
- * (s2Member Pro) **Unlimited Membership Levels.** Updating the built-in software documentation for s2Member Pro to cover an edge case where a site owner many choose to exceed the recommended maximum for Membership Levels when running s2Member Pro. If you intend to use more than `100` Membership Levels (this is not recommended); but if you do, please see: `Dashboard → s2Member Pro → General Options → Membership Levels/Labels` for the latest details on this.
656
- * (s2Member/s2Member Pro) **Dropping IE8 Support.** s2Member and s2Member Pro will no longer support IE8 in any official capacity. s2Member's HTML output and CSS files have been cleaned up; and all hacks related to IE8 have been removed. Out with the old, in with the new! We need to keep s2Member up-to-date with the latest improvements offered by IE9 and other modern browsers. While s2Member may continue to function relatively well in IE8, hacks used in the past to accomodate edge cases in this buggy browser have been removed in favor of standards compliance.
657
- * (s2Member/s2Member Pro) **Lazy Loading CSS/JS.** s2Member now offers site owners the option to enable/disable lazy loading of CSS/JS libraries provided by the s2Member software. For further details, please see: `Dashboard → s2Member → General Options → CSS/JS Lazy Loading`.
658
- * (s2Member/s2Member Pro) **Bug Fix.** s2Member and s2Member Pro have both been updated to prevent spaces in a comma-delimited list of Custom Capabilities; e.g., `ccaps="music, videos"` should be `ccaps="music,videos"` please. Spaces in this list have never been allowed, but now there is better server-side validation to prevent this from happening; reducing the chance of error when a site owner configures a Button or Pro-Form shortcode with s2Member.
659
- * (s2Member/s2Member Pro) **Other Minor Bug Fixes.** Please see: <https://github.com/WebSharks/s2Member/commits/000000-dev>
660
-
661
- = v131109 =
662
-
663
- * (s2Member/s2Member Pro) **UI Makeover** This release of s2Member upgrades all administrative UI panels.
664
- * (s2Member/s2Member Pro) **Compatibility** Updating s2Member for compatibility with the coming release of both Quick Cache LITE and Quick Cache Pro for WordPress. These are not available publicly yet, but they are expected for release very soon. This release of s2Member is compatible with both the current and future releases of Quick Cache for WordPress.
665
- * (s2Member/s2Member Pro) **Improvement (Speed)** Lazy load s2Member's JS file at all times. Done, this release will speed your site up for first-time visitors.
666
- * (s2Member/s2Member Pro) **Improvement (Speed)** Lazy load s2Member's CSS file at all times. Done, this release will speed your site up for first-time visitors.
667
- * (s2Member/s2Member Pro) **Improvement (Speed)** Load s2Member's JS library in the footer if at all possible (instead of the `<head>`). Done, this will improve the speed of your site for first-time visitors.
668
- * (s2Member/s2Member Pro) **Debug Notices** Resolved all of the most obvious PHP notices when running s2Member in debug mode. This improvement impacts developers only.
669
- * (s2Member/s2Member Pro) **Password Strength Meter** Removed dependence on `password-strength-meter` (a JavaScript library) from the WordPress core. This was causing some SSL issues for site owners. In the past it was necessary for s2Member to load an additional JS resource for registration/checkout and Pro-Forms (`password-strength-meter`). Starting with this release, s2Member handles password strength meters all by itself, thereby avoiding the additional overhead; and also the issues associated with this core functionality over SSL pages. Fixed in this release.
670
- * (s2Member/s2Member Pro) **Mobile Devices** The s2Stream shortcode (for protected audio/video files) was updated to better support mobile device playback. See also: <http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#s2stream-mobile-devices>.
671
- * (s2Member Pro) **Checkout Options** Improving support for multiple Checkout Options. When a customer changes to a new Checkout Option by selecting an option from the drop-down menu in a Pro-Form; this action will now result in a hash jump back to the location of the Pro-Form on any given page; instead of to the top of the page, which could potentially result in a confusing experience on some sites (depending on the implementation). Aside: for developers, it's helpful to know that all s2Member Pro-Forms now have a hashable ID `#s2p-form` that is cleaner than the longer (product-specific) IDs associated with Pro-Forms; e.g., `s2member-pro-paypal-form...`, etc. If you need to hash a Pro-Form, please use the more general `#s2p-form` on the end of a URL. This will take a customer directly to that Pro-Form in the context of any given page.
672
-
673
- = v131026 =
674
-
675
- * (s2Member) **WordPress v3.7 Compatibility** s2Member further updated to support subtle changes in the WordPress v3.7 `wp-login.php` file. This release corrects a minor issue w/ patches applied by s2Member when running in a Multisite Network environment. If you are running s2Member on a Multisite Network, please be sure to run the automatic patcher provided in your Dashboard against WordPress v3.7 after updating to this release of s2Member.
676
- * (s2Member Pro) **PayPal Central IPN** Updating the example file: `s2m-pro-extras/paypal-central-ipn.php` to use one of the latest PayPal IP addresses listed [here](https://ppmts.custhelp.com/app/answers/detail/a_id/92).
677
-
678
- = v131025 =
679
-
680
- * (s2Member) **WordPress v3.7 Compatibility** s2Member updated to support WordPress v3.7. s2Member remains compatible with WP v3.3 (or higher).
681
- * (s2Member Pro) **New Feature: Simultaneous Login Monitoring** Available only w/ s2Member Pro. s2Member Pro has been updated to support configurations that limit the number of simultaneous logins a single username can receive. For further details, please see: `Dashboard → s2Member → Restriction Options → Simultaneous Login Restrictions` (when s2Member Pro is installed).
682
- * (s2Member) **Post Restrictions (#3)** Adding support for `all-[post type]` in addition to the existing `all-[post type]s` (plural) currently supported by s2Member's Restriction Options for Posts. This makes it possible for a site owner to type only the Post Type after the keyword prefix `all-`; and excluding the plural `s` in cases when this is necessary.
683
- * (s2Member) **Documentation Update (#3)** Adding note in Download Options panel regarding `raw` shortcode tags around Shortcodes when using the inFocus theme. See also [this thread](http://mysitemyway.com/support/topic/infocus-adding-tags-into-plugin-content) for further details.
684
- * (s2Member) **Documentation Cleanup (#12)** General cleanup in several s2Member panels to improve inline documentation that comes w/ the software. Branding improvements, padding adjustments, and subtle textual changes.
685
- * (s2Member) **Bug Fix (#11)** Running `isset()` against `$cache_needs_updating` to prevent NOTICE when running in `WP_DEBUG` mode.
686
- * (s2Member) **Optimization (#9)** Removing all image source files (.fla and .pspimage) from the official distribution package to reduce overall filesize.
687
- * (s2Member) **Quick Start Video (#10)** Adding Quick Start playlist to Quick Start section.
688
- * (s2Member) **UI (#6)** Reducing padding around section headers in s2Member option panels to reduce the amount of space these consume.
689
- * (s2Member Pro) **SSL** Forcing all automatic updates of s2Member Pro to occur over SSL for improved security.
690
- * (s2Member) **Login Welcome Page** Improving support for new feature (force HTTP redirection). See: `s2Member → General Options → Login Welcome Page` for details on how this feature works.
691
- * (s2Member) **Bug Fix: Registration/Profile Fields** Adding space between checkboxes and their labels.
692
- * (s2Member) **ClickBank IPN Filter** Adding a new filter to s2Member's ClickBank IPN handler for developers integrating s2Member in creative ways: `c_ws_plugin__s2member_pro_clickbank_notify_handles_completions`. Defaults to a TRUE value. Forcing this filter to a FALSE value will prevent s2Member from handling term completions via IPN communication; in cases where it's preferred that a site owner deal with this specific scenario manually.
693
- * (s2Member) **Conformity** Updating calls to `$wpdb->escape` changing to `esc_sql` to conform w/ WordPress standards.
694
- * (s2Member Pro) **Compatibility: Checkout Options** Improving theme support for Checkout Options created using Pro-Forms by wrapping other Pro-Form Shortcodes. Some site owners reported line break injections in the previous verison. Fixed in this release.
695
- * (s2Member) **See also: s2Member Repo** https://github.com/WebSharks/s2Member/commits/000000-dev
696
-
697
- = v130816 =
698
-
699
- * (s2Member Pro) **Compatibility, ClickBank (#467)** Improving support for ClickBank PitchPlus Upsell Flows. Please see [this thread](http://www.s2member.com/forums/topic/clickbank-buttons-not-working/#post-55725) for further details.
700
- * (s2Member/s2Member Pro) **User Search on Multisite Networks (#468)** User search functionality was partially broken for Child Blogs in a Multisite Network after some improvements were implemented in s2Member® v130731. The issue has now been corrected in this release for Multisite Networks. For further details, please see [this thread](http://www.s2member.com/forums/topic/user-search-no-longer-working/#post-55778).
701
- * (s2Member/s2Member Pro) **Z-Index in Menu Pages (#461)** Stacking order against a WordPress® installation running a Dashboard with a collapsed sidebar menu (left side) was causing some UI problems. Fixed in this release.
702
- * (s2Member/s2Member Pro) **SSL Compatibility (#437)** Adding a new option in the `s2Member® → General Options → Login Welcome Page` section. The default value for this new option is always `yes`. However, the default functionality can be turned off (if you prefer). This new option allows site owners to better integrate with a core WordPress® feature commonly referred to as `FORCE_SSL_LOGIN` and/or `FORCE_SSL_ADMIN`. This new feature can be used, or not. It is intended mainly for site owners running w/ `FORCE_SSL_LOGIN` and/or `FORCE_SSL_ADMIN`.
703
- * (s2Member/s2Member Pro) **Login/Registration Design Option (#437)** Adding a new option in the `s2Member® → General Options → Login/Registration Design` section. This new option (found at the bottom of `s2Member® → General Options → Login/Registration Design`) allows a site owner to show/hide the `Back To Home Page` link at the bottom of the default WordPress® Login/Registration system. This can be useful for site owners running w/ `FORCE_SSL_LOGIN` and/or `FORCE_SSL_ADMIN`; where they would prefer NOT to link customers back to the main site under a default HTTPS link; but rather, create their own link and gain better control over this area of their site.
704
- * (s2Member/s2Member Pro) **Videos (#467)** Updating internal documentation found in `Dashboard → s2Member® → Quick-Start`. Specifically, the video player here was integrated with an older version of the YouTube® API and was not working properly. Fixed in this release.
705
-
706
- = v130802 =
707
-
708
- * (s2Member Pro) **Compatibility, WordPress® v3.6** Updating s2Member® Pro-Form templates and their underlying CSS. This update improves their appearance against the Twenty Thirteen theme that comes with WordPress® v3.6. Specifically, some of the Pro-Form buttons were a little out of place in this new default theme. Fixed in this release.
709
- * (s2Member Pro) **Compatibility, Checkout Options (#443)** Revision 3. Updating this feature to support a wider variety of WordPress® configurations and content filters. This update also resolves an empty `desc=""` attribute error reported by some site owners. Feature description... It is now possible to build dropdown menus offering your customers a variety of options using a Single Pro-Form. This is accomplished quite easily using Shortcodes. For full details and examples, please check this section of your Dashboard in the latest release. See: `s2Member® → PayPal® Pro-Forms → Wrapping Multiple Shortcodes as "Checkout Options"`. NOTE: this works for PayPal® Pro-Forms, and ALSO for Authorize.Net Pro-Forms.
710
-
711
- = v130801 =
712
-
713
- * (s2Member Pro) **New Feature; Checkout Options (#403)** Revision 2. Updating documentation on this new feature to prevent conufusion for site owners. s2Member® Pro now supports "Checkout Options". It is now possible to build dropdown menus offering your customers a variety of options using a Single Pro-Form. This is accomplished quite easily using Shortcodes. For full details and examples, please check this section of your Dashboard in the latest release. See: `s2Member® → PayPal® Pro-Forms → Wrapping Multiple Shortcodes as "Checkout Options"`. NOTE: this works for PayPal® Pro-Forms, and ALSO for Authorize.Net Pro-Forms.
714
-
715
- = v130731 =
716
-
717
- * (s2Member Pro) **New Feature; Checkout Options (#403)** s2Member® Pro now supports "Checkout Options". It is now possible to build dropdown menus offering your customers a variety of options using a Single Pro-Form. This is accomplished quite easily using Shortcodes. For full details and examples, please check this section of your Dashboard in the latest release. See: `s2Member® → PayPal® Pro-Forms → Wrapping Multiple Shortcodes as "Checkout Options"`. NOTE: this works for PayPal® Pro-Forms, and ALSO for Authorize.Net Pro-Forms.
718
- * (s2Member Pro) **Free Checkout (#403)** It is now possible to offer a 100% free checkout experience using any of s2Member's Pro-Form Shortcodes. In previous releases of s2Member® it was not possible to set the `ra=""` Attribute to a zero dollar amount. Now it is! This works for PayPal® Pro-Forms, and also for Authorize.Net Pro-Forms.
719
- * (s2Member Pro) **100% Off Coupons (#403)** It is now possible to offer a 100% off coupon. This works for PayPal® Pro-Forms, and also for Authorize.Net Pro-Forms. See: `s2Member® → Pro Coupon Codes` for details and examples.
720
- * (s2Member Pro) **Expiration Date Dropdowns (#428)** This release improves all s2Member® Pro-Form templates by adding dropdown menus for the customer's credit card expiration month/year instead of the simple text input field used in previous releases.
721
- * (s2Member/s2Member Pro) **MySQL Wait Timeout (#349)** s2Member now automatically increases the MySQL `wait_timeout` to `300` seconds during s2Member processing routines. Reason for increase: should any 3rd party service API result in unexpected connection timeouts (such as PayPal, Authorize.Net, Amazon, MailChimp, AWeber, etc); this may cause a delay that could potentially exceed the default `wait_timeout` of `30` seconds on the MySQL resource handle that is global to all of WordPress. Increasing `wait_timeout` before transaction processing will decrease the chance of failure after a timeout is exceeded. Among other things, this resolves an elusive bug where there are mysterious 404 errors after checkout under the right scenario (e.g., when an unexpected timeout occurs). This may also resolve problems associated w/ some mysterious reports where emails were not sent during s2Member's attempt to complete post-processing of a transaction (and/or where other portions of post-processing failed under rare circumstances).
722
- * (s2Member/s2Member Pro) **Alternative Views (#300)** This release gives s2Member® the ability to hide protected content in widgets that list protected WordPress® Pages. This is a new Alternative View in the Dashboard. See: `s2Member® → Restriction Options → Alternative Views` for further details please.
723
- * (s2Member/s2Member Pro) **Documentation Update (#350)** Subtle improvements to the built-in documentation pertaining to s2Member's Automatic List Transitioning feature in the Dashboard. See: `s2Member® → API/List Servers → Automatic Unsubscribes` for further details please.
724
- * (s2Member/s2Member Pro) **Bug Fix (#387)** In s2Member® Only mode, a recursive scan for the WordPress® `/wp-load.php` file was failing somtimes when/if a custom directory was configured for plugins. Fixed in this release. See [this thread](http://www.s2member.com/forums/topic/problem-with-wordpress-folder-search-code/) for further details.
725
- * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed incorrect pagination of user search results in the Dashboard.
726
- * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed slow query against user searches in the Dashboard.
727
- * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed incorrect result totals under some rare scenarios in user search results.
728
-
729
- = v130617 =
730
-
731
- * (s2Member/s2Member Pro) **IP Restrictions (#148)** It is now possible to introduce a custom template file that controls the error message displayed when/if a user breaches security by exceeding your maximum unique IP addresses; as configured under `s2Member → Restriction Options → Unique IP Restrictions`. If you would like to use a custom template for this message, please copy the default template file from `/s2member/includes/templates/errors/ip-restrictions.php` and place this file into your active WordPress® theme directory (or into the `/wp-content/` directory if you prefer). s2Member will automatically find your custom template in one of these locations; and s2Member will use your custom template instead of the built-in default.
732
- * (s2Member Pro) **Bug Fix (#302)** Updating Authorize.Net Pro-Form Generator to support max days of `365` instead of `7`.
733
- * (s2Member Pro) **Amazon S3 Secret Access Keys (#321)** Updating UI configuration panel to better explain what a Secret Access Key is; and adding a note about Secret Access Keys for Amazon S3 integration. Amazon® is deprecating Secret Access Keys, but they ARE still required for digitally signed URLs. This update changes nothing in s2Member's functionality. It simply adds some additional detail to a configuration field that will assist site owners integrating s2Member w/ Amazon S3 for the first time.
734
- * (s2Member/s2Member Pro) **Translations (#317)** Updating `/s2member/includes/translations/translations.txt` (README file). Adding blurp about fuzzy translation entries in existing PO files that translate s2Member. This contains some additional tips on how to update existing PO files upon each release of s2Member and/or s2Member Pro.
735
- * (s2Member/s2Member Pro) **Bug Fix (#321)** Fixing bug in `/s2member/includes/templates/cfg-files/s2-cross-xml.php` for S3 Buckets (resulting in `crossdomain.xml`). This file contained a parse error and was causing some problems for site owners integrating Adobe Flash content served via Amazon S3. Fixed in this release.
736
- * (s2Member Pro) **PayPal Pro-Forms (#315)** Adding note in the Dashboard here (`s2Member → PayPal Pro-Forms → Shortcode Attributes Explained`). In the list of Shortcode Attributes we are adding a note regarding max character length for the `desc=""` Attribute in a PayPal Pro-Form Shortcode. This can be as long as you like. However, all descriptions passed through PayPal® APIs are truncated automatically to 60 characters max (e.g., the maximum allowed length for PayPal® descriptions is 60 characters). Nothing new here, but we thought it would be a good idea to clarify this behavior in the documentation. Updated in this release.
737
- * (s2Member Pro) **PayPal Pro-Forms (#312)** Preventing the use of multiple Pro-Forms in the same Post/Page. This has never been possible, it is known to break the functionality of s2Member Pro-Forms. Please limit Pro-Form Shortcodes to ONE for each Post/Page; and do NOT attempt to use more than one Pro-Form Shortcode on the same Post/Page (at the same time). In this release we have added a friendly JavaScript alert/warning for site owners that attempt this, so that problems and confusion can be avoided in this unlikely scenario.
738
-
739
- = v130513 =
740
-
741
- * (s2Member/s2Member Pro) **s2Stream Shortcode Bug Fix (#256)** Fixing a bug first introduced in the previous release where we added support for `player_aspectratio`. This quick update corrects the PHP parse error at line #154 of `sc-files-in.inc.php`. It also corrects the behavior of the `player_height=""` and `player_aspectratio=""` Shortcode Attributes for the `s2Stream` Shortcode. Many thanks to everyone that reported this bug.
742
- * (s2Member Pro) **Codestyling Localization** Removing symlink creator for Codestyleing Localization compatibility. There have been some reports of problems during WordPress® automatic upgrades (when/if the symlink exists). Until we can find a way to avoid this, we're disabling the automatic symlink generator. If you're running the Codestyling Localization plugin together with s2Member Pro, you will need to create the symlink yourself if you want to make s2Member fully compatible. Please create a symlink here: `/wp-content/plugins/s2member/s2member-pro` that points to the s2Member Pro directory: `/wp-content/plugins/s2member-pro`. See notes in previous changelog for further details on this.
743
-
744
- **IMPORTANT NOTE:** If you upgraded previously to v130510 (and you ran the Codestyling Localization plugin together with s2Member® v130510—at any time); please delete this symlink via FTP: `/wp-content/plugins/s2member/s2member-pro`. Please do this BEFORE attempting an automatic upgrade via WordPress®.
745
-
746
- If you missed this note and you've already attempted an automatic upgrade, you will have trouble. Here's how to correct the problem.
747
-
748
- 1. Log into your site via FTP and delete these two directories manually.
749
- `/wp-content/plugins/s2member` and `/wp-content/plugins/s2member-pro`.
750
-
751
- 2. Now, please follow the [instructions here](http://www.s2member.com/pro/#!s2_tab_jump=s2-pro-install-update) to upgrade s2Member® Pro manually.
752
-
753
- = v130510 =
754
-
755
- * (s2Member Pro) **Authorize.Net UK (and Other Currencies) (#104)** Adding support for Authorize.Net UK and other currencies too. s2Member Pro now officially supports Authorize.Net UK Edition. It is now possible to change your Authorize.Net Pro-Form Shortcode Attribute `cc="USD"` to one of these values: `cc="USD"`, or `cc="CAD"` or `cc="EUR"` or `cc="GBP"`. For further details, please see: `Dashboard → Authorize.Net Pro-Forms → Shortcode Attributes (Explained)`.
756
- * (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard → ClickBank Buttons → Shortcode Attributes (Explained)`.
757
- * (s2Member Pro) **ClickBank PitchPlus Upsell Flows (#227)** Adding support for ClickBank PitchPlus Upsell Flows via new Shortcode Attributes: `cbfid=""`, `cbur=""`, `cbf="auto"`. s2Member Pro now officially supports ClickBank PitchPlus Upsell Flows. We support PitchPlus Basic and PitchPlus Advanced too. For further details, please see: `Dashboard → ClickBank Buttons → Shortcode Attributes (Explained)`.
758
- * (s2Member/s2Member Pro) **Codestyling Localization** Adding automatic symlink creator for improved compatibility with the CodeStyling Localization plugin. A symlink is created automatically whenever the CodeStyling Localization plugin is installed, and s2Member® Pro is installed as well. The symlink allows the CodeStyling Localization plugin to scan files from the s2Member® Pro directory too; instead of only scanning the s2Member® Framework directory. s2Member and s2Member Pro are now both compatible with the Codestyling Localization plugin (optional).
759
- * (s2Member/s2Member Pro) **Custom Templates w/ s2Stream Shortcode** Adding support for custom templates to be used in conjunction with the `s2Stream` Shortcode. It is now possible to take the default player templates from `/s2member/includes/templates/players/` and put these files inside your own WordPress® theme directory (or inside the `/wp-content/` directory). s2Member will automatically find your template files in these locations. Your custom template files will then be used instead of the built-in defaults.
760
- * (s2Member/s2Member Pro) **Bug Fix (#59)** Resending a password to a User from the Dashboard (while changing the User's email address at the same time); resulted in the email being sent to the previous email address instead of the new one. Fixed in this release.
761
- * (s2Member/s2Member Pro) **Bug Fix (#216)** Removing `-MultiViews` from s2Member's `.htaccess` file in the `/s2member-files/` directory. This improves compatibility with some Apache installations that simply have `AllowOverride All`; because `All` may not include `MultiViews` in some versions of Apache.
762
- * (s2Member/s2Member Pro) **IP Restrictions (#149)** In the Dashboard, we now report if a User is at (or above) max allowable IPs; instead of reporting only if they have actually triggered an internal security breach (which times out quickly in most cases). Fixed in this release.
763
- * (s2Member/s2Member Pro) **Enhancing JW Player Integration (#251)** Adding support for s2Stream Shortcode Attribute `player_aspectratio="12:5"` (as one example). See also [this post](http://www.longtailvideo.com/blog/32697/new-in-jw-player-responsive-design) at Longtail Video.
764
- * (s2Member Pro) **Updating Payflow Integration (#193)** Removing DAILY `D` option for Payflow Recurring Billing. No longer supported by Payflow. However, s2Member will let a `D` value slip by Shortcode Attribute validation in case a site owner has arranged for this to become available against their Payflow account somehow; and to remain backward compatible with previous versions of s2Member Pro. Moving forward, it is NO longer possible to bill customers on a daily basis with PayPal Payments Pro (Payflow Edition). This is a PayPal limitation.
765
- * (s2Member Pro) **Updating Payflow Integration w/ Payflow Bug Workaround (#193)** Updating Payflow integration to support Billing Agreement IDs (aka: `BAID` values) when working together with Payflow Express Checkout APIs (and where a site owner is charging on a recurring basis).
766
-
767
- This improvement also allows s2Member to work around a Payflow bug where `BILLINGTYPE=RecurringPayments` results in error `#7 (Invalid/Expired TOKEN)` whenever Payflow attempts to rebill a customer. s2Member now sets `BILLINGTYPE=RecurringBilling`; and we pass `BAID=B-xxxxxx` instead of passing `TOKEN=xxxxxx`.
768
-
769
- Site owners also need to [contact PayPal MTS](http://www.paypal.com/mts) and ask to have `Reference Transactions` (free) enabled for `Recurring Billing` service. ~ However, you ONLY need `Recurring Billing` service and `Reference Transactions` enabled IF you're operating a PayPal Payments Pro (Payflow Edition) account; and only IF you're charging customers on a recurring basis.
770
-
771
- All of these changes related to Payflow (as detailed in this changelog entry), impact only ONE specific scenario.
772
- - You have a PayPal Payments Pro (Payflow Edition) account.
773
- - You charge your customers on a recurring basis.
774
- - A customer chooses PayPal as their billing method during checkout.
775
-
776
- No other part of s2Member's integration with Payflow was modified in this release.
777
-
778
- For further details, please see [this thread](http://www.s2member.com/forums/topic/paypal-expired-security-token/page/2/) (or monitor the [s2Member KB](http://www.s2member.com/kb/) for new articles on this subject).
779
- * (s2Member Pro) **Payflow API Docs** Updating `s2m-pro-extras.zip` to include the latest versions of the PayPal Pro (Payflow Edition) APIs. s2Member Pro customers can download this optional ZIP file from their My Account page at s2Member.com. These are extras only, they are NOT part of the s2Member application.
780
- * (s2Member Pro) **Google Checkout Bug Fix (#214)** Updating s2Member's Google Checkout integration to properly support the `rrt` Shortcode Attribute. Fixed in this release. For further details please see [this thread](http://www.s2member.com/forums/topic/google-recurring-problem/#post-48218).
781
- * (s2Member Pro) **Username Validation (#246)** Now forcing user input (during Pro-Form registration) to lowercase on Multisite Networks to prevent unnecessary validation errors during checkout (saving a customer time). Also, s2Member now validates a customer's Username before it is passed through `sanitize_user()` (a core WordPress® function). This prevents confusion for a customer where certain characters were stripped out automatically, causing them problems when attempting to log in for the first time (e.g., the customer thinks their Username is `john~doe`; when it is actually `johndoe` because WordPress (when running a Multisite Network) removes anything that is NOT `a-z0-9 _.-@` (and s2Member removes whitespace as well).
782
-
783
- = v130406 =
784
-
785
- * (s2Member/s2Member Pro) **Multisite Networks (#145)** Bug fix on Multisite Networks related to User deletions and subsequent logins on child blogs. For further details, please see [this thread](http://www.s2member.com/forums/topic/deleted-users-can-log-in/#post-46738).
786
- * (s2Member Pro) **New Feature (#59)** It is now possible to Edit a User in the Dashboard and check a box to have the User's password reset, and an email message sent automatically to the User/Member with a copy of the Username/Password. This requires s2Member® Pro.
787
- * (s2Member Pro) **API Functions (#158)** New PayPal® Pro API Functions (`s2member_pro_paypal_rbp_for_user`, `s2member_pro_paypal_rbp_times_for_user`). These are for developers. For further details, please see [this article](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) in the s2Member® Codex.
788
- * (s2Member Pro) **API Functions (#158)** New PayPal® Pro (PayFlow® Edition) API Functions (`s2member_pro_payflow_rbp_for_user`, `s2member_pro_payflow_rbp_times_for_user`). These are for developers. For further details, please see [this article](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) in the s2Member® Codex.
789
-
790
- = v130404 =
791
-
792
- * (s2Member Pro) **Compatibility (#108)** Updating s2Member® Pro's integration with Authorize.Net to allow charges up to `$99,999.00` (formerly `$10,000.00`).
793
- * (s2Member/s2Member Pro) **User Searches (#91)** Updating `pre_user_query` filter to include `first_name/last_name` (instead of only the `display_name`).
794
- * (s2Member/s2Member Pro) **bbPress Integration (#88)** Updating bbPress Role/Cap filter to exclude itself during bbPress deactivation. This was causing a loss of the `read` Capability inadvertently.
795
- * (s2Member/s2Member Pro) **PayPal® 20% Rule (#100)** Removing mention of the PayPal® 20% rule/limitation in the inline documentation. We confirmed with PayPal this ridiculous rule no longer applies to PayPal Standard Buttons.
796
- * (s2Member/s2Member Pro) **File Downloads (#73)** Fixed bug related to `%2F` in file download URLs leading to a `ccap` directory.
797
- * (s2Member/s2Member Pro) **Debug Logging (#69)** Logging now disabled by default. New log recommendation/warning notices updated throughout all menu pages for s2Member®.
798
- * (s2Member/s2Member Pro) **Debug Logging (#69)** Logging must now be disabled (and the logs directory must be non-existent or empty) for an s2Member® Security Badge to go green. There is only one way to bypass this security check. See KB Article: [s2Member® Security Badges](http://www.s2member.com/kb/security-badges/). Notices are displayed on activation of this version to warn site owners about this change.
799
- * (s2Member/s2Member Pro) **JW Player (#121)** Adding CSS `class` attribute to all JW Player template files used in conjunction with the `s2Stream` shortcode. New CSS class name: `s2member-jwplayer-v6`.
800
- * (s2Member/s2Member Pro) **JW Player (#121)** Adding support for percentage-based width/height values in `player_width="" player_height=""` attributes of an s2Stream shortcode that generates a JW Player. Example: `player_width="100%"`.
801
-
802
- = v130221 =
803
-
804
- * (s2Member/s2Member Pro) **Bug Fix (#41)** Custom Registration/Profile Fields with an ID that ended with `-[0-9]+` or `_[0-9]+` was failing JavaScript validation due to a parsing issue. Fixed in this release.
805
- * (s2Member/s2Member Pro) **Bug Fix (#43)** A bug first introduced in the last release of s2Member® v130220 was preventing Administrative New User Notifications from being sent by s2Member®. Fixed in this release.
806
-
807
- = v130220 =
808
-
809
- * (s2Member Pro) **Feature Enhancement/User Exportation (#33)** Adding support for UTF-8 BOM in CSV User export files. Now a configurable option during User/Member Exportation.
810
- * (s2Member/s2Member Pro) **Feature Enhancement/Emails (#21)** Adding additional Replacement Codes for New User Email Notifications (for both the User/Member Notification and also for the Administrator Notification). The following Replacement Codes are now possible: `%%role%%`, `%%label%%`, `%%level%%`, `%%ccaps%%`. Also adding four new Filters for developers. These include: `ws_plugin__s2member_welcome_email_sbj`, `ws_plugin__s2member_welcome_email_msg`, `ws_plugin__s2member_admin_new_user_email_sbj`, `ws_plugin__s2member_admin_new_user_email_msg`. See `Dashboard → General Options → Email Configuration` for further details.
811
- * (s2Member/s2Member Pro) **Feature Enhancement/Emails (#30)** Adding support for PHP tags in the following emails: New User Notification, Administrative New User Notification, Signup Confirmation Email, Specific Post/Page Confirmation Email. See the relevant sections in your Dashboard for further details. Such as: `s2Member® → General Options → Email Configuration` and `s2Member® → PayPal® Options → Signup Confirmation Email`.
812
- * (s2Member/s2Member Pro) **Feature Enhancement/Shortcodes (#23)** Adding support for the `lang=""` Attribute in PayPal Buttons, PayPal Pro-Forms, and in Google Checkout Buttons. This is a bit different from the existing `lc=""` value. The `lc=""` value controls the interface at PayPal, while the `lang=""` value controls the language of the Standard and/or Express Checkout Button itself (with respect to s2Member®). For further details, please see: `Dashboard → PayPal Buttons (or Pro-Forms) → Shortcode Attributes (Explained)`.
813
- * (s2Member/s2Member Pro) **Bug Fix** Fixing bug in User Access Package. Now checking if `$cap_enabled` also is `TRUE`; just in case another plugin or hack file attempts to disable Custom Capabilities without removing them. Not likely, but we can support this easily with a quick update in this release. Note... this has no impact on s2Member's existing functionality. Custom Capabilities continue to work just as they always have.
814
- * (s2Member/s2Member Pro) **Feature Enhancement/Logging** Adding new logger. Logs to file `reg-handler.log`. Includes all User/Member registrations handled by s2Member® (either directly or indirectly). Only if logging is enabled. For further details, please check your Dashboard here: `s2Member® → Log Files (Debug)`.
815
- * (s2Member/s2Member Pro) **Feature Enhancement/EOTs (#29)** Adding UI option for EOT Grace Time. For further details, please see: `Dashboard → PayPal Options → Automatic EOT Behavior`. Also adding a new Filter for developers: `ws_plugin__s2member_eot_grace_time`.
816
- * (s2Member/s2Member Pro) **Feature Enhancement/EOTs** Adding UI option for EOT Custom Capability Removal. For further details, please see: `Dashboard → PayPal Options → Automatic EOT Behavior`. Also adding a new Filter for developers: `ws_plugin__s2member_remove_ccaps_during_eot_events`.
817
- * (s2Member/s2Member Pro) **Feature Enhancement/s2Stream Shortcode (#32)** Adding additional support for JW Player™ Captions, Titles, Descriptions, and Media IDs (i.e., `player_title=""`, `player_description=""`, `player_mediaid=""`, `player_captions=""`). Please check the Shortcode Attributes tab in [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes) for further details.
818
-
819
- = v130214 =
820
-
821
- * **(Maintenance Release) Upgrade immediately.**
822
- * (s2Member/s2Member Pro) **Log Viewer (#16)** Additional log file descriptions have been added to the Dashboard, along with some other UI enhancements in this section.
823
- * (s2Member/s2Member Pro) **Bug Fix (#18)** Usernames consisting of all numeric values were not always being redirected to the Login Welcome Page upon logging in, even when s2Member® was configured to do so. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/subscribers-not-taken-to-welcome-page/page/2/#post-41663).
824
- * (s2Member Pro) **Coupon Codes (#19)** Adding new Replacement Codes: `%%full_coupon_code%%`, `%%coupon_code%%` and `%%coupon_affiliate_id%%`. These are now available in all API Tracking Codes, in all Custom Return URLs for Pro-Forms, and in most API Notifications.
825
- * (s2Member Pro) **Coupon Codes (#19)** Deprecating the `%%affiliate_id%%` Replacement Code for tracking Affiliate Coupon Codes in favor of `%%coupon_affiliate_id%%`.
826
- * (s2Member/s2Member Pro) **Last Login Time** Improving readability of Last Login Time in list of Users/Members.
827
- * (s2Member/s2Member Pro) **Compatibility** Improving support for WordPress® v3.6-alpha with respect to `tabindex` values on `/wp-login.php`.
828
- * (s2Member/s2Member Pro) **Compatibility** Bumping minimum WordPress® requirement from v3.2 up to v3.3. Starting with this release, s2Member® is no longer compatible with the much older WordPress® v3.2.
829
-
830
- = v130213 =
831
-
832
- * **(Maintenance Release) Upgrade immediately.**
833
- * (s2Member Pro) **Compatibility (#13)** PayPal® Payments Pro, PayPal® Payments Pro (Payflow Edition), and Authorize.Net. s2Member® Pro now supports a recurring interval of Semi-Yearly (e.g., charges occur every six months). This has always been possible by manipulating Shortcode Attribues, but it's now officially supported by Pro-Form Generators in your Dashboard—which come with s2Member® Pro.
834
- * (s2Member Pro) **Compatibility (#13)** ClickBank® Recurring Products. ClickBank® has started allowing a Weekly recurring interval and stopped allowing Yearly. s2Member® has been updated in this release to support a Weekly recurring interval with ClickBank®; and to remove the Yearly option in the ClickBank® Button Generator.
835
- * (s2Member Pro) **Compatibility (#13)** PayPal® Payments Pro (Payflow Edition). PayPal® Payments Pro (Payflow Edition) has started allowing a Daily recurring interval. s2Member® has been updated in this release to support a Daily recurring interval with PayPal® Payments Pro (Payflow Edition). Daily recurring intervals remain possible with PayPal® Pro accounts that do not include the additional Payflow API. This change simply adds official support for Daily recurring billing with PayPal® Payments Pro (Payflow Edition).
836
- * (s2Member) **Debugging Assistance** Updating s2Member's PayPal® PDT/Auto-Return handler to better handle scenarios where a site owner is missing a PayPal® PDT Identity Token in their s2Member® configuration, or has incorrectly set the `custom=""` Shortcode Attribute in Payment Buttons generated with s2Member®. Administrative notices are now displayed in the Dashboard when/if this occurs and s2Member® can catch the issue during post-processing of a transaction.
837
- * (s2Member/s2Member Pro) **General Code Cleanup** Removing all `/**/` markers in the s2Member® codebase. These were used in conjunction with PolyStyle® code formatting tools to preserve line breaks in the code. The WebSharks™ development team no longer uses PolyStyle®, making these obsolete now. Removed in this release to improve readability for developers.
838
- * (s2Member/s2Member Pro) **General Code Cleanup** Removing all unnecessary uses of PHP's `eval()` function in s2Member's codebase. These were used to keep repetitive code all in a single line; part of a standard the WebSharks™ development team is now moving away from. Removed in this release to improve readability for developers; and to prevent unnecessary confusion.
839
- * (s2Member/s2Member Pro) **Auto-EOT System** Updated s2Member's Auto-EOT System. s2Member® now leaves an additional note behind after a demotion, which references the Paid Subscr. Gateway and Paid Subscr. ID values before the demotion occurred. This way there is a better reference left behind after an automatic demotion occurs.
840
- * (s2Member/s2Member Pro) **Searching Users** Updating search function in list of Users (i.e., `Dashboard → Users → [Search Box]`) to include the Administrative Notes field when searching for Users. This allows references to old Paid Subscr. IDs in the Administrative Notes field to be considered when searching Users/Members.
841
- * (s2Member/s2Member Pro) **Last Login Time** Adding new User Option value (tracked by s2Member®). This option value tracks the last time each User/Member logged into your site. Ex: `get_user_option("s2member_last_login_time")`.
842
- * (s2Member/s2Member Pro) **Last Login Time** Adding new User data column to list of Users in the Dashboard: `Last Login Time`.
843
- * (s2Member/s2Member Pro) **Last Login Time** Adding new API Function: [`s2member_last_login_time()`](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/).
844
- * (s2Member/s2Member Pro) **ezPHP** Updated all internal documentation references that pointed to Exec-PHP or the PHP Execution plugin as recommendations for developers that wish to integrate PHP tags into Posts/Pages/Widgets. These old references now point to the [ezPHP](http://www.s2member.com/kb/ezphp-plugin/) plugin by s2Member® Lead Developer: Jason Caldwell. s2Member® remains compatible with other PHP plugins, but we recommend [ezPHP](http://www.s2member.com/kb/ezphp-plugin/) for the best compatibility with both s2Member® and WordPress® itself.
845
- * (s2Member/s2Member Pro) **Simple Shortcode Conditionals** Adding a [Simple Shortcode Conditionals](http://www.s2member.com/kb/simple-shortcode-conditionals/) section to `s2Member® → Restriction Options` in the Dashboard. This way more site owners will be aware of this feature from the start.
846
- * (s2Member/s2Member Pro) **Login/Registration Design** Login/Registration Design with s2Member® is now optional (e.g., this feature can be disabled now—if you prefer). See: `Dashboard → s2Member® → General Options → Login/Registration Design`. This feature is enabled by default on all s2Member® installations.
847
- * (s2Member/s2Member Pro) **Inline Documentation** Adding more links to KB articles throughout the Dashboard area.
848
- * (s2Member/s2Member Pro) **Inline Documentation** Updating all spaced parenthesis like `( something... )` to remove the grammatical errors—by removing the extra spaces inside these brackets.
849
- * (s2Member/s2Member Pro) **Inline Documentation** Removing all references to PriMoThemes and/or primothemes.com within the application itself. PriMoThemes is now s2Member® (as of Jan 2012—it's been awhile; so time to remove these obviously).
850
- * (s2Member/s2Member Pro) **Inline Documentation** Adding link to "more updates..." in the Dashboard, pointing to the s2Member® KB. Increasing number of recent KB udpates from 3 up to 5. These are visible from any s2Member® page in the Dashboard (top of the right-hand column).
851
- * (s2Member/s2Member Pro) **Inline Documentation** Adding [s2Member® Pro](http://www.s2member.com/pro/) (a recommended upgrade) to the Quick-Start Guide for s2Member®—in the Dashboard.
852
- * (s2Member/s2Member Pro) **Inline Documentation** Adding Troubleshooting section to the Quick-Start Guide for s2Member®—in the Dashboard.
853
- * (s2Member/s2Member Pro) **Inline Documentation** Adding Perfect Theme section to the Quick-Start Guide for s2Member®—in the Dashboard.
854
- * (s2Member/s2Member Pro) **Inline Documentation** Adding video tutorial to the `Dashboard → s2Member® → API / Scripting → Custom Capabilities` section.
855
- * (s2Member/s2Member Pro) **Logging Functionality** Adding an s2Member® Log Viewer to the Dashboard for all site owners; and also for s2Member® Support Reps to use when running diagnostics. See: `Dashboard → s2Member® → Log Files (Debug)` for further details.
856
- * (s2Member/s2Member Pro) **Logging Functionality** Logging routines are now enabled by default on all new installations of s2Member®. Existing installations of s2Member® are advised to enable logging, by visiting this section of your Dashboard. See: `s2Member® → PayPal® Options (or Authorize.Net, ClickBank, etc) → Account Details → Logging`.
857
- * (s2Member/s2Member Pro) **Logging Functionality** Additional logging routines that will track all s2Member® HTTP communication within WordPress® is now enabled by default. This new log file will be located inside `/wp-content/plugins/s2member-logs`. It is named: `s2-http-api-debug.log`. See: `Dashboard → s2Member® → Log Files (Debug)` for further details.
858
- * (s2Member/s2Member Pro) **Logging Functionality** Additional logging routines that will track *all* HTTP communication within WordPress® are now possible (these are quite extensive). See: `Dashboard → s2Member® → Log Files (Debug) → Logging Configuration` for further details. This more extensive logging is disabled by default; it must be enabled by a site owner. For debugging only—this should NEVER be enabled on a live site.
859
- * (s2Member/s2Member Pro) **Logging Functionality** Adding date/time to all log entries maintained by s2Member®.
860
- * (s2Member/s2Member Pro) **GZIP Conflicts** Adding additional lines of defense against GZIP conflicts during file downloads, with calls to `@apache_setenv("no-gzip", "1")` in other areas—not just during public file downloads (e.g., also during User/Member exporations, log file downloads, etc).
861
- * (s2Member/s2Member Pro) **GZIP Conflicts** Adding an additional line of defense against GZIP conflicts during file downloads, with this line now appearing in the `.htaccess` file snippet added by the s2Member® software application: `RewriteCond %{QUERY_STRING} (^|\?|&)no-gzip\=1`.
862
- * (s2Member/s2Member Pro) **GZIP Conflicts** Adding an additional line of defense against GZIP conflicts during User/Member exporations, log file downloads, and other downloads that come straight from the Dashboard area to site owners via web browsers. s2Member® now sends `Content-Encoding: none` to prevent Apache's `mod_deflate` from interfering with s2Member® under these special scenarios. A `Content-Encoding: none` header value is technically invalid, but it's known to prevent issues with `mod_deflate`. Since a `Content-Encoding: none` header value is technically invalid, s2Member® does NOT implement this during public file downloads; where we need to provide wider support for a long list of devices that may choke on this incorrect value. This is only implemented for site owners in the administrative areas of WordPress; and only for file downloads related to CSV export files and logs.
863
- * (s2Member/s2Member Pro) **Bug Fix** Fixed incorrect `preg_split` limit against `$paypal['item_number']` in IPN handler for `subscr_payment` and `subscr_cancel` transaction types. Doesn't appear to have affected anything negatively, but it was wrong none the less. Fixed in this release.
864
- * (s2Member/s2Member Pro) **Bug Fix** Fixed incorrect handling of a single opt-in checkbox on BuddyPress registration forms, which was not being wrapped with s2Member's BuddyPress container divs at all times. A symptom of this bug was to see a checkbox on your BuddyPress registration that was out of alignment or out of position. Fixed in this release.
865
- * (s2Member/s2Member Pro) **Compatibility** Updated all of s2Member's IPN handlers to accept `$_REQUEST` data for Proxy-related variables like `s2member_paypal_proxy_return_url`. This allows s2Member® itself to use `$_POST` variables for Proxy-related variables; and it further reduces the likelihood of 403 Forbidden errors caused by [paranoid Mod Security configurations](http://www.s2member.com/kb/mod-security-random-503-403-errors/). One issue this should help to correct, is a mysterious case where a `success=""` Shortcode Attribute is not working as you might expect. This can be caused by [paranoid Mod Security configurations](http://www.s2member.com/kb/mod-security-random-503-403-errors/) at places like HostGator®, because a URL is passing through a query string. This release will help to prevent this from becoming a problem, because `success=""` URLs will be passed through `$_POST` variables now in all Pro-Form integrations.
866
-
867
- = v130207 =
868
-
869
- * **(Maintenance Release) Upgrade immediately.**
870
- * (s2Member Pro) **Bug Fix (#2)** Modification Tracking Codes not working properly under s2Member's Authorize.Net integration. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/shareasale-integration-not-working/#post-40954).
871
- * (s2Member) **Compatibility (#4)** PayPal® integrated into a site charging in the JPY currency was incorrectly limited to an amount of 10000.00. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/default-currency-can-i-change-it-to-yen/#post-40590).
872
- * (s2Member) **Compatibility (#5)** Incorrect `tabindex` values in WordPress® v3.5+. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/tabindex-messed-up-on-registration-page/#post-40591).
873
- * (s2Member/s2Member Pro) **Line Breaks (#3)** Some line breaks in both s2Member® and s2Member® Pro were converted to CRLF inadvertently in the previous release. No real harm done, but this was causing some problems for the s2Member® Server Scanner because it uses a checksum against installation files; which was being thrown off balance due to the unexpected line break style. Fixed in this release. A symptom of this bug was to see invalid checksums when running diagnostics with the s2Member® Server Scanner.
874
- * (s2Member/s2Member Pro) **Compatibility (#6)** s2Member® File Downloads (audio/video files) with spaces in a file name were not always being handled properly. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/jwplayer-filename-bug/#post-40799).
875
-
876
- = v130203 =
877
-
878
- * **(New Release) Please read this changelog for important details.**
879
- * (s2Member Pro) **Remote Ops API (`create_user`)** s2Member® Pro's Remote Operations API, for the `create_user` Operation has been updated to support a new specification: `modify_if_login_exists`. For further details, please check your s2Member® Pro Dashboard here: `s2Member® → API / Scripting → Remote Operations API`.
880
- * (s2Member Pro) **Remote Ops API (`modify_user`,`delete_user`)** s2Member® Pro's Remote Operations API has been updated to support two additional Operations: `update_user` and `delete_user`. For further details on these new Operations, please check your s2Member® Pro Dashboard here: `s2Member® → API / Scripting → Remote Operations API`.
881
- * (s2Member Pro) **Remote Ops API (`init` hook priority)** s2Member® Pro's Remote Operations API has been updated to prevent conflicts when running in concert with BuddyPress v1.6.4+. Hook priority now running at default value of `11`, right after BuddyPress v1.6.4 at hook priority `10`.
882
- * (s2Member/s2Member Pro) **s2Stream Shortcode (#88)** s2Member® now supports JW Player® license keys (for the professional edition) using Shortcode Attribute `player_key=""` (or they can be specified sitewide via JavaScript provided by Longtail Video—optional). See [this discussion](http://www.s2member.com/forums/topic/jwplayer-shortcode-for-poster-not-working/#post-40435). See also: [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes).
883
- * (s2Member/s2Member Pro) **s2Stream Shortcode (#88)** Bug fix. The s2Stream Shortcode was not working properly (with respect to a specific Shortcode Attribute: `player_image=""`). Fixed in this release. See [this discussion](http://www.s2member.com/forums/topic/jwplayer-shortcode-for-poster-not-working/#post-40128). See also: [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes).
884
- * (s2Member Pro) **User Exportation (#89)** s2Member® Pro's User Exportation now includes separate data columns for each Custom Registration/Profile Field that you've configured with s2Member®. Also, s2Member® Pro will now include ALL Custom Registration/Profile Fields (even if there is no value associated with certain Fields, for specific Users/Members—e.g., empty column values will now be included by s2Member® Pro). This provides a more consistent/readable CSV export file; a major improvement. Discussed in [this KB article](http://www.s2member.com/kb/importing-updating-users/#custom-registration-profile-fields).
885
- * (s2Member Pro) **User Importation (#89)** s2Member® Pro's User/Member Import format changed in this release (with respect to Custom Registration/Profile Fields only). If you are importing Custom Registration/Profile Fields, please review [this KB article](http://www.s2member.com/kb/importing-updating-users/#custom-registration-profile-fields) before you import new Users/Members or mass update any existing Users/Members. ALSO NOTE: User/Member CSV Export Files generated by previous versions of s2Member® Pro (if they contained any Custom Registration/Profile Fields) will NOT be compatible with this latest release (e.g., you should NOT attempt to re-import those old files in an effort to mass update existing Users/Members). Please generate a new User/Member CSV Export File in the latest release of s2Member® Pro before attempting to edit and/or mass update existing Users/Members with applications like MS Excel or OpenOffice.
886
-
887
- = v130123 =
888
-
889
- * **(Maintenance Release) Upgrade immediately.**
890
- * (s2Member/s2Member Pro) **s2Stream Shortcode (#78)** s2Member® now supports JW Player® license keys using Shortcode Attribute `player_key=""`. See [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/) please. Also discussed in [this thread](http://www.s2member.com/forums/topic/new-jw-player-6-s2-video-audio-shortcodes/#post-38768).
891
- * (s2Member/s2Member Pro) **s2Stream Shortcode (#79)** s2Member® now supports JW Player® [Advanced Option Blocks](http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player) using Shortcode Attribute `player_option_blocks=""`. Example: `player_option_blocks="sharing:{}"`. See [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/) please. Also discussed in [this thread](http://www.s2member.com/forums/topic/new-jw-player-6-s2-video-audio-shortcodes/#post-38768).
892
- * (s2Member Pro) **User Exportation (#80)** s2Member® Pro User Exportation now occurs with MySQL `ORDER BY ID`, instead of no `ORDER BY` at all. This helps to prevent confusion and buggy behavior. Discussed in [this thread](http://www.s2member.com/forums/topic/user-export-not-working-properly/#post-39123).
893
- * (s2Member Pro) **User Exportation (#81)** s2Member Pro's User Exportation now supports the exporation of up to `1000` User/Member table rows at once. Of course it remains possible to export ALL of your Users/Members with s2Member® Pro. All we've done here is bump the default limit from `250` up to `1000` at a time. In addition, there is a new Filter making it possible to extend this limit further on servers that can handle it. Use Filter: `ws_plugin__s2member_pro_export_users_limit` if you would like to export more Users all at once. See also: `Dashboard → s2Member® Pro → User/Member Exportation`.
894
- * (s2Member/s2Member Pro) **KB Articles** Inline documentation updated in some areas, with a few links pointing to helpful/related KB articles.
895
-
896
- = v130121 =
897
-
898
- * **(Maintenance Release) Upgrade immediately.**
899
- * **New Feature** s2Member® now comes with a new Shortcode `[s2Stream file_download="video.mp4" player="jwplayer-v6" ... /]`, making it MUCH easier for site owners to implemement RTMP streams of audio/video content. For further details, please check your Dashboard under: `s2Member® → Download Options → JW Player® v6 and RTMP Protocol Examples`. See also: `s2Member® → Download Options → Shortcode Attributes (Explained)`.
900
- * **Compatibility (#75)** Updated s2Member's local file storage engine (for File Downloads via s2Member®), to support special characters in file names. Discussed in [this thread](http://www.s2member.com/forums/topic/problem-with-quotes-in-filename-downloads/#post-38395).
901
- * **Bug Fix (#71)** A bug first introduced in the previous release of v130116, where we added support for byte-range requests to s2Member's File Download functionality, was causing multiple byte-range requests (processed by s2Member) to count against each User/Member as multiple File Downloads. Fixed in this release.
902
- * **Compatibility** Updated s2Member's integration with Amazon® S3 to extend the default 30 second connection timeout (which was too conservative for many integrations) up to 24 hours by default, making it match the same as s2Member's Amazon® CloudFront connection timeout. For further details, please check your Dashboard under: `s2Member® → Download Options → Amazon® S3/CDN Storage → Dev Note w/Technical Details`. It is possible to modify this connection timeout through a Filter discussed there.
903
-
904
- = v130116 =
905
-
906
- * **(Maintenance Release) Upgrade immediately.**
907
- * **Compatibility (#39)** Updated codes samples for JW Player®, to include the `mp4:` prefix when implementing RTMP streams against MP4 video files. Discussed in [this thread](http://www.s2member.com/forums/topic/cloudfront-subfolder-streaming-error/#post-35750).
908
- * **Compatibility (#51)** Updated Payflow® API to support recurring billing every six months. Discussed in [this thread](http://www.s2member.com/forums/topic/payflow-error-6-month-recurring-membership/#post-36053).
909
- * **Bug Fix (#69)** Updated multisite user imporation routine, to support a specific scenario not covered under WordPress v3.5. Discussed in [this thread](http://www.s2member.com/forums/topic/users-on-multisite/).
910
- * **Feature Improvement (#71)** s2Member® has been updated to support byte-range requests with it's default local file storage engine, served from the `/s2member-files/` directory. s2Member® has always supported byte-range requests when integrated with Amazon® CloudFront. Now it supports byte-range requests in it's default local storage engine too. This will improve compatibility with mobile devices, iTunes™ and other devices that use byte-range requests. Discussed in [this thread](http://www.s2member.com/forums/topic/any-way-to-set-accept-ranges-for-downloads/#post-15871).
911
-
912
- = v121213 =
913
-
914
- * ... trimmed away at v121213.
915
- * Initial release: v1.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md DELETED
@@ -1,7 +0,0 @@
1
- ## s2Member® Framework
2
-
3
- s2Member® Framework ~ membership management for WordPress®.
4
-
5
- ## BRANCH RENAME: `000000-dev` is now just `dev` ...
6
-
7
- See announcement: https://github.com/websharks/s2member/issues/968
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 161129
4
- Stable tag: 161129
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -17,11 +17,11 @@ Authorize.Net® Compatible: yes w/s2Member® Pro
17
  Google® Checkout Compatible: yes w/s2Member® Pro
18
  ClickBank® Compatible: yes w/s2Member® Pro
19
 
20
- Tested up to: 4.7
21
  Requires at least: 4.2
22
 
23
  Requires PHP: 5.2
24
- Tested up to PHP: 7.0.12
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
@@ -36,27 +36,23 @@ Text Domain: s2member
36
  Domain Path: /src/includes/translations
37
 
38
  Plugin Name: s2Member® Framework
39
- Forum URI: http://s2member.com/forums/
40
  Plugin URI: http://s2member.com/
41
  Privacy URI: http://s2member.com/privacy-policy/
42
  Changelog URI: http://s2member.com/changelog/
43
- Video Tutorials: http://s2member.com/videos/
44
  Knowledge Base: http://s2member.com/kb/
45
  Newsletter: http://s2member.com/r/subscribe/
46
- Pro Add-on / Home Page: http://s2member.com/
47
- Pro Add-on / Prices: http://s2member.com/prices/
48
- Pro Add-on / Auto-Update URL: https://www.s2member.com/
49
  PayPal Pro Integration: http://s2member.com/r/pp-account-types/
50
- Professional Installation URI: http://s2member.com/r/professional-installation/
51
 
52
  Description: s2Member®—a powerful (free) membership plugin for WordPress®. Protect members only content with roles/capabilities.
53
- Tags: s2, s2member, s2 member, membership, users, user, members, member, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, stripe, bitcoin, paypal, paypal pro, pay pal, authorize, authorize.net, google wallet, clickbank, click bank, buddypress, buddy press, bbpress, bb press, shopping cart, cart, checkout, ecommerce
54
 
55
  s2Member®—a powerful (free) membership plugin for WordPress®. Protect members only content with roles/capabilities.
56
 
57
  == Description ==
58
 
59
- **NOTICE:** The support forum at WordPress is for community interaction only. If you are an s2Member Pro customer in need of support, please use [our support center](http://www.s2member.com/contact/).
60
 
61
  ---
62
 
@@ -66,7 +62,7 @@ Protect your WordPress Posts, Pages, Tags, Categories, URIs, BuddyPress/bbPress,
66
 
67
  s2Member is powered almost entirely by WordPress shortcodes, making complex integrations quick & easy. Sell recurring (or non-recurring) subscriptions with lots of flexibility. Or sell "Buy Now" access in various ways. You can also sell specific Posts/Pages, sell access to file downloads, or sell Custom Capabilities that provide highly configurable access to specific portions of your content.
68
 
69
- You can learn more at [s2Member.com](http://www.s2member.com/).
70
 
71
  = Reasons to upgrade to "s2Member® Pro" =
72
 
@@ -77,11 +73,11 @@ You can learn more at [s2Member.com](http://www.s2member.com/).
77
 
78
  With 1000's of customers, an intelligent open-community, comprehensive documentation, video tutorials, APIs, the s2Member Codex, KB articles, and over 50,000 forum posts; s2Member just can't be beat!
79
 
80
- Secure WordPress content and offer users/members a secure checkout solution that integrates seamlessly with WordPress Roles/Capabilities. It's like a cash machine. s2Member puts money back in your pocket with every customer you acquire. You can learn more at [s2Member.com](http://www.s2member.com/).
81
 
82
  == Installation ==
83
 
84
- **NOTICE:** If you are an s2Member Pro customer in need of support, please use [our support center at s2Member.com](http://www.s2member.com/contact/).
85
 
86
  ---
87
 
@@ -93,7 +89,7 @@ Secure WordPress content and offer users/members a secure checkout solution that
93
 
94
  = See Also (s2Member.com) =
95
 
96
- [Detailed installation/upgrade instructions](http://www.s2member.com/framework/#!s2_tab_jump=s2-framework-install-update).
97
 
98
  = Is s2Member compatible with Multisite Networking? =
99
 
@@ -111,7 +107,7 @@ Yes. s2Member and s2Member Pro, are also both compatible with Multisite Networki
111
 
112
  == Frequently Asked Questions ==
113
 
114
- **NOTICE:** If you are an s2Member Pro customer in need of support, please use [our support center at s2Member.com](http://www.s2member.com/contact/).
115
 
116
  ---
117
 
@@ -120,7 +116,7 @@ Yes. s2Member and s2Member Pro, are also both compatible with Multisite Networki
120
  * s2Member® FAQs: <http://s2member.com/faqs/>
121
  * Knowledge Base: <http://s2member.com/kb/>
122
  * Video Tutorials: <http://s2member.com/videos/>
123
- * Community: <http://s2member.com/forums/>
124
  * Codex: <http://s2member.com/codex/>
125
 
126
  = Translating s2Member® =
@@ -175,6 +171,24 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
175
 
176
  == Changelog ==
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  = v161129 =
179
 
180
  - (s2Member Pro) **Bug Fix:** Stripe refund notifications via the Stripe Webhook were always interpreted by s2Member as full refunds. This release corrects this bug so that s2Member will handle partial refunds via the Stripe API properly in all cases. Props @raamdev for reporting.
@@ -293,7 +307,7 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
293
  - (s2Member) **Multisite Support:** This release of s2Member (the free version only) removes full support for Multisite Networks, which is now a Pro feature; i.e., only available in the Pro version.
294
 
295
  ##### Is s2Member still compatible with WordPress Multisite Networking?
296
- Multisite support is no longer included in the s2Member Framework. However, it is available with s2Member Pro. s2Member Pro is compatible with Multisite Networking. After you enable Multisite Networking, install the s2Member Pro Add-On. Then, navigate to `s2Member → Multisite (Config)` in the Dashboard of your Main Site. You can learn more about s2Member Pro at [s2Member.com](http://www.s2member.com/).
297
 
298
  ##### I was using the free version in a Multisite Network before. What happened?
299
  s2Member (when running on a Multisite Network) requires minor alterations in WordPress core that are not compatible with plugins available at WordPress.org (i.e., not allowed) at this time. For this reason, full support for Multisite Networks is now available only in the pro version.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 170221
4
+ Stable tag: 170221
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
17
  Google® Checkout Compatible: yes w/s2Member® Pro
18
  ClickBank® Compatible: yes w/s2Member® Pro
19
 
20
+ Tested up to: 4.8-alpha
21
  Requires at least: 4.2
22
 
23
  Requires PHP: 5.2
24
+ Tested up to PHP: 7.0.15
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
36
  Domain Path: /src/includes/translations
37
 
38
  Plugin Name: s2Member® Framework
39
+ Forum URI: http://s2member.com/r/forum/
40
  Plugin URI: http://s2member.com/
41
  Privacy URI: http://s2member.com/privacy-policy/
42
  Changelog URI: http://s2member.com/changelog/
43
+ Video Tutorials: http://s2member.com/r/s2member-videos/
44
  Knowledge Base: http://s2member.com/kb/
45
  Newsletter: http://s2member.com/r/subscribe/
 
 
 
46
  PayPal Pro Integration: http://s2member.com/r/pp-account-types/
 
47
 
48
  Description: s2Member®—a powerful (free) membership plugin for WordPress®. Protect members only content with roles/capabilities.
49
+ Tags: membership, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, paypal, ecommerce, restriction
50
 
51
  s2Member®—a powerful (free) membership plugin for WordPress®. Protect members only content with roles/capabilities.
52
 
53
  == Description ==
54
 
55
+ **NOTICE:** The support forum at WordPress is for community interaction only. If you are an s2Member Pro customer in need of support, please use [our support center](http://s2member.com/support/).
56
 
57
  ---
58
 
62
 
63
  s2Member is powered almost entirely by WordPress shortcodes, making complex integrations quick & easy. Sell recurring (or non-recurring) subscriptions with lots of flexibility. Or sell "Buy Now" access in various ways. You can also sell specific Posts/Pages, sell access to file downloads, or sell Custom Capabilities that provide highly configurable access to specific portions of your content.
64
 
65
+ You can learn more at [s2Member.com](http://s2member.com/).
66
 
67
  = Reasons to upgrade to "s2Member® Pro" =
68
 
73
 
74
  With 1000's of customers, an intelligent open-community, comprehensive documentation, video tutorials, APIs, the s2Member Codex, KB articles, and over 50,000 forum posts; s2Member just can't be beat!
75
 
76
+ Secure WordPress content and offer users/members a secure checkout solution that integrates seamlessly with WordPress Roles/Capabilities. It's like a cash machine. s2Member puts money back in your pocket with every customer you acquire. You can learn more at [s2Member.com](http://s2member.com/).
77
 
78
  == Installation ==
79
 
80
+ **NOTICE:** If you are an s2Member Pro customer in need of support, please use [our support center at s2Member.com](http://s2member.com/support/).
81
 
82
  ---
83
 
89
 
90
  = See Also (s2Member.com) =
91
 
92
+ [Detailed installation/upgrade instructions](http://s2member.com/installation/).
93
 
94
  = Is s2Member compatible with Multisite Networking? =
95
 
107
 
108
  == Frequently Asked Questions ==
109
 
110
+ **NOTICE:** If you are an s2Member Pro customer in need of support, please use [our support center at s2Member.com](http://s2member.com/support/).
111
 
112
  ---
113
 
116
  * s2Member® FAQs: <http://s2member.com/faqs/>
117
  * Knowledge Base: <http://s2member.com/kb/>
118
  * Video Tutorials: <http://s2member.com/videos/>
119
+ * Community: <http://s2member.com/r/forum/>
120
  * Codex: <http://s2member.com/codex/>
121
 
122
  = Translating s2Member® =
171
 
172
  == Changelog ==
173
 
174
+ = v170221 =
175
+
176
+ - (s2Member/s2Member Pro) **JW Player v7:** This release adds support for JW Player v7 in the `[s2Stream /]` shortcode. See [Issue #774](https://github.com/websharks/s2member/issues/774).
177
+
178
+ - (s2Member Pro) **Bug Fix:** Allow Pro-Forms to use `success="%%sp_access_url%%"` without issue. See [Issue #1024](https://github.com/websharks/s2member/issues/1024).
179
+
180
+ - (s2Member/s2Member Pro) **AWS Region:** Adding AWS region `ap-northeast-2`. See [Issue #1033](https://github.com/websharks/s2member/issues/1033).
181
+
182
+ - (s2Member/s2Member Pro) **AWS Region:** Adding AWS region `eu-west-2`. See [Issue #1033](https://github.com/websharks/s2member/issues/1033).
183
+
184
+ - (s2Member) **Bug Fix:** This release corrects a minor server-side validation bug that was related to the use of non-personal email address. See [Thread #1195](https://forums.wpsharks.com/t/bugfix-file-custom-reg-fields-inc-php-missing-bracket/1195) and [Issue #1054](https://github.com/websharks/s2member/issues/1054).
185
+
186
+ - (s2Member) **Bug Fix:** Updated several outdated links within the software; e.g., removing older `www.` references, correcting forum links, and more. Also corrected missing changelog. See [Issue #1027](https://github.com/websharks/s2member/issues/1027).
187
+
188
+ - (s2Member Pro) **Pro Upgrader:** The pro upgrader has been refactored and now asks for your s2Member Pro License Key instead of your s2Member.com password. The next time you upgrade to the most recent version of s2Member Pro, you will be asked for your License Key. You can obtain your License Key by logging into your account at s2Member.com. Once logged in, visit your 'My Account' page, where you will find your License Key right at the top. See [Issue #668](https://github.com/websharks/s2member/issues/668).
189
+
190
+ - (s2Member/s2Member Pro) **CloudFlare Compat.:** Enhancing compatibility with Rocket Loader via `data-cfasync="false"` on dynamic s2Member scripts. See: [Issue #1038](https://github.com/websharks/s2member/issues/1038).
191
+
192
  = v161129 =
193
 
194
  - (s2Member Pro) **Bug Fix:** Stripe refund notifications via the Stripe Webhook were always interpreted by s2Member as full refunds. This release corrects this bug so that s2Member will handle partial refunds via the Stripe API properly in all cases. Props @raamdev for reporting.
307
  - (s2Member) **Multisite Support:** This release of s2Member (the free version only) removes full support for Multisite Networks, which is now a Pro feature; i.e., only available in the Pro version.
308
 
309
  ##### Is s2Member still compatible with WordPress Multisite Networking?
310
+ Multisite support is no longer included in the s2Member Framework. However, it is available with s2Member Pro. s2Member Pro is compatible with Multisite Networking. After you enable Multisite Networking, install the s2Member Pro Add-On. Then, navigate to `s2Member → Multisite (Config)` in the Dashboard of your Main Site. You can learn more about s2Member Pro at [s2Member.com](http://s2member.com/).
311
 
312
  ##### I was using the free version in a Multisite Network before. What happened?
313
  s2Member (when running on a Multisite Network) requires minor alterations in WordPress core that are not compatible with plugins available at WordPress.org (i.e., not allowed) at this time. For this reason, full support for Multisite Networks is now available only in the pro version.
s2member.php CHANGED
@@ -20,8 +20,8 @@
20
  */
21
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
22
 
23
- Version: 161129
24
- Stable tag: 161129
25
 
26
  SSL Compatible: yes
27
  bbPress Compatible: yes
@@ -36,11 +36,11 @@ Authorize.Net Compatible: yes w/s2Member Pro
36
  Google Wallet Compatible: yes w/s2Member Pro
37
  ClickBank Compatible: yes w/s2Member Pro
38
 
39
- Tested up to: 4.7-alpha
40
  Requires at least: 4.2
41
 
42
  Requires PHP: 5.2
43
- Tested up to PHP: 7.0.12
44
 
45
  Copyright: © 2009 WebSharks, Inc.
46
  License: GNU General Public License
@@ -48,24 +48,20 @@ Contributors: WebSharks, JasWSInc, anguz, raamdev, bruce-caldwell
48
 
49
  Author: s2Member / WebSharks, Inc.
50
  Author URI: http://s2member.com/
51
- Donate link: http://s2member.com/donate/
52
 
53
  Text Domain: s2member
54
  Domain Path: /src/includes/translations
55
 
56
  Plugin Name: s2Member Framework
57
- Forum URI: http://s2member.com/forums/
58
  Plugin URI: http://s2member.com/
59
  Privacy URI: http://s2member.com/privacy-policy/
60
  Changelog URI: http://s2member.com/changelog/
61
- Video Tutorials: http://s2member.com/videos/
62
  Knowledge Base: http://s2member.com/kb/
63
  Newsletter: http://s2member.com/r/subscribe/
64
- Pro Add-on / Home Page: http://s2member.com/
65
- Pro Add-on / Prices: http://s2member.com/prices/
66
- Pro Add-on / Auto-Update URL: https://www.s2member.com/
67
  PayPal Pro Integration: http://s2member.com/r/pp-account-types/
68
- Professional Installation URI: http://s2member.com/r/professional-installation/
69
 
70
  Description: s2Member, a powerful (free) membership plugin for WordPress. Protect/secure members only content with roles/capabilities.
71
  Tags: s2, s2member, s2 member, membership, users, user, members, member, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, paypal, paypal pro, pay pal, authorize, authorize.net, google wallet, clickbank, click bank, buddypress, buddy press, bbpress, bb press, shopping cart, cart, checkout, ecommerce
@@ -81,7 +77,7 @@ if(!defined('WPINC')) // MUST have WordPress.
81
  *
82
  * @var string
83
  */
84
- ${__FILE__}['tmp'] = '161129'; //version//
85
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
86
  define('WS_PLUGIN__S2MEMBER_VERSION', ${__FILE__}['tmp']);
87
  /**
@@ -114,7 +110,7 @@ if(!defined('WS_PLUGIN__S2MEMBER_MIN_WP_VERSION'))
114
  *
115
  * @var string
116
  */
117
- ${__FILE__}['tmp'] = '161129'; //version//
118
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
119
  define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', ${__FILE__}['tmp']);
120
  /*
20
  */
21
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
22
 
23
+ Version: 170221
24
+ Stable tag: 170221
25
 
26
  SSL Compatible: yes
27
  bbPress Compatible: yes
36
  Google Wallet Compatible: yes w/s2Member Pro
37
  ClickBank Compatible: yes w/s2Member Pro
38
 
39
+ Tested up to: 4.8-alpha
40
  Requires at least: 4.2
41
 
42
  Requires PHP: 5.2
43
+ Tested up to PHP: 7.0.15
44
 
45
  Copyright: © 2009 WebSharks, Inc.
46
  License: GNU General Public License
48
 
49
  Author: s2Member / WebSharks, Inc.
50
  Author URI: http://s2member.com/
51
+ Donate link: http://s2member.com/r/donate
52
 
53
  Text Domain: s2member
54
  Domain Path: /src/includes/translations
55
 
56
  Plugin Name: s2Member Framework
57
+ Forum URI: http://s2member.com/r/forum/
58
  Plugin URI: http://s2member.com/
59
  Privacy URI: http://s2member.com/privacy-policy/
60
  Changelog URI: http://s2member.com/changelog/
61
+ Video Tutorials: http://s2member.com/r/s2member-videos/
62
  Knowledge Base: http://s2member.com/kb/
63
  Newsletter: http://s2member.com/r/subscribe/
 
 
 
64
  PayPal Pro Integration: http://s2member.com/r/pp-account-types/
 
65
 
66
  Description: s2Member, a powerful (free) membership plugin for WordPress. Protect/secure members only content with roles/capabilities.
67
  Tags: s2, s2member, s2 member, membership, users, user, members, member, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, paypal, paypal pro, pay pal, authorize, authorize.net, google wallet, clickbank, click bank, buddypress, buddy press, bbpress, bb press, shopping cart, cart, checkout, ecommerce
77
  *
78
  * @var string
79
  */
80
+ ${__FILE__}['tmp'] = '170221'; //version//
81
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
82
  define('WS_PLUGIN__S2MEMBER_VERSION', ${__FILE__}['tmp']);
83
  /**
110
  *
111
  * @var string
112
  */
113
+ ${__FILE__}['tmp'] = '170221'; //version//
114
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
115
  define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', ${__FILE__}['tmp']);
116
  /*
src/includes/classes/css-js-themes.inc.php CHANGED
@@ -131,5 +131,27 @@ if(!class_exists('c_ws_plugin__s2member_css_js_themes'))
131
  }
132
  do_action('ws_plugin__s2member_after_add_js_w_globals', get_defined_vars());
133
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  }
135
  }
131
  }
132
  do_action('ws_plugin__s2member_after_add_js_w_globals', get_defined_vars());
133
  }
134
+
135
+ /**
136
+ * Disallow async loading.
137
+ *
138
+ * @package s2Member\CSS_JS
139
+ * @since 170221 Enhancing CloudFlare compat.
140
+ *
141
+ * @attaches-to ``add_filter('script_loader_tag');``
142
+ *
143
+ * @param string $tag The script tag.
144
+ * @param string $handle The script handle.
145
+ *
146
+ * @return string Possibly altered script tag.
147
+ */
148
+ public static function script_loader_tag($tag = '', $handle = '')
149
+ {
150
+ if ($handle === 'ws-plugin--s2member') {
151
+ $tag = str_replace(' src=', ' data-cfasync="false" src=', $tag);
152
+ }
153
+ return $tag; // Prevent RocketLoader from loading async.
154
+ // See: <https://support.cloudflare.com/hc/en-us/articles/200169436-How-can-I-have-Rocket-Loader-ignore-my-script-s-in-Automatic-Mode->
155
+ }
156
  }
157
  }
src/includes/classes/custom-reg-fields.inc.php CHANGED
@@ -573,7 +573,7 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
573
 
574
  $errors = array(); // Initialize the array of errors.
575
  $force_personal_emails = isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'][0]) ? TRUE : FALSE;
576
- $non_personal_email_users = '/^(?:'.implode('|', preg_split('/[\s;,]+/', preg_quote($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'], '/'))).'@/i';
577
 
578
  foreach($fields_to_validate as $_field)
579
  {
573
 
574
  $errors = array(); // Initialize the array of errors.
575
  $force_personal_emails = isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'][0]) ? TRUE : FALSE;
576
+ $non_personal_email_users = '/^(?:'.implode('|', preg_split('/[\s;,]+/', preg_quote($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'], '/'))).')@/i';
577
 
578
  foreach($fields_to_validate as $_field)
579
  {
src/includes/classes/menu-pages-rs.inc.php CHANGED
@@ -51,13 +51,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
51
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
52
  {
53
  echo '<div class="ws-menu-page-others">' . "\n";
54
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Add-on / Prices")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/src/images/brand-upsell-pro.png" alt="." /></a>' . "\n";
55
- echo '</div>' . "\n";
56
- }
57
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["installation"])
58
- {
59
- echo '<div class="ws-menu-page-installation">' . "\n";
60
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Professional Installation URI")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/src/images/brand-installation.png" alt="." /></a>' . "\n";
61
  echo '</div>' . "\n";
62
  }
63
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["tools"])
51
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
52
  {
53
  echo '<div class="ws-menu-page-others">' . "\n";
54
+ echo '<a href="http://s2member.com/prices/" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/src/images/brand-upsell-pro.png" alt="." /></a>' . "\n";
 
 
 
 
 
 
55
  echo '</div>' . "\n";
56
  }
57
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["tools"])
src/includes/classes/menu-pages-tb.inc.php CHANGED
@@ -48,11 +48,7 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages_tb'))
48
  }
49
  if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['upsell-pro'])
50
  {
51
- echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Pro Add-on / Prices')).'" target="_blank" style="font-size:120%; font-weight:bold;"><i class="fa fa-money"></i> s2Member® Pro (Upgrade)</a>'."\n";
52
- }
53
- if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['installation'])
54
- {
55
- echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Professional Installation URI')).'" target="_blank"><i class="fa fa-wrench"></i> Professional Installation Service</a>'."\n";
56
  }
57
  if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['kb'])
58
  {
48
  }
49
  if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['upsell-pro'])
50
  {
51
+ echo '<a href="http://s2member.com/prices/" target="_blank" style="font-size:120%; font-weight:bold;"><i class="fa fa-money"></i> s2Member® Pro (Upgrade)</a>'."\n";
 
 
 
 
52
  }
53
  if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['kb'])
54
  {
src/includes/classes/paypal-notify-in.inc.php CHANGED
@@ -209,6 +209,9 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in'))
209
  while(@ob_end_clean()); // Clean output buffers.
210
 
211
  if (!empty($paypal['s2member_paypal_proxy_return_url'])) {
 
 
 
212
  exit($paypal['s2member_paypal_proxy_return_url']);
213
  } elseif (!empty($paypal['s2member_indicator'])) {
214
  exit($paypal['s2member_indicator']);
209
  while(@ob_end_clean()); // Clean output buffers.
210
 
211
  if (!empty($paypal['s2member_paypal_proxy_return_url'])) {
212
+ if(preg_match('/^https?%3A/ui', $paypal['s2member_paypal_proxy_return_url'])) {
213
+ $paypal['s2member_paypal_proxy_return_url'] = urldecode($paypal['s2member_paypal_proxy_return_url']);
214
+ } // See: <https://github.com/websharks/s2member/issues/1024>
215
  exit($paypal['s2member_paypal_proxy_return_url']);
216
  } elseif (!empty($paypal['s2member_indicator'])) {
217
  exit($paypal['s2member_indicator']);
src/includes/classes/paypal-return-in-proxy-x-preview.inc.php CHANGED
@@ -62,7 +62,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_proxy_x_preview"))
62
  $paypal["s2member_log"][] = "Redirecting Customer to the Home Page (after displaying preview information).";
63
 
64
  echo c_ws_plugin__s2member_return_templates::return_template ($paypal["subscr_gateway"],
65
- sprintf (_x ('<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e., based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href="%s" target="_blank">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>', "s2member-front", "s2member"), esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Add-on / Prices"))),
66
  _x ("Continue (Click Here)", "s2member-front", "s2member"), home_url ("/"));
67
  }
68
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
62
  $paypal["s2member_log"][] = "Redirecting Customer to the Home Page (after displaying preview information).";
63
 
64
  echo c_ws_plugin__s2member_return_templates::return_template ($paypal["subscr_gateway"],
65
+ _x ('<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e., based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href="http://s2member.com/prices/" target="_blank">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>', "s2member-front", "s2member"),
66
  _x ("Continue (Click Here)", "s2member-front", "s2member"), home_url ("/"));
67
  }
68
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
src/includes/classes/readmes.inc.php CHANGED
@@ -46,8 +46,8 @@ if (!class_exists ("c_ws_plugin__s2member_readmes"))
46
  {
47
  if (!($path = $specific_path)) // Was a specific path passed in?
48
  {
49
- $path = dirname (dirname (dirname (__FILE__))) . "/readme.txt";
50
- $dev_path = dirname (dirname (dirname (__FILE__))) . "/readme-dev.txt";
51
  $path = (file_exists ($dev_path)) ? $dev_path : $path;
52
  }
53
 
@@ -207,8 +207,8 @@ if (!class_exists ("c_ws_plugin__s2member_readmes"))
207
 
208
  if (!($path = $specific_path)) // Was a specific path passed in?
209
  {
210
- $path = dirname (dirname (dirname (__FILE__))) . "/readme.txt";
211
- $dev_path = dirname (dirname (dirname (__FILE__))) . "/readme-dev.txt";
212
  $path = (file_exists ($dev_path)) ? $dev_path : $path;
213
  }
214
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
  {
47
  if (!($path = $specific_path)) // Was a specific path passed in?
48
  {
49
+ $path = dirname (dirname (dirname (dirname (__FILE__)))) . "/readme.txt";
50
+ $dev_path = dirname (dirname (dirname (dirname (__FILE__)))) . "/readme-dev.txt";
51
  $path = (file_exists ($dev_path)) ? $dev_path : $path;
52
  }
53
 
207
 
208
  if (!($path = $specific_path)) // Was a specific path passed in?
209
  {
210
+ $path = dirname (dirname (dirname (dirname (__FILE__)))) . "/readme.txt";
211
+ $dev_path = dirname (dirname (dirname (dirname (__FILE__)))) . "/readme-dev.txt";
212
  $path = (file_exists ($dev_path)) ? $dev_path : $path;
213
  }
214
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
src/includes/classes/sc-files-in.inc.php CHANGED
@@ -118,9 +118,9 @@ if(!class_exists('c_ws_plugin__s2member_sc_files_in'))
118
  'count_against_user' => 'yes', 'check_user' => 'yes',
119
 
120
  // Configuration
121
- 'player' => 'jwplayer-v6-rtmp', 'player_id' => 's2-stream-'.md5(uniqid('', TRUE)),
122
  'player_path' => '/jwplayer/jwplayer.js', 'player_key' => '', 'player_title' => '',
123
- 'player_image' => '', 'player_mediaid' => '', 'player_description' => '', 'player_captions' => '',
124
  'player_resolutions' => '', // A comma-delimited list of resolution options.
125
 
126
  // Layout
@@ -129,8 +129,8 @@ if(!class_exists('c_ws_plugin__s2member_sc_files_in'))
129
 
130
  // Playback
131
  'player_autostart' => 'no', 'player_fallback' => 'yes', 'player_mute' => 'no',
132
- 'player_primary' => (($attr['player'] === 'jw-player-v6') ? 'html5' : 'flash'),
133
- 'player_repeat' => 'no', 'player_startparam' => '',
134
 
135
  // Advanced Option Blocks
136
  'player_option_blocks' => ''), $attr);
@@ -186,7 +186,155 @@ if(!class_exists('c_ws_plugin__s2member_sc_files_in'))
186
  $template = (is_file(get_stylesheet_directory().'/'.basename($template))) ? get_stylesheet_directory().'/'.basename($template) : $template;
187
  $template = (is_file(WP_CONTENT_DIR.'/'.basename($template))) ? WP_CONTENT_DIR.'/'.basename($template) : $template;
188
 
189
- if(strpos($attr['player'], 'jwplayer-v6') === 0) // JW Player is currently the only supported player.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  {
191
  $player = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
192
 
118
  'count_against_user' => 'yes', 'check_user' => 'yes',
119
 
120
  // Configuration
121
+ 'player' => 'jwplayer-v7-rtmp', 'player_id' => 's2-stream-'.md5(uniqid('', TRUE)),
122
  'player_path' => '/jwplayer/jwplayer.js', 'player_key' => '', 'player_title' => '',
123
+ 'player_image' => '', 'player_mediaid' => '', 'player_description' => '', 'player_captions' => '', 'player_tracks' => '',
124
  'player_resolutions' => '', // A comma-delimited list of resolution options.
125
 
126
  // Layout
129
 
130
  // Playback
131
  'player_autostart' => 'no', 'player_fallback' => 'yes', 'player_mute' => 'no',
132
+ 'player_primary' => (($attr['player'] === 'jw-player-v7' || $attr['player'] === 'jw-player-v6') ? 'html5' : 'flash'),
133
+ 'player_repeat' => 'no', 'player_startparam' => '', // `startparam` seems to be JW Player v6 only.
134
 
135
  // Advanced Option Blocks
136
  'player_option_blocks' => ''), $attr);
186
  $template = (is_file(get_stylesheet_directory().'/'.basename($template))) ? get_stylesheet_directory().'/'.basename($template) : $template;
187
  $template = (is_file(WP_CONTENT_DIR.'/'.basename($template))) ? WP_CONTENT_DIR.'/'.basename($template) : $template;
188
 
189
+ if(strpos($attr['player'], 'jwplayer-v7') === 0) // JW Player (new v7).
190
+ {
191
+ $player = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
192
+
193
+ $_first_file_download_url = array(); // Holds the first one.
194
+ $_last_file_download_url = array(); // Holds the last one.
195
+ $_uses_rtmp_streamers = FALSE; // Streamers use RTMP?
196
+
197
+ $_total_player_sources = count($file_download_urls); // Total sources.
198
+ $_player_sources_counter = 1; // Player sources counter; needed by the loop below.
199
+
200
+ $player_resolution_aspect_ratio_w = 16; // Default aspect ratio width.
201
+ $player_resolution_aspect_ratio_h = 9; // Default aspect ratio in height.
202
+ if($attr['player_aspectratio'] && preg_match('/^[0-9]+\:[0-9]+$/', $attr['player_aspectratio']))
203
+ list($player_resolution_aspect_ratio_w, $player_resolution_aspect_ratio_h) = explode(':', $attr['player_aspectratio']);
204
+ $player_resolution_aspect_ratio_w = (integer)$player_resolution_aspect_ratio_w; // Force integer value.
205
+ $player_resolution_aspect_ratio_h = (integer)$player_resolution_aspect_ratio_h; // Force integer value.
206
+
207
+ // See: <http://wsharks.com/1yzjAl6> and <http://wsharks.com/1yzkhea> regarging the SMIL bitrate hints given here.
208
+ $player_resolution_bitrates = array(2160 => '35000000', 1440 => '10000000', 1080 => '8000000', 720 => '5000000', 640 => '2500001', 480 => '2500000', 360 => '1000000', 320 => '999999', 240 => '500000', 180 => '300000');
209
+ $player_resolution_bitrates = apply_filters('ws_plugin__s2member_sc_get_stream_resolution_bitrates', $player_resolution_bitrates, get_defined_vars());
210
+
211
+ $player_resolution_sources_smil_file_id = md5(serialize($attr).c_ws_plugin__s2member_utils_ip::current()); // Initialize SMIL ID.
212
+ $player_resolution_sources_smil_file_url = home_url('/s2member-rsf-file.smil?s2member_rsf_file='.urlencode($player_resolution_sources_smil_file_id).'&s2member_rsf_file_ip='.urlencode(c_ws_plugin__s2member_utils_ip::current()));
213
+ $player_resolution_sources_smil_file_url = c_ws_plugin__s2member_utils_urls::add_s2member_sig($player_resolution_sources_smil_file_url);
214
+ $player_resolution_sources_smil_file_contents = ''; // Initialize player sources SMIL file contents.
215
+ $player_sources = ''; // Initialize player sources; empty string.
216
+
217
+ foreach($file_download_urls as $_file_download_url_label => $_file_download_url)
218
+ {
219
+ $_is_first_file_download_url = $_player_sources_counter <= 1;
220
+ $_is_last_file_download_url = $_player_sources_counter >= $_total_player_sources;
221
+
222
+ if($_is_first_file_download_url) // We base this conditional on the first streamer.
223
+ $_uses_rtmp_streamers = stripos($_file_download_url['streamer'], 'rtmp') === 0;
224
+
225
+ switch($attr['player'])// See: <http://wsharks.com/1Bd6tKy>
226
+ {
227
+ case 'jwplayer-v7': // New JW Player v7 (very simple).
228
+
229
+ $player_sources .= ',{'; // Open this source; JSON object properties.
230
+ $player_sources .= "'file': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['url'])."'";
231
+ if(is_string($_file_download_url_label)) $player_sources .= ",'label': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url_label)."'";
232
+ if($_is_first_file_download_url) $player_sources .= ",'default': 'true'";
233
+ $player_sources .= '}'; // Close this source.
234
+
235
+ break; // Break switch loop.
236
+
237
+ case 'jwplayer-v7-rtmp': // RTMP w/ downloadable fallback (mobile compatibility).
238
+ case 'jwplayer-v7-rtmp-only': // RTMP streaming only (flash player only).
239
+
240
+ if($attr['player_resolutions'] && $_total_player_sources > 1 && $_uses_rtmp_streamers)
241
+ {
242
+ if($_is_first_file_download_url) // The first source is the SMIL file.
243
+ {
244
+ $player_sources .= ',{'; // Open this source; JSON object properties.
245
+ $player_sources .= "'file': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($player_resolution_sources_smil_file_url)."'";
246
+ if($_is_first_file_download_url) $player_sources .= ",'default': 'true'";
247
+ $player_sources .= '}'; // Close this source.
248
+ }
249
+ $_file_download_url['smil']['height'] = (integer)$_file_download_url_label; // e.g., `720p-HD` becomes `720`.
250
+ if(!$_file_download_url['smil']['height']) $_file_download_url['smil']['height'] = 720; // Use a default height if invalid.
251
+ $_file_download_url['smil']['width'] = ceil(($_file_download_url['smil']['height'] / $player_resolution_aspect_ratio_h) * $player_resolution_aspect_ratio_w);
252
+
253
+ $_file_download_url['smil']['system-bitrate'] = '1'; // Default value.
254
+ if(!empty($player_resolution_bitrates[$_file_download_url['smil']['height']]))
255
+ $_file_download_url['smil']['system-bitrate'] = $player_resolution_bitrates[$_file_download_url['smil']['height']];
256
+
257
+ $player_resolution_sources_smil_file_contents .= '<video src="'.esc_attr($_file_download_url['file']).'"'.
258
+ ' width="'.esc_attr($_file_download_url['smil']['width']).'"'.
259
+ ' height="'.esc_attr($_file_download_url['smil']['height']).'"'.
260
+ ' system-bitrate="'.esc_attr($_file_download_url['smil']['system-bitrate']).'" />';
261
+ }
262
+ else // Build them inline; i.e., don't create a SMIL file in this case; not necessary.
263
+ {
264
+ $player_sources .= ',{'; // Open this source; JSON object properties.
265
+ $player_sources .= "'file': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['streamer'].'/'.$_file_download_url['prefix'].$_file_download_url['file'])."'";
266
+ if(is_string($_file_download_url_label)) $player_sources .= ",'label': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url_label)."'";
267
+ if($_is_first_file_download_url) $player_sources .= ",'default': 'true'";
268
+ $player_sources .= '}'; // Close this source.
269
+ }
270
+ if($_is_last_file_download_url && $attr['player'] === 'jwplayer-v7-rtmp') // Provide a fallback also.
271
+ {
272
+ $player_sources .= ',{'; // Open this source; JSON object properties.
273
+ $player_sources .= "'file': '".c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['url'])."'";
274
+ $player_sources .= '}'; // Close this source.
275
+ }
276
+ break; // Break switch loop.
277
+ }
278
+ if($_is_first_file_download_url) // Record first one; also run back compat. replacements.
279
+ {
280
+ $_first_file_download_url = $_file_download_url; // Record for use later.
281
+ $player = preg_replace('/%%streamer%%/', $_file_download_url['streamer'], $player);
282
+ $player = preg_replace('/%%prefix%%/', $_file_download_url['prefix'], $player);
283
+ $player = preg_replace('/%%file%%/', $_file_download_url['file'], $player);
284
+ $player = preg_replace('/%%url%%/', $_file_download_url['url'], $player);
285
+ }
286
+ if($_is_last_file_download_url) // Record last one; which could be the same as the first one.
287
+ {
288
+ $_last_file_download_url = $_file_download_url; // Record for use later.
289
+ }
290
+ $_player_sources_counter++; // Increment the counter.
291
+ }
292
+ $player_sources = '['.trim($player_sources, ',').']'; // Build array.
293
+
294
+ if($player_resolution_sources_smil_file_contents && $_first_file_download_url) // Build SMIL file.
295
+ {
296
+ $player_resolution_sources_smil_file_contents = '<smil>'. // See: <http://wsharks.com/1ruqGVu>
297
+ ' <head><meta base="'.esc_attr($_first_file_download_url['streamer']).'" /></head>'.
298
+ ' <body><switch>'.$player_resolution_sources_smil_file_contents.'</switch></body>'.
299
+ '</smil>';
300
+ set_transient('s2m_rsf_'.$player_resolution_sources_smil_file_id, $player_resolution_sources_smil_file_contents, 86400);
301
+ }
302
+ unset($_first_file_download_url, $_last_file_download_url, $_uses_rtmp_streamers, // Housekeeping.
303
+ $_total_player_sources, $_player_sources_counter, $_is_first_file_download_url, $_is_last_file_download_url,
304
+ $_file_download_url_label, $_file_download_url);
305
+
306
+ $player = preg_replace('/%%player_id%%/', $attr['player_id'], $player);
307
+ $player = preg_replace('/%%player_path%%/', $attr['player_path'], $player);
308
+ $player = preg_replace('/%%player_key%%/', $attr['player_key'], $player);
309
+
310
+ $player = preg_replace('/%%player_title%%/', $attr['player_title'], $player);
311
+ $player = preg_replace('/%%player_image%%/', $attr['player_image'], $player);
312
+
313
+ $player = preg_replace('/%%player_mediaid%%/', $attr['player_mediaid'], $player);
314
+ $player = preg_replace('/%%player_description%%/', $attr['player_description'], $player);
315
+
316
+ if(($attr['player_tracks'] = c_ws_plugin__s2member_utils_strings::trim($attr['player_tracks'], NULL, '[]')))
317
+ $player = preg_replace('/%%player_tracks%%/', '['.((strpos($attr['player_tracks'], ':') !== FALSE) ? $attr['player_tracks'] : base64_decode($attr['player_tracks'])).']', $player);
318
+ else $player = preg_replace('/%%player_tracks%%/', '[]', $player);
319
+
320
+ $player = preg_replace('/%%player_sources%%/', $player_sources, $player); // Sources are constructed dynamically.
321
+
322
+ $player = preg_replace('/%%player_controls%%/', ((filter_var($attr['player_controls'], FILTER_VALIDATE_BOOLEAN)) ? 'true' : 'false'), $player);
323
+ $player = preg_replace('/%%player_width%%/', ((strpos($attr['player_width'], '%') !== FALSE) ? "'".$attr['player_width']."'" : (integer)$attr['player_width']), $player);
324
+ $player = preg_replace('/%%player_height%%/', (($attr['player_aspectratio']) ? "''" : ((strpos($attr['player_height'], '%') !== FALSE) ? "'".$attr['player_height']."'" : (integer)$attr['player_height'])), $player);
325
+ $player = preg_replace('/%%player_aspectratio%%/', $attr['player_aspectratio'], $player);
326
+ $player = preg_replace('/%%player_stretching%%/', $attr['player_stretching'], $player);
327
+
328
+ $player = preg_replace('/%%player_autostart%%/', ((filter_var($attr['player_autostart'], FILTER_VALIDATE_BOOLEAN)) ? 'true' : 'false'), $player);
329
+ $player = preg_replace('/%%player_fallback%%/', ((filter_var($attr['player_fallback'], FILTER_VALIDATE_BOOLEAN)) ? 'true' : 'false'), $player);
330
+ $player = preg_replace('/%%player_mute%%/', ((filter_var($attr['player_mute'], FILTER_VALIDATE_BOOLEAN)) ? 'true' : 'false'), $player);
331
+ $player = preg_replace('/%%player_repeat%%/', ((filter_var($attr['player_repeat'], FILTER_VALIDATE_BOOLEAN)) ? 'true' : 'false'), $player);
332
+ $player = preg_replace('/%%player_startparam%%/', $attr['player_startparam'], $player);
333
+ $player = preg_replace('/%%player_primary%%/', $attr['player_primary'], $player);
334
+
335
+ $player = preg_replace('/%%player_option_blocks%%/', ((strpos($attr['player_option_blocks'], ':') !== FALSE) ? $attr['player_option_blocks'] : base64_decode($attr['player_option_blocks'])), $player);
336
+ }
337
+ else if(strpos($attr['player'], 'jwplayer-v6') === 0) // JW Player (old v6).
338
  {
339
  $player = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
340
 
src/includes/hooks.inc.php CHANGED
@@ -71,6 +71,7 @@ add_filter('widget_text', 'do_shortcode'); // Shortcodes in widgets.
71
 
72
  add_action('wp_print_styles', 'c_ws_plugin__s2member_css_js_themes::add_css');
73
  add_action('wp_print_scripts', 'c_ws_plugin__s2member_css_js_themes::add_js_w_globals');
 
74
 
75
  add_action('wp_login_failed', 'c_ws_plugin__s2member_brute_force::track_failed_logins');
76
  add_filter('authenticate', 'c_ws_plugin__s2member_brute_force::stop_brute_force_logins', 100);
71
 
72
  add_action('wp_print_styles', 'c_ws_plugin__s2member_css_js_themes::add_css');
73
  add_action('wp_print_scripts', 'c_ws_plugin__s2member_css_js_themes::add_js_w_globals');
74
+ add_filter('script_loader_tag', 'c_ws_plugin__s2member_css_js_themes::script_loader_tag', 10, 2);
75
 
76
  add_action('wp_login_failed', 'c_ws_plugin__s2member_brute_force::track_failed_logins');
77
  add_filter('authenticate', 'c_ws_plugin__s2member_brute_force::stop_brute_force_logins', 100);
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3-rtmp-only.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6-rtmp-only" player_path="/jwplayer/jwplayer.js" file_download="audio.mp3" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7-rtmp-only" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="audio.mp3" /]
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3-rtmp.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6-rtmp" player_path="/jwplayer/jwplayer.js" file_download="audio.mp3" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7-rtmp" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="audio.mp3" /]
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp3.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6" player_path="/jwplayer/jwplayer.js" file_download="audio.mp3" rewrite="yes" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="audio.mp3" rewrite="yes" /]
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4-rtmp-only.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6-rtmp-only" player_path="/jwplayer/jwplayer.js" file_download="video.mp4" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7-rtmp-only" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="video.mp4" /]
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4-rtmp.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6-rtmp" player_path="/jwplayer/jwplayer.js" file_download="video.mp4" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7-rtmp" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="video.mp4" /]
src/includes/menu-pages/code-samples/jwplayer-s2stream-mp4.x-php CHANGED
@@ -1,2 +1,2 @@
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
- [s2Stream player="jwplayer-v6" player_path="/jwplayer/jwplayer.js" file_download="video.mp4" rewrite="yes" /]
1
  Copy/paste this Shortcode into any WordPress® Post or Page.
2
+ [s2Stream player="jwplayer-v7" player_path="/jwplayer/jwplayer.js" player_key="YOUR KEY HERE" file_download="video.mp4" rewrite="yes" /]
src/includes/menu-pages/code-samples/jwplayer-standard-mp4.x-php CHANGED
@@ -6,8 +6,10 @@ $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test fil
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
- <script type="text/javascript">
 
 
11
  jwplayer('jw-container').setup({
12
  playlist:
13
  [{
@@ -20,4 +22,4 @@ $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test fil
20
  primary: 'flash' /* Try Flash® first, fallback on HTML5 or direct download of MP4 file. */,
21
  width: 480, height: 270 // Set video dimensions for all sources.
22
  });
23
- </script>
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
+ <script src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
+ <script>jwplayer.key = 'YOUR KEY HERE';</script>
11
+
12
+ <script>
13
  jwplayer('jw-container').setup({
14
  playlist:
15
  [{
22
  primary: 'flash' /* Try Flash® first, fallback on HTML5 or direct download of MP4 file. */,
23
  width: 480, height: 270 // Set video dimensions for all sources.
24
  });
25
+ </script>
src/includes/menu-pages/code-samples/jwplayer-streaming-mp4-sca.x-php CHANGED
@@ -6,16 +6,17 @@ $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test fil
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
 
10
 
11
- <script type="text/javascript">
12
  // The Shortcode here will return a JSON object for JavaScript notation.
13
  // A direct URL to the RTMP source; counting the file against the current User in real-time.
14
  // API Shortcode `s2File` returns a null object if access is denied to the current User/Member.
15
  var mp4 = [s2File download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" url_to_storage_source="true" count_against_user="true" get_streamer_json="true" /];
16
  </script>
17
 
18
- <script type="text/javascript">
19
  if(typeof mp4 === 'object') // `s2File` returns a null object if access is denied to the current User.
20
  {
21
  jwplayer('jw-container').setup({
@@ -35,4 +36,4 @@ $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test fil
35
  {
36
  document.write('Sorry, you do NOT have access to this file.');
37
  }
38
- </script>
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
+ <script src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
+ <script>jwplayer.key = 'YOUR KEY HERE';</script>
11
 
12
+ <script>
13
  // The Shortcode here will return a JSON object for JavaScript notation.
14
  // A direct URL to the RTMP source; counting the file against the current User in real-time.
15
  // API Shortcode `s2File` returns a null object if access is denied to the current User/Member.
16
  var mp4 = [s2File download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" url_to_storage_source="true" count_against_user="true" get_streamer_json="true" /];
17
  </script>
18
 
19
+ <script>
20
  if(typeof mp4 === 'object') // `s2File` returns a null object if access is denied to the current User.
21
  {
22
  jwplayer('jw-container').setup({
36
  {
37
  document.write('Sorry, you do NOT have access to this file.');
38
  }
39
+ </script>
src/includes/menu-pages/code-samples/jwplayer-streaming-mp4-webm.x-php CHANGED
@@ -7,7 +7,8 @@ $s2_jw_config["webm_video_file_name"] = "video.webm"; // Name of your WEBM test
7
  ?>
8
 
9
  <div id="jw-container">JW Player® appears here.</div>
10
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
 
11
 
12
  <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
13
  $mp4_cfg = array("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true);
@@ -17,7 +18,7 @@ $webm_cfg = array("file_download" => $s2_jw_config["webm_video_file_name"], "url
17
  if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
18
  && ($webm["url"] = s2member_file_download_url ($webm_cfg))) { ?>
19
 
20
- <script type="text/javascript">
21
  jwplayer('jw-container').setup({
22
  playlist:
23
  [{
@@ -35,4 +36,4 @@ if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
35
 
36
  <?php } else /* Access is denied to the current User. */ { ?>
37
  Sorry, you do NOT have access to this file.
38
- <?php } ?>
7
  ?>
8
 
9
  <div id="jw-container">JW Player® appears here.</div>
10
+ <script src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
11
+ <script>jwplayer.key = 'YOUR KEY HERE';</script>
12
 
13
  <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
14
  $mp4_cfg = array("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true);
18
  if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
19
  && ($webm["url"] = s2member_file_download_url ($webm_cfg))) { ?>
20
 
21
+ <script>
22
  jwplayer('jw-container').setup({
23
  playlist:
24
  [{
36
 
37
  <?php } else /* Access is denied to the current User. */ { ?>
38
  Sorry, you do NOT have access to this file.
39
+ <?php } ?>
src/includes/menu-pages/code-samples/jwplayer-streaming-mp4.x-php CHANGED
@@ -6,7 +6,8 @@ $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test fil
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
 
10
 
11
  <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
12
  $cfg = array("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true); ?>
@@ -14,7 +15,7 @@ $cfg = array("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_st
14
  <?php // API Function `s2member_file_download_url()` returns false if access is denied to the current User.
15
  if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
16
 
17
- <script type="text/javascript">
18
  jwplayer('jw-container').setup({
19
  playlist:
20
  [{
@@ -31,4 +32,4 @@ if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
31
 
32
  <?php } else /* Access is denied to the current User. */ { ?>
33
  Sorry, you do NOT have access to this file.
34
- <?php } ?>
6
  ?>
7
 
8
  <div id="jw-container">JW Player® appears here.</div>
9
+ <script src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
+ <script>jwplayer.key = 'YOUR KEY HERE';</script>
11
 
12
  <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
13
  $cfg = array("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true); ?>
15
  <?php // API Function `s2member_file_download_url()` returns false if access is denied to the current User.
16
  if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
17
 
18
+ <script>
19
  jwplayer('jw-container').setup({
20
  playlist:
21
  [{
32
 
33
  <?php } else /* Access is denied to the current User. */ { ?>
34
  Sorry, you do NOT have access to this file.
35
+ <?php } ?>
src/includes/menu-pages/down-ops.inc.php CHANGED
@@ -177,7 +177,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
177
 
178
  echo '<div class="ws-menu-page-hr"></div>'."\n";
179
 
180
- echo '<p>The function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_key()" target="_blank" rel="external">s2member_file_download_key()</a>, is part of the s2Member API. It produces a time-sensitive File Download Key that is unique to each and every visitor. Each Key it produces <em>(at the time it is produced)</em>, will be valid for the current day, and only for a specific IP address and User-Agent string; as detected by s2Member. This makes it possible for you to create links on your site, which provide access to protected file downloads; and without having to worry about one visitor sharing their link with another. So let\'s take a quick look at what <code>s2member_file_download_key()</code> actually produces.</p>'."\n";
181
  echo '<p><code>s2member_file_download_key("example-file.zip")</code> = a site-specific hash of: <code>date("Y-m-d").$_SERVER["REMOTE_ADDR"].$_SERVER["HTTP_USER_AGENT"].$file</code></p>'."\n";
182
  echo '<p>When <code>s2member_file_download_key = <em>a valid Key</em></code>, it works independently from Member Level Access. That is, a visitor does NOT have to be logged in to receive access; they just need a valid Key. Using this advanced technique, you could extend s2Member\'s file protection routines, or even combine them with Specific Post/Page Access, and more. The possibilities are limitless really.</p>'."\n";
183
 
@@ -236,7 +236,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
236
  echo '<h3>Remote Header Authorization (optional)</h3>'."\n";
237
  echo '<p>This can be enabled on a case-by-case basis. Just add this to the end of your download links: <code>&amp;s2member_file_remote=yes</code></p>'."\n";
238
  echo '<p>Shortcode alternative: <code>[s2File download="example-file.zip" remote="yes" /]</code></p>'."\n";
239
- echo '<p>Remote Header Authorization allows access to file downloads through an entirely different approach. Instead of asking the Member to log into your site through a browser, a Member will be prompted automatically, to log in through HTTP Header Authorization prompts; which is the same technique used in more traditional security systems via .htaccess files. In other words, Remote Header Authorization makes it possible for your Members to access files through remote applications that may NOT use a browser. This is often the case when a Member needs to access protected files through a software client like iTunes; typical with podcasts. See <a href="http://www.s2member.com/videos/71F49478D6983A9C/" target="_blank" rel="external">tutorial video here</a> for details about how to setup a Podcast for iTunes.</p>'."\n";
240
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_remote_authorization", get_defined_vars());
241
  echo '</div>'."\n";
242
 
@@ -287,10 +287,12 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
287
  echo '<option value="us-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-1') ? ' selected="selected"' : '').'>us-west-1</option>'."\n";
288
  echo '<option value="us-west-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-2') ? ' selected="selected"' : '').'>us-west-2</option>'."\n";
289
  echo '<option value="eu-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-west-1') ? ' selected="selected"' : '').'>eu-west-1</option>'."\n";
 
290
  echo '<option value="eu-central-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-central-1') ? ' selected="selected"' : '').'>eu-central-1</option>'."\n";
291
  echo '<option value="ap-southeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-1') ? ' selected="selected"' : '').'>ap-southeast-1</option>'."\n";
292
  echo '<option value="ap-southeast-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-2') ? ' selected="selected"' : '').'>ap-southeast-2</option>'."\n";
293
  echo '<option value="ap-northeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-northeast-1') ? ' selected="selected"' : '').'>ap-northeast-1</option>'."\n";
 
294
  echo '<option value="sa-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'sa-east-1') ? ' selected="selected"' : '').'>sa-east-1</option>'."\n";
295
  echo '<option value="us-gov-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-gov-west-1') ? ' selected="selected"' : '').'>us-gov-west-1</option>'."\n";
296
  echo '</select><br />'."\n";
@@ -642,12 +644,12 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
642
  {
643
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rtmp_streaming", get_defined_vars());
644
 
645
- echo '<div class="ws-menu-page-group" title="JW Player v6 &amp; RTMP Protocol Examples">'."\n";
646
 
647
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
648
- echo '<h3>JW Player v6 &amp; RTMP Protocol Examples</h3>'."\n";
649
  echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/ZTopRQQAELw" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
650
- echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
651
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
652
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
653
  if(stripos(wp_get_theme(), 'infocus') !== FALSE)
@@ -688,13 +690,13 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
688
  echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <strong>s2Member → Download Options → Advanced Mod Rewrite Linkage</strong>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
689
 
690
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
691
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
692
 
693
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
694
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
695
 
696
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
697
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
698
 
699
  echo '</div>'."\n";
700
 
@@ -740,7 +742,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
740
  echo '<div class="ws-menu-page-hr"></div>'."\n";
741
 
742
  echo '<h4 style="margin:0;"><code>[s2File /]</code> &amp; <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
743
- echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
744
  echo '<table class="form-table" style="margin-top:0;">'."\n";
745
  echo '<tbody>'."\n";
746
  echo '<tr style="padding-top:0;">'."\n";
@@ -773,7 +775,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
773
 
774
  echo '<h4 style="margin:0;">Additional <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
775
  echo '<p style="margin:0;"><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
776
- echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
777
  echo '<table class="form-table" style="margin-top:0;">'."\n";
778
  echo '<tbody>'."\n";
779
  echo '<tr style="padding-top:0;">'."\n";
@@ -781,12 +783,12 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
781
  echo '<td style="padding-top:0;">'."\n";
782
  echo '<ul class="ws-menu-page-li-margins">'."\n";
783
  echo '<li><code>file_download="video.mp4"</code> Location of the audio/video file, relative to the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory; or, relative to the root of your Amazon S3 Bucket, when applicable.</li>'."\n";
784
- echo '<li><code>player="jwplayer-v6-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v6</code> (works with any audio/video file, and you do NOT need to have Amazon S3 or CloudFront integrated for this to work), <code>jwplayer-v6-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon S3 and CloudFront integration), <code>jwplayer-v6-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon S3 and CloudFront integration).</li>'."\n";
785
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member for each instance of your Shortcode.</li>'."\n";
786
  echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code>—you should upload the <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
787
  echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e., click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
788
- echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="video_ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>, <code>player_captions="{file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.s2member.com/r/jw-player-video-captions/" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
789
- echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
790
  echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
791
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
792
  echo '</ul>'."\n";
@@ -799,7 +801,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
799
  echo '<div class="ws-menu-page-hr"></div>'."\n";
800
 
801
  echo '<h4 style="margin:0;"><code>[s2Key /]</code> Shortcode Attributes:</h4>'."\n";
802
- echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_key()" target="_blank" rel="external">s2member_file_download_key()</a> for PHP integration.</p>'."\n";
803
  echo '<table class="form-table" style="margin-top:0;">'."\n";
804
  echo '<tbody>'."\n";
805
  echo '<tr style="padding-top:0;">'."\n";
177
 
178
  echo '<div class="ws-menu-page-hr"></div>'."\n";
179
 
180
+ echo '<p>The function <a href="https://s2member.com/r/s2member-codex-src_doc_s2member_file_download_key/" target="_blank" rel="external">s2member_file_download_key()</a>, is part of the s2Member API. It produces a time-sensitive File Download Key that is unique to each and every visitor. Each Key it produces <em>(at the time it is produced)</em>, will be valid for the current day, and only for a specific IP address and User-Agent string; as detected by s2Member. This makes it possible for you to create links on your site, which provide access to protected file downloads; and without having to worry about one visitor sharing their link with another. So let\'s take a quick look at what <code>s2member_file_download_key()</code> actually produces.</p>'."\n";
181
  echo '<p><code>s2member_file_download_key("example-file.zip")</code> = a site-specific hash of: <code>date("Y-m-d").$_SERVER["REMOTE_ADDR"].$_SERVER["HTTP_USER_AGENT"].$file</code></p>'."\n";
182
  echo '<p>When <code>s2member_file_download_key = <em>a valid Key</em></code>, it works independently from Member Level Access. That is, a visitor does NOT have to be logged in to receive access; they just need a valid Key. Using this advanced technique, you could extend s2Member\'s file protection routines, or even combine them with Specific Post/Page Access, and more. The possibilities are limitless really.</p>'."\n";
183
 
236
  echo '<h3>Remote Header Authorization (optional)</h3>'."\n";
237
  echo '<p>This can be enabled on a case-by-case basis. Just add this to the end of your download links: <code>&amp;s2member_file_remote=yes</code></p>'."\n";
238
  echo '<p>Shortcode alternative: <code>[s2File download="example-file.zip" remote="yes" /]</code></p>'."\n";
239
+ echo '<p>Remote Header Authorization allows access to file downloads through an entirely different approach. Instead of asking the Member to log into your site through a browser, a Member will be prompted automatically, to log in through HTTP Header Authorization prompts; which is the same technique used in more traditional security systems via .htaccess files. In other words, Remote Header Authorization makes it possible for your Members to access files through remote applications that may NOT use a browser. This is often the case when a Member needs to access protected files through a software client like iTunes; typical with podcasts. See <a href="https://s2member.com/r/file-downloads-remote-auth-podcasting/" target="_blank" rel="external">tutorial video here</a> for details about how to setup a Podcast for iTunes.</p>'."\n";
240
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_remote_authorization", get_defined_vars());
241
  echo '</div>'."\n";
242
 
287
  echo '<option value="us-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-1') ? ' selected="selected"' : '').'>us-west-1</option>'."\n";
288
  echo '<option value="us-west-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-2') ? ' selected="selected"' : '').'>us-west-2</option>'."\n";
289
  echo '<option value="eu-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-west-1') ? ' selected="selected"' : '').'>eu-west-1</option>'."\n";
290
+ echo '<option value="eu-west-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-west-2') ? ' selected="selected"' : '').'>eu-west-2</option>'."\n";
291
  echo '<option value="eu-central-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-central-1') ? ' selected="selected"' : '').'>eu-central-1</option>'."\n";
292
  echo '<option value="ap-southeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-1') ? ' selected="selected"' : '').'>ap-southeast-1</option>'."\n";
293
  echo '<option value="ap-southeast-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-2') ? ' selected="selected"' : '').'>ap-southeast-2</option>'."\n";
294
  echo '<option value="ap-northeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-northeast-1') ? ' selected="selected"' : '').'>ap-northeast-1</option>'."\n";
295
+ echo '<option value="ap-northeast-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-northeast-2') ? ' selected="selected"' : '').'>ap-northeast-2</option>'."\n";
296
  echo '<option value="sa-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'sa-east-1') ? ' selected="selected"' : '').'>sa-east-1</option>'."\n";
297
  echo '<option value="us-gov-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-gov-west-1') ? ' selected="selected"' : '').'>us-gov-west-1</option>'."\n";
298
  echo '</select><br />'."\n";
644
  {
645
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rtmp_streaming", get_defined_vars());
646
 
647
+ echo '<div class="ws-menu-page-group" title="JW Player v7 &amp; RTMP Protocol Examples">'."\n";
648
 
649
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
650
+ echo '<h3>JW Player v7 &amp; RTMP Protocol Examples</h3>'."\n";
651
  echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/ZTopRQQAELw" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
652
+ echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Forum</a> for tips/tricks if you like.</p>'."\n";
653
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
654
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
655
  if(stripos(wp_get_theme(), 'infocus') !== FALSE)
690
  echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <strong>s2Member → Download Options → Advanced Mod Rewrite Linkage</strong>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
691
 
692
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
693
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
694
 
695
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
696
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
697
 
698
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
699
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
700
 
701
  echo '</div>'."\n";
702
 
742
  echo '<div class="ws-menu-page-hr"></div>'."\n";
743
 
744
  echo '<h4 style="margin:0;"><code>[s2File /]</code> &amp; <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
745
+ echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="https://s2member.com/r/s2member-codex-src_doc_s2member_file_download_url/" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
746
  echo '<table class="form-table" style="margin-top:0;">'."\n";
747
  echo '<tbody>'."\n";
748
  echo '<tr style="padding-top:0;">'."\n";
775
 
776
  echo '<h4 style="margin:0;">Additional <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
777
  echo '<p style="margin:0;"><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
778
+ echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="https://s2member.com/r/s2member-codex-src_doc_s2member_file_download_url/" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
779
  echo '<table class="form-table" style="margin-top:0;">'."\n";
780
  echo '<tbody>'."\n";
781
  echo '<tr style="padding-top:0;">'."\n";
783
  echo '<td style="padding-top:0;">'."\n";
784
  echo '<ul class="ws-menu-page-li-margins">'."\n";
785
  echo '<li><code>file_download="video.mp4"</code> Location of the audio/video file, relative to the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory; or, relative to the root of your Amazon S3 Bucket, when applicable.</li>'."\n";
786
+ echo '<li><code>player="jwplayer-v7-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v7</code> (works with any audio/video file, and you do NOT need to have Amazon S3 or CloudFront integrated for this to work), <code>jwplayer-v7-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon S3 and CloudFront integration), <code>jwplayer-v7-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon S3 and CloudFront integration).</li>'."\n";
787
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member for each instance of your Shortcode.</li>'."\n";
788
  echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code>—you should upload the <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
789
  echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e., click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
790
+ echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v7, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_key="my-license-key"</code>, <code>player_tracks="{kind:\'captions\',file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.s2member.com/r/jw-player-video-captions/" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
791
+ echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v7, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
792
  echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
793
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
794
  echo '</ul>'."\n";
801
  echo '<div class="ws-menu-page-hr"></div>'."\n";
802
 
803
  echo '<h4 style="margin:0;"><code>[s2Key /]</code> Shortcode Attributes:</h4>'."\n";
804
+ echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="https://s2member.com/r/s2member-codex-src_doc_s2member_file_download_key/" target="_blank" rel="external">s2member_file_download_key()</a> for PHP integration.</p>'."\n";
805
  echo '<table class="form-table" style="margin-top:0;">'."\n";
806
  echo '<tbody>'."\n";
807
  echo '<tr style="padding-top:0;">'."\n";
src/includes/menu-pages/gen-ops.inc.php CHANGED
@@ -146,7 +146,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
146
 
147
  echo '<div class="ws-menu-page-section ws-plugin--s2member-localhost-info-section">'."\n";
148
  echo '<h3>Localhost WAMP/MAMP Installs (are you a developer?)</h3>'."\n";
149
- echo '<p>If you\'re developing your site in a <code>localhost</code> environment, running something like WAMP/MAMP, or <a href="http://www.easyphp.org/" target="_blank" rel="external">EasyPHP</a>, please add this line to your <code>/wp-config.php</code> file: <code><span style="color:#0000BB;">define</span><span style="color:#007700;">(</span><span style="color:#DD0000;">"LOCALHOST"</span>, <span style="color:#0000BB;">true</span><span style="color:#007700;">);</span></code>.</p>'."\n";
150
  echo '<p>This lets s2Member know definitively that your site is in a <code>localhost</code> environment. s2Member will adjust itself accordingly, maximizing functionality during your developement. s2Member can usually auto-detect this, but in cases where your <code>localhost</code> installation runs on something other than <code>127.0.0.1/localhost</code>, you need to tell s2Member definitively, by adding that line to your <code>/wp-config.php</code> file. For instance, s2Member needs to know when your server IP is the same as all User IPs.</p>'."\n";
151
  echo '<p><em>Once your site goes live, please remove the line. If you\'re already on a live server connected to the web, please ignore this section.</em></p>'."\n";
152
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_localhost_info", get_defined_vars());
@@ -206,9 +206,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
206
  echo '<div class="ws-menu-page-section ws-plugin--s2member-s-badge-wp-footer-code-section">'."\n";
207
  echo '<h3>Security Badge &amp; Footer Configuration (optional)</h3>'."\n";
208
  echo '<div class="ws-menu-page-right">'.c_ws_plugin__s2member_utilities::s_badge_gen("1", TRUE, TRUE).'</div>'."\n";
209
- echo '<p>An s2Member Security Badge (optional), can be used to express your site\'s concern for security; demonstrating to all Users/Members that your site (and the s2Member software) takes security seriously. However, in order to qualify your site, you <em>must</em> generate a Security Encryption Key (previous section), and then click "Save All Changes". Only then, will s2Member officially verify your installation</em>.</p>'."\n";
210
- echo '<p>Once you\'ve <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">properly configured all security aspects of s2Member</a>, your s2Member Security Badge will be verified. To see the "verified" version of your Security Badge, you might need to refresh your browser after saving all changes (i.e., after you create a Security Encryption Key). Also, s2Member will <em>not</em> "verify" your site if you turn off Unique IP Restrictions, Brute Force Login Protection, or if your <code>/wp-config.php</code> file lacks <a href="http://codex.wordpress.org/Editing_wp-config.php#Security_Keys" target="_blank" rel="external">Security Keys</a> <em>(each at least 60 chars in length)</em>. In addition, it\'s not possible for s2Member to verify your Security Badge if your site is in a <code>localhost</code> environment; i.e., not connected to the web.</p>'."\n";
211
- echo '<p><strong>How does s2Member know when my site is secure?</strong><br />If enabled below, an API call for "Security Badge Status" will allow web service connections to determine your status. Clicking <a href="'.esc_attr(home_url("/?s2member_s_badge_status=1")).'" target="_blank" rel="external">this link</a> will report <code>1</code> <em>(secure)</em>, <code>0</code> <em>(at risk)</em>, or <code>-</code> <em>(API disabled)</em>. Once all security considerations are satisfied, s2Member will report <code>1</code> <em>(secure)</em> for your installation. <strong>Note:</strong> this simple API will not, and should not, report any other information. It will only report the current status of your Security Badge, as determined by your installation of s2Member. When/if you install the s2Member Security Badge, s2Member will make a connection to your site <strong>once per day</strong>, to test your status.</p>'."\n";
212
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_s_badge_wp_footer_code", get_defined_vars());
213
 
214
  echo '<table class="form-table">'."\n";
@@ -229,7 +228,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
229
  echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>No (default, Badge Status API is disabled)</option>'."\n";
230
  echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>Yes (enable Badge Status API for verification)</option>'."\n";
231
  echo '</select><br />'."\n";
232
- echo 'This must be enabled if you want s2Member to verify your Security Badge.'."\n";
233
  echo '</td>'."\n";
234
 
235
  echo '</tr>'."\n";
@@ -432,7 +431,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
432
 
433
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
434
  '<div class="ws-menu-page-hr"></div>'."\n".
435
- '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="http://codex.wordpress.org/Class_Reference/WP_User" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please note that all Replacement Codes will be parsed first, and then any PHP tags that you\'ve included. Also, please remember that emails are sent in plain text format.</p>'."\n"
436
  : '';
437
  echo '</td>'."\n";
438
 
@@ -535,7 +534,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
535
 
536
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
537
  '<div class="ws-menu-page-hr"></div>'."\n".
538
- '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="http://codex.wordpress.org/Class_Reference/WP_User" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please note that all Replacement Codes will be parsed first, and then any PHP tags that you\'ve included. Also, please remember that emails are sent in plain text format.</p>'."\n"
539
  : '';
540
  echo '</td>'."\n";
541
 
@@ -616,7 +615,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
616
  echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
617
  echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
618
  echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>(at Level #0)</em>, along with several Primary Roles for paid Membership <em>(i.e., Levels 1-4)</em>, created by the s2Member plugin.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' s2Member also supports unlimited Custom Capability Packages <em>(see <strong>s2Member → API Scripting → Custom Capabilities</strong>)</em>' : '').'. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>'."\n";
619
- echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <strong>s2Member → API Scripting → Custom Capabilities</strong>. We also recommend <a href="http://www.s2member.com/videos/A2C07377CF60025E/" target="_blank" rel="external">this video tutorial</a>.</em></p>'."\n" : '';
620
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><strong>See also:</strong> These KB articles: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities</a> and <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
621
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
622
 
146
 
147
  echo '<div class="ws-menu-page-section ws-plugin--s2member-localhost-info-section">'."\n";
148
  echo '<h3>Localhost WAMP/MAMP Installs (are you a developer?)</h3>'."\n";
149
+ echo '<p>If you\'re developing your site in a <code>localhost</code> environment, running something like WAMP/MAMP, or <a href="https://s2member.com/r/easyphp/" target="_blank" rel="external">EasyPHP</a>, please add this line to your <code>/wp-config.php</code> file: <code><span style="color:#0000BB;">define</span><span style="color:#007700;">(</span><span style="color:#DD0000;">"LOCALHOST"</span>, <span style="color:#0000BB;">true</span><span style="color:#007700;">);</span></code>.</p>'."\n";
150
  echo '<p>This lets s2Member know definitively that your site is in a <code>localhost</code> environment. s2Member will adjust itself accordingly, maximizing functionality during your developement. s2Member can usually auto-detect this, but in cases where your <code>localhost</code> installation runs on something other than <code>127.0.0.1/localhost</code>, you need to tell s2Member definitively, by adding that line to your <code>/wp-config.php</code> file. For instance, s2Member needs to know when your server IP is the same as all User IPs.</p>'."\n";
151
  echo '<p><em>Once your site goes live, please remove the line. If you\'re already on a live server connected to the web, please ignore this section.</em></p>'."\n";
152
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_localhost_info", get_defined_vars());
206
  echo '<div class="ws-menu-page-section ws-plugin--s2member-s-badge-wp-footer-code-section">'."\n";
207
  echo '<h3>Security Badge &amp; Footer Configuration (optional)</h3>'."\n";
208
  echo '<div class="ws-menu-page-right">'.c_ws_plugin__s2member_utilities::s_badge_gen("1", TRUE, TRUE).'</div>'."\n";
209
+ echo '<p>An s2Member Security Badge can be used to express your site\'s concern for security. To qualify your site, you must enable the Badge Status API (see below), and you must <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">properly configure all security features in WordPress &amp; s2Member</a>. If you enable the Badge Status API, s2Member will make a connection to your site <strong>once per day</strong>, to test your status. Once your status is <code>1</code> (secure), <strong>it can then take up to 12 hours</strong> for your s2Member Security Badge image to show a green status for the first time.</p>'."\n";
210
+ echo '<p><strong>How does s2Member know when my site is secure?</strong><br />If enabled below, an API call for "Security Badge Status" will allow web service connections to determine your status. For example, clicking <a href="'.esc_attr(home_url("/?s2member_s_badge_status=1")).'" target="_blank" rel="external">this link</a> will report <code>1</code> (secure), <code>0</code> (at risk), or <code>-</code> (API disabled). Once you have <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">properly configured all security features in WordPress &amp; s2Member</a>, the s2Member Badge Status API will report <code>1</code> (secure) for your installation. <strong>Note:</strong> this simple API will not, and should not, report any other information. It will only report the current status of your Security Badge, as determined by your installation of s2Member.</p>'."\n";
 
211
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_s_badge_wp_footer_code", get_defined_vars());
212
 
213
  echo '<table class="form-table">'."\n";
228
  echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>No (default, Badge Status API is disabled)</option>'."\n";
229
  echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["s_badge_status_enabled"]) ? ' selected="selected"' : '').'>Yes (enable Badge Status API for verification)</option>'."\n";
230
  echo '</select><br />'."\n";
231
+ echo '<em>This must be enabled if you want s2Member to verify your Security Badge each day.</em>'."\n";
232
  echo '</td>'."\n";
233
 
234
  echo '</tr>'."\n";
431
 
432
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
433
  '<div class="ws-menu-page-hr"></div>'."\n".
434
+ '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="https://s2member.com/r/wordpress-codex-wp_user/" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please note that all Replacement Codes will be parsed first, and then any PHP tags that you\'ve included. Also, please remember that emails are sent in plain text format.</p>'."\n"
435
  : '';
436
  echo '</td>'."\n";
437
 
534
 
535
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ?
536
  '<div class="ws-menu-page-hr"></div>'."\n".
537
+ '<p style="margin:0;"><strong>PHP Code:</strong> It is also possible to use PHP tags—optional (for developers). If you use PHP tags, please run a test email with <code>&lt;?php print_r(get_defined_vars()); ?&gt;</code>. This will give you a full list of all PHP variables available to you in this email. The <code>$user</code> variable is the most important one. It\'s an instance of the <a href="https://s2member.com/r/wordpress-codex-wp_user/" target="_blank" rel="external"><code>WP_User</code></a> class (e.g., <code>$user->ID</code>, <code>$user->has_cap()</code>, etc). Please note that all Replacement Codes will be parsed first, and then any PHP tags that you\'ve included. Also, please remember that emails are sent in plain text format.</p>'."\n"
538
  : '';
539
  echo '</td>'."\n";
540
 
615
  echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
616
  echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
617
  echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>(at Level #0)</em>, along with several Primary Roles for paid Membership <em>(i.e., Levels 1-4)</em>, created by the s2Member plugin.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' s2Member also supports unlimited Custom Capability Packages <em>(see <strong>s2Member → API Scripting → Custom Capabilities</strong>)</em>' : '').'. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>'."\n";
618
+ echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <strong>s2Member → API Scripting → Custom Capabilities</strong>. We also recommend <a href="https://s2member.com/r/s2member-video-custom-capabilities-for-wordpress/" target="_blank" rel="external">this video tutorial</a>.</em></p>'."\n" : '';
619
  echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><strong>See also:</strong> These KB articles: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities</a> and <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
620
  do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
621
 
src/includes/menu-pages/help.inc.php CHANGED
@@ -49,7 +49,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_help"))
49
  echo '<div class="ws-menu-page-group" title="Getting Help w/ s2Member" default-state="open">' . "\n";
50
 
51
  echo '<div class="ws-menu-page-section ws-plugin--s2member-help">' . "\n";
52
- echo '<p>s2Member is pretty easy to setup and install initially. Most of the official documentation is right here in your Dashboard (i.e., there is a lot of inline documentation built into the software). That being said, it can take some time to master everything there is to know about s2Member\'s advanced features. If you need assistance with s2Member, please search the <a href="http://s2member.com/kb/" target="_blank" rel="external">s2Member Knowledge Base</a>, <a href="http://s2member.com/videos/" target="_blank" rel="external">Video Tutorials</a>, <a href="http://s2member.com/forums/" target="_blank" rel="external">Forums</a> and <a href="http://s2member.com/r/codex/" target="_blank" rel="external">Codex</a>. If you are planning to do something creative with s2Member, you might want to <a href="http://jobs.wordpress.net" target="_blank" rel="external">hire a freelance developer</a> to assist you.</p>' . "\n";
53
  echo '<p><strong>See also:</strong> <a href="http://s2member.com/r/common-troubleshooting-tips/" target="_blank" rel="external">s2Member Troubleshooting Guide</a> (please read this first if you\'re having trouble).</p>'."\n";
54
 
55
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
@@ -82,7 +82,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_help"))
82
  echo '<div class="ws-menu-page-group" title="s2Member Tech. Support (for Pro Customers)" default-state="open">' . "\n";
83
 
84
  echo '<div class="ws-menu-page-section ws-plugin--s2member-support">' . "\n";
85
- echo '<p style="max-width:900px;">Support for s2Member® is provided by WebSharks, Inc. Our customer support representatives are available Monday through Friday, excluding all major holidays. Or, you can discuss problems/solutions with others in our <a href="https://wordpress.org/support/plugin/s2member" target="_blank" rel="external">public community forum</a>.</p>'."\n";
86
 
87
  echo '<ul>'."\n";
88
  echo '<li>For pre-sale questions please see: <a href="http://s2member.com/kb/kb-tag/pre-sale-faqs/" target="_blank" rel="external">Pre-Sale FAQs</a>.</li>'."\n";
49
  echo '<div class="ws-menu-page-group" title="Getting Help w/ s2Member" default-state="open">' . "\n";
50
 
51
  echo '<div class="ws-menu-page-section ws-plugin--s2member-help">' . "\n";
52
+ echo '<p>s2Member is pretty easy to setup and install initially. Most of the official documentation is right here in your Dashboard (i.e., there is a lot of inline documentation built into the software). That being said, it can take some time to master everything there is to know about s2Member\'s advanced features. If you need assistance with s2Member, please search the <a href="http://s2member.com/kb/" target="_blank" rel="external">s2Member Knowledge Base</a>, <a href="http://s2member.com/r/videos/" target="_blank" rel="external">Video Tutorials</a>, <a href="http://s2member.com/r/forum/" target="_blank" rel="external">Forums</a> and <a href="http://s2member.com/r/codex/" target="_blank" rel="external">Codex</a>. If you are planning to do something creative with s2Member, you might want to <a href="https://s2member.com/r/jobs-wordpress-net/" target="_blank" rel="external">hire a freelance developer</a> to assist you.</p>' . "\n";
53
  echo '<p><strong>See also:</strong> <a href="http://s2member.com/r/common-troubleshooting-tips/" target="_blank" rel="external">s2Member Troubleshooting Guide</a> (please read this first if you\'re having trouble).</p>'."\n";
54
 
55
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
82
  echo '<div class="ws-menu-page-group" title="s2Member Tech. Support (for Pro Customers)" default-state="open">' . "\n";
83
 
84
  echo '<div class="ws-menu-page-section ws-plugin--s2member-support">' . "\n";
85
+ echo '<p style="max-width:900px;">Support for s2Member® is provided by WebSharks, Inc. Our customer support representatives are available Monday through Friday, excluding all major holidays. Or, you can discuss problems/solutions with others in our <a href="http://s2member.com/r/forums/" target="_blank" rel="external">public community forum</a>.</p>'."\n";
86
 
87
  echo '<ul>'."\n";
88
  echo '<li>For pre-sale questions please see: <a href="http://s2member.com/kb/kb-tag/pre-sale-faqs/" target="_blank" rel="external">Pre-Sale FAQs</a>.</li>'."\n";
src/includes/menu-pages/logs.inc.php CHANGED
@@ -150,7 +150,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
150
  echo '</form>'."\n";
151
 
152
  echo '<p><strong>Debugging Tips:</strong> &nbsp;&nbsp; It is normal to see a few errors in your log files. This is because s2Member logs <em>all</em> of its communication with Payment Gateways. Everything—not just successes. With that in mind, there will be some failures that s2Member expects (to a certain extent); and s2Member deals with these gracefully. What you\'re looking for here, are things that jump right out at you as being a major issue (e.g., when s2Member makes a point of providing details to you in a log entry about problems that should be corrected on your installation). Please read carefully.</p>'."\n";
153
- echo '<p><strong>Test Transaction Tips:</strong> &nbsp;&nbsp; Generally speaking, it is best to run test transactions for yourself. Be sure to run your final test transactions against a live Payment Gateway that is <em>not</em> in Sandbox/Test Mode (<a href="#" onclick="alert(\'While some Payment Gateways make it possible for you to run test transactions in Sandbox/Test Mode, these are not a reliable way to test s2Member.\n\nOften times (particularly with PayPal) Sandbox/Test mode behaves somewhat differently—often with buggy behavior. This can really create frustration for site owners. Therefore, it is always a good idea to run low-dollar test transactions against a live Payment Gateway.\n\nAlso, please be sure that you are not logged in as an Administrator when running test transactions. For most test transactions, you will want to be completely logged-out of your site before completing checkout (just like a new Customer would be). If you are testing an upgrade or downgrade (where you do need to be logged-in), please do not attempt this under an Administrative account. s2Member will not upgrade/downgrade Administrative accounts—for security purposes.\'); return false;">click here for details</a>). After running test transactions, please review the log file entries pertaining to your transaction. Does s2Member report any major issues? If so, please read through any details that s2Member provides in the log file. If you need assistance, please <a href="http://www.s2member.com/quick-s.php" target="_blank" rel="external">search s2Member.com</a> for answers to common questions.</p>'."\n";
154
  echo '<p><strong>s2 Core Processors:</strong> &nbsp;&nbsp; It is normal to have a <code>gateway-core-ipn.log</code> and/or a <code>gateway-core-rtn.log</code> file at all times. Ultimately, all Payment Gateway integrations supported by s2Member pass through it\'s core post-processing handlers. If you\'re having trouble, and you don\'t find any errors in your Payment Gateway log files, please check the <code>gateway-core-ipn.log</code> and <code>gateway-core-rtn.log</code> files too. Regarding s2Member Pro-Forms... If you\'ve integrated s2Member Pro-Forms, you will not have a <code>gateway-core-rtn.log</code> file, because that particular processor is not used with Pro-Form integrations. However, you will have a <code>gateway-core-ipn.log</code> file, and you will need to make a point of inspecting this file to ensure there were no post-processing issues.</p>'."\n";
155
  echo '<p><strong>s2 HTTP API Logs:</strong> &nbsp;&nbsp; If s2Member is not behaving as expected, and you cannot find errors anywhere in your Payment Gateway log files (or with any core processors), please review your <code>s2-http-api-debug.log</code> file too. Look for any HTTP connections where s2Member is getting <code>403</code>, <code>404</code>, <code>503</code> errors from your server. This can sometimes happen due to <a href="http://www.s2member.com/kb/mod-security-random-503-403-errors/" target="_blank" rel="external">paranoid Mod Security configurations</a>, and it may require you to contact your hosting company for assistance.</p>'."\n";
156
  echo '<p style="font-style:italic;"><strong>Archived Log Files:</strong> &nbsp;&nbsp; All s2Member log files are stored here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])).'</code>. Any log files that contain the word <code>ARCHIVED</code> in their name, are files that reached a size of more than 2MB; so s2Member archived them automatically to prevent any single log file from becoming too large. Archived log file names will also contain the date/time they were archived by s2Member. These archived log files typically contain much older (and possibly outdated) log entries.</p>'."\n";
150
  echo '</form>'."\n";
151
 
152
  echo '<p><strong>Debugging Tips:</strong> &nbsp;&nbsp; It is normal to see a few errors in your log files. This is because s2Member logs <em>all</em> of its communication with Payment Gateways. Everything—not just successes. With that in mind, there will be some failures that s2Member expects (to a certain extent); and s2Member deals with these gracefully. What you\'re looking for here, are things that jump right out at you as being a major issue (e.g., when s2Member makes a point of providing details to you in a log entry about problems that should be corrected on your installation). Please read carefully.</p>'."\n";
153
+ echo '<p><strong>Test Transaction Tips:</strong> &nbsp;&nbsp; Generally speaking, it is best to run test transactions for yourself. Be sure to run your final test transactions against a live Payment Gateway that is <em>not</em> in Sandbox/Test Mode (<a href="#" onclick="alert(\'While some Payment Gateways make it possible for you to run test transactions in Sandbox/Test Mode, these are not a reliable way to test s2Member.\n\nOften times (particularly with PayPal) Sandbox/Test mode behaves somewhat differently—often with buggy behavior. This can really create frustration for site owners. Therefore, it is always a good idea to run low-dollar test transactions against a live Payment Gateway.\n\nAlso, please be sure that you are not logged in as an Administrator when running test transactions. For most test transactions, you will want to be completely logged-out of your site before completing checkout (just like a new Customer would be). If you are testing an upgrade or downgrade (where you do need to be logged-in), please do not attempt this under an Administrative account. s2Member will not upgrade/downgrade Administrative accounts—for security purposes.\'); return false;">click here for details</a>). After running test transactions, please review the log file entries pertaining to your transaction. Does s2Member report any major issues? If so, please read through any details that s2Member provides in the log file. If you need assistance, please <a href="https://s2member.com/r/s2member-kb/" target="_blank" rel="external">search s2Member.com</a> for answers to common questions.</p>'."\n";
154
  echo '<p><strong>s2 Core Processors:</strong> &nbsp;&nbsp; It is normal to have a <code>gateway-core-ipn.log</code> and/or a <code>gateway-core-rtn.log</code> file at all times. Ultimately, all Payment Gateway integrations supported by s2Member pass through it\'s core post-processing handlers. If you\'re having trouble, and you don\'t find any errors in your Payment Gateway log files, please check the <code>gateway-core-ipn.log</code> and <code>gateway-core-rtn.log</code> files too. Regarding s2Member Pro-Forms... If you\'ve integrated s2Member Pro-Forms, you will not have a <code>gateway-core-rtn.log</code> file, because that particular processor is not used with Pro-Form integrations. However, you will have a <code>gateway-core-ipn.log</code> file, and you will need to make a point of inspecting this file to ensure there were no post-processing issues.</p>'."\n";
155
  echo '<p><strong>s2 HTTP API Logs:</strong> &nbsp;&nbsp; If s2Member is not behaving as expected, and you cannot find errors anywhere in your Payment Gateway log files (or with any core processors), please review your <code>s2-http-api-debug.log</code> file too. Look for any HTTP connections where s2Member is getting <code>403</code>, <code>404</code>, <code>503</code> errors from your server. This can sometimes happen due to <a href="http://www.s2member.com/kb/mod-security-random-503-403-errors/" target="_blank" rel="external">paranoid Mod Security configurations</a>, and it may require you to contact your hosting company for assistance.</p>'."\n";
156
  echo '<p style="font-style:italic;"><strong>Archived Log Files:</strong> &nbsp;&nbsp; All s2Member log files are stored here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])).'</code>. Any log files that contain the word <code>ARCHIVED</code> in their name, are files that reached a size of more than 2MB; so s2Member archived them automatically to prevent any single log file from becoming too large. Archived log file names will also contain the date/time they were archived by s2Member. These archived log files typically contain much older (and possibly outdated) log entries.</p>'."\n";
src/includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -56,9 +56,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
56
  echo '<div class="ws-menu-page-group" title="PayPal Account Details">'."\n";
57
 
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
59
- echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/src/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
60
  echo '<h3>PayPal Account Details (required, if using PayPal)</h3>'."\n";
61
- echo '<p>s2Member integrates with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal Payments Standard</a>—for businesses. You do not need a PayPal Pro account. You just need to upgrade your Personal PayPal account to a Business status, which is free. A PayPal account can be <a href="http://s2member.com/r/paypal-business-upgrade/" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account by clicking the "Profile" link under your "My Account" tab, selecting "Personal Business Information", and then clicking the "Upgrade Your Account" button. <strong>See also:</strong> This KB article: <a href="http://s2member.com/kb-article/supported-paypal-account-types/" target="_blank" rel="external">PayPal Compatibility (Account Types)</a>.</p>'."\n";
62
  echo '<p><em><strong>PayPal API Credentials:</strong> Once you have a PayPal Business account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">PayPal API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Request API Signature".</em></p>'."\n";
63
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
64
 
@@ -253,7 +253,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
253
  echo '<div class="ws-menu-page-group" title="Payflow Account Details">'."\n";
254
 
255
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-payflow-account-details-section">'."\n";
256
- echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/src/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
257
  echo '<h3>Payflow Account Details (required, if using Payflow)</h3>'."\n";
258
  echo '<p>Newer PayPal Pro accounts (i.e., PayPal Pro w/ Payflow Edition), come with the Payflow API for Recurring Billing service. If you have a newer PayPal Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member Pro-Forms, you will need to fill in the details here. Providing Payflow API Credentials below, will automatically put s2Member\'s Recurring Billing integration through Pro-Forms into Payflow mode. Just fill in the details below, and you\'re ready to generate Pro-Forms that charge customers on a recurring basis. s2Member will use the Payflow Edition API instead of the older PayPal Pro DPRP service; which is being slowly phased out in favor of Payflow Edition APIs.</p>'."\n";
259
  echo '<p><em><strong>Payflow API Credentials:</strong> Once you have a PayPal Pro account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">Payflow API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Payflow / API Access". You will need the following credentials: Username, Password, Partner, and Vendor.</em></p>'."\n";
@@ -372,7 +372,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
372
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="margin-top:10px; display:none;">'."\n";
373
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
374
  echo '<input type="text" autocomplete="off" value="'.format_to_edit(home_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()), "https")).'" style="width:99%;" />'."\n";
375
- echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation must include the <code>custom</code> POST variable, and that variable must always start with your installation domain (i.e., custom=<code>'.esc_html($_SERVER["HTTP_HOST"]).'</code>). In addition, the <code>item_number</code> variable must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions, all other POST variables should follow PayPal standards. Please see: <a href="http://www.s2member.com/paypal-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>'."\n";
376
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars());
377
  echo '</div>'."\n";
378
  echo '</div>'."\n";
56
  echo '<div class="ws-menu-page-group" title="PayPal Account Details">'."\n";
57
 
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
59
+ echo '<a href="https://s2member.com/r/paypal/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/src/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
60
  echo '<h3>PayPal Account Details (required, if using PayPal)</h3>'."\n";
61
+ echo '<p>s2Member integrates with <a href="https://s2member.com/r/paypal/" target="_blank" rel="external">PayPal Payments Standard</a>—for businesses. You do not need a PayPal Pro account. You just need to upgrade your Personal PayPal account to a Business status, which is free. A PayPal account can be <a href="http://s2member.com/r/paypal-business-upgrade/" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account by clicking the "Profile" link under your "My Account" tab, selecting "Personal Business Information", and then clicking the "Upgrade Your Account" button. <strong>See also:</strong> This KB article: <a href="http://s2member.com/kb-article/supported-paypal-account-types/" target="_blank" rel="external">PayPal Compatibility (Account Types)</a>.</p>'."\n";
62
  echo '<p><em><strong>PayPal API Credentials:</strong> Once you have a PayPal Business account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">PayPal API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Request API Signature".</em></p>'."\n";
63
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
64
 
253
  echo '<div class="ws-menu-page-group" title="Payflow Account Details">'."\n";
254
 
255
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-payflow-account-details-section">'."\n";
256
+ echo '<a href="https://s2member.com/r/paypal/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/src/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
257
  echo '<h3>Payflow Account Details (required, if using Payflow)</h3>'."\n";
258
  echo '<p>Newer PayPal Pro accounts (i.e., PayPal Pro w/ Payflow Edition), come with the Payflow API for Recurring Billing service. If you have a newer PayPal Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member Pro-Forms, you will need to fill in the details here. Providing Payflow API Credentials below, will automatically put s2Member\'s Recurring Billing integration through Pro-Forms into Payflow mode. Just fill in the details below, and you\'re ready to generate Pro-Forms that charge customers on a recurring basis. s2Member will use the Payflow Edition API instead of the older PayPal Pro DPRP service; which is being slowly phased out in favor of Payflow Edition APIs.</p>'."\n";
259
  echo '<p><em><strong>Payflow API Credentials:</strong> Once you have a PayPal Pro account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">Payflow API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Payflow / API Access". You will need the following credentials: Username, Password, Partner, and Vendor.</em></p>'."\n";
372
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="margin-top:10px; display:none;">'."\n";
373
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
374
  echo '<input type="text" autocomplete="off" value="'.format_to_edit(home_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()), "https")).'" style="width:99%;" />'."\n";
375
+ echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation must include the <code>custom</code> POST variable, and that variable must always start with your installation domain (i.e., custom=<code>'.esc_html($_SERVER["HTTP_HOST"]).'</code>). In addition, the <code>item_number</code> variable must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions, all other POST variables should follow PayPal standards. Please see: <a href="https://s2member.com/r/paypal/-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>'."\n";
376
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars());
377
  echo '</div>'."\n";
378
  echo '</div>'."\n";
src/includes/menu-pages/res-ops.inc.php CHANGED
@@ -57,11 +57,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
57
 
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-post-level-access-section">'."\n";
59
  echo '<h3>Post Level Access Restrictions (optional)</h3>'."\n";
60
- echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member also supports Custom <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Types</a> here. If you have a theme or plugin installed, which has enabled Custom Post Types <em>(i.e., Music/Videos or something else)</em>, you can put the IDs for those Posts here.</p>'."\n";
61
- echo '<p><strong>What do I enter?</strong> Post IDs in comma-delimited format. Example: <code>1,2,3,84,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Posts, of any type)</em>. You can also include all Post IDs of a specific <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Type</a>. e.g., <code>1,2,3,all-newspapers</code> <em>(protects several Post IDs, and all Posts of type: <code>newspaper</code>)</em>.</p>'."\n";
62
  echo '<p><em><strong>Note:</strong> Protecting individual Posts, <strong>only</strong> protects the Permalinks for those Posts. It is still possible for excerpts of protected content to be seen in search results generated by WordPress, feeds, and Archive views; such as your Home Page, inside a Category listing, or through other queries formulated by your theme. This is the intended functionality. Excerpts are a great way to "tease" public visitors. In other words, public visitors may have access to excerpts introduced by your theme, but any attempt to view the full Post (i.e., the Permalink) will result in an automatic redirect to your Membership Options Page; requiring registration.</em></p>'."\n";
63
  echo '<p><em><strong>Note:</strong> If you would like to protect many Posts at once (including Archive views), you can use Category Level Restrictions, Tag Level Restrictions, or have a look down below at s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>'."\n";
64
- echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
65
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars());
66
 
67
  echo '<table class="form-table">'."\n";
@@ -104,7 +104,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
104
  echo '<h3>Page Level Access Restrictions (optional)</h3>'."\n";
105
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>'."\n";
106
  echo '<p><strong>What do I enter?</strong> Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Pages)</em>.</p>'."\n";
107
- echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
108
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars());
109
 
110
  echo '<table class="form-table">'."\n";
@@ -145,7 +145,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
145
 
146
  echo '<div class="ws-menu-page-section ws-plugin--s2member-tag-level-access-section">'."\n";
147
  echo '<h3>Tag Level Access Restrictions (optional)</h3>'."\n";
148
- echo '<p>Here you can specify Tags that are restricted to certain Membership Access Levels. This is similar to Category Level Access. When you restrict access to a Tag Archive, it also restricts access to any Post having that Tag; even if a Post has other Tags. <strong>Tip:</strong> Tags can be applied to any Post, without affecting your Category structure at all. If you\'d like to use Tags with Pages get the <a href="https://wordpress.org/plugins/tag-pages/" target="_blank" rel="external">Tag Pages</a> plugin.</p>'."\n";
149
  echo '<p><strong>What do I enter?</strong> Tags in comma-delimited format. Example: <code>members, members only, free subscribers, premium</code>. Or, you can type: <code>all</code> <em>(to protect all Tags)</em>. <strong>Note:</strong> tags are caSe sensitive. The Tag <code>members only</code> is not the same as <code>Members Only</code>.</p>'."\n";
150
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_tag_level_access", get_defined_vars());
151
 
@@ -189,7 +189,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
189
  echo '<h3>Category Level Access Restrictions (optional)</h3>'."\n";
190
  echo '<p>Here you can specify Categories that are restricted to certain Membership Access Levels. Category restrictions are a bit more complex. When you restrict access to a Category, it also restricts access to any child Categories it may have <em>(aka: sub-Categories)</em>. In other words, restricting a Category protects a Category Archive, all of its child Category Archives, and any Posts contained within the Category or its child Categories. This is a very powerful form of protection, so please be careful. It\'s very easy to protect too much content by accident.</p>'."\n";
191
  echo '<p><strong>What do I enter?</strong> Category IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Categories)</em>.</p>'."\n";
192
- echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Category IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
193
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars());
194
 
195
  echo '<table class="form-table">'."\n";
@@ -327,9 +327,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
327
  echo '<input type="checkbox" name="ws_plugin__s2member_filter_wp_query[]" id="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'" value="'.esc_attr($ws_plugin__s2member_temp_s_value).'"'.((in_array($ws_plugin__s2member_temp_s_value, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'">'.$ws_plugin__s2member_temp_s_label.'</label><br />'."\n";
328
  echo '</div>'."\n";
329
  echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically using this technique:<br />'."\n";
330
- echo '<code><a href="http://codex.wordpress.org/Function_Reference/query_posts" target="_blank" rel="external">query_posts</a>("suppress_filters=true");</code><br />'."\n";
331
- echo '<code><a href="http://codex.wordpress.org/Function_Reference/get_posts" target="_blank" rel="external">get_posts</a>()</code> auto-suppresses filters.<br />'."\n";
332
- echo 'Also see <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_attach_s2member_query_filters()" target="_blank" rel="external">this article</a> in the s2Member Codex.'."\n";
333
  echo '</td>'."\n";
334
 
335
  echo '</tr>'."\n";
@@ -403,7 +403,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
403
  echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <strong>s2Member → PayPal Buttons → Specific Post/Page</strong> to generate "Buy Now" Buttons that you can insert into your WordPress Editor and make available on your site. The Button Generator for s2Member will even let you Package Additional Posts/Pages together into one transaction.</p>'."\n";
404
  echo '<p><strong>What do I enter?</strong> Post/Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. <strong>Note:</strong> the word <code>all</code> does not work here. You must supply a list of Specific Post/Page IDs.</p>'."\n";
405
  echo '<p><em><strong>Avoid Conflicts!</strong> Please be careful not to create a conflict with any of your other Access Restrictions. If you are going to sell Specific Post/Page Access you should enter specific Post/Page IDs that have not already been protected by other Restrictions (either directly or indirectly). In short, <strong>make sure that you haven\'t protected any of your Specific Posts/Pages with Member Level Access Restrictions already</strong>. If you configure s2Member in such as a way, that a Post/Page requires both Membership Level Access and Specific Post/Page Access too, you will create a conflict. Customers that purchase Specific Post/Page Access would be unable to access the Post/Page without also having a Membership.</em></p>'."\n";
406
- echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
407
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars());
408
 
409
  echo '<table class="form-table">'."\n";
@@ -441,7 +441,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
441
  echo '<div class="ws-menu-page-section ws-plugin--s2member-brute-force-restrictions-section">'."\n";
442
  echo '<h3>Brute Force IP/Login Restrictions (prevents username/password guessing)</h3>'."\n";
443
  echo '<input type="button" id="ws-plugin--s2member-brute-force-restrictions-reset-button" value="Reset Brute Force Logs" class="ws-menu-page-right" style="min-width:175px;" />'."\n";
444
- echo '<p>As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a <a href="https://en.wikipedia.org/wiki/Brute-force_attack" target="_blank" rel="external">Brute Force Attack</a>; whereby multiple/repeated logins are strategically attempted with various Username/Password combinations until a correct guess is made. It is not likely that you\'ll be attacked in this way, but it\'s still a good idea to protect your system; just in case somebody tries this. s2Member thwarts this behavior by monitoring failed login attempts that occur within a short period of time. Whenever s2Member detects an IP address <em>(i.e., a remote user)</em> that is consistently failing to enter a valid Username/Password, a temporary ban is created; preventing additional attempts from taking place for 30 minutes. This temporary ban, will only affect the offending IP address.</p>'."\n";
445
  echo '<p><em><strong>Note:</strong> an empty IP address (associated with someone browsing anonymously) is also considered a unique IP address. This way it cannot circumvent s2Member\'s security.</em></p>'."\n";
446
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
447
 
@@ -629,7 +629,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
629
 
630
  echo '<td>'."\n";
631
  echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_max_simultaneous_logins_timeout" id="ws-plugin--s2member-max-simultaneous-logins-timeout" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_simultaneous_logins_timeout"]).'" /><br />'."\n";
632
- echo 'Examples: <code>30 minutes</code>, <code>1 hour</code>, <code>2 hours</code>; anything compatible with PHP\'s <a href="http://php.net/manual/en/function.strtotime.php" target="_blank" rel="external">strtotime()</a>.<br />'."\n";
633
  echo 'Recommended Setting: <code>30 minutes</code>; if they stop browsing the site, they\'re considered inactive.<br />'."\n";
634
  echo '</td>'."\n";
635
 
57
 
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-post-level-access-section">'."\n";
59
  echo '<h3>Post Level Access Restrictions (optional)</h3>'."\n";
60
+ echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member also supports Custom <a href="https://s2member.com/r/wordpress-codex-post-types/" target="_blank" rel="external">Post Types</a> here. If you have a theme or plugin installed, which has enabled Custom Post Types <em>(i.e., Music/Videos or something else)</em>, you can put the IDs for those Posts here.</p>'."\n";
61
+ echo '<p><strong>What do I enter?</strong> Post IDs in comma-delimited format. Example: <code>1,2,3,84,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Posts, of any type)</em>. You can also include all Post IDs of a specific <a href="https://s2member.com/r/wordpress-codex-post-types/" target="_blank" rel="external">Post Type</a>. e.g., <code>1,2,3,all-newspapers</code> <em>(protects several Post IDs, and all Posts of type: <code>newspaper</code>)</em>.</p>'."\n";
62
  echo '<p><em><strong>Note:</strong> Protecting individual Posts, <strong>only</strong> protects the Permalinks for those Posts. It is still possible for excerpts of protected content to be seen in search results generated by WordPress, feeds, and Archive views; such as your Home Page, inside a Category listing, or through other queries formulated by your theme. This is the intended functionality. Excerpts are a great way to "tease" public visitors. In other words, public visitors may have access to excerpts introduced by your theme, but any attempt to view the full Post (i.e., the Permalink) will result in an automatic redirect to your Membership Options Page; requiring registration.</em></p>'."\n";
63
  echo '<p><em><strong>Note:</strong> If you would like to protect many Posts at once (including Archive views), you can use Category Level Restrictions, Tag Level Restrictions, or have a look down below at s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>'."\n";
64
+ echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post IDs? Get <a href="https://s2member.com/r/wordpress-org-wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
65
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars());
66
 
67
  echo '<table class="form-table">'."\n";
104
  echo '<h3>Page Level Access Restrictions (optional)</h3>'."\n";
105
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>'."\n";
106
  echo '<p><strong>What do I enter?</strong> Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Pages)</em>.</p>'."\n";
107
+ echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Page IDs? Get <a href="https://s2member.com/r/wordpress-org-wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
108
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars());
109
 
110
  echo '<table class="form-table">'."\n";
145
 
146
  echo '<div class="ws-menu-page-section ws-plugin--s2member-tag-level-access-section">'."\n";
147
  echo '<h3>Tag Level Access Restrictions (optional)</h3>'."\n";
148
+ echo '<p>Here you can specify Tags that are restricted to certain Membership Access Levels. This is similar to Category Level Access. When you restrict access to a Tag Archive, it also restricts access to any Post having that Tag; even if a Post has other Tags. <strong>Tip:</strong> Tags can be applied to any Post, without affecting your Category structure at all. If you\'d like to use Tags with Pages get the <a href="https://s2member.com/r/wordpress-org-tag-pages/" target="_blank" rel="external">Tag Pages</a> plugin.</p>'."\n";
149
  echo '<p><strong>What do I enter?</strong> Tags in comma-delimited format. Example: <code>members, members only, free subscribers, premium</code>. Or, you can type: <code>all</code> <em>(to protect all Tags)</em>. <strong>Note:</strong> tags are caSe sensitive. The Tag <code>members only</code> is not the same as <code>Members Only</code>.</p>'."\n";
150
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_tag_level_access", get_defined_vars());
151
 
189
  echo '<h3>Category Level Access Restrictions (optional)</h3>'."\n";
190
  echo '<p>Here you can specify Categories that are restricted to certain Membership Access Levels. Category restrictions are a bit more complex. When you restrict access to a Category, it also restricts access to any child Categories it may have <em>(aka: sub-Categories)</em>. In other words, restricting a Category protects a Category Archive, all of its child Category Archives, and any Posts contained within the Category or its child Categories. This is a very powerful form of protection, so please be careful. It\'s very easy to protect too much content by accident.</p>'."\n";
191
  echo '<p><strong>What do I enter?</strong> Category IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. Or, you can type: <code>all</code> <em>(to protect all Categories)</em>.</p>'."\n";
192
+ echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Category IDs? Get <a href="https://s2member.com/r/wordpress-org-wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
193
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars());
194
 
195
  echo '<table class="form-table">'."\n";
327
  echo '<input type="checkbox" name="ws_plugin__s2member_filter_wp_query[]" id="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'" value="'.esc_attr($ws_plugin__s2member_temp_s_value).'"'.((in_array($ws_plugin__s2member_temp_s_value, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'">'.$ws_plugin__s2member_temp_s_label.'</label><br />'."\n";
328
  echo '</div>'."\n";
329
  echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically using this technique:<br />'."\n";
330
+ echo '<code><a href="https://s2member.com/r/wordpress-codex-query_posts/" target="_blank" rel="external">query_posts</a>("suppress_filters=true");</code><br />'."\n";
331
+ echo '<code><a href="https://s2member.com/r/wordpress-codex-get_posts/" target="_blank" rel="external">get_posts</a>()</code> auto-suppresses filters.<br />'."\n";
332
+ echo 'Also see <a href="https://s2member.com/r/s2member-codex-attach_s2member_query_filters/" target="_blank" rel="external">this article</a> in the s2Member Codex.'."\n";
333
  echo '</td>'."\n";
334
 
335
  echo '</tr>'."\n";
403
  echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <strong>s2Member → PayPal Buttons → Specific Post/Page</strong> to generate "Buy Now" Buttons that you can insert into your WordPress Editor and make available on your site. The Button Generator for s2Member will even let you Package Additional Posts/Pages together into one transaction.</p>'."\n";
404
  echo '<p><strong>What do I enter?</strong> Post/Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. <strong>Note:</strong> the word <code>all</code> does not work here. You must supply a list of Specific Post/Page IDs.</p>'."\n";
405
  echo '<p><em><strong>Avoid Conflicts!</strong> Please be careful not to create a conflict with any of your other Access Restrictions. If you are going to sell Specific Post/Page Access you should enter specific Post/Page IDs that have not already been protected by other Restrictions (either directly or indirectly). In short, <strong>make sure that you haven\'t protected any of your Specific Posts/Pages with Member Level Access Restrictions already</strong>. If you configure s2Member in such as a way, that a Post/Page requires both Membership Level Access and Specific Post/Page Access too, you will create a conflict. Customers that purchase Specific Post/Page Access would be unable to access the Post/Page without also having a Membership.</em></p>'."\n";
406
+ echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post/Page IDs? Get <a href="https://s2member.com/r/wordpress-org-wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
407
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars());
408
 
409
  echo '<table class="form-table">'."\n";
441
  echo '<div class="ws-menu-page-section ws-plugin--s2member-brute-force-restrictions-section">'."\n";
442
  echo '<h3>Brute Force IP/Login Restrictions (prevents username/password guessing)</h3>'."\n";
443
  echo '<input type="button" id="ws-plugin--s2member-brute-force-restrictions-reset-button" value="Reset Brute Force Logs" class="ws-menu-page-right" style="min-width:175px;" />'."\n";
444
+ echo '<p>As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a <a href="https://s2member.com/r/wikipedia-brute-force-attack/" target="_blank" rel="external">Brute Force Attack</a>; whereby multiple/repeated logins are strategically attempted with various Username/Password combinations until a correct guess is made. It is not likely that you\'ll be attacked in this way, but it\'s still a good idea to protect your system; just in case somebody tries this. s2Member thwarts this behavior by monitoring failed login attempts that occur within a short period of time. Whenever s2Member detects an IP address <em>(i.e., a remote user)</em> that is consistently failing to enter a valid Username/Password, a temporary ban is created; preventing additional attempts from taking place for 30 minutes. This temporary ban, will only affect the offending IP address.</p>'."\n";
445
  echo '<p><em><strong>Note:</strong> an empty IP address (associated with someone browsing anonymously) is also considered a unique IP address. This way it cannot circumvent s2Member\'s security.</em></p>'."\n";
446
  do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
447
 
629
 
630
  echo '<td>'."\n";
631
  echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_max_simultaneous_logins_timeout" id="ws-plugin--s2member-max-simultaneous-logins-timeout" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_simultaneous_logins_timeout"]).'" /><br />'."\n";
632
+ echo 'Examples: <code>30 minutes</code>, <code>1 hour</code>, <code>2 hours</code>; anything compatible with PHP\'s <a href="https://s2member.com/r/php-net-strtotime/" target="_blank" rel="external">strtotime()</a>.<br />'."\n";
633
  echo 'Recommended Setting: <code>30 minutes</code>; if they stop browsing the site, they\'re considered inactive.<br />'."\n";
634
  echo '</td>'."\n";
635
 
src/includes/menu-pages/scripting.inc.php CHANGED
@@ -159,8 +159,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
159
 
160
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
161
 
162
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
163
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
164
 
165
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
166
 
@@ -248,8 +248,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
248
 
249
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
250
 
251
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
252
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
253
 
254
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
255
 
@@ -317,8 +317,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
317
 
318
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
319
 
320
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
321
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
322
 
323
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
324
 
@@ -369,12 +369,12 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
369
  echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button &amp; Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
370
  echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
371
  echo '<p>Custom Capabilities are always prepended with <code>access_s2member_ccap_</code>. You fill in the last part, with ONLY lowercase alpha-numerics and/or underscores. For example, let\'s say you want to sell Membership Level #1, as is. But, you also want to sell a slight variation of Membership Level #1, that includes the ability to access the Music &amp; Video sections of your site. So, instead of selling this additional access under a whole new Membership Level, you could just sell a modified version of Membership Level #1. Add the the Custom Capabilities: <code>music,videos</code>. Once a Member has these Capabilities, you can test for these Capabilities using <code>current_user_can("access_s2member_ccap_music")</code> and <code>current_user_can("access_s2member_ccap_videos")</code>.</p>' . "\n";
372
- echo '<p>The important thing to realize, is that Custom Capabilities, are just that. They\'re custom. s2Member only deals with the default Capabilities that it uses. If you start using Custom Capabilities, you MUST use Simple or Advanced Conditionals (<em>i.e., <a href="http://codex.wordpress.org/Function_Reference/current_user_can" target="_blank" rel="external"><code>current_user_can()</code></a> logic</em>) to test for them. Either in your theme files with PHP, or in Posts/Pages using <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Conditionals</a> <em>(powered by Shortcodes)</em>.</p>' . "\n";
373
 
374
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
375
 
376
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities (Including bbPress Support)</a>.</p>'."\n";
377
- echo '<p><strong class="ws-menu-page-hilite">See also:</strong> This VIDEO tutorial: <a href="http://www.s2member.com/videos/A2C07377CF60025E/" target="_blank" rel="external">Using Custom Capabilities with s2Member</a> (by Lead Developer Jason Caldwell).</p>'."\n";
378
 
379
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
380
 
@@ -385,8 +385,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
385
 
386
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
387
 
388
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
389
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br />' . "\n";
390
  echo '<strong>See Also:</strong> <a href="http://s2member.com/r/enhanced-capability-manager/" target="_blank" rel="external">Plugins → Enhanced Capability Manager</a> <em>(may come in handy for some)</em>.</p>' . "\n";
391
 
392
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
@@ -417,8 +417,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
417
 
418
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
419
 
420
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
421
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
422
 
423
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
424
 
@@ -457,8 +457,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
457
 
458
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
459
 
460
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
461
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
462
 
463
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
464
 
@@ -735,8 +735,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
735
 
736
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
737
 
738
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
739
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
740
 
741
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
742
 
@@ -1086,13 +1086,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
1086
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
1087
  echo '<h3>WP Hooks For Theme/Plugin Developers (scripting required)</h3>' . "\n";
1088
  echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>(or even modify)</em> 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. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://s2member.com/r/mu-plugins/" target="_blank" rel="external">MUST USE plugins</a>, which are loaded into WordPress automatically; that\'s what you want!</p>' . "\n";
1089
- echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>(over 1000 total)</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/src/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="http://www.s2member.com/codex/#src_doc_overview_description" target="_blank" rel="external">this article</a> as a primer. The <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
1090
  do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
1091
 
1092
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1093
 
1094
- echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1095
- echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
1096
  echo '</div>' . "\n";
1097
 
1098
  echo '</div>' . "\n";
159
 
160
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
161
 
162
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
163
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
164
 
165
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
166
 
248
 
249
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
250
 
251
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
252
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
253
 
254
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
255
 
317
 
318
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
319
 
320
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
321
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
322
 
323
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
324
 
369
  echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button &amp; Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
370
  echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
371
  echo '<p>Custom Capabilities are always prepended with <code>access_s2member_ccap_</code>. You fill in the last part, with ONLY lowercase alpha-numerics and/or underscores. For example, let\'s say you want to sell Membership Level #1, as is. But, you also want to sell a slight variation of Membership Level #1, that includes the ability to access the Music &amp; Video sections of your site. So, instead of selling this additional access under a whole new Membership Level, you could just sell a modified version of Membership Level #1. Add the the Custom Capabilities: <code>music,videos</code>. Once a Member has these Capabilities, you can test for these Capabilities using <code>current_user_can("access_s2member_ccap_music")</code> and <code>current_user_can("access_s2member_ccap_videos")</code>.</p>' . "\n";
372
+ echo '<p>The important thing to realize, is that Custom Capabilities, are just that. They\'re custom. s2Member only deals with the default Capabilities that it uses. If you start using Custom Capabilities, you MUST use Simple or Advanced Conditionals (<em>i.e., <a href="https://s2member.com/r/wordpress-codex-current_user_can/" target="_blank" rel="external"><code>current_user_can()</code></a> logic</em>) to test for them. Either in your theme files with PHP, or in Posts/Pages using <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Conditionals</a> <em>(powered by Shortcodes)</em>.</p>' . "\n";
373
 
374
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
375
 
376
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities (Including bbPress Support)</a>.</p>'."\n";
377
+ echo '<p><strong class="ws-menu-page-hilite">See also:</strong> This VIDEO tutorial: <a href="https://s2member.com/r/s2member-video-custom-capabilities-for-wordpress/" target="_blank" rel="external">Using Custom Capabilities with s2Member</a> (by Lead Developer Jason Caldwell).</p>'."\n";
378
 
379
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
380
 
385
 
386
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
387
 
388
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
389
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br />' . "\n";
390
  echo '<strong>See Also:</strong> <a href="http://s2member.com/r/enhanced-capability-manager/" target="_blank" rel="external">Plugins → Enhanced Capability Manager</a> <em>(may come in handy for some)</em>.</p>' . "\n";
391
 
392
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
417
 
418
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
419
 
420
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
421
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
422
 
423
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
424
 
457
 
458
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
459
 
460
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
461
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
462
 
463
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
464
 
735
 
736
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
737
 
738
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
739
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
740
 
741
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
742
 
1086
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
1087
  echo '<h3>WP Hooks For Theme/Plugin Developers (scripting required)</h3>' . "\n";
1088
  echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>(or even modify)</em> 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. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://s2member.com/r/mu-plugins/" target="_blank" rel="external">MUST USE plugins</a>, which are loaded into WordPress automatically; that\'s what you want!</p>' . "\n";
1089
+ echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>(over 1000 total)</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/src/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="https://s2member.com/r/s2member-codex-src_doc_overview_description/" target="_blank" rel="external">this article</a> as a primer. The <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
1090
  do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
1091
 
1092
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1093
 
1094
+ echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="https://s2member.com/r/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
1095
+ echo '<strong>See Also:</strong> <a href="https://s2member.com/r/s2member-codex-api-constants-package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="https://s2member.com/r/s2member-codex-api-functions-package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
1096
  echo '</div>' . "\n";
1097
 
1098
  echo '</div>' . "\n";
src/includes/menu-pages/start.inc.php CHANGED
@@ -213,7 +213,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
213
 
214
  echo '<div class="ws-menu-page-section ws-plugin--s2member-reg-before-checkout-section">' . "\n";
215
  echo '<p>By default, s2Member will send a Customer directly to PayPal, and only after checkout is completed does the Customer have the ability to register a Username/Password for access to your site. This process works very well in most cases, and it has the benefit of increasing conversion rates, because there are fewer obstacles for the Customer on their way to the actual checkout process at PayPal.</p>' . "\n";
216
- echo '<p>That being said, we believe the <em>ideal</em> approach is a <em>combined</em> Checkout/Registration process; in just one simple step <em>(available with <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Add-on / Prices")) . '" target="_blank" rel="external">s2Member Pro</a> using Stripe™ (most popular), PayPal Pro integration, or through Authorize.Net)</em>. However, even with PayPal Standard Buttons, there is a way to accomplish Registration Before Checkout, thereby reversing the process—if you prefer it that way.</p>'."\n";
217
  echo '<p>With PayPal Standard Buttons, Registration before Checkout is accomplished by turning Open Registration <code>(on)</code>, and then making a PayPal Button available to Free Subscribers at Level #0. In other words, you can let Visitors register for free at Level #0 <em>(where they have access to very little perhaps)</em>, and then charge them for access to higher Member Levels [1-4]. For further details, please check your WordPress Dashboard here: <strong>s2Member → General Options → Open Registration</strong>.</p>' . "\n";
218
  echo '<p><em>s2Member\'s Simple Conditionals can help with you too. For instance, you could integrate a special PayPal Button on your Login Welcome Page that will only be seen by Free Subscribers at Level #0. Please check your WordPress Dashboard under: <strong>s2Member → Restriction Options → Simple Shortcode Conditionals</strong>. We also suggest reading over the documentation on PayPal Modification Buttons. See: <strong>s2Member → PayPal Buttons → Subscr. Modification Buttons</strong>.</em></p>' . "\n";
219
  echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://s2member.com/r/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
213
 
214
  echo '<div class="ws-menu-page-section ws-plugin--s2member-reg-before-checkout-section">' . "\n";
215
  echo '<p>By default, s2Member will send a Customer directly to PayPal, and only after checkout is completed does the Customer have the ability to register a Username/Password for access to your site. This process works very well in most cases, and it has the benefit of increasing conversion rates, because there are fewer obstacles for the Customer on their way to the actual checkout process at PayPal.</p>' . "\n";
216
+ echo '<p>That being said, we believe the <em>ideal</em> approach is a <em>combined</em> Checkout/Registration process; in just one simple step <em>(available with <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro</a> using Stripe™ (most popular), PayPal Pro integration, or through Authorize.Net)</em>. However, even with PayPal Standard Buttons, there is a way to accomplish Registration Before Checkout, thereby reversing the process—if you prefer it that way.</p>'."\n";
217
  echo '<p>With PayPal Standard Buttons, Registration before Checkout is accomplished by turning Open Registration <code>(on)</code>, and then making a PayPal Button available to Free Subscribers at Level #0. In other words, you can let Visitors register for free at Level #0 <em>(where they have access to very little perhaps)</em>, and then charge them for access to higher Member Levels [1-4]. For further details, please check your WordPress Dashboard here: <strong>s2Member → General Options → Open Registration</strong>.</p>' . "\n";
218
  echo '<p><em>s2Member\'s Simple Conditionals can help with you too. For instance, you could integrate a special PayPal Button on your Login Welcome Page that will only be seen by Free Subscribers at Level #0. Please check your WordPress Dashboard under: <strong>s2Member → Restriction Options → Simple Shortcode Conditionals</strong>. We also suggest reading over the documentation on PayPal Modification Buttons. See: <strong>s2Member → PayPal Buttons → Subscr. Modification Buttons</strong>.</em></p>' . "\n";
219
  echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://s2member.com/r/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
src/includes/menu-pages/trk-ops.inc.php CHANGED
@@ -128,7 +128,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
128
  echo '</table>'."\n";
129
 
130
  echo '<div class="ws-menu-page-hr"></div>'."\n";
131
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
132
  echo '</div>'."\n";
133
 
134
  echo '</div>'."\n";
@@ -229,7 +229,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
229
  echo '</table>'."\n";
230
 
231
  echo '<div class="ws-menu-page-hr"></div>'."\n";
232
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
233
  echo '</div>'."\n";
234
 
235
  echo '</div>'."\n";
@@ -322,7 +322,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
322
  echo '</table>'."\n";
323
 
324
  echo '<div class="ws-menu-page-hr"></div>'."\n";
325
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
326
  echo '</div>'."\n";
327
 
328
  echo '</div>'."\n";
@@ -400,7 +400,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
400
  echo '</table>'."\n";
401
 
402
  echo '<div class="ws-menu-page-hr"></div>'."\n";
403
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
404
  echo '</div>'."\n";
405
 
406
  echo '</div>'."\n";
@@ -456,7 +456,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
456
  echo '<p><em><strong>Tip:</strong> iDevAffiliate also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
457
 
458
  echo '<div class="ws-menu-page-hr"></div>'."\n";
459
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
460
  echo '</div>'."\n";
461
 
462
  echo '</div>'."\n";
@@ -505,7 +505,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
505
  echo '<p><em><strong>Tip:</strong> ShareASale also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
506
 
507
  echo '<div class="ws-menu-page-hr"></div>'."\n";
508
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with ShareASale. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
509
  echo '</div>'."\n";
510
 
511
  echo '</div>'."\n";
@@ -526,7 +526,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
526
  do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_other_methods", get_defined_vars());
527
 
528
  echo '<div class="ws-menu-page-hr"></div>'."\n";
529
- echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
530
  echo '</div>'."\n";
531
 
532
  echo '</div>'."\n";
128
  echo '</table>'."\n";
129
 
130
  echo '<div class="ws-menu-page-hr"></div>'."\n";
131
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
132
  echo '</div>'."\n";
133
 
134
  echo '</div>'."\n";
229
  echo '</table>'."\n";
230
 
231
  echo '<div class="ws-menu-page-hr"></div>'."\n";
232
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
233
  echo '</div>'."\n";
234
 
235
  echo '</div>'."\n";
322
  echo '</table>'."\n";
323
 
324
  echo '<div class="ws-menu-page-hr"></div>'."\n";
325
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
326
  echo '</div>'."\n";
327
 
328
  echo '</div>'."\n";
400
  echo '</table>'."\n";
401
 
402
  echo '<div class="ws-menu-page-hr"></div>'."\n";
403
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
404
  echo '</div>'."\n";
405
 
406
  echo '</div>'."\n";
456
  echo '<p><em><strong>Tip:</strong> iDevAffiliate also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
457
 
458
  echo '<div class="ws-menu-page-hr"></div>'."\n";
459
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
460
  echo '</div>'."\n";
461
 
462
  echo '</div>'."\n";
505
  echo '<p><em><strong>Tip:</strong> ShareASale also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
506
 
507
  echo '<div class="ws-menu-page-hr"></div>'."\n";
508
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with ShareASale. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
509
  echo '</div>'."\n";
510
 
511
  echo '</div>'."\n";
526
  do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_other_methods", get_defined_vars());
527
 
528
  echo '<div class="ws-menu-page-hr"></div>'."\n";
529
+ echo '<p><em><strong>Tip:</strong> With <a href="http://s2member.com/prices/" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
530
  echo '</div>'."\n";
531
 
532
  echo '</div>'."\n";
src/includes/templates/players/jwplayer-v7-rtmp-only.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // @codingStandardsIgnoreFile
3
+ if(!defined('WPINC')) // MUST have WordPress.
4
+ exit("Do not access this file directly.");
5
+ ?>
6
+
7
+ <div id="%%player_id%%" class="s2member-jwplayer-v7"></div>
8
+ <script type="text/javascript" src="%%player_path%%"></script>
9
+ <script type="text/javascript">
10
+ if(typeof jwplayer.key !== 'string' || !jwplayer.key)
11
+ jwplayer.key = '%%player_key%%';
12
+
13
+ jwplayer('%%player_id%%').setup
14
+ ({
15
+ playlist:
16
+ [{
17
+ title: '%%player_title%%',
18
+ image: '%%player_image%%',
19
+
20
+ mediaid: '%%player_mediaid%%',
21
+ description: '%%player_description%%',
22
+
23
+ tracks: %%player_tracks%%,
24
+
25
+ sources: %%player_sources%%
26
+ }],
27
+
28
+ controls: %%player_controls%%,
29
+ stretching: '%%player_stretching%%',
30
+ width: %%player_width%%,
31
+ height: %%player_height%%,
32
+ aspectratio: '%%player_aspectratio%%',
33
+
34
+ mute: %%player_mute%%,
35
+ autostart: %%player_autostart%%,
36
+ fallback: %%player_fallback%%,
37
+ primary: '%%player_primary%%',
38
+ repeat: %%player_repeat%%,
39
+
40
+ %%player_option_blocks%%
41
+ });
42
+ </script>
src/includes/templates/players/jwplayer-v7-rtmp.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // @codingStandardsIgnoreFile
3
+ if(!defined('WPINC')) // MUST have WordPress.
4
+ exit("Do not access this file directly.");
5
+ ?>
6
+
7
+ <div id="%%player_id%%" class="s2member-jwplayer-v7"></div>
8
+ <script type="text/javascript" src="%%player_path%%"></script>
9
+ <script type="text/javascript">
10
+ if(typeof jwplayer.key !== 'string' || !jwplayer.key)
11
+ jwplayer.key = '%%player_key%%';
12
+
13
+ jwplayer('%%player_id%%').setup
14
+ ({
15
+ playlist:
16
+ [{
17
+ title: '%%player_title%%',
18
+ image: '%%player_image%%',
19
+
20
+ mediaid: '%%player_mediaid%%',
21
+ description: '%%player_description%%',
22
+
23
+ tracks: %%player_tracks%%,
24
+
25
+ sources: %%player_sources%%
26
+ }],
27
+
28
+ controls: %%player_controls%%,
29
+ stretching: '%%player_stretching%%',
30
+ width: %%player_width%%,
31
+ height: %%player_height%%,
32
+ aspectratio: '%%player_aspectratio%%',
33
+
34
+ mute: %%player_mute%%,
35
+ autostart: %%player_autostart%%,
36
+ fallback: %%player_fallback%%,
37
+ primary: '%%player_primary%%',
38
+ repeat: %%player_repeat%%,
39
+
40
+ %%player_option_blocks%%
41
+ });
42
+ </script>
src/includes/templates/players/jwplayer-v7.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // @codingStandardsIgnoreFile
3
+ if(!defined('WPINC')) // MUST have WordPress.
4
+ exit("Do not access this file directly.");
5
+ ?>
6
+
7
+ <div id="%%player_id%%" class="s2member-jwplayer-v7"></div>
8
+ <script type="text/javascript" src="%%player_path%%"></script>
9
+ <script type="text/javascript">
10
+ if(typeof jwplayer.key !== 'string' || !jwplayer.key)
11
+ jwplayer.key = '%%player_key%%';
12
+
13
+ jwplayer('%%player_id%%').setup
14
+ ({
15
+ playlist:
16
+ [{
17
+ title: '%%player_title%%',
18
+ image: '%%player_image%%',
19
+
20
+ mediaid: '%%player_mediaid%%',
21
+ description: '%%player_description%%',
22
+
23
+ tracks: %%player_tracks%%,
24
+
25
+ sources: %%player_sources%%
26
+ }],
27
+
28
+ controls: %%player_controls%%,
29
+ stretching: '%%player_stretching%%',
30
+ width: %%player_width%%,
31
+ height: %%player_height%%,
32
+ aspectratio: '%%player_aspectratio%%',
33
+
34
+ mute: %%player_mute%%,
35
+ autostart: %%player_autostart%%,
36
+ fallback: %%player_fallback%%,
37
+ primary: '%%player_primary%%',
38
+ repeat: %%player_repeat%%,
39
+
40
+ %%player_option_blocks%%
41
+ });
42
+ </script>
src/includes/translations/README.md DELETED
@@ -1,19 +0,0 @@
1
- ## Translations
2
-
3
- s2Member and s2Member Pro are now equipped with support for front-end translation, using standardized WordPress® methodologies; i.e., we've implemented the use of `_x()`, and various other translation routines for many aspects of s2Member's front-end interfaces. For instance, things like Profile panels, Login/Registration Fields, and Pro-Form integrations; as well as error messages displayed to Users/Members. Translation support for back-end admin panels provided by s2Member will come in a future release, along with more extensive translation support for front-end aspects.
4
-
5
- Please note, this is but our first step toward internationalizing s2Member and s2Member Pro. Look for further updates/improvements to come in the future.
6
-
7
- Like WordPress® itself, we chose to use the GNU `gettext` localization framework to provide localization infrastructure for s2Member®. GNU `gettext` is a mature, widely used framework for modular translation of software, and is the *de facto* standard for localization in the open source/free software realm. If you'd like to translate s2Member and/or s2Member Pro, please use the POT file found inside `/s2member/src/includes/translations/s2member.pot`, which contains all translation entries for both the s2Member Framework *(i.e., the free version)*, and also for s2Member Pro.
8
-
9
- The file: `/s2member/src/includes/translations/s2member.pot` will be updated with each new release of s2Member.
10
-
11
- If this is your first translation of a WordPress® plugin, [this article](http://codex.wordpress.org/Translating_WordPress#Localization_Technology) and/or [this article](http://urbangiraffe.com/articles/translating-wordpress-themes-and-plugins/), might be of some assistance. When you are finished translating the `s2member.pot` file, place your completed `s2member-[locale].mo` file into this directory: `/wp-content/plugins/`; and please feel free to [share your translation](http://www.s2member.com/forums/forum/community/) with the rest of the s2Member® community.
12
-
13
- Quick Tip: If you only need to translate the front-end of s2Member, please ignore entries in the `s2member.pot` file with a context matching `s2member-admin`. Those sections of s2Member are only seen by site Administrators; they are NOT used in s2Member's front-end integration with WordPress®. Skipping over translation entries with a context matching `s2member-admin` can save you time.
14
-
15
- ### Existing Translations (Updating Your PO File)?
16
-
17
- FUZZY translation entries: If you're updating an existing PO file (e.g., recompiling your MO file after changes in a new release of s2Member); please be sure to manually review any "fuzzy" entries. A fuzzy entry can occur as a result of changes from one release of s2Member (or s2Member Pro) to the next; where small changes in text might render your translation invalid (e.g., fuzzy).
18
-
19
- Depending on your PO file editor, fuzzy entries may need to be reviewed and changes committed BEFORE you recompile; otherwise fuzzy entries will revert to their default state in your final MO file. Translations that are fuzzy, are NOT compiled into your final MO file. This can lead to much confusion. Please review any fuzzy entries carefully.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/includes/translations/s2member.pot CHANGED
@@ -1,14 +1,14 @@
1
- # Copyright (C) 2016
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 161129\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2016-11-29 21:39:59+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
@@ -1263,8 +1263,8 @@ msgctxt "s2member-front"
1263
  msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
1264
  msgstr ""
1265
 
1266
- #: pro/src/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
1267
- #: pro/src/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:295
1268
  #: pro/src/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:162
1269
  msgctxt "s2member-front"
1270
  msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
@@ -4336,7 +4336,7 @@ msgstr ""
4336
 
4337
  #: src/includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
4338
  msgctxt "s2member-front"
4339
- msgid "<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e., based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href=\"%s\" target=\"_blank\">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>"
4340
  msgstr ""
4341
 
4342
  #: src/includes/classes/paypal-return-in-proxy-x-preview.inc.php:66
1
+ # Copyright (C) 2017
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 170221\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2017-02-21 00:41:55+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2017-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
1263
  msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
1264
  msgstr ""
1265
 
1266
+ #: pro/src/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:180
1267
+ #: pro/src/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:299
1268
  #: pro/src/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:162
1269
  msgctxt "s2member-front"
1270
  msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
4336
 
4337
  #: src/includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
4338
  msgctxt "s2member-front"
4339
+ msgid "<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e., based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href=\"http://s2member.com/prices/\" target=\"_blank\">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>"
4340
  msgstr ""
4341
 
4342
  #: src/includes/classes/paypal-return-in-proxy-x-preview.inc.php:66
src/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitaf88aff620c8d57924dd31933bf23dd6::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit70c0498e8019a5c38acfc616c0b849f8::getLoader();
src/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitaf88aff620c8d57924dd31933bf23dd6
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitaf88aff620c8d57924dd31933bf23dd6
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitaf88aff620c8d57924dd31933bf23dd6', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitaf88aff620c8d57924dd31933bf23dd6', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit70c0498e8019a5c38acfc616c0b849f8
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit70c0498e8019a5c38acfc616c0b849f8', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit70c0498e8019a5c38acfc616c0b849f8', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {