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

Version Description

= v150722 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 150311 to 150722

Files changed (149) hide show
  1. changelog.md +176 -77
  2. checksum.txt +1 -1
  3. includes/classes/admin-lockouts.inc.php +1 -1
  4. includes/classes/admin-notices.inc.php +11 -8
  5. includes/classes/auto-eots.inc.php +24 -19
  6. includes/classes/aweber.inc.php +4 -1
  7. includes/classes/cache.inc.php +0 -1
  8. includes/classes/constants.inc.php +35 -35
  9. includes/classes/custom-reg-fields.inc.php +3 -4
  10. includes/classes/database.inc.php +0 -1
  11. includes/classes/email-configs.inc.php +0 -1
  12. includes/classes/files-in.inc.php +3 -3
  13. includes/classes/files.inc.php +1 -1
  14. includes/classes/installation.inc.php +22 -5
  15. includes/classes/labels.inc.php +0 -1
  16. includes/classes/list-servers.inc.php +15 -1
  17. includes/classes/login-customizations.inc.php +3 -2
  18. includes/classes/login-redirects-r.inc.php +30 -28
  19. includes/classes/login-redirects.inc.php +35 -20
  20. includes/classes/menu-pages-rs.inc.php +0 -1
  21. includes/classes/menu-pages.inc.php +11 -11
  22. includes/classes/meta-box-saves.inc.php +0 -1
  23. includes/classes/meta-box-security.inc.php +4 -5
  24. includes/classes/meta-boxes.inc.php +0 -1
  25. includes/classes/mms-patches.inc.php +0 -1
  26. includes/classes/mo-page-in.inc.php +10 -1
  27. includes/classes/mo-page.inc.php +0 -1
  28. includes/classes/op-notices.inc.php +2 -3
  29. includes/classes/option-forces.inc.php +0 -1
  30. includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php +19 -15
  31. includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php +2 -2
  32. includes/classes/paypal-return-in.inc.php +2 -2
  33. includes/classes/paypal-utilities.inc.php +2 -3
  34. includes/classes/profile-mods-4bp-in.inc.php +2 -2
  35. includes/classes/profile-mods-in.inc.php +2 -2
  36. includes/classes/register-in.inc.php +0 -1
  37. includes/classes/register.inc.php +0 -1
  38. includes/classes/registrations.inc.php +3 -3
  39. includes/classes/s-badge-status-in.inc.php +0 -1
  40. includes/classes/s-badge-status.inc.php +0 -1
  41. includes/classes/sc-eots-in.inc.php +169 -0
  42. includes/classes/sc-eots.inc.php +49 -0
  43. includes/classes/sc-files.inc.php +0 -1
  44. includes/classes/sc-gets-in.inc.php +46 -6
  45. includes/classes/sc-gets.inc.php +1 -1
  46. includes/classes/sc-if-conds-in.inc.php +3 -1
  47. includes/classes/sc-paypal-button-e.inc.php +0 -1
  48. includes/classes/sc-paypal-button-in.inc.php +0 -1
  49. includes/classes/sc-paypal-button.inc.php +0 -1
  50. includes/classes/sc-profile-in.inc.php +2 -2
  51. includes/classes/sc-profile.inc.php +0 -1
  52. includes/classes/sc-s-badge-in.inc.php +48 -50
  53. includes/classes/sc-s-badge.inc.php +42 -42
  54. includes/classes/sp-access.inc.php +0 -1
  55. includes/classes/ssl-in.inc.php +2 -2
  56. includes/classes/user-deletions.inc.php +3 -2
  57. includes/classes/user-new-in.inc.php +1 -2
  58. includes/classes/user-new.inc.php +0 -1
  59. includes/classes/user-notes.inc.php +0 -1
  60. includes/classes/user-securities.inc.php +108 -2
  61. includes/classes/users-list-in.inc.php +5 -5
  62. includes/classes/utilities.inc.php +35 -3
  63. includes/classes/utils-arrays.inc.php +0 -1
  64. includes/classes/utils-captchas.inc.php +81 -19
  65. includes/classes/utils-css.inc.php +0 -1
  66. includes/classes/utils-cur.inc.php +13 -7
  67. includes/classes/utils-dirs.inc.php +0 -1
  68. includes/classes/utils-forms.inc.php +1 -2
  69. includes/classes/utils-html.inc.php +0 -1
  70. includes/classes/utils-time.inc.php +28 -24
  71. includes/classes/utils-urls.inc.php +157 -124
  72. includes/classes/utils-users.inc.php +340 -19
  73. includes/classes/wp-footer.inc.php +47 -50
  74. includes/codes.inc.php +2 -1
  75. includes/externals/aweber/aweber.php +0 -2
  76. includes/externals/aweber/aweber_entry_data_array.php +0 -4
  77. includes/externals/aweber/curl_object.php +20 -22
  78. includes/externals/aweber/oauth_adapter.php +0 -3
  79. includes/externals/aweber/oauth_application.php +4 -6
  80. includes/externals/mailchimp/Mailchimp-o.php +0 -1
  81. includes/externals/mailchimp/Mailchimp/Campaigns.php +2 -4
  82. includes/externals/mailchimp/Mailchimp/Lists.php +1 -1
  83. includes/externals/markdown/nc-markdown.inc.php +0 -1
  84. includes/functions/api-functions.inc.php +58 -22
  85. includes/functions/deprecated.inc.php +1 -2
  86. includes/functions/pluggables.inc.php +0 -1
  87. includes/hooks.inc.php +2 -1
  88. includes/menu-pages/api-ops.inc.php +6 -6
  89. includes/menu-pages/code-samples/api-mop-vars-ro.x-php +1 -1
  90. includes/menu-pages/code-samples/current-user-access-label.x-php +1 -1
  91. includes/menu-pages/code-samples/current-user-access-level.x-php +1 -1
  92. includes/menu-pages/code-samples/current-user-can-constants-2.x-php +1 -1
  93. includes/menu-pages/code-samples/current-user-can-full-access.x-php +1 -1
  94. includes/menu-pages/code-samples/current-user-custom.x-php +1 -1
  95. includes/menu-pages/code-samples/current-user-downloads-allowed-is-unlimited.x-php +1 -1
  96. includes/menu-pages/code-samples/current-user-email.x-php +1 -1
  97. includes/menu-pages/code-samples/current-user-fields.x-php +1 -1
  98. includes/menu-pages/code-samples/current-user-paid-registration-days-dripping.x-php +1 -1
  99. includes/menu-pages/code-samples/current-user-paid-registration-days.x-php +1 -1
  100. includes/menu-pages/code-samples/current-user-registration-days.x-php +1 -1
  101. includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php +1 -1
  102. includes/menu-pages/code-samples/sc-s2-conditional-supplements-1-farm.x-php +1 -1
  103. includes/menu-pages/code-samples/sc-s2-conditional-supplements-1.x-php +1 -1
  104. includes/menu-pages/down-ops.inc.php +27 -27
  105. includes/menu-pages/els-ops.inc.php +10 -10
  106. includes/menu-pages/gen-ops.inc.php +43 -35
  107. includes/menu-pages/integrations.inc.php +1 -1
  108. includes/menu-pages/menu-pages-s-min.js +1 -1
  109. includes/menu-pages/menu-pages-s.js +6 -3
  110. includes/menu-pages/menu-pages.css +9 -1
  111. includes/menu-pages/mms-ops.inc.php +1 -2
  112. includes/menu-pages/paypal-buttons.inc.php +27 -28
  113. includes/menu-pages/paypal-ops.inc.php +27 -27
  114. includes/menu-pages/res-ops.inc.php +5 -5
  115. includes/menu-pages/scripting.inc.php +22 -23
  116. includes/menu-pages/start.inc.php +15 -16
  117. includes/menu-pages/trk-ops.inc.php +21 -21
  118. includes/s2member-min.js +1 -1
  119. includes/s2member.css +2 -2
  120. includes/s2member.js +247 -216
  121. includes/syscon.inc.php +22 -10
  122. includes/templates/badges/s-badge.php +1 -19
  123. includes/templates/buttons/paypal-cancellation-button.php +1 -1
  124. includes/templates/buttons/paypal-ccaps-checkout-button.php +1 -1
  125. includes/templates/buttons/paypal-checkout-button.php +1 -1
  126. includes/templates/buttons/paypal-sp-checkout-button.php +1 -1
  127. includes/templates/cfg-files/s2-cross-xml.php +1 -1
  128. includes/templates/cfg-files/s2member-files-no-gzip.php +1 -1
  129. includes/templates/cfg-files/s2member-files.php +1 -1
  130. includes/templates/cfg-files/s2member-logs.php +1 -1
  131. includes/templates/cfg-files/s2o-mu-plugins.php +1 -1
  132. includes/templates/cfg-files/s2o-nw-plugins.php +1 -1
  133. includes/templates/cfg-files/s2o-st-plugins.php +1 -1
  134. includes/templates/cfg-files/s2o-th-funcs.php +1 -1
  135. includes/templates/errors/ip-restrictions.php +1 -1
  136. includes/templates/options/paypal-currencies.php +1 -1
  137. includes/templates/options/paypal-membership-ccap-terms.php +1 -1
  138. includes/templates/options/paypal-membership-regular-terms.php +1 -1
  139. includes/templates/options/paypal-membership-trial-terms.php +1 -1
  140. includes/templates/options/paypal-sp-hours.php +1 -1
  141. includes/templates/players/jwplayer-v6-rtmp-only.php +1 -1
  142. includes/templates/players/jwplayer-v6-rtmp.php +1 -1
  143. includes/templates/players/jwplayer-v6.php +1 -1
  144. includes/templates/returns/default-return.php +1 -1
  145. includes/templates/shortcodes/paypal-cancellation-button-shortcode.php +1 -1
  146. includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php +1 -1
  147. includes/templates/shortcodes/paypal-checkout-button-shortcode.php +1 -1
  148. includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php +1 -1
  149. includes/translations/s2member.pot +422 -360
changelog.md CHANGED
@@ -1,3 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = v150311 =
2
 
3
  - (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.
@@ -9,7 +108,7 @@
9
 
10
  = v150225 =
11
 
12
- - (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.
13
  - (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.
14
  - (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.
15
  - (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!
@@ -22,13 +121,13 @@
22
 
23
  = v150203 =
24
 
25
- - (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: https://www.youtube.com/watch?v=T3N_vygowbM&feature=youtu.be ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/386) for additional technical details.
26
- - (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.
27
- - (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.
28
- - (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.
29
- - (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.
30
- - (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.
31
- - (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.
32
  - (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).
33
  - (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.
34
  - (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.
@@ -41,7 +140,7 @@
41
  = v150102 =
42
 
43
  - (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.
44
- - (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.
45
  - (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!
46
  - (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.
47
  - (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.
@@ -50,7 +149,7 @@
50
  - (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.
51
  - (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.
52
  - (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.
53
- - (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.
54
 
55
  _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._
56
  - (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.
@@ -82,12 +181,12 @@
82
 
83
  = v141007 =
84
 
85
- - (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).
86
- - (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.
87
  - (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.
88
  - (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.
89
- - (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.
90
- - (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.
91
 
92
  = v140921 =
93
 
@@ -121,38 +220,38 @@
121
  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.
122
 
123
  See also: [this GitHub issue](https://github.com/websharks/s2member/issues/179) if you'd like more info.
124
- * (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.
125
- * (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.
126
- * (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.
127
  * (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).
128
  * (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).
129
  * (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.
130
  * (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.
131
  * (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).
132
  * (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.
133
- * (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.
134
  * (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.
135
  * (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.
136
- * (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.
137
  * (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.
138
- * (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.
139
  * (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.
140
 
141
  = v140725 =
142
 
143
  * (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).
144
 
145
- **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`.
146
 
147
  **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.
148
 
149
- * (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.
150
  * (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.
151
  * (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.
152
  * (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.
153
  * (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.
154
  * (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.
155
- * (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.
156
  * (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.
157
  * (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.
158
  * (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!?
@@ -160,11 +259,11 @@
160
 
161
  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.
162
 
163
- 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 :-)
164
 
165
  = v140630 =
166
 
167
- - (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`.
168
 
169
  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.
170
 
@@ -189,7 +288,7 @@
189
  * (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.
190
  * (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.
191
 
192
- **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`.
193
 
194
  See also: [this GitHub issue](https://github.com/websharks/s2member/issues/183) if you'd like further details.
195
  * (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.
@@ -230,11 +329,11 @@
230
 
231
  = v140409 =
232
 
233
- * (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/).
234
  * (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.
235
  * (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.
236
- * (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`.
237
- * (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`.
238
  * (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.
239
  * (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.
240
 
@@ -254,15 +353,15 @@
254
  * (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).
255
  * (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.
256
  * (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.
257
- * (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.
258
  * (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.
259
  * (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).
260
  * (s2Member) **Cosmetics**. Updating s2Member's adminitrative menu pages to enhance their appearance in the most recent versions of WordPress. Nothing significant, just minor tweaks.
261
  * (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.
262
- * (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`.
263
- * (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).
264
  * (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.
265
- * (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`.
266
  * (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.
267
  * (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).
268
  * (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).
@@ -274,9 +373,9 @@
274
  = v140105 =
275
 
276
  * (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.
277
- * (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`.
278
- * (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`.
279
- * (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.
280
  * (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`.
281
  * (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`.
282
  * (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.
@@ -293,20 +392,20 @@
293
 
294
  * (s2Member Pro) **Google Wallet.** s2Member Pro now supports [Google Wallet for Digital Goods](https://developers.google.com/commerce/wallet/digital/).
295
 
296
- 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`.
297
 
298
  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>.
299
 
300
- 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).
301
  * (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!
302
- * (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`.
303
  * (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.
304
  * (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)`.
305
  * (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()`.
306
  * (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.
307
- * (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.
308
  * (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.
309
- * (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`.
310
  * (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.
311
  * (s2Member/s2Member Pro) **Other Minor Bug Fixes.** Please see: <https://github.com/WebSharks/s2Member/commits/000000-dev>
312
 
@@ -330,7 +429,7 @@
330
  = v131025 =
331
 
332
  * (s2Member) **WordPress v3.7 Compatibility** s2Member updated to support WordPress v3.7. s2Member remains compatible with WP v3.3 (or higher).
333
- * (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).
334
  * (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.
335
  * (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.
336
  * (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.
@@ -339,7 +438,7 @@
339
  * (s2Member) **Quick Start Video (#10)** Adding Quick Start playlist to Quick Start section.
340
  * (s2Member) **UI (#6)** Reducing padding around section headers in s2Member option panels to reduce the amount of space these consume.
341
  * (s2Member Pro) **SSL** Forcing all automatic updates of s2Member Pro to occur over SSL for improved security.
342
- * (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.
343
  * (s2Member) **Bug Fix: Registration/Profile Fields** Adding space between checkboxes and their labels.
344
  * (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.
345
  * (s2Member) **Conformity** Updating calls to `$wpdb->escape` changing to `esc_sql` to conform w/ WordPress standards.
@@ -351,28 +450,28 @@
351
  * (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.
352
  * (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).
353
  * (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.
354
- * (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`.
355
- * (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.
356
- * (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.
357
 
358
  = v130802 =
359
 
360
  * (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.
361
- * (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.
362
 
363
  = v130801 =
364
 
365
- * (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.
366
 
367
  = v130731 =
368
 
369
- * (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.
370
  * (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.
371
- * (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.
372
  * (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.
373
  * (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).
374
- * (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.
375
- * (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.
376
  * (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.
377
  * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed incorrect pagination of user search results in the Dashboard.
378
  * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed slow query against user searches in the Dashboard.
@@ -380,12 +479,12 @@
380
 
381
  = v130617 =
382
 
383
- * (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.
384
  * (s2Member Pro) **Bug Fix (#302)** Updating Authorize.Net Pro-Form Generator to support max days of `365` instead of `7`.
385
  * (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.
386
  * (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.
387
  * (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.
388
- * (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.
389
  * (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.
390
 
391
  = v130513 =
@@ -404,9 +503,9 @@
404
 
405
  = v130510 =
406
 
407
- * (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)`.
408
- * (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard ClickBank Buttons Shortcode Attributes (Explained)`.
409
- * (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)`.
410
  * (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).
411
  * (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.
412
  * (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.
@@ -459,13 +558,13 @@
459
  = v130220 =
460
 
461
  * (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.
462
- * (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.
463
- * (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`.
464
- * (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)`.
465
  * (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.
466
- * (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)`.
467
- * (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`.
468
- * (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`.
469
  * (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.
470
 
471
  = v130214 =
@@ -489,13 +588,13 @@
489
  * (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.
490
  * (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.
491
  * (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.
492
- * (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.
493
  * (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")`.
494
  * (s2Member/s2Member Pro) **Last Login Time** Adding new User data column to list of Users in the Dashboard: `Last Login Time`.
495
  * (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/).
496
  * (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.
497
- * (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.
498
- * (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.
499
  * (s2Member/s2Member Pro) **Inline Documentation** Adding more links to KB articles throughout the Dashboard area.
500
  * (s2Member/s2Member Pro) **Inline Documentation** Updating all spaced parenthesis like `( something... )` to remove the grammatical errors—by removing the extra spaces inside these brackets.
501
  * (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).
@@ -503,11 +602,11 @@
503
  * (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.
504
  * (s2Member/s2Member Pro) **Inline Documentation** Adding Troubleshooting section to the Quick-Start Guide for s2Member®—in the Dashboard.
505
  * (s2Member/s2Member Pro) **Inline Documentation** Adding Perfect Theme section to the Quick-Start Guide for s2Member®—in the Dashboard.
506
- * (s2Member/s2Member Pro) **Inline Documentation** Adding video tutorial to the `Dashboard s2Member® API / Scripting Custom Capabilities` section.
507
- * (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.
508
- * (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`.
509
- * (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.
510
- * (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.
511
  * (s2Member/s2Member Pro) **Logging Functionality** Adding date/time to all log entries maintained by s2Member®.
512
  * (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).
513
  * (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`.
@@ -528,8 +627,8 @@
528
  = v130203 =
529
 
530
  * **(New Release) Please read this changelog for important details.**
531
- * (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`.
532
- * (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`.
533
  * (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`.
534
  * (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).
535
  * (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).
@@ -542,16 +641,16 @@
542
  * (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).
543
  * (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).
544
  * (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).
545
- * (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`.
546
  * (s2Member/s2Member Pro) **KB Articles** Inline documentation updated in some areas, with a few links pointing to helpful/related KB articles.
547
 
548
  = v130121 =
549
 
550
  * **(Maintenance Release) Upgrade immediately.**
551
- * **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)`.
552
  * **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).
553
  * **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.
554
- * **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.
555
 
556
  = v130116 =
557
 
@@ -564,4 +663,4 @@
564
  = v121213 =
565
 
566
  * ... trimmed away at v121213.
567
- * Initial release: v1.0.
1
+ = v150722 =
2
+
3
+ - (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.
4
+
5
+ - (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.
6
+
7
+ - (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.
8
+
9
+ _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._
10
+
11
+ - (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.
12
+
13
+ - (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.
14
+
15
+ - (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.
16
+
17
+ - (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.
18
+
19
+ - (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.
20
+
21
+ - (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.
22
+
23
+ - (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.
24
+
25
+ - (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.
26
+
27
+ - (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+.
28
+
29
+ - (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.
30
+
31
+ - (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.
32
+
33
+ - (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.
34
+
35
+ - (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.
36
+
37
+ - (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.
38
+
39
+ - (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.
40
+
41
+ - (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.
42
+
43
+ - (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.
44
+
45
+ - (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.
46
+
47
+ - (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.
48
+
49
+ - (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.
50
+
51
+ - (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.
52
+
53
+ - (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.
54
+
55
+ - (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.
56
+
57
+ - (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.
58
+
59
+ - (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.
60
+
61
+ - (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.
62
+
63
+ - (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.
64
+
65
+ - (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._
66
+
67
+ - (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.
68
+
69
+ - (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.
70
+
71
+ - (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.
72
+
73
+ - (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.
74
+
75
+ 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.
76
+
77
+ 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.
78
+
79
+ _See also: [Instructions for Updating s2Member and s2Member Pro](https://s2member.com/updating/)_
80
+ - (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.
81
+
82
+ - (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.
83
+
84
+ - (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.
85
+
86
+ - (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.
87
+
88
+ _See also: [New `[s2Eot /]` Shortcode](http://s2member.com/kb-article/s2eot-shortcode-documentation/) with EOT-specific date/time functionality enhancements._
89
+
90
+ - (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.
91
+
92
+ - (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.
93
+
94
+ - (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.
95
+
96
+ - (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.
97
+
98
+ - (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/)
99
+
100
  = v150311 =
101
 
102
  - (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.
108
 
109
  = v150225 =
110
 
111
+ - (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.
112
  - (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.
113
  - (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.
114
  - (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!
121
 
122
  = v150203 =
123
 
124
+ - (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.
125
+ - (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.
126
+ - (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.
127
+ - (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.
128
+ - (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.
129
+ - (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.
130
+ - (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.
131
  - (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).
132
  - (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.
133
  - (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.
140
  = v150102 =
141
 
142
  - (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.
143
+ - (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.
144
  - (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!
145
  - (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.
146
  - (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.
149
  - (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.
150
  - (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.
151
  - (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.
152
+ - (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.
153
 
154
  _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._
155
  - (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.
181
 
182
  = v141007 =
183
 
184
+ - (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).
185
+ - (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.
186
  - (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.
187
  - (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.
188
+ - (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.
189
+ - (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.
190
 
191
  = v140921 =
192
 
220
  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.
221
 
222
  See also: [this GitHub issue](https://github.com/websharks/s2member/issues/179) if you'd like more info.
223
+ * (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.
224
+ * (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.
225
+ * (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.
226
  * (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).
227
  * (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).
228
  * (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.
229
  * (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.
230
  * (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).
231
  * (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.
232
+ * (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.
233
  * (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.
234
  * (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.
235
+ * (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.
236
  * (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.
237
+ * (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.
238
  * (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.
239
 
240
  = v140725 =
241
 
242
  * (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).
243
 
244
+ **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`.
245
 
246
  **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.
247
 
248
+ * (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.
249
  * (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.
250
  * (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.
251
  * (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.
252
  * (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.
253
  * (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.
254
+ * (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.
255
  * (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.
256
  * (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.
257
  * (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!?
259
 
260
  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.
261
 
262
+ 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 :-)
263
 
264
  = v140630 =
265
 
266
+ - (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`.
267
 
268
  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.
269
 
288
  * (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.
289
  * (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.
290
 
291
+ **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`.
292
 
293
  See also: [this GitHub issue](https://github.com/websharks/s2member/issues/183) if you'd like further details.
294
  * (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.
329
 
330
  = v140409 =
331
 
332
+ * (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/).
333
  * (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.
334
  * (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.
335
+ * (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`.
336
+ * (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`.
337
  * (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.
338
  * (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.
339
 
353
  * (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).
354
  * (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.
355
  * (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.
356
+ * (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.
357
  * (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.
358
  * (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).
359
  * (s2Member) **Cosmetics**. Updating s2Member's adminitrative menu pages to enhance their appearance in the most recent versions of WordPress. Nothing significant, just minor tweaks.
360
  * (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.
361
+ * (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`.
362
+ * (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).
363
  * (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.
364
+ * (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`.
365
  * (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.
366
  * (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).
367
  * (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).
373
  = v140105 =
374
 
375
  * (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.
376
+ * (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`.
377
+ * (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`.
378
+ * (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.
379
  * (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`.
380
  * (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`.
381
  * (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.
392
 
393
  * (s2Member Pro) **Google Wallet.** s2Member Pro now supports [Google Wallet for Digital Goods](https://developers.google.com/commerce/wallet/digital/).
394
 
395
+ 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`.
396
 
397
  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>.
398
 
399
+ 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).
400
  * (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!
401
+ * (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`.
402
  * (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.
403
  * (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)`.
404
  * (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()`.
405
  * (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.
406
+ * (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.
407
  * (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.
408
+ * (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`.
409
  * (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.
410
  * (s2Member/s2Member Pro) **Other Minor Bug Fixes.** Please see: <https://github.com/WebSharks/s2Member/commits/000000-dev>
411
 
429
  = v131025 =
430
 
431
  * (s2Member) **WordPress v3.7 Compatibility** s2Member updated to support WordPress v3.7. s2Member remains compatible with WP v3.3 (or higher).
432
+ * (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).
433
  * (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.
434
  * (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.
435
  * (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.
438
  * (s2Member) **Quick Start Video (#10)** Adding Quick Start playlist to Quick Start section.
439
  * (s2Member) **UI (#6)** Reducing padding around section headers in s2Member option panels to reduce the amount of space these consume.
440
  * (s2Member Pro) **SSL** Forcing all automatic updates of s2Member Pro to occur over SSL for improved security.
441
+ * (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.
442
  * (s2Member) **Bug Fix: Registration/Profile Fields** Adding space between checkboxes and their labels.
443
  * (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.
444
  * (s2Member) **Conformity** Updating calls to `$wpdb->escape` changing to `esc_sql` to conform w/ WordPress standards.
450
  * (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.
451
  * (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).
452
  * (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.
453
+ * (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`.
454
+ * (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.
455
+ * (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.
456
 
457
  = v130802 =
458
 
459
  * (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.
460
+ * (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.
461
 
462
  = v130801 =
463
 
464
+ * (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.
465
 
466
  = v130731 =
467
 
468
+ * (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.
469
  * (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.
470
+ * (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.
471
  * (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.
472
  * (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).
473
+ * (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.
474
+ * (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.
475
  * (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.
476
  * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed incorrect pagination of user search results in the Dashboard.
477
  * (s2Member/s2Member Pro) **Bug Fix (#418)** Fixed slow query against user searches in the Dashboard.
479
 
480
  = v130617 =
481
 
482
+ * (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.
483
  * (s2Member Pro) **Bug Fix (#302)** Updating Authorize.Net Pro-Form Generator to support max days of `365` instead of `7`.
484
  * (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.
485
  * (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.
486
  * (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.
487
+ * (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.
488
  * (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.
489
 
490
  = v130513 =
503
 
504
  = v130510 =
505
 
506
+ * (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)`.
507
+ * (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard ClickBank Buttons Shortcode Attributes (Explained)`.
508
+ * (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)`.
509
  * (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).
510
  * (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.
511
  * (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.
558
  = v130220 =
559
 
560
  * (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.
561
+ * (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.
562
+ * (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`.
563
+ * (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)`.
564
  * (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.
565
+ * (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)`.
566
+ * (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`.
567
+ * (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`.
568
  * (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.
569
 
570
  = v130214 =
588
  * (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.
589
  * (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.
590
  * (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.
591
+ * (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.
592
  * (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")`.
593
  * (s2Member/s2Member Pro) **Last Login Time** Adding new User data column to list of Users in the Dashboard: `Last Login Time`.
594
  * (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/).
595
  * (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.
596
+ * (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.
597
+ * (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.
598
  * (s2Member/s2Member Pro) **Inline Documentation** Adding more links to KB articles throughout the Dashboard area.
599
  * (s2Member/s2Member Pro) **Inline Documentation** Updating all spaced parenthesis like `( something... )` to remove the grammatical errors—by removing the extra spaces inside these brackets.
600
  * (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).
602
  * (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.
603
  * (s2Member/s2Member Pro) **Inline Documentation** Adding Troubleshooting section to the Quick-Start Guide for s2Member®—in the Dashboard.
604
  * (s2Member/s2Member Pro) **Inline Documentation** Adding Perfect Theme section to the Quick-Start Guide for s2Member®—in the Dashboard.
605
+ * (s2Member/s2Member Pro) **Inline Documentation** Adding video tutorial to the `Dashboard s2Member® API / Scripting Custom Capabilities` section.
606
+ * (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.
607
+ * (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`.
608
+ * (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.
609
+ * (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.
610
  * (s2Member/s2Member Pro) **Logging Functionality** Adding date/time to all log entries maintained by s2Member®.
611
  * (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).
612
  * (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`.
627
  = v130203 =
628
 
629
  * **(New Release) Please read this changelog for important details.**
630
+ * (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`.
631
+ * (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`.
632
  * (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`.
633
  * (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).
634
  * (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).
641
  * (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).
642
  * (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).
643
  * (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).
644
+ * (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`.
645
  * (s2Member/s2Member Pro) **KB Articles** Inline documentation updated in some areas, with a few links pointing to helpful/related KB articles.
646
 
647
  = v130121 =
648
 
649
  * **(Maintenance Release) Upgrade immediately.**
650
+ * **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)`.
651
  * **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).
652
  * **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.
653
+ * **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.
654
 
655
  = v130116 =
656
 
663
  = v121213 =
664
 
665
  * ... trimmed away at v121213.
666
+ * Initial release: v1.0.
checksum.txt CHANGED
@@ -1 +1 @@
1
- 6e978345db7617c401da82504eb6d20b
1
+ ac6ab77717ca3649c60746d452238881
includes/classes/admin-lockouts.inc.php CHANGED
@@ -133,4 +133,4 @@ if(!class_exists('c_ws_plugin__s2member_admin_lockouts'))
133
  do_action('ws_plugin__s2member_after_filter_admin_menu_bar', get_defined_vars());
134
  }
135
  }
136
- }
133
  do_action('ws_plugin__s2member_after_filter_admin_menu_bar', get_defined_vars());
134
  }
135
  }
136
+ }
includes/classes/admin-notices.inc.php CHANGED
@@ -75,17 +75,20 @@ if(!class_exists('c_ws_plugin__s2member_admin_notices'))
75
  do_action('ws_plugin__s2member_before_display_admin_notice', get_defined_vars());
76
  unset($__refs, $__v); // Allow variables to be modified by reference.
77
 
78
- if($notice && is_string($notice) && $error) // Slightly different/special format for errors.
 
 
 
79
  {
80
- $notice .= $dismiss ? ' [ <a href="'.esc_attr(add_query_arg('ws-plugin--s2member-dismiss-admin-notice', urlencode(md5($notice)),
81
- $_SERVER['REQUEST_URI'])).'">dismiss message</a> ]' : '';
82
- echo '<div class="error fade"><p>'.$notice.'</p></div>'; // Special error notice; w/ fade class.
83
  }
84
  else if($notice && is_string($notice))
85
  {
86
- $notice .= $dismiss ? ' [ <a href="'.esc_attr(add_query_arg('ws-plugin--s2member-dismiss-admin-notice', urlencode(md5($notice)),
87
- $_SERVER['REQUEST_URI'])).'">dismiss message</a> ]' : '';
88
- echo '<div class="updated fade"><p>'.$notice.'</p></div>'; // Regular notice; w/ fade class.
89
  }
90
  do_action('ws_plugin__s2member_after_display_admin_notice', get_defined_vars());
91
  }
@@ -154,4 +157,4 @@ if(!class_exists('c_ws_plugin__s2member_admin_notices'))
154
  do_action('ws_plugin__s2member_after_admin_notices', get_defined_vars());
155
  }
156
  }
157
- }
75
  do_action('ws_plugin__s2member_before_display_admin_notice', get_defined_vars());
76
  unset($__refs, $__v); // Allow variables to be modified by reference.
77
 
78
+ if($dismiss) $dismissal_link = '<div style="float:right; margin:0 0 0 1em; font-weight:bold;">'.
79
+ '[ <a href="'.esc_attr(add_query_arg('ws-plugin--s2member-dismiss-admin-notice', urlencode(md5($notice)), $_SERVER['REQUEST_URI'])).'">dismiss</a> ]'.
80
+ '</div>';
81
+ if($notice && is_string($notice) && $error)
82
  {
83
+ if($dismiss && !empty($dismissal_link))
84
+ $notice = $dismissal_link.$notice;
85
+ echo '<div class="error fade"><p>'.$notice.'</p></div>';
86
  }
87
  else if($notice && is_string($notice))
88
  {
89
+ if($dismiss && !empty($dismissal_link))
90
+ $notice = $dismissal_link.$notice;
91
+ echo '<div class="updated fade"><p>'.$notice.'</p></div>';
92
  }
93
  do_action('ws_plugin__s2member_after_display_admin_notice', get_defined_vars());
94
  }
157
  do_action('ws_plugin__s2member_after_admin_notices', get_defined_vars());
158
  }
159
  }
160
+ }
includes/classes/auto-eots.inc.php CHANGED
@@ -111,7 +111,7 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
111
 
112
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
113
  do_action('ws_plugin__s2member_before_auto_eot_system', get_defined_vars());
114
- unset($__refs, $__v);
115
 
116
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['auto_eot_system_enabled'] /* Enabled? */)
117
  {
@@ -123,7 +123,9 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
123
  {
124
  if(($user_id = $eot->ID) && is_object($user = new WP_User ($user_id)) && $user->ID)
125
  {
126
- delete_user_option($user_id, 's2member_auto_eot_time'); // Always delete.
 
 
127
 
128
  if(!$user->has_cap('administrator') /* Do NOT process Administrator accounts. */)
129
  {
@@ -131,13 +133,14 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
131
  {
132
  $eot_del_type = 'auto-eot-cancellation-expiration-demotion'; // Set EOT/Del type.
133
 
134
- $custom = get_user_option('s2member_custom', $user_id);
135
- $subscr_gateway = get_user_option('s2member_subscr_gateway', $user_id);
136
- $subscr_id = get_user_option('s2member_subscr_id', $user_id);
137
- $subscr_baid = get_user_option('s2member_subscr_baid', $user_id);
138
- $subscr_cid = get_user_option('s2member_subscr_cid', $user_id);
139
- $fields = get_user_option('s2member_custom_fields', $user_id);
140
- $user_reg_ip = get_user_option('s2member_registration_ip', $user_id);
 
141
 
142
  $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role('subscriber');
143
  $existing_role = c_ws_plugin__s2member_user_access::user_access_role($user);
@@ -146,7 +149,7 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
146
  do_action('ws_plugin__s2member_during_auto_eot_system_during_before_demote', get_defined_vars());
147
  do_action('ws_plugin__s2member_during_collective_mods', $user_id, get_defined_vars(), $eot_del_type, 'modification', $demotion_role);
148
  do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'modification');
149
- unset($__refs, $__v);
150
 
151
  if($existing_role !== $demotion_role /* Only if NOT the existing Role. */)
152
  $user->set_role($demotion_role /* Give User the demotion Role. */);
@@ -162,21 +165,23 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
162
  delete_user_option($user_id, 's2member_subscr_cid');
163
 
164
  delete_user_option($user_id, 's2member_ipn_signup_vars');
165
- if(!apply_filters('ws_plugin__s2member_preserve_paid_registration_times', TRUE, get_defined_vars()))
166
  delete_user_option($user_id, 's2member_paid_registration_times');
167
 
168
  delete_user_option($user_id, 's2member_last_status_scan');
169
  delete_user_option($user_id, 's2member_first_payment_txn_id');
170
  delete_user_option($user_id, 's2member_last_payment_time');
 
171
  delete_user_option($user_id, 's2member_auto_eot_time');
172
 
173
  delete_user_option($user_id, 's2member_file_download_access_log');
174
  delete_user_option($user_id, 's2member_authnet_payment_failures');
175
 
176
- c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Demoted by s2Member: '.date('D M j, Y g:i a T'));
177
 
 
178
  if($subscr_gateway && $subscr_id) // Also note the Paid Subscr. Gateway/ID so there is a reference left behind here.
179
- c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Paid Subscr. ID @ time of demotion: '.$subscr_gateway.' '.$subscr_id);
180
 
181
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_urls'] && is_array($cv = preg_split('/\|/', $custom)))
182
  {
@@ -257,7 +262,7 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
257
  }
258
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
259
  do_action('ws_plugin__s2member_during_auto_eot_system_during_demote', get_defined_vars());
260
- unset($__refs, $__v);
261
  }
262
  else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'delete')
263
  {
@@ -266,7 +271,7 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
266
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
267
  do_action('ws_plugin__s2member_during_auto_eot_system_during_before_delete', get_defined_vars());
268
  do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'removal-deletion');
269
- unset($__refs, $__v);
270
 
271
  if(is_multisite()/* Multisite does NOT actually delete; ONLY removes. */)
272
  {
@@ -280,11 +285,11 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
280
 
281
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
282
  do_action('ws_plugin__s2member_during_auto_eot_system_during_delete', get_defined_vars());
283
- unset($__refs, $__v);
284
  }
285
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
286
  do_action('ws_plugin__s2member_during_auto_eot_system', get_defined_vars());
287
- unset($__refs, $__v);
288
  }
289
  }
290
  }
@@ -294,7 +299,7 @@ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
294
 
295
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
296
  do_action('ws_plugin__s2member_after_auto_eot_system', get_defined_vars());
297
- unset($__refs, $__v);
298
  }
299
  }
300
- }
111
 
112
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
113
  do_action('ws_plugin__s2member_before_auto_eot_system', get_defined_vars());
114
+ unset($__refs, $__v); // Housekeeping.
115
 
116
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['auto_eot_system_enabled'] /* Enabled? */)
117
  {
123
  {
124
  if(($user_id = $eot->ID) && is_object($user = new WP_User ($user_id)) && $user->ID)
125
  {
126
+ $auto_eot_time = get_user_option('s2member_auto_eot_time', $user_id);
127
+ delete_user_option($user_id, 's2member_last_auto_eot_time');
128
+ delete_user_option($user_id, 's2member_auto_eot_time');
129
 
130
  if(!$user->has_cap('administrator') /* Do NOT process Administrator accounts. */)
131
  {
133
  {
134
  $eot_del_type = 'auto-eot-cancellation-expiration-demotion'; // Set EOT/Del type.
135
 
136
+ $custom = get_user_option('s2member_custom', $user_id);
137
+ $subscr_gateway = get_user_option('s2member_subscr_gateway', $user_id);
138
+ $subscr_id = get_user_option('s2member_subscr_id', $user_id);
139
+ $subscr_baid = get_user_option('s2member_subscr_baid', $user_id);
140
+ $subscr_cid = get_user_option('s2member_subscr_cid', $user_id);
141
+ $fields = get_user_option('s2member_custom_fields', $user_id);
142
+ $user_reg_ip = get_user_option('s2member_registration_ip', $user_id);
143
+ $ipn_signup_vars = get_user_option('s2member_ipn_signup_vars', $user_id);
144
 
145
  $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role('subscriber');
146
  $existing_role = c_ws_plugin__s2member_user_access::user_access_role($user);
149
  do_action('ws_plugin__s2member_during_auto_eot_system_during_before_demote', get_defined_vars());
150
  do_action('ws_plugin__s2member_during_collective_mods', $user_id, get_defined_vars(), $eot_del_type, 'modification', $demotion_role);
151
  do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'modification');
152
+ unset($__refs, $__v); // Housekeeping.
153
 
154
  if($existing_role !== $demotion_role /* Only if NOT the existing Role. */)
155
  $user->set_role($demotion_role /* Give User the demotion Role. */);
165
  delete_user_option($user_id, 's2member_subscr_cid');
166
 
167
  delete_user_option($user_id, 's2member_ipn_signup_vars');
168
+ if(!apply_filters('ws_plugin__s2member_preserve_paid_registration_times', TRUE))
169
  delete_user_option($user_id, 's2member_paid_registration_times');
170
 
171
  delete_user_option($user_id, 's2member_last_status_scan');
172
  delete_user_option($user_id, 's2member_first_payment_txn_id');
173
  delete_user_option($user_id, 's2member_last_payment_time');
174
+ delete_user_option($user_id, 's2member_last_auto_eot_time');
175
  delete_user_option($user_id, 's2member_auto_eot_time');
176
 
177
  delete_user_option($user_id, 's2member_file_download_access_log');
178
  delete_user_option($user_id, 's2member_authnet_payment_failures');
179
 
180
+ update_user_option($user_id, 's2member_last_auto_eot_time', $auto_eot_time);
181
 
182
+ c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Demoted by s2Member: '.date('D M j, Y g:i a T'));
183
  if($subscr_gateway && $subscr_id) // Also note the Paid Subscr. Gateway/ID so there is a reference left behind here.
184
+ c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Paid Subscr. ID @ time of demotion: '.$subscr_gateway.' '.$subscr_id);
185
 
186
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_urls'] && is_array($cv = preg_split('/\|/', $custom)))
187
  {
262
  }
263
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
264
  do_action('ws_plugin__s2member_during_auto_eot_system_during_demote', get_defined_vars());
265
+ unset($__refs, $__v); // Housekeeping.
266
  }
267
  else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'delete')
268
  {
271
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
272
  do_action('ws_plugin__s2member_during_auto_eot_system_during_before_delete', get_defined_vars());
273
  do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'removal-deletion');
274
+ unset($__refs, $__v); // Housekeeping.
275
 
276
  if(is_multisite()/* Multisite does NOT actually delete; ONLY removes. */)
277
  {
285
 
286
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
287
  do_action('ws_plugin__s2member_during_auto_eot_system_during_delete', get_defined_vars());
288
+ unset($__refs, $__v); // Housekeeping.
289
  }
290
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
291
  do_action('ws_plugin__s2member_during_auto_eot_system', get_defined_vars());
292
+ unset($__refs, $__v); // Housekeeping.
293
  }
294
  }
295
  }
299
 
300
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
301
  do_action('ws_plugin__s2member_after_auto_eot_system', get_defined_vars());
302
+ unset($__refs, $__v); // Housekeeping.
303
  }
304
  }
305
+ }
includes/classes/aweber.inc.php CHANGED
@@ -178,6 +178,9 @@ if(!class_exists('c_ws_plugin__s2member_aweber'))
178
  $_aw['subscriber_props']['ip_address'] = substr($_aw['subscriber_props']['ip_address'], 0, 60);
179
  $_aw['subscriber_props']['ad_tracking'] = substr($_aw['subscriber_props']['ad_tracking'], 0, 20);
180
 
 
 
 
181
  foreach($_aw['subscriber_props'] as $_key => $_value)
182
  if(!$_value && $_value !== FALSE) // Empty?
183
  unset($_aw['subscriber_props'][$_key]);
@@ -311,4 +314,4 @@ if(!class_exists('c_ws_plugin__s2member_aweber'))
311
  return self::unsubscribe($old_args) && self::subscribe($new_args);
312
  }
313
  }
314
- }
178
  $_aw['subscriber_props']['ip_address'] = substr($_aw['subscriber_props']['ip_address'], 0, 60);
179
  $_aw['subscriber_props']['ad_tracking'] = substr($_aw['subscriber_props']['ad_tracking'], 0, 20);
180
 
181
+ if(!filter_var($_aw['subscriber_props']['ip_address'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
182
+ $_aw['subscriber_props']['ip_address'] = ''; // IPv4 addresses only.
183
+
184
  foreach($_aw['subscriber_props'] as $_key => $_value)
185
  if(!$_value && $_value !== FALSE) // Empty?
186
  unset($_aw['subscriber_props'][$_key]);
314
  return self::unsubscribe($old_args) && self::subscribe($new_args);
315
  }
316
  }
317
+ }
includes/classes/cache.inc.php CHANGED
@@ -102,4 +102,3 @@ if (!class_exists ("c_ws_plugin__s2member_cache"))
102
  }
103
  }
104
  }
105
- ?>
102
  }
103
  }
104
  }
 
includes/classes/constants.inc.php CHANGED
@@ -457,7 +457,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
457
  * The current User's Registration Time.
458
  *
459
  * The Registration Time, is the time at which the Username was created for the account, that's it.
460
- * There's nothing special about this. This simply returns a {@link http://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
461
  *
462
  * This will be equal to `0` if NOT logged-in.
463
  *
@@ -544,7 +544,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
544
  * @see http://codex.wordpress.org/Function_Reference/get_user_option get_user_option()
545
  */
546
  if(!defined('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_TIME'))
547
- define ('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_TIME', ($c[] = (($user && (int)$paid_registration_times['level']) ? (int)$paid_registration_times['level'] : 0)));
548
 
549
  /**
550
  * The number of days the current User has been a paid Member.
@@ -596,7 +596,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
596
  * @see http://codex.wordpress.org/Function_Reference/get_user_option get_user_option()
597
  */
598
  if(!defined('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS'))
599
- define ('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS', ($c[] = (($user && (int)$paid_registration_times['level']) ? (int)floor((strtotime('now') - (int)$paid_registration_times['level']) / 86400) : 0)));
600
 
601
  /**
602
  * The number of days the current User has had an account, period.
@@ -1076,7 +1076,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1076
  *
1077
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1078
  *
1079
- * @see `Dashboard s2Member Download Options`
1080
  */
1081
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED'))
1082
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED', ($c[] = (int)$file_downloads['allowed']));
@@ -1131,7 +1131,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1131
  *
1132
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1133
  *
1134
- * @see `Dashboard s2Member Download Options`
1135
  */
1136
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED'))
1137
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED', ($c[] = (($file_downloads['allowed'] >= 999999999) ? TRUE : FALSE)));
@@ -1177,7 +1177,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1177
  *
1178
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1179
  *
1180
- * @see `Dashboard s2Member Download Options`
1181
  */
1182
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY'))
1183
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY', ($c[] = (int)$file_downloads['currently']));
@@ -1223,7 +1223,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1223
  *
1224
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1225
  *
1226
- * @see `Dashboard s2Member Download Options`
1227
  */
1228
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS'))
1229
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS', ($c[] = (int)$file_downloads['allowed_days']));
@@ -1279,7 +1279,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1279
  *
1280
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1281
  *
1282
- * @see `Dashboard s2Member Download Options`
1283
  */
1284
  if(!defined('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID'))
1285
  define ('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page']));
@@ -1320,7 +1320,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1320
  *
1321
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1322
  *
1323
- * @see `Dashboard s2Member General Options Membership Options Page`
1324
  */
1325
  if(!defined('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_ID'))
1326
  define ('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_options_page']));
@@ -1361,7 +1361,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1361
  *
1362
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1363
  *
1364
- * @see `Dashboard s2Member General Options Login Welcome Page`
1365
  */
1366
  if(!defined('S2MEMBER_LOGIN_WELCOME_PAGE_ID'))
1367
  define ('S2MEMBER_LOGIN_WELCOME_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page']));
@@ -1401,7 +1401,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1401
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID
1402
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL
1403
  *
1404
- * @see `Dashboard s2Member General Options Profile Modifications`
1405
  */
1406
  if(!defined('S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL'))
1407
  define ('S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL', ($c[] = (string)home_url('/?s2member_profile=1')));
@@ -1457,7 +1457,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1457
  *
1458
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1459
  *
1460
- * @see `Dashboard s2Member Download Options`
1461
  */
1462
  if(!defined('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL'))
1463
  define ('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL', ($c[] = (string)$links['file_download_limit_exceeded_page']));
@@ -1498,7 +1498,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1498
  *
1499
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1500
  *
1501
- * @see `Dashboard s2Member General Options Membership Options Page`
1502
  */
1503
  if(!defined('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_URL'))
1504
  define ('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_URL', ($c[] = (string)$links['membership_options_page'])); // Signup page.
@@ -1539,7 +1539,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1539
  *
1540
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1541
  *
1542
- * @see `Dashboard s2Member General Options Login Welcome Page`
1543
  */
1544
  if(!defined('S2MEMBER_LOGIN_WELCOME_PAGE_URL'))
1545
  define ('S2MEMBER_LOGIN_WELCOME_PAGE_URL', ($c[] = (($login_redirection_url) ? (string)$login_redirection_url : (string)$links['login_welcome_page'])));
@@ -1664,7 +1664,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1664
  *
1665
  * @see http://codex.wordpress.org/Function_Reference/wp_get_current_user wp_get_current_user()
1666
  *
1667
- * @see `Dashboard s2Member General Options Membership Level (Labels)`
1668
  */
1669
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1670
  {
@@ -1716,7 +1716,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1716
  *
1717
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1718
  *
1719
- * @see `Dashboard s2Member Download Options`
1720
  */
1721
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1722
  {
@@ -1769,7 +1769,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1769
  *
1770
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1771
  *
1772
- * @see `Dashboard s2Member Download Options`
1773
  */
1774
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1775
  {
@@ -1813,7 +1813,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1813
  * @see s2Member\API_Constants\S2MEMBER_LEVELn_FILE_DOWNLOADS_ALLOWED
1814
  * @see s2Member\API_Constants\S2MEMBER_LEVELn_FILE_DOWNLOADS_ALLOWED_DAYS
1815
  *
1816
- * @see `Dashboard s2Member Download Options`
1817
  */
1818
  if(!defined('S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS'))
1819
  define ('S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_inline_extensions']));
@@ -1841,7 +1841,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1841
  *
1842
  * @see s2Member\API_Constants\S2MEMBER_REG_EMAIL_FROM_EMAIL
1843
  *
1844
- * @see `Dashboard s2Member General Options`
1845
  */
1846
  if(!defined('S2MEMBER_REG_EMAIL_FROM_NAME'))
1847
  define ('S2MEMBER_REG_EMAIL_FROM_NAME', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_name']));
@@ -1869,7 +1869,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1869
  *
1870
  * @see s2Member\API_Constants\S2MEMBER_REG_EMAIL_FROM_NAME
1871
  *
1872
- * @see `Dashboard s2Member General Options`
1873
  */
1874
  if(!defined('S2MEMBER_REG_EMAIL_FROM_EMAIL'))
1875
  define ('S2MEMBER_REG_EMAIL_FROM_EMAIL', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_email']));
@@ -1898,7 +1898,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1898
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_RETURN_URL
1899
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN
1900
  *
1901
- * @see `Dashboard s2Member PayPal Options IPN Integration`
1902
  */
1903
  if(!defined('S2MEMBER_PAYPAL_NOTIFY_URL'))
1904
  define ('S2MEMBER_PAYPAL_NOTIFY_URL', ($c[] = (string)home_url('/?s2member_paypal_notify=1')));
@@ -1927,7 +1927,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1927
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_NOTIFY_URL
1928
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN
1929
  *
1930
- * @see `Dashboard s2Member PayPal Options Auto-Return/PDT Integration`
1931
  */
1932
  if(!defined('S2MEMBER_PAYPAL_RETURN_URL'))
1933
  define ('S2MEMBER_PAYPAL_RETURN_URL', ($c[] = (string)home_url('/?s2member_paypal_return=1')));
@@ -1957,7 +1957,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1957
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
1958
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
1959
  *
1960
- * @see `Dashboard s2Member PayPal Options Account Details`
1961
  */
1962
  if(!defined('S2MEMBER_PAYPAL_BUSINESS'))
1963
  define ('S2MEMBER_PAYPAL_BUSINESS', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_business']));
@@ -1988,7 +1988,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
1988
  *
1989
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_ENDPOINT
1990
  *
1991
- * @see `Dashboard s2Member PayPal Options Account Details`
1992
  */
1993
  if(!defined('S2MEMBER_PAYPAL_ENDPOINT'))
1994
  define ('S2MEMBER_PAYPAL_ENDPOINT', ($c[] = (($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_sandbox']) ? 'www.sandbox.paypal.com' : 'www.paypal.com')));
@@ -2019,7 +2019,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2019
  *
2020
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_ENDPOINT
2021
  *
2022
- * @see `Dashboard s2Member PayPal Options Account Details`
2023
  */
2024
  if(!defined('S2MEMBER_PAYPAL_API_ENDPOINT'))
2025
  define ('S2MEMBER_PAYPAL_API_ENDPOINT', ($c[] = (($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_sandbox']) ? 'api-3t.sandbox.paypal.com' : 'api-3t.paypal.com')));
@@ -2048,7 +2048,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2048
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
2049
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
2050
  *
2051
- * @see `Dashboard s2Member PayPal Options Account Details`
2052
  */
2053
  if(!defined('S2MEMBER_PAYPAL_API_USERNAME'))
2054
  define ('S2MEMBER_PAYPAL_API_USERNAME', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username']));
@@ -2077,7 +2077,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2077
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_USERNAME
2078
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
2079
  *
2080
- * @see `Dashboard s2Member PayPal Options Account Details`
2081
  */
2082
  if(!defined('S2MEMBER_PAYPAL_API_PASSWORD'))
2083
  define ('S2MEMBER_PAYPAL_API_PASSWORD', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password']));
@@ -2106,7 +2106,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2106
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_USERNAME
2107
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
2108
  *
2109
- * @see `Dashboard s2Member PayPal Options Account Details`
2110
  */
2111
  if(!defined('S2MEMBER_PAYPAL_API_SIGNATURE'))
2112
  define ('S2MEMBER_PAYPAL_API_SIGNATURE', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature']));
@@ -2134,7 +2134,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2134
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_RETURN_URL
2135
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_NOTIFY_URL
2136
  *
2137
- * @see `Dashboard s2Member PayPal Options Auto-Return/PDT Integration`
2138
  */
2139
  if(!defined('S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN'))
2140
  define ('S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_identity_token']));
@@ -2195,7 +2195,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2195
  *
2196
  * @see s2Member\API_Functions\s2member_value_for_pp_inv()
2197
  *
2198
- * @see `Dashboard s2Member PayPal Buttons`
2199
  */
2200
  if(!defined('S2MEMBER_VALUE_FOR_PP_INV'))
2201
  define ('S2MEMBER_VALUE_FOR_PP_INV', uniqid().'~'.S2MEMBER_CURRENT_USER_IP);
@@ -2254,7 +2254,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2254
  *
2255
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0
2256
  *
2257
- * @see `Dashboard s2Member PayPal Buttons`
2258
  */
2259
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0'))
2260
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0', ($c[] = ((S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID) ? 'Referencing Customer ID' : 'Originating Domain')));
@@ -2313,7 +2313,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2313
  *
2314
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0
2315
  *
2316
- * @see `Dashboard s2Member PayPal Buttons`
2317
  */
2318
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0'))
2319
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0', ($c[] = ((S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID) ? S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID : (string)@$_SERVER['HTTP_HOST'])));
@@ -2369,7 +2369,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2369
  *
2370
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1
2371
  *
2372
- * @see `Dashboard s2Member PayPal Buttons`
2373
  */
2374
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1'))
2375
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1', ($c[] = 'Customer IP Address' /* Via $_SERVER['REMOTE_ADDR'] below. */));
@@ -2425,7 +2425,7 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2425
  *
2426
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1
2427
  *
2428
- * @see `Dashboard s2Member PayPal Buttons`
2429
  */
2430
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1'))
2431
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1', ($c[] = (string)@$_SERVER['REMOTE_ADDR']));
@@ -2452,4 +2452,4 @@ if(!class_exists('c_ws_plugin__s2member_constants'))
2452
  do_action('ws_plugin__s2member_after_constants', get_defined_vars());
2453
  }
2454
  }
2455
- }
457
  * The current User's Registration Time.
458
  *
459
  * The Registration Time, is the time at which the Username was created for the account, that's it.
460
+ * There's nothing special about this. This simply returns a {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
461
  *
462
  * This will be equal to `0` if NOT logged-in.
463
  *
544
  * @see http://codex.wordpress.org/Function_Reference/get_user_option get_user_option()
545
  */
546
  if(!defined('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_TIME'))
547
+ define ('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_TIME', ($c[] = (($user && (int)@$paid_registration_times['level']) ? (int)$paid_registration_times['level'] : 0)));
548
 
549
  /**
550
  * The number of days the current User has been a paid Member.
596
  * @see http://codex.wordpress.org/Function_Reference/get_user_option get_user_option()
597
  */
598
  if(!defined('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS'))
599
+ define ('S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS', ($c[] = (($user && (int)@$paid_registration_times['level']) ? (int)floor((strtotime('now') - (int)$paid_registration_times['level']) / 86400) : 0)));
600
 
601
  /**
602
  * The number of days the current User has had an account, period.
1076
  *
1077
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1078
  *
1079
+ * @see `Dashboard s2Member Download Options`
1080
  */
1081
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED'))
1082
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED', ($c[] = (int)$file_downloads['allowed']));
1131
  *
1132
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1133
  *
1134
+ * @see `Dashboard s2Member Download Options`
1135
  */
1136
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED'))
1137
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED', ($c[] = (($file_downloads['allowed'] >= 999999999) ? TRUE : FALSE)));
1177
  *
1178
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1179
  *
1180
+ * @see `Dashboard s2Member Download Options`
1181
  */
1182
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY'))
1183
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY', ($c[] = (int)$file_downloads['currently']));
1223
  *
1224
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1225
  *
1226
+ * @see `Dashboard s2Member Download Options`
1227
  */
1228
  if(!defined('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS'))
1229
  define ('S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS', ($c[] = (int)$file_downloads['allowed_days']));
1279
  *
1280
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1281
  *
1282
+ * @see `Dashboard s2Member Download Options`
1283
  */
1284
  if(!defined('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID'))
1285
  define ('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page']));
1320
  *
1321
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1322
  *
1323
+ * @see `Dashboard s2Member General Options Membership Options Page`
1324
  */
1325
  if(!defined('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_ID'))
1326
  define ('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_options_page']));
1361
  *
1362
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1363
  *
1364
+ * @see `Dashboard s2Member General Options Login Welcome Page`
1365
  */
1366
  if(!defined('S2MEMBER_LOGIN_WELCOME_PAGE_ID'))
1367
  define ('S2MEMBER_LOGIN_WELCOME_PAGE_ID', ($c[] = (int)$GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page']));
1401
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_ID
1402
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL
1403
  *
1404
+ * @see `Dashboard s2Member General Options Profile Modifications`
1405
  */
1406
  if(!defined('S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL'))
1407
  define ('S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL', ($c[] = (string)home_url('/?s2member_profile=1')));
1457
  *
1458
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1459
  *
1460
+ * @see `Dashboard s2Member Download Options`
1461
  */
1462
  if(!defined('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL'))
1463
  define ('S2MEMBER_FILE_DOWNLOAD_LIMIT_EXCEEDED_PAGE_URL', ($c[] = (string)$links['file_download_limit_exceeded_page']));
1498
  *
1499
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1500
  *
1501
+ * @see `Dashboard s2Member General Options Membership Options Page`
1502
  */
1503
  if(!defined('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_URL'))
1504
  define ('S2MEMBER_MEMBERSHIP_OPTIONS_PAGE_URL', ($c[] = (string)$links['membership_options_page'])); // Signup page.
1539
  *
1540
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL
1541
  *
1542
+ * @see `Dashboard s2Member General Options Login Welcome Page`
1543
  */
1544
  if(!defined('S2MEMBER_LOGIN_WELCOME_PAGE_URL'))
1545
  define ('S2MEMBER_LOGIN_WELCOME_PAGE_URL', ($c[] = (($login_redirection_url) ? (string)$login_redirection_url : (string)$links['login_welcome_page'])));
1664
  *
1665
  * @see http://codex.wordpress.org/Function_Reference/wp_get_current_user wp_get_current_user()
1666
  *
1667
+ * @see `Dashboard s2Member General Options Membership Level (Labels)`
1668
  */
1669
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1670
  {
1716
  *
1717
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1718
  *
1719
+ * @see `Dashboard s2Member Download Options`
1720
  */
1721
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1722
  {
1769
  *
1770
  * @see s2Member\API_Constants\S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS
1771
  *
1772
+ * @see `Dashboard s2Member Download Options`
1773
  */
1774
  for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
1775
  {
1813
  * @see s2Member\API_Constants\S2MEMBER_LEVELn_FILE_DOWNLOADS_ALLOWED
1814
  * @see s2Member\API_Constants\S2MEMBER_LEVELn_FILE_DOWNLOADS_ALLOWED_DAYS
1815
  *
1816
+ * @see `Dashboard s2Member Download Options`
1817
  */
1818
  if(!defined('S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS'))
1819
  define ('S2MEMBER_FILE_DOWNLOAD_INLINE_EXTENSIONS', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_inline_extensions']));
1841
  *
1842
  * @see s2Member\API_Constants\S2MEMBER_REG_EMAIL_FROM_EMAIL
1843
  *
1844
+ * @see `Dashboard s2Member General Options`
1845
  */
1846
  if(!defined('S2MEMBER_REG_EMAIL_FROM_NAME'))
1847
  define ('S2MEMBER_REG_EMAIL_FROM_NAME', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_name']));
1869
  *
1870
  * @see s2Member\API_Constants\S2MEMBER_REG_EMAIL_FROM_NAME
1871
  *
1872
+ * @see `Dashboard s2Member General Options`
1873
  */
1874
  if(!defined('S2MEMBER_REG_EMAIL_FROM_EMAIL'))
1875
  define ('S2MEMBER_REG_EMAIL_FROM_EMAIL', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_email']));
1898
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_RETURN_URL
1899
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN
1900
  *
1901
+ * @see `Dashboard s2Member PayPal Options IPN Integration`
1902
  */
1903
  if(!defined('S2MEMBER_PAYPAL_NOTIFY_URL'))
1904
  define ('S2MEMBER_PAYPAL_NOTIFY_URL', ($c[] = (string)home_url('/?s2member_paypal_notify=1')));
1927
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_NOTIFY_URL
1928
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN
1929
  *
1930
+ * @see `Dashboard s2Member PayPal Options Auto-Return/PDT Integration`
1931
  */
1932
  if(!defined('S2MEMBER_PAYPAL_RETURN_URL'))
1933
  define ('S2MEMBER_PAYPAL_RETURN_URL', ($c[] = (string)home_url('/?s2member_paypal_return=1')));
1957
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
1958
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
1959
  *
1960
+ * @see `Dashboard s2Member PayPal Options Account Details`
1961
  */
1962
  if(!defined('S2MEMBER_PAYPAL_BUSINESS'))
1963
  define ('S2MEMBER_PAYPAL_BUSINESS', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_business']));
1988
  *
1989
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_ENDPOINT
1990
  *
1991
+ * @see `Dashboard s2Member PayPal Options Account Details`
1992
  */
1993
  if(!defined('S2MEMBER_PAYPAL_ENDPOINT'))
1994
  define ('S2MEMBER_PAYPAL_ENDPOINT', ($c[] = (($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_sandbox']) ? 'www.sandbox.paypal.com' : 'www.paypal.com')));
2019
  *
2020
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_ENDPOINT
2021
  *
2022
+ * @see `Dashboard s2Member PayPal Options Account Details`
2023
  */
2024
  if(!defined('S2MEMBER_PAYPAL_API_ENDPOINT'))
2025
  define ('S2MEMBER_PAYPAL_API_ENDPOINT', ($c[] = (($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_sandbox']) ? 'api-3t.sandbox.paypal.com' : 'api-3t.paypal.com')));
2048
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
2049
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
2050
  *
2051
+ * @see `Dashboard s2Member PayPal Options Account Details`
2052
  */
2053
  if(!defined('S2MEMBER_PAYPAL_API_USERNAME'))
2054
  define ('S2MEMBER_PAYPAL_API_USERNAME', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username']));
2077
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_USERNAME
2078
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_SIGNATURE
2079
  *
2080
+ * @see `Dashboard s2Member PayPal Options Account Details`
2081
  */
2082
  if(!defined('S2MEMBER_PAYPAL_API_PASSWORD'))
2083
  define ('S2MEMBER_PAYPAL_API_PASSWORD', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password']));
2106
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_USERNAME
2107
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_API_PASSWORD
2108
  *
2109
+ * @see `Dashboard s2Member PayPal Options Account Details`
2110
  */
2111
  if(!defined('S2MEMBER_PAYPAL_API_SIGNATURE'))
2112
  define ('S2MEMBER_PAYPAL_API_SIGNATURE', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature']));
2134
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_RETURN_URL
2135
  * @see s2Member\API_Constants\S2MEMBER_PAYPAL_NOTIFY_URL
2136
  *
2137
+ * @see `Dashboard s2Member PayPal Options Auto-Return/PDT Integration`
2138
  */
2139
  if(!defined('S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN'))
2140
  define ('S2MEMBER_PAYPAL_PDT_IDENTITY_TOKEN', ($c[] = (string)$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_identity_token']));
2195
  *
2196
  * @see s2Member\API_Functions\s2member_value_for_pp_inv()
2197
  *
2198
+ * @see `Dashboard s2Member PayPal Buttons`
2199
  */
2200
  if(!defined('S2MEMBER_VALUE_FOR_PP_INV'))
2201
  define ('S2MEMBER_VALUE_FOR_PP_INV', uniqid().'~'.S2MEMBER_CURRENT_USER_IP);
2254
  *
2255
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0
2256
  *
2257
+ * @see `Dashboard s2Member PayPal Buttons`
2258
  */
2259
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0'))
2260
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0', ($c[] = ((S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID) ? 'Referencing Customer ID' : 'Originating Domain')));
2313
  *
2314
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0
2315
  *
2316
+ * @see `Dashboard s2Member PayPal Buttons`
2317
  */
2318
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0'))
2319
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0', ($c[] = ((S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID) ? S2MEMBER_CURRENT_USER_SUBSCR_OR_WP_ID : (string)@$_SERVER['HTTP_HOST'])));
2369
  *
2370
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1
2371
  *
2372
+ * @see `Dashboard s2Member PayPal Buttons`
2373
  */
2374
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1'))
2375
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1', ($c[] = 'Customer IP Address' /* Via $_SERVER['REMOTE_ADDR'] below. */));
2425
  *
2426
  * @see s2Member\API_Constants\S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON1
2427
  *
2428
+ * @see `Dashboard s2Member PayPal Buttons`
2429
  */
2430
  if(!defined('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1'))
2431
  define ('S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1', ($c[] = (string)@$_SERVER['REMOTE_ADDR']));
2452
  do_action('ws_plugin__s2member_after_constants', get_defined_vars());
2453
  }
2454
  }
2455
+ }
includes/classes/custom-reg-fields.inc.php CHANGED
@@ -830,10 +830,9 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
830
  if(isset($user_fields[$option_name]))
831
  return $user_fields[$option_name];
832
 
833
- if(stripos($option_name, 's2_') === 0)
834
- if(($real_name = preg_replace('/^s2_/i', '', $option_name)))
835
- if(isset($user_fields[$real_name]))
836
- return $user_fields[$real_name];
837
 
838
  return $what_wp_says;
839
  }
830
  if(isset($user_fields[$option_name]))
831
  return $user_fields[$option_name];
832
 
833
+ if(stripos($option_name, 's2_') === 0 && ($real_option_name = preg_replace('/^s2_/i', '', $option_name)))
834
+ if(isset($user_fields[$real_option_name]))
835
+ return $user_fields[$real_option_name];
 
836
 
837
  return $what_wp_says;
838
  }
includes/classes/database.inc.php CHANGED
@@ -48,4 +48,3 @@ if (!class_exists ("c_ws_plugin__s2member_database"))
48
  }
49
  }
50
  }
51
- ?>
48
  }
49
  }
50
  }
 
includes/classes/email-configs.inc.php CHANGED
@@ -398,4 +398,3 @@ if (!class_exists ("c_ws_plugin__s2member_email_configs"))
398
  }
399
  }
400
  }
401
- ?>
398
  }
399
  }
400
  }
 
includes/classes/files-in.inc.php CHANGED
@@ -141,7 +141,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
141
  status_header(503);
142
  header('Content-Type: text/html; charset=UTF-8');
143
  while(@ob_end_clean()) ; // Clean any existing output buffers.
144
- exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member General Options Membership Options Page</strong>.', 's2member-front', 's2member'));
145
  }
146
  return FALSE; // Else return false.
147
  }
@@ -152,7 +152,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
152
  status_header(503);
153
  header('Content-Type: text/html; charset=UTF-8');
154
  while(@ob_end_clean()) ; // Clean any existing output buffers.
155
- exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member Download Options Basic Download Restrictions</strong>.', 's2member-front', 's2member'));
156
  }
157
  return FALSE; // Else return false.
158
  }
@@ -510,7 +510,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
510
  *
511
  * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
512
  * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
513
- * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member Download Options JW Player & RTMP Protocol Examples`.
514
  *
515
  * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
516
  *
141
  status_header(503);
142
  header('Content-Type: text/html; charset=UTF-8');
143
  while(@ob_end_clean()) ; // Clean any existing output buffers.
144
+ exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member General Options Membership Options Page</strong>.', 's2member-front', 's2member'));
145
  }
146
  return FALSE; // Else return false.
147
  }
152
  status_header(503);
153
  header('Content-Type: text/html; charset=UTF-8');
154
  while(@ob_end_clean()) ; // Clean any existing output buffers.
155
+ exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member Download Options Basic Download Restrictions</strong>.', 's2member-front', 's2member'));
156
  }
157
  return FALSE; // Else return false.
158
  }
510
  *
511
  * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
512
  * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
513
+ * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member Download Options JW Player & RTMP Protocol Examples`.
514
  *
515
  * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
516
  *
includes/classes/files.inc.php CHANGED
@@ -57,7 +57,7 @@ if(!class_exists('c_ws_plugin__s2member_files'))
57
  *
58
  * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
59
  * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
60
- * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member Download Options JW Player & RTMP Protocol Examples`.
61
  *
62
  * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
63
  *
57
  *
58
  * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
59
  * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
60
+ * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member Download Options JW Player & RTMP Protocol Examples`.
61
  *
62
  * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
63
  *
includes/classes/installation.inc.php CHANGED
@@ -92,17 +92,17 @@ if(!class_exists('c_ws_plugin__s2member_installation'))
92
  if(!$v || !version_compare($v, '110912', '>=') && $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'] === array('all'))
93
  // s2Member v110912 changed the way the 'all' option for Alternative Views was handled.
94
  {
95
- $notice = '<strong>IMPORTANT:</strong> This version of s2Member changes the way your <code>Alternative View Protections</code> work. Please review your options under: <strong>s2Member Restriction Options Alternative View Protections</strong>.';
96
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
97
  }
98
  if($v && version_compare($v, '130316', '<=')) // This version disables logging by default.
99
  {
100
  c_ws_plugin__s2member_menu_pages::update_all_options(array('ws_plugin__s2member_gateway_debug_logs' => '0', 'ws_plugin__s2member_gateway_debug_logs_extensive' => '0'), TRUE, FALSE, FALSE, FALSE, FALSE);
101
 
102
- $notice = '<strong>IMPORTANT:</strong> This version of s2Member disables s2Member\'s debug logging by default (for added security). Please see: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member Log Files (Debug) Configuration</a> for further details.';
103
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
104
 
105
- $notice = '<strong>IMPORTANT / Regarding s2Member Security Badges:</strong> If debug logging is enabled, your site will no longer qualify for an s2Member Security Badge until you disable logging (and you must also download, and then delete any existing log files from the past). Please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a> for further details. If you have existing s2Member log files, you will need to delete those files from the server before your s2Member Security Badge can be re-enabled. s2Member stores log files here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])).'</code>. See also: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member Log Files (Debug) Configuration</a> for further details.';
106
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
107
  }
108
  if($v && version_compare($v, '140128', '<=')) // This version introduces support for partial refunds.
@@ -136,7 +136,7 @@ if(!class_exists('c_ws_plugin__s2member_installation'))
136
  $notice = '<strong>Multisite Network</strong> updated automatically by <strong>s2Member</strong> v'.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'.<br />';
137
  $notice .= 'You\'ll want to configure s2Member\'s Multisite options now.<br />';
138
  $notice .= 'In the Dashboard for your Main Site, see:<br />';
139
- $notice .= '<strong>s2Member Multisite (Config)</strong>.';
140
 
141
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
142
 
@@ -229,5 +229,22 @@ if(!class_exists('c_ws_plugin__s2member_installation'))
229
  }
230
  do_action('ws_plugin__s2member_after_uninstall', get_defined_vars());
231
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  }
233
- }
92
  if(!$v || !version_compare($v, '110912', '>=') && $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'] === array('all'))
93
  // s2Member v110912 changed the way the 'all' option for Alternative Views was handled.
94
  {
95
+ $notice = '<strong>IMPORTANT:</strong> This version of s2Member changes the way your <code>Alternative View Protections</code> work. Please review your options under: <strong>s2Member Restriction Options Alternative View Protections</strong>.';
96
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
97
  }
98
  if($v && version_compare($v, '130316', '<=')) // This version disables logging by default.
99
  {
100
  c_ws_plugin__s2member_menu_pages::update_all_options(array('ws_plugin__s2member_gateway_debug_logs' => '0', 'ws_plugin__s2member_gateway_debug_logs_extensive' => '0'), TRUE, FALSE, FALSE, FALSE, FALSE);
101
 
102
+ $notice = '<strong>IMPORTANT:</strong> This version of s2Member disables s2Member\'s debug logging by default (for added security). Please see: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member Log Files (Debug) Configuration</a> for further details.';
103
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
104
 
105
+ $notice = '<strong>IMPORTANT / Regarding s2Member Security Badges:</strong> If debug logging is enabled, your site will no longer qualify for an s2Member Security Badge until you disable logging (and you must also download, and then delete any existing log files from the past). Please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a> for further details. If you have existing s2Member log files, you will need to delete those files from the server before your s2Member Security Badge can be re-enabled. s2Member stores log files here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])).'</code>. See also: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member Log Files (Debug) Configuration</a> for further details.';
106
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
107
  }
108
  if($v && version_compare($v, '140128', '<=')) // This version introduces support for partial refunds.
136
  $notice = '<strong>Multisite Network</strong> updated automatically by <strong>s2Member</strong> v'.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'.<br />';
137
  $notice .= 'You\'ll want to configure s2Member\'s Multisite options now.<br />';
138
  $notice .= 'In the Dashboard for your Main Site, see:<br />';
139
+ $notice .= '<strong>s2Member Multisite (Config)</strong>.';
140
 
141
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
142
 
229
  }
230
  do_action('ws_plugin__s2member_after_uninstall', get_defined_vars());
231
  }
232
+
233
+ /**
234
+ * Disallow automatic updates of s2Member w/ Pro is installed.
235
+ *
236
+ * @package s2Member\Installation
237
+ * @since 150717
238
+ *
239
+ * @attaches-to `auto_update_plugin` filter.
240
+ */
241
+ public static function auto_update_filter($update = NULL, $item = NULL)
242
+ {
243
+ if(is_object($item) && !empty($item->slug) && $item->slug === 's2member')
244
+ if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
245
+ $update = FALSE; // Disallow.
246
+
247
+ return $update; // Filter through.
248
+ }
249
  }
250
+ }
includes/classes/labels.inc.php CHANGED
@@ -78,4 +78,3 @@ if (!class_exists ("c_ws_plugin__s2member_labels"))
78
  }
79
  }
80
  }
81
- ?>
78
  }
79
  }
80
  }
 
includes/classes/list-servers.inc.php CHANGED
@@ -56,6 +56,9 @@ if(!class_exists('c_ws_plugin__s2member_list_servers'))
56
  do_action('ws_plugin__s2member_before_process_list_servers', get_defined_vars());
57
  unset($__refs, $__v); // Allows vars to be modified by reference.
58
 
 
 
 
59
  if(c_ws_plugin__s2member_list_servers::list_servers_integrated())
60
  {
61
  $args = get_defined_vars(); // Function args.
@@ -89,6 +92,13 @@ if(!class_exists('c_ws_plugin__s2member_list_servers'))
89
  */
90
  public static function process_list_servers_against_current_user($opt_in = FALSE, $double_opt_in = TRUE, $clean_user_cache = TRUE)
91
  {
 
 
 
 
 
 
 
92
  if($clean_user_cache) // Start from a fresh user object here?
93
  {
94
  clean_user_cache(get_current_user_id());
@@ -172,6 +182,10 @@ if(!class_exists('c_ws_plugin__s2member_list_servers'))
172
  */
173
  public static function process_list_server_removals_against_current_user($opt_out = FALSE, $clean_user_cache = TRUE)
174
  {
 
 
 
 
175
  if($clean_user_cache) // Start from a fresh user object here?
176
  {
177
  clean_user_cache(get_current_user_id());
@@ -298,4 +312,4 @@ if(!class_exists('c_ws_plugin__s2member_list_servers'))
298
  return apply_filters('ws_plugin__s2member_list_servers_integrated', FALSE, get_defined_vars());
299
  }
300
  }
301
- }
56
  do_action('ws_plugin__s2member_before_process_list_servers', get_defined_vars());
57
  unset($__refs, $__v); // Allows vars to be modified by reference.
58
 
59
+ if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'])
60
+ $opt_in = true; // Accept as true; the double opt-in box is null.
61
+
62
  if(c_ws_plugin__s2member_list_servers::list_servers_integrated())
63
  {
64
  $args = get_defined_vars(); // Function args.
92
  */
93
  public static function process_list_servers_against_current_user($opt_in = FALSE, $double_opt_in = TRUE, $clean_user_cache = TRUE)
94
  {
95
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
96
+ do_action('ws_plugin__s2member_before_process_list_servers_against_current_user', get_defined_vars());
97
+ unset($__refs, $__v); // Allows vars to be modified by reference.
98
+
99
+ if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'])
100
+ $opt_in = true; // Accept as true; the double opt-in box is null.
101
+
102
  if($clean_user_cache) // Start from a fresh user object here?
103
  {
104
  clean_user_cache(get_current_user_id());
182
  */
183
  public static function process_list_server_removals_against_current_user($opt_out = FALSE, $clean_user_cache = TRUE)
184
  {
185
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
186
+ do_action('ws_plugin__s2member_before_process_list_server_removals_against_current_user', get_defined_vars());
187
+ unset($__refs, $__v); // Allows vars to be modified by reference.
188
+
189
  if($clean_user_cache) // Start from a fresh user object here?
190
  {
191
  clean_user_cache(get_current_user_id());
312
  return apply_filters('ws_plugin__s2member_list_servers_integrated', FALSE, get_defined_vars());
313
  }
314
  }
315
+ }
includes/classes/login-customizations.inc.php CHANGED
@@ -131,8 +131,9 @@ if(!class_exists('c_ws_plugin__s2member_login_customizations'))
131
  $a[] = 'div#login form input[type="submit"]:hover, div#login form input[type="submit"]:active, div#login form input[type="submit"]:focus { color:#000000'.$i.'; text-shadow:2px 2px 5px #CCCCCC'.$i.'; border-color:#000000'.$i.'; }';
132
  $a[] = 'div#login form#registerform p.submit { float:none'.$i.'; margin-top:-10px'.$i.'; } div#login form#registerform input[type="submit"] { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; }';
133
  $a[] = 'div#login form#lostpasswordform p.submit { float:none'.$i.'; } div#login form#lostpasswordform input[type="submit"] { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; }';
 
134
 
135
- $a[] = 'div.ws-plugin--s2member-password-strength { margin-top:3px'.$i.'; font-color:#000000'.$i.'; background-color:#EEEEEE'.$i.'; padding:3px'.$i.'; border-radius:3px'.$i.'; } div.ws-plugin--s2member-password-strength-short { background-color:#FFA0A0'.$i.'; } div.ws-plugin--s2member-password-strength-bad { background-color:#FFB78C'.$i.'; } div.ws-plugin--s2member-password-strength-good { background-color:#FFEC8B'.$i.'; } div.ws-plugin--s2member-password-strength-strong { background-color:#C3FF88'.$i.'; } div.ws-plugin--s2member-password-strength-mismatch { background-color:#D6C1AB'.$i.'; }';
136
 
137
  $a[] = 'div#login form#registerform p#reg_passmail { font-style:italic'.$i.'; }';
138
 
@@ -221,4 +222,4 @@ if(!class_exists('c_ws_plugin__s2member_login_customizations'))
221
  return apply_filters('ws_plugin__s2member_lost_password_url', $lostpassword_url, $redirect, get_defined_vars());
222
  }
223
  }
224
- }
131
  $a[] = 'div#login form input[type="submit"]:hover, div#login form input[type="submit"]:active, div#login form input[type="submit"]:focus { color:#000000'.$i.'; text-shadow:2px 2px 5px #CCCCCC'.$i.'; border-color:#000000'.$i.'; }';
132
  $a[] = 'div#login form#registerform p.submit { float:none'.$i.'; margin-top:-10px'.$i.'; } div#login form#registerform input[type="submit"] { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; }';
133
  $a[] = 'div#login form#lostpasswordform p.submit { float:none'.$i.'; } div#login form#lostpasswordform input[type="submit"] { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; }';
134
+ $a[] = 'div#login form#resetpassform #pass-strength-result { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; } div#login form#resetpassform p.submit { float:none'.$i.'; } div#login form#resetpassform input[type="submit"] { float:none'.$i.'; width:100%'.$i.'; box-sizing:border-box'.$i.'; }';
135
 
136
+ $a[] = 'div.ws-plugin--s2member-password-strength { margin-top:3px'.$i.'; font-color:#000000'.$i.'; background-color:#EEEEEE'.$i.'; padding:3px'.$i.'; border-radius:3px'.$i.'; } div.ws-plugin--s2member-password-strength-short { background-color:#FFA0A0'.$i.'; } div.ws-plugin--s2member-password-strength-weak { background-color:#FFB78C'.$i.'; } div.ws-plugin--s2member-password-strength-good { background-color:#FFEC8B'.$i.'; } div.ws-plugin--s2member-password-strength-strong { background-color:#C3FF88'.$i.'; } div.ws-plugin--s2member-password-strength-mismatch { background-color:#D6C1AB'.$i.'; }';
137
 
138
  $a[] = 'div#login form#registerform p#reg_passmail { font-style:italic'.$i.'; }';
139
 
222
  return apply_filters('ws_plugin__s2member_lost_password_url', $lostpassword_url, $redirect, get_defined_vars());
223
  }
224
  }
225
+ }
includes/classes/login-redirects-r.inc.php CHANGED
@@ -15,9 +15,9 @@
15
  * @since 3.5
16
  */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
- exit("Do not access this file directly.");
19
 
20
- if (!class_exists ("c_ws_plugin__s2member_login_redirects_r"))
21
  {
22
  /**
23
  * Login redirect removals.
@@ -30,68 +30,70 @@ if (!class_exists ("c_ws_plugin__s2member_login_redirects_r"))
30
  /**
31
  * Handles completely empty ``login_redirect`` values.
32
  *
33
- * @attaches-to ``add_filter("login_redirect");``
34
  *
35
  * @package s2Member\Login_Redirects
36
  * @since 110926
37
  *
38
- * @param string $redirect_to Expects the current ``$redirect_to`` value, passed in by the Filter.
39
  * @return string A non-empty string value. s2Member will NEVER allow this to be completely empty.
40
  */
41
- public static function _empty_login_redirect_filter ($redirect_to)
42
  {
43
- return (!$redirect_to) ? admin_url () : $redirect_to;
44
  }
 
45
  /**
46
  * Handles HTTP/HTTPS ``login_redirect`` values.
47
  *
48
- * @attaches-to ``add_filter("login_redirect");``
49
  *
50
  * @package s2Member\Login_Redirects
51
  * @since 130819
52
  *
53
- * @param string $redirect_to Expects the current ``$redirect_to`` value, passed in by the Filter.
54
  * @return string Updated `redirect_to` value.
55
  */
56
- public static function _http_login_redirect_filter ($redirect_to)
57
  {
58
- if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_always_http"])
59
- if($redirect_to && is_string ($redirect_to) && strpos($redirect_to, "wp-admin") === FALSE)
 
 
60
  {
61
- $redirect_to = preg_replace("/^https\:\/\//i", "http://", $redirect_to);
62
- if(stripos($redirect_to, "http://") !== 0) // Force absolute.
63
  {
64
- $home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
65
- $http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/', '', home_url('/', 'http')), '/');
66
- $redirect_to = $http_home_base.'/'.ltrim($redirect_to, '/');
 
67
  }
68
  }
69
  return $redirect_to;
70
  }
 
71
  /**
72
  * Removes all other ``login_redirect`` Filters to prevent conflicts with s2Member.
73
  *
74
- * @attaches-to ``add_action("init");``
75
  *
76
  * @package s2Member\Login_Redirects
77
  * @since 3.5
78
  */
79
- public static function remove_login_redirect_filters ()
80
  {
81
- do_action("ws_plugin__s2member_before_remove_login_redirect_filters", get_defined_vars ());
82
 
83
- if (!apply_filters("ws_plugin__s2member_allow_other_login_redirect_filters", false, get_defined_vars ()))
84
  {
85
- remove_all_filters /* Removes all `login_redirect` Filters. */("login_redirect");
86
- add_filter ("login_redirect", "c_ws_plugin__s2member_login_redirects_r::_empty_login_redirect_filter");
87
- add_filter ("login_redirect", "c_ws_plugin__s2member_login_redirects_r::_http_login_redirect_filter");
88
-
89
- do_action("ws_plugin__s2member_during_remove_login_redirect_filters", get_defined_vars ());
90
  }
91
- do_action("ws_plugin__s2member_after_remove_login_redirect_filters", get_defined_vars ());
 
92
 
93
- return /* Return for uniformity. */;
94
  }
95
  }
96
  }
97
- ?>
15
  * @since 3.5
16
  */
17
  if(!defined('WPINC')) // MUST have WordPress.
18
+ exit('Do not access this file directly.');
19
 
20
+ if (!class_exists ('c_ws_plugin__s2member_login_redirects_r'))
21
  {
22
  /**
23
  * Login redirect removals.
30
  /**
31
  * Handles completely empty ``login_redirect`` values.
32
  *
33
+ * @attaches-to ``add_filter('login_redirect');``
34
  *
35
  * @package s2Member\Login_Redirects
36
  * @since 110926
37
  *
38
+ * @param string $redirect_to Expects the current ``$redirect_to`` passed in by the Filter.
39
  * @return string A non-empty string value. s2Member will NEVER allow this to be completely empty.
40
  */
41
+ public static function _empty_login_redirect_filter($redirect_to)
42
  {
43
+ return $redirect_to ? $redirect_to : admin_url ();
44
  }
45
+
46
  /**
47
  * Handles HTTP/HTTPS ``login_redirect`` values.
48
  *
49
+ * @attaches-to ``add_filter('login_redirect');``
50
  *
51
  * @package s2Member\Login_Redirects
52
  * @since 130819
53
  *
54
+ * @param string $redirect_to Expects the current ``$redirect_to`` passed in by the Filter.
55
  * @return string Updated `redirect_to` value.
56
  */
57
+