Version Description
= v150722 =
(Maintenance Release) Upgrade immediately.
Download this release
Release Info
Developer | JasWSInc |
Plugin | s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) |
Version | 150722 |
Comparing to | |
See all releases |
Code changes from version 150311 to 150722
- changelog.md +176 -77
- checksum.txt +1 -1
- includes/classes/admin-lockouts.inc.php +1 -1
- includes/classes/admin-notices.inc.php +11 -8
- includes/classes/auto-eots.inc.php +24 -19
- includes/classes/aweber.inc.php +4 -1
- includes/classes/cache.inc.php +0 -1
- includes/classes/constants.inc.php +35 -35
- includes/classes/custom-reg-fields.inc.php +3 -4
- includes/classes/database.inc.php +0 -1
- includes/classes/email-configs.inc.php +0 -1
- includes/classes/files-in.inc.php +3 -3
- includes/classes/files.inc.php +1 -1
- includes/classes/installation.inc.php +22 -5
- includes/classes/labels.inc.php +0 -1
- includes/classes/list-servers.inc.php +15 -1
- includes/classes/login-customizations.inc.php +3 -2
- includes/classes/login-redirects-r.inc.php +30 -28
- includes/classes/login-redirects.inc.php +35 -20
- includes/classes/menu-pages-rs.inc.php +0 -1
- includes/classes/menu-pages.inc.php +11 -11
- includes/classes/meta-box-saves.inc.php +0 -1
- includes/classes/meta-box-security.inc.php +4 -5
- includes/classes/meta-boxes.inc.php +0 -1
- includes/classes/mms-patches.inc.php +0 -1
- includes/classes/mo-page-in.inc.php +10 -1
- includes/classes/mo-page.inc.php +0 -1
- includes/classes/op-notices.inc.php +2 -3
- includes/classes/option-forces.inc.php +0 -1
- includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php +19 -15
- includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php +2 -2
- includes/classes/paypal-return-in.inc.php +2 -2
- includes/classes/paypal-utilities.inc.php +2 -3
- includes/classes/profile-mods-4bp-in.inc.php +2 -2
- includes/classes/profile-mods-in.inc.php +2 -2
- includes/classes/register-in.inc.php +0 -1
- includes/classes/register.inc.php +0 -1
- includes/classes/registrations.inc.php +3 -3
- includes/classes/s-badge-status-in.inc.php +0 -1
- includes/classes/s-badge-status.inc.php +0 -1
- includes/classes/sc-eots-in.inc.php +169 -0
- includes/classes/sc-eots.inc.php +49 -0
- includes/classes/sc-files.inc.php +0 -1
- includes/classes/sc-gets-in.inc.php +46 -6
- includes/classes/sc-gets.inc.php +1 -1
- includes/classes/sc-if-conds-in.inc.php +3 -1
- includes/classes/sc-paypal-button-e.inc.php +0 -1
- includes/classes/sc-paypal-button-in.inc.php +0 -1
- includes/classes/sc-paypal-button.inc.php +0 -1
- includes/classes/sc-profile-in.inc.php +2 -2
- includes/classes/sc-profile.inc.php +0 -1
- includes/classes/sc-s-badge-in.inc.php +48 -50
- includes/classes/sc-s-badge.inc.php +42 -42
- includes/classes/sp-access.inc.php +0 -1
- includes/classes/ssl-in.inc.php +2 -2
- includes/classes/user-deletions.inc.php +3 -2
- includes/classes/user-new-in.inc.php +1 -2
- includes/classes/user-new.inc.php +0 -1
- includes/classes/user-notes.inc.php +0 -1
- includes/classes/user-securities.inc.php +108 -2
- includes/classes/users-list-in.inc.php +5 -5
- includes/classes/utilities.inc.php +35 -3
- includes/classes/utils-arrays.inc.php +0 -1
- includes/classes/utils-captchas.inc.php +81 -19
- includes/classes/utils-css.inc.php +0 -1
- includes/classes/utils-cur.inc.php +13 -7
- includes/classes/utils-dirs.inc.php +0 -1
- includes/classes/utils-forms.inc.php +1 -2
- includes/classes/utils-html.inc.php +0 -1
- includes/classes/utils-time.inc.php +28 -24
- includes/classes/utils-urls.inc.php +157 -124
- includes/classes/utils-users.inc.php +340 -19
- includes/classes/wp-footer.inc.php +47 -50
- includes/codes.inc.php +2 -1
- includes/externals/aweber/aweber.php +0 -2
- includes/externals/aweber/aweber_entry_data_array.php +0 -4
- includes/externals/aweber/curl_object.php +20 -22
- includes/externals/aweber/oauth_adapter.php +0 -3
- includes/externals/aweber/oauth_application.php +4 -6
- includes/externals/mailchimp/Mailchimp-o.php +0 -1
- includes/externals/mailchimp/Mailchimp/Campaigns.php +2 -4
- includes/externals/mailchimp/Mailchimp/Lists.php +1 -1
- includes/externals/markdown/nc-markdown.inc.php +0 -1
- includes/functions/api-functions.inc.php +58 -22
- includes/functions/deprecated.inc.php +1 -2
- includes/functions/pluggables.inc.php +0 -1
- includes/hooks.inc.php +2 -1
- includes/menu-pages/api-ops.inc.php +6 -6
- includes/menu-pages/code-samples/api-mop-vars-ro.x-php +1 -1
- includes/menu-pages/code-samples/current-user-access-label.x-php +1 -1
- includes/menu-pages/code-samples/current-user-access-level.x-php +1 -1
- includes/menu-pages/code-samples/current-user-can-constants-2.x-php +1 -1
- includes/menu-pages/code-samples/current-user-can-full-access.x-php +1 -1
- includes/menu-pages/code-samples/current-user-custom.x-php +1 -1
- includes/menu-pages/code-samples/current-user-downloads-allowed-is-unlimited.x-php +1 -1
- includes/menu-pages/code-samples/current-user-email.x-php +1 -1
- includes/menu-pages/code-samples/current-user-fields.x-php +1 -1
- includes/menu-pages/code-samples/current-user-paid-registration-days-dripping.x-php +1 -1
- includes/menu-pages/code-samples/current-user-paid-registration-days.x-php +1 -1
- includes/menu-pages/code-samples/current-user-registration-days.x-php +1 -1
- includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php +1 -1
- includes/menu-pages/code-samples/sc-s2-conditional-supplements-1-farm.x-php +1 -1
- includes/menu-pages/code-samples/sc-s2-conditional-supplements-1.x-php +1 -1
- includes/menu-pages/down-ops.inc.php +27 -27
- includes/menu-pages/els-ops.inc.php +10 -10
- includes/menu-pages/gen-ops.inc.php +43 -35
- includes/menu-pages/integrations.inc.php +1 -1
- includes/menu-pages/menu-pages-s-min.js +1 -1
- includes/menu-pages/menu-pages-s.js +6 -3
- includes/menu-pages/menu-pages.css +9 -1
- includes/menu-pages/mms-ops.inc.php +1 -2
- includes/menu-pages/paypal-buttons.inc.php +27 -28
- includes/menu-pages/paypal-ops.inc.php +27 -27
- includes/menu-pages/res-ops.inc.php +5 -5
- includes/menu-pages/scripting.inc.php +22 -23
- includes/menu-pages/start.inc.php +15 -16
- includes/menu-pages/trk-ops.inc.php +21 -21
- includes/s2member-min.js +1 -1
- includes/s2member.css +2 -2
- includes/s2member.js +247 -216
- includes/syscon.inc.php +22 -10
- includes/templates/badges/s-badge.php +1 -19
- includes/templates/buttons/paypal-cancellation-button.php +1 -1
- includes/templates/buttons/paypal-ccaps-checkout-button.php +1 -1
- includes/templates/buttons/paypal-checkout-button.php +1 -1
- includes/templates/buttons/paypal-sp-checkout-button.php +1 -1
- includes/templates/cfg-files/s2-cross-xml.php +1 -1
- includes/templates/cfg-files/s2member-files-no-gzip.php +1 -1
- includes/templates/cfg-files/s2member-files.php +1 -1
- includes/templates/cfg-files/s2member-logs.php +1 -1
- includes/templates/cfg-files/s2o-mu-plugins.php +1 -1
- includes/templates/cfg-files/s2o-nw-plugins.php +1 -1
- includes/templates/cfg-files/s2o-st-plugins.php +1 -1
- includes/templates/cfg-files/s2o-th-funcs.php +1 -1
- includes/templates/errors/ip-restrictions.php +1 -1
- includes/templates/options/paypal-currencies.php +1 -1
- includes/templates/options/paypal-membership-ccap-terms.php +1 -1
- includes/templates/options/paypal-membership-regular-terms.php +1 -1
- includes/templates/options/paypal-membership-trial-terms.php +1 -1
- includes/templates/options/paypal-sp-hours.php +1 -1
- includes/templates/players/jwplayer-v6-rtmp-only.php +1 -1
- includes/templates/players/jwplayer-v6-rtmp.php +1 -1
- includes/templates/players/jwplayer-v6.php +1 -1
- includes/templates/returns/default-return.php +1 -1
- includes/templates/shortcodes/paypal-cancellation-button-shortcode.php +1 -1
- includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php +1 -1
- includes/templates/shortcodes/paypal-checkout-button-shortcode.php +1 -1
- includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php +1 -1
- 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
|
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:
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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®
|
355 |
-
* (s2Member/s2Member Pro) **Login/Registration Design Option (#437)** Adding a new option in the `s2Member®
|
356 |
-
* (s2Member/s2Member Pro) **Videos (#467)** Updating internal documentation found in `Dashboard
|
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®
|
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®
|
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®
|
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®
|
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®
|
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®
|
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
|
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
|
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
|
408 |
-
* (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard
|
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
|
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
|
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®
|
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
|
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®
|
467 |
-
* (s2Member/s2Member Pro) **Feature Enhancement/EOTs (#29)** Adding UI option for EOT Grace Time. For further details, please see: `Dashboard
|
468 |
-
* (s2Member/s2Member Pro) **Feature Enhancement/EOTs** Adding UI option for EOT Custom Capability Removal. For further details, please see: `Dashboard
|
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
|
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®
|
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
|
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
|
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
|
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®
|
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
|
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
|
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®
|
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®
|
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
|
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®
|
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®
|
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 |
-
|
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($
|
|
|
|
|
|
|
79 |
{
|
80 |
-
$
|
81 |
-
|
82 |
-
echo '<div class="error fade"><p>'.$notice.'</p></div>';
|
83 |
}
|
84 |
else if($notice && is_string($notice))
|
85 |
{
|
86 |
-
$
|
87 |
-
|
88 |
-
echo '<div class="updated fade"><p>'.$notice.'</p></div>';
|
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 |
-
|
|
|
|
|
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
|
135 |
-
$subscr_gateway
|
136 |
-
$subscr_id
|
137 |
-
$subscr_baid
|
138 |
-
$subscr_cid
|
139 |
-
$fields
|
140 |
-
$user_reg_ip
|
|
|
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
|
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 |
-
|
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.'
|
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
|
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)
|
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)
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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(($
|
835 |
-
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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-
|
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(
|
19 |
|
20 |
-
if (!class_exists (
|
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(
|
34 |
*
|
35 |
* @package s2Member\Login_Redirects
|
36 |
* @since 110926
|
37 |
*
|
38 |
-
* @param string $redirect_to Expects the current ``$redirect_to``
|
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
|
42 |
{
|
43 |
-
return
|
44 |
}
|
|
|
45 |
/**
|
46 |
* Handles HTTP/HTTPS ``login_redirect`` values.
|
47 |
*
|
48 |
-
* @attaches-to ``add_filter(
|
49 |
*
|
50 |
* @package s2Member\Login_Redirects
|
51 |
* @since 130819
|
52 |
*
|
53 |
-
* @param string $redirect_to Expects the current ``$redirect_to``
|
54 |
* @return string Updated `redirect_to` value.
|
55 |
*/
|
56 |
-
public static function _http_login_redirect_filter
|
57 |
{
|
58 |
-
|
59 |
-
|
|
|
|
|
60 |
{
|
61 |
-
$redirect_to = preg_replace(
|
62 |
-
if(stripos($redirect_to,
|
63 |
{
|
64 |
-
$
|
65 |
-
$
|
66 |
-
$
|
|
|
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(
|
75 |
*
|
76 |
* @package s2Member\Login_Redirects
|
77 |
* @since 3.5
|
78 |
*/
|
79 |
-
public static function remove_login_redirect_filters
|
80 |
{
|
81 |
-
do_action(
|
82 |
|
83 |
-
if (!apply_filters(
|
84 |
{
|
85 |
-
remove_all_filters
|
86 |
-
|
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 |
-
|
|
|
92 |
|
93 |
-
|
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 |
+
public static function _http_login_redirect_filter($redirect_to)
|
58 |
{
|
59 |
+
$ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
|
60 |
+
|
61 |
+
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_redirection_always_http'])
|
62 |
+
if($redirect_to && is_string($redirect_to) && strpos($redirect_to, 'wp-admin') === FALSE)
|
63 |
{
|
64 |
+
$redirect_to = preg_replace('/^https\:\/\//i', 'http://', $redirect_to);
|
65 |
+
if(stripos($redirect_to, 'http://') !== 0) // Force full URL.
|
66 |
{
|
67 |
+
$redirect_uri = $redirect_to; // e.g., `/path/with/?query=args`
|
68 |
+
$home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
|
69 |
+
$http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/'.$ci, '', home_url('/', 'http')), '/');
|
70 |
+
$redirect_to = $http_home_base.'/'.ltrim($redirect_uri, '/');
|
71 |
}
|
72 |
}
|
73 |
return $redirect_to;
|
74 |
}
|
75 |
+
|
76 |
/**
|
77 |
* Removes all other ``login_redirect`` Filters to prevent conflicts with s2Member.
|
78 |
*
|
79 |
+
* @attaches-to ``add_action('init');``
|
80 |
*
|
81 |
* @package s2Member\Login_Redirects
|
82 |
* @since 3.5
|
83 |
*/
|
84 |
+
public static function remove_login_redirect_filters()
|
85 |
{
|
86 |
+
do_action('ws_plugin__s2member_before_remove_login_redirect_filters', get_defined_vars ());
|
87 |
|
88 |
+
if (!apply_filters('ws_plugin__s2member_allow_other_login_redirect_filters', false, get_defined_vars ()))
|
89 |
{
|
90 |
+
remove_all_filters('login_redirect'); // Remove all others.
|
91 |
+
do_action('ws_plugin__s2member_during_remove_login_redirect_filters', get_defined_vars ());
|
|
|
|
|
|
|
92 |
}
|
93 |
+
add_filter('login_redirect', 'c_ws_plugin__s2member_login_redirects_r::_empty_login_redirect_filter');
|
94 |
+
add_filter('login_redirect', 'c_ws_plugin__s2member_login_redirects_r::_http_login_redirect_filter');
|
95 |
|
96 |
+
do_action('ws_plugin__s2member_after_remove_login_redirect_filters', get_defined_vars ());
|
97 |
}
|
98 |
}
|
99 |
}
|
|
includes/classes/login-redirects.inc.php
CHANGED
@@ -52,17 +52,20 @@ if(!class_exists('c_ws_plugin__s2member_login_redirects'))
|
|
52 |
{
|
53 |
update_user_option($user_id, 's2member_last_login_time', time());
|
54 |
|
|
|
|
|
|
|
55 |
if(!get_user_option('s2member_registration_ip', $user_id))
|
56 |
update_user_option($user_id, 's2member_registration_ip', $_SERVER['REMOTE_ADDR']);
|
57 |
|
58 |
-
if(($logins = (int)get_user_option('s2member_login_counter', $user_id) + 1) >= 1 || ($logins = 1))
|
59 |
-
update_user_option($user_id, 's2member_login_counter', $logins);
|
60 |
-
|
61 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password'])
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
|
|
66 |
) $ok = c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok($_SERVER['REMOTE_ADDR'], strtolower($username));
|
67 |
|
68 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_redirection_always_http']) // Alter value of `redirect_to`?
|
@@ -71,12 +74,13 @@ if(!class_exists('c_ws_plugin__s2member_login_redirects'))
|
|
71 |
$_REQUEST['redirect_to'] = preg_replace('/^https\:\/\//i', 'http://', $_REQUEST['redirect_to']);
|
72 |
if(stripos($_REQUEST['redirect_to'], 'http://') !== 0) // Force an absolute URL in this case.
|
73 |
{
|
|
|
74 |
$home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
|
75 |
$http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/'.$ci, '', home_url('/', 'http')), '/');
|
76 |
-
$_REQUEST['redirect_to'] = $http_home_base.'/'.ltrim($
|
77 |
}
|
78 |
}
|
79 |
-
if(($redirect = apply_filters('ws_plugin__s2member_login_redirect',
|
80 |
{
|
81 |
$obey_redirect_to = apply_filters('ws_plugin__s2member_obey_login_redirect_to', TRUE, get_defined_vars());
|
82 |
|
@@ -93,15 +97,21 @@ if(!class_exists('c_ws_plugin__s2member_login_redirects'))
|
|
93 |
do_action('ws_plugin__s2member_during_login_redirect', get_defined_vars());
|
94 |
unset($__refs, $__v); // Housekeeping.
|
95 |
|
96 |
-
|
97 |
|
98 |
-
|
99 |
-
$redirect = $
|
100 |
|
|
|
|
|
|
|
|
|
|
|
101 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'])
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
105 |
else $redirect = home_url('/'); // Default to the home page.
|
106 |
|
107 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_redirection_always_http'])
|
@@ -109,12 +119,17 @@ if(!class_exists('c_ws_plugin__s2member_login_redirects'))
|
|
109 |
$redirect = preg_replace('/^https\:\/\//i', 'http://', $redirect);
|
110 |
if(stripos($redirect, 'http://') !== 0) // Force absolute.
|
111 |
{
|
112 |
-
$
|
113 |
-
$
|
114 |
-
$
|
|
|
115 |
}
|
116 |
}
|
117 |
-
|
|
|
|
|
|
|
|
|
118 |
}
|
119 |
}
|
120 |
}
|
@@ -217,4 +232,4 @@ if(!class_exists('c_ws_plugin__s2member_login_redirects'))
|
|
217 |
return apply_filters('ws_plugin__s2member_fill_login_redirect_rc_vars', $url, get_defined_vars());
|
218 |
}
|
219 |
}
|
220 |
-
}
|
52 |
{
|
53 |
update_user_option($user_id, 's2member_last_login_time', time());
|
54 |
|
55 |
+
$logins = (int)get_user_option('s2member_login_counter', $user_id) + 1;
|
56 |
+
update_user_option($user_id, 's2member_login_counter', $logins);
|
57 |
+
|
58 |
if(!get_user_option('s2member_registration_ip', $user_id))
|
59 |
update_user_option($user_id, 's2member_registration_ip', $_SERVER['REMOTE_ADDR']);
|
60 |
|
|
|
|
|
|
|
61 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password'])
|
62 |
+
{
|
63 |
+
delete_user_setting('default_password_nag');
|
64 |
+
update_user_option($user_id, 'default_password_nag', FALSE, TRUE);
|
65 |
+
}
|
66 |
+
$ok = TRUE; // Initialize IP restriction being OK here. This is for filters.
|
67 |
+
if($username !== 'demo' && !is_super_admin($user_id) // Exclude the `demo` user, super admins, and anyone who can edit posts.
|
68 |
+
&& !apply_filters('ws_plugin__s2member_disable_login_ip_restrictions', $user->has_cap('edit_posts') ? TRUE : FALSE, get_defined_vars())
|
69 |
) $ok = c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok($_SERVER['REMOTE_ADDR'], strtolower($username));
|
70 |
|
71 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_redirection_always_http']) // Alter value of `redirect_to`?
|
74 |
$_REQUEST['redirect_to'] = preg_replace('/^https\:\/\//i', 'http://', $_REQUEST['redirect_to']);
|
75 |
if(stripos($_REQUEST['redirect_to'], 'http://') !== 0) // Force an absolute URL in this case.
|
76 |
{
|
77 |
+
$redirect_uri = $_REQUEST['redirect_to']; // e.g., `/path/with/?query=args`
|
78 |
$home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
|
79 |
$http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/'.$ci, '', home_url('/', 'http')), '/');
|
80 |
+
$_REQUEST['redirect_to'] = $http_home_base.'/'.ltrim($redirect_uri, '/');
|
81 |
}
|
82 |
}
|
83 |
+
if(($redirect = apply_filters('ws_plugin__s2member_login_redirect', $user->has_cap('edit_posts') ? FALSE : TRUE, get_defined_vars())))
|
84 |
{
|
85 |
$obey_redirect_to = apply_filters('ws_plugin__s2member_obey_login_redirect_to', TRUE, get_defined_vars());
|
86 |
|
97 |
do_action('ws_plugin__s2member_during_login_redirect', get_defined_vars());
|
98 |
unset($__refs, $__v); // Housekeeping.
|
99 |
|
100 |
+
$is_lwp = FALSE; // Initialize LWP detection flag.
|
101 |
|
102 |
+
if($redirect && is_string($redirect))
|
103 |
+
$redirect = $redirect;
|
104 |
|
105 |
+
else if(($login_redirection_url = c_ws_plugin__s2member_login_redirects::login_redirection_url($user)))
|
106 |
+
{
|
107 |
+
$is_lwp = TRUE; // Flag as being a hard-coded LWP URL in this case.
|
108 |
+
$redirect = $login_redirection_url; // Special redirection URL.
|
109 |
+
}
|
110 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'])
|
111 |
+
{
|
112 |
+
$is_lwp = TRUE; // Flag as being a hard-coded LWP URL in this case.
|
113 |
+
$redirect = get_page_link($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page']);
|
114 |
+
}
|
115 |
else $redirect = home_url('/'); // Default to the home page.
|
116 |
|
117 |
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['login_redirection_always_http'])
|
119 |
$redirect = preg_replace('/^https\:\/\//i', 'http://', $redirect);
|
120 |
if(stripos($redirect, 'http://') !== 0) // Force absolute.
|
121 |
{
|
122 |
+
$redirect_uri = $redirect; // e.g., `/path/with/?query=args`
|
123 |
+
$home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
|
124 |
+
$http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/'.$ci, '', home_url('/', 'http')), '/');
|
125 |
+
$redirect = $http_home_base.'/'.ltrim($redirect_uri, '/');
|
126 |
}
|
127 |
}
|
128 |
+
if($is_lwp) // Allow offsite redirection?
|
129 |
+
wp_redirect($redirect); // Perhaps an offsite location.
|
130 |
+
else wp_safe_redirect($redirect); // Default behavior.
|
131 |
+
|
132 |
+
exit(); // Stop here; redirecting now.
|
133 |
}
|
134 |
}
|
135 |
}
|
232 |
return apply_filters('ws_plugin__s2member_fill_login_redirect_rc_vars', $url, get_defined_vars());
|
233 |
}
|
234 |
}
|
235 |
+
}
|
includes/classes/menu-pages-rs.inc.php
CHANGED
@@ -102,4 +102,3 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
|
|
102 |
}
|
103 |
}
|
104 |
}
|
105 |
-
?>
|
102 |
}
|
103 |
}
|
104 |
}
|
|
includes/classes/menu-pages.inc.php
CHANGED
@@ -96,25 +96,25 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
|
|
96 |
|
97 |
if(empty($_GET['page']) || $_GET['page'] !== 'ws-plugin--s2member-mms-ops') // Do NOT display page-conflict-warnings on the Main Multisite Configuration panel.
|
98 |
{
|
99 |
-
if(!$options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>NOTE:</strong> s2Member security restrictions will NOT be enforced until you\'ve configured a Membership Options Page. See: <strong>s2Member
|
100 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
101 |
|
102 |
-
if($options['login_welcome_page'] && $options['login_welcome_page'] === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is the same as your Membership Options Page. Please correct this. See: <strong>s2Member
|
103 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
104 |
|
105 |
-
if($options['membership_options_page'] && (string)get_option('page_on_front') === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Membership Options Page is currently configured as your Home Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Membership Options Page MUST stand alone. Please correct this. See: <strong>WordPress
|
106 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
107 |
|
108 |
-
if($options['login_welcome_page'] && (string)get_option('page_on_front') === $options['login_welcome_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is currently configured as your Home Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Login Welcome Page MUST stand alone. Please correct this. See: <strong>WordPress
|
109 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
110 |
|
111 |
-
if($options['membership_options_page'] && (string)get_option('page_for_posts') === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Membership Options Page is currently configured as your Posts Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Membership Options Page MUST stand alone. Please correct this. See: <strong>WordPress
|
112 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
113 |
|
114 |
-
if($options['login_welcome_page'] && (string)get_option('page_for_posts') === $options['login_welcome_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is currently configured as your Posts Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Login Welcome Page MUST stand alone. Please correct this. See: <strong>WordPress
|
115 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
116 |
|
117 |
-
if($options['file_download_limit_exceeded_page'] && $options['file_download_limit_exceeded_page'] === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Download Limit Exceeded Page is the same as your Membership Options Page. Please correct this. See: <strong>s2Member
|
118 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
119 |
}
|
120 |
$updated_all_options = TRUE; // Flag indicating this routine was processed successfully; and that all s2Member options have been updated successfully.
|
@@ -290,7 +290,7 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
|
|
290 |
wp_enqueue_script('jquery-sprintf', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.sprintf/jquery.sprintf-min.js', array('jquery'), c_ws_plugin__s2member_utilities::ver_checksum());
|
291 |
wp_enqueue_script('jquery-json-ps', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.json-ps/jquery.json-ps-min.js', array('jquery'), c_ws_plugin__s2member_utilities::ver_checksum());
|
292 |
wp_enqueue_script('jquery-ui-effects', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.ui-effects/jquery.ui-effects-min.js', array('jquery', 'jquery-ui-core'), c_ws_plugin__s2member_utilities::ver_checksum());
|
293 |
-
wp_enqueue_script('ws-plugin--s2member-menu-pages', home_url('
|
294 |
|
295 |
do_action('ws_plugin__s2member_during_add_admin_scripts', get_defined_vars());
|
296 |
}
|
@@ -312,7 +312,7 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
|
|
312 |
if(!empty($_GET['page']) && preg_match('/ws-plugin--s2member-/', $_GET['page']))
|
313 |
{
|
314 |
wp_enqueue_style('thickbox');
|
315 |
-
wp_enqueue_style('ws-plugin--s2member-menu-pages', home_url('
|
316 |
|
317 |
do_action('ws_plugin__s2member_during_add_admin_styles', get_defined_vars());
|
318 |
}
|
@@ -731,7 +731,7 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
|
|
731 |
do_action('ws_plugin__s2member_before_paypal_buttons_page', get_defined_vars());
|
732 |
|
733 |
if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_business'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_merchant_id'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature'])
|
734 |
-
c_ws_plugin__s2member_admin_notices::display_admin_notice('Please configure <strong>s2Member
|
735 |
|
736 |
include_once dirname(dirname(__FILE__)).'/menu-pages/paypal-buttons.inc.php';
|
737 |
|
@@ -815,4 +815,4 @@ if(!class_exists('c_ws_plugin__s2member_menu_pages'))
|
|
815 |
do_action('ws_plugin__s2member_after_logs_page', get_defined_vars());
|
816 |
}
|
817 |
}
|
818 |
-
}
|
96 |
|
97 |
if(empty($_GET['page']) || $_GET['page'] !== 'ws-plugin--s2member-mms-ops') // Do NOT display page-conflict-warnings on the Main Multisite Configuration panel.
|
98 |
{
|
99 |
+
if(!$options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>NOTE:</strong> s2Member security restrictions will NOT be enforced until you\'ve configured a Membership Options Page. See: <strong>s2Member → General Options → Membership Options Page</strong>.'))
|
100 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
101 |
|
102 |
+
if($options['login_welcome_page'] && $options['login_welcome_page'] === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is the same as your Membership Options Page. Please correct this. See: <strong>s2Member → General Options → Login Welcome Page</strong>.'))
|
103 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
104 |
|
105 |
+
if($options['membership_options_page'] && (string)get_option('page_on_front') === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Membership Options Page is currently configured as your Home Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Membership Options Page MUST stand alone. Please correct this. See: <strong>WordPress → Reading Options</strong>. Or change: <strong>s2Member → General Options → Membership Options Page</strong>.'))
|
106 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
107 |
|
108 |
+
if($options['login_welcome_page'] && (string)get_option('page_on_front') === $options['login_welcome_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is currently configured as your Home Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Login Welcome Page MUST stand alone. Please correct this. See: <strong>WordPress → Reading Options</strong>. Or change: <strong>s2Member → General Options → Login Welcome Page</strong>.'))
|
109 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
110 |
|
111 |
+
if($options['membership_options_page'] && (string)get_option('page_for_posts') === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Membership Options Page is currently configured as your Posts Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Membership Options Page MUST stand alone. Please correct this. See: <strong>WordPress → Reading Options</strong>. Or change: <strong>s2Member → General Options → Membership Options Page</strong>.'))
|
112 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
113 |
|
114 |
+
if($options['login_welcome_page'] && (string)get_option('page_for_posts') === $options['login_welcome_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Login Welcome Page is currently configured as your Posts Page (i.e., static page) for WordPress. This causes internal conflicts with s2Member. Your Login Welcome Page MUST stand alone. Please correct this. See: <strong>WordPress → Reading Options</strong>. Or change: <strong>s2Member → General Options → Login Welcome Page</strong>.'))
|
115 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
116 |
|
117 |
+
if($options['file_download_limit_exceeded_page'] && $options['file_download_limit_exceeded_page'] === $options['membership_options_page'] && ($display_notices === TRUE || in_array('page-conflict-warnings', (array)$display_notices)) && ($notice = '<strong>s2Member:</strong> Your Download Limit Exceeded Page is the same as your Membership Options Page. Please correct this. See: <strong>s2Member → Download Options</strong>.'))
|
118 |
($enqueue_notices === TRUE || in_array('page-conflict-warnings', (array)$enqueue_notices)) ? c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, '*:*', TRUE) : c_ws_plugin__s2member_admin_notices::display_admin_notice($notice, TRUE);
|
119 |
}
|
120 |
$updated_all_options = TRUE; // Flag indicating this routine was processed successfully; and that all s2Member options have been updated successfully.
|
290 |
wp_enqueue_script('jquery-sprintf', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.sprintf/jquery.sprintf-min.js', array('jquery'), c_ws_plugin__s2member_utilities::ver_checksum());
|
291 |
wp_enqueue_script('jquery-json-ps', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.json-ps/jquery.json-ps-min.js', array('jquery'), c_ws_plugin__s2member_utilities::ver_checksum());
|
292 |
wp_enqueue_script('jquery-ui-effects', $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/includes/jquery/jquery.ui-effects/jquery.ui-effects-min.js', array('jquery', 'jquery-ui-core'), c_ws_plugin__s2member_utilities::ver_checksum());
|
293 |
+
wp_enqueue_script('ws-plugin--s2member-menu-pages', home_url('/wp-admin/admin.php?ws_plugin__s2member_menu_pages_js='.urlencode(mt_rand()), is_ssl() ? 'https' : 'http'), array('jquery', 'thickbox', 'media-upload', 'jquery-sprintf', 'jquery-json-ps', 'jquery-ui-core', 'jquery-ui-effects', 'password-strength-meter'), c_ws_plugin__s2member_utilities::ver_checksum());
|
294 |
|
295 |
do_action('ws_plugin__s2member_during_add_admin_scripts', get_defined_vars());
|
296 |
}
|
312 |
if(!empty($_GET['page']) && preg_match('/ws-plugin--s2member-/', $_GET['page']))
|
313 |
{
|
314 |
wp_enqueue_style('thickbox');
|
315 |
+
wp_enqueue_style('ws-plugin--s2member-menu-pages', home_url('/wp-admin/admin.php?ws_plugin__s2member_menu_pages_css='.urlencode(mt_rand()), is_ssl() ? 'https' : 'http'), array('thickbox'), c_ws_plugin__s2member_utilities::ver_checksum(), 'all');
|
316 |
|
317 |
do_action('ws_plugin__s2member_during_add_admin_styles', get_defined_vars());
|
318 |
}
|
731 |
do_action('ws_plugin__s2member_before_paypal_buttons_page', get_defined_vars());
|
732 |
|
733 |
if(!$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_business'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_merchant_id'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature'])
|
734 |
+
c_ws_plugin__s2member_admin_notices::display_admin_notice('Please configure <strong>s2Member → PayPal Options</strong> first. Once all of your PayPal Options are configured; including your Email Address, Merchant ID, API Username, Password, and Signature; return to this page & generate your PayPal Button(s).', TRUE);
|
735 |
|
736 |
include_once dirname(dirname(__FILE__)).'/menu-pages/paypal-buttons.inc.php';
|
737 |
|
815 |
do_action('ws_plugin__s2member_after_logs_page', get_defined_vars());
|
816 |
}
|
817 |
}
|
818 |
+
}
|
includes/classes/meta-box-saves.inc.php
CHANGED
@@ -145,4 +145,3 @@ if (!class_exists ("c_ws_plugin__s2member_meta_box_saves"))
|
|
145 |
}
|
146 |
}
|
147 |
}
|
148 |
-
?>
|
145 |
}
|
146 |
}
|
147 |
}
|
|
includes/classes/meta-box-security.inc.php
CHANGED
@@ -69,7 +69,7 @@ if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
|
|
69 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts of this type)</option>'."\n")
|
70 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Pages)</option>'."\n";
|
71 |
|
72 |
-
echo '</select><br /><small>* see: <strong>Restriction Options
|
73 |
|
74 |
if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
|
75 |
// ^ Will change once Custom Capabilities are compatible with a Blog Farm.
|
@@ -77,7 +77,7 @@ if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
|
|
77 |
echo '<p style="margin-top:15px; margin-left:2px;"><strong>Require Custom Capabilities?</strong></p>'."\n";
|
78 |
echo '<label class="screen-reader-text" for="ws-plugin--s2member-security-meta-box-ccaps">Custom Capabilities?</label>'."\n";
|
79 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_security_meta_box_ccaps" id="ws-plugin--s2member-security-meta-box-ccaps" value="'.format_to_edit(trim(implode(",", (array)get_post_meta($page_id, "s2member_ccaps_req", true)))).'" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" style="width:99%;" />'."\n";
|
80 |
-
echo '<br /><small>* see: <strong>API Scripting
|
81 |
}
|
82 |
}
|
83 |
|
@@ -115,7 +115,7 @@ if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
|
|
115 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts of this type)</option>'."\n")
|
116 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts)</option>'."\n";
|
117 |
|
118 |
-
echo '</select><br /><small>* see: <strong>Restriction Options
|
119 |
|
120 |
if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
|
121 |
// ^ Will change once Custom Capabilities are compatible with a Blog Farm.
|
@@ -123,7 +123,7 @@ if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
|
|
123 |
echo '<p style="margin-top:15px; margin-left:2px;"><strong>Require Custom Capabilities?</strong></p>'."\n";
|
124 |
echo '<label class="screen-reader-text" for="ws-plugin--s2member-security-meta-box-ccaps">Custom Capabilities?</label>'."\n";
|
125 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_security_meta_box_ccaps" id="ws-plugin--s2member-security-meta-box-ccaps" value="'.format_to_edit(trim(implode(",", (array)get_post_meta($post_id, "s2member_ccaps_req", true)))).'" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" style="width:99%;" />'."\n";
|
126 |
-
echo '<br /><small>* see: <strong>API Scripting
|
127 |
}
|
128 |
}
|
129 |
|
@@ -138,4 +138,3 @@ if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
|
|
138 |
}
|
139 |
}
|
140 |
}
|
141 |
-
?>
|
69 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts of this type)</option>'."\n")
|
70 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Pages)</option>'."\n";
|
71 |
|
72 |
+
echo '</select><br /><small>* see: <strong>Restriction Options → Pages</strong></small>'."\n";
|
73 |
|
74 |
if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
|
75 |
// ^ Will change once Custom Capabilities are compatible with a Blog Farm.
|
77 |
echo '<p style="margin-top:15px; margin-left:2px;"><strong>Require Custom Capabilities?</strong></p>'."\n";
|
78 |
echo '<label class="screen-reader-text" for="ws-plugin--s2member-security-meta-box-ccaps">Custom Capabilities?</label>'."\n";
|
79 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_security_meta_box_ccaps" id="ws-plugin--s2member-security-meta-box-ccaps" value="'.format_to_edit(trim(implode(",", (array)get_post_meta($page_id, "s2member_ccaps_req", true)))).'" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" style="width:99%;" />'."\n";
|
80 |
+
echo '<br /><small>* see: <strong>API Scripting → Custom Capabilities</strong></small>'."\n";
|
81 |
}
|
82 |
}
|
83 |
|
115 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts of this type)</option>'."\n")
|
116 |
: '<option value="" disabled="disabled">Level #'.$n.' (already protects "all" Posts)</option>'."\n";
|
117 |
|
118 |
+
echo '</select><br /><small>* see: <strong>Restriction Options → Posts</strong></small>'."\n";
|
119 |
|
120 |
if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
|
121 |
// ^ Will change once Custom Capabilities are compatible with a Blog Farm.
|
123 |
echo '<p style="margin-top:15px; margin-left:2px;"><strong>Require Custom Capabilities?</strong></p>'."\n";
|
124 |
echo '<label class="screen-reader-text" for="ws-plugin--s2member-security-meta-box-ccaps">Custom Capabilities?</label>'."\n";
|
125 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_security_meta_box_ccaps" id="ws-plugin--s2member-security-meta-box-ccaps" value="'.format_to_edit(trim(implode(",", (array)get_post_meta($post_id, "s2member_ccaps_req", true)))).'" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" style="width:99%;" />'."\n";
|
126 |
+
echo '<br /><small>* see: <strong>API Scripting → Custom Capabilities</strong></small>'."\n";
|
127 |
}
|
128 |
}
|
129 |
|
138 |
}
|
139 |
}
|
140 |
}
|
|
includes/classes/meta-boxes.inc.php
CHANGED
@@ -57,4 +57,3 @@ if (!class_exists ("c_ws_plugin__s2member_meta_boxes"))
|
|
57 |
}
|
58 |
}
|
59 |
}
|
60 |
-
?>
|
57 |
}
|
58 |
}
|
59 |
}
|
|
includes/classes/mms-patches.inc.php
CHANGED
@@ -147,4 +147,3 @@ if (!class_exists ("c_ws_plugin__s2member_mms_patches"))
|
|
147 |
}
|
148 |
}
|
149 |
}
|
150 |
-
?>
|
147 |
}
|
148 |
}
|
149 |
}
|
|
includes/classes/mo-page-in.inc.php
CHANGED
@@ -110,6 +110,16 @@ if(!class_exists("c_ws_plugin__s2member_mo_page_in"))
|
|
110 |
$mop_url = add_query_arg(urlencode_deep($vars), $mop_url);
|
111 |
$mop_url = c_ws_plugin__s2member_utils_urls::add_s2member_sig($mop_url);
|
112 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
wp_redirect($mop_url, $status); // NOTE: we do not exit here (on purpose).
|
114 |
|
115 |
do_action("ws_plugin__s2member_after_wp_redirect_w_mop_vars", get_defined_vars());
|
@@ -162,4 +172,3 @@ if(!class_exists("c_ws_plugin__s2member_mo_page_in"))
|
|
162 |
}
|
163 |
}
|
164 |
}
|
165 |
-
?>
|
110 |
$mop_url = add_query_arg(urlencode_deep($vars), $mop_url);
|
111 |
$mop_url = c_ws_plugin__s2member_utils_urls::add_s2member_sig($mop_url);
|
112 |
}
|
113 |
+
if(!empty($_GET) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_ga_vars_enable"])
|
114 |
+
{
|
115 |
+
$ga_vars = array(); // Initialize.
|
116 |
+
|
117 |
+
foreach(stripslashes_deep($_GET) as $_key => $_value)
|
118 |
+
if(strpos($_key, 'utm_') === 0) $ga_vars[$_key] = $_value;
|
119 |
+
unset($_key, $_value); // Housekeeping.
|
120 |
+
|
121 |
+
$mop_url = add_query_arg(urlencode_deep($ga_vars), $mop_url);
|
122 |
+
}
|
123 |
wp_redirect($mop_url, $status); // NOTE: we do not exit here (on purpose).
|
124 |
|
125 |
do_action("ws_plugin__s2member_after_wp_redirect_w_mop_vars", get_defined_vars());
|
172 |
}
|
173 |
}
|
174 |
}
|
|
includes/classes/mo-page.inc.php
CHANGED
@@ -83,4 +83,3 @@ if(!class_exists("c_ws_plugin__s2member_mo_page"))
|
|
83 |
}
|
84 |
}
|
85 |
}
|
86 |
-
?>
|
83 |
}
|
84 |
}
|
85 |
}
|
|
includes/classes/op-notices.inc.php
CHANGED
@@ -45,7 +45,7 @@ if (!class_exists ("c_ws_plugin__s2member_op_notices"))
|
|
45 |
|
46 |
if (is_blog_admin () && $pagenow === "options-general.php" && !isset ($_GET["page"]) && !is_multisite ()) // Multisite does NOT provide these options.
|
47 |
{
|
48 |
-
$notice = "<em>* Note: The s2Member plugin has control over two options on this page.<br /><code>Anyone Can Register = " . esc_html (get_option ("users_can_register")) . "</code>, and <code>New User Default Role = " . esc_html (get_option ("default_role")) . "</code>.<br />For further details, see: <strong>s2Member
|
49 |
|
50 |
$js = '<script type="text/javascript">';
|
51 |
$js .= "jQuery(document).ready(function(\$){ \$('input#users_can_register, select#default_role').attr('disabled', 'disabled'); });";
|
@@ -78,7 +78,7 @@ if (!class_exists ("c_ws_plugin__s2member_op_notices"))
|
|
78 |
|
79 |
if (is_multisite () && is_network_admin () && in_array($pagenow, array("settings.php")) && !isset ($_GET["page"]))
|
80 |
{
|
81 |
-
$notice = "<em>* Note: The s2Member plugin has control over two options on this page.<br /><code>Allow Open Registration = " . esc_html (get_site_option ("registration")) . "</code> and <code>Add New Users = " . esc_html (get_site_option ("add_new_users")) . "</code>.<br />Please check: <strong>s2Member
|
82 |
|
83 |
$js = '<script type="text/javascript">';
|
84 |
$js .= "jQuery(document).ready(function(\$){ \$('input[name=registration], input#add_new_users').attr('disabled', 'disabled'); });";
|
@@ -136,4 +136,3 @@ if (!class_exists ("c_ws_plugin__s2member_op_notices"))
|
|
136 |
}
|
137 |
}
|
138 |
}
|
139 |
-
?>
|
45 |
|
46 |
if (is_blog_admin () && $pagenow === "options-general.php" && !isset ($_GET["page"]) && !is_multisite ()) // Multisite does NOT provide these options.
|
47 |
{
|
48 |
+
$notice = "<em>* Note: The s2Member plugin has control over two options on this page.<br /><code>Anyone Can Register = " . esc_html (get_option ("users_can_register")) . "</code>, and <code>New User Default Role = " . esc_html (get_option ("default_role")) . "</code>.<br />For further details, see: <strong>s2Member → General Options → Open Registration</strong>.";
|
49 |
|
50 |
$js = '<script type="text/javascript">';
|
51 |
$js .= "jQuery(document).ready(function(\$){ \$('input#users_can_register, select#default_role').attr('disabled', 'disabled'); });";
|
78 |
|
79 |
if (is_multisite () && is_network_admin () && in_array($pagenow, array("settings.php")) && !isset ($_GET["page"]))
|
80 |
{
|
81 |
+
$notice = "<em>* Note: The s2Member plugin has control over two options on this page.<br /><code>Allow Open Registration = " . esc_html (get_site_option ("registration")) . "</code> and <code>Add New Users = " . esc_html (get_site_option ("add_new_users")) . "</code>.<br />Please check: <strong>s2Member → Multisite (Config)</strong>.";
|
82 |
|
83 |
$js = '<script type="text/javascript">';
|
84 |
$js .= "jQuery(document).ready(function(\$){ \$('input[name=registration], input#add_new_users').attr('disabled', 'disabled'); });";
|
136 |
}
|
137 |
}
|
138 |
}
|
|
includes/classes/option-forces.inc.php
CHANGED
@@ -256,4 +256,3 @@ if (!class_exists ("c_ws_plugin__s2member_option_forces"))
|
|
256 |
}
|
257 |
}
|
258 |
}
|
259 |
-
?>
|
256 |
}
|
257 |
}
|
258 |
}
|
|
includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php
CHANGED
@@ -57,7 +57,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
57 |
{
|
58 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
59 |
do_action('ws_plugin__s2member_during_paypal_notify_before_subscr_eot', get_defined_vars());
|
60 |
-
unset($__refs, $__v);
|
61 |
|
62 |
if(!get_transient($transient_ipn = 's2m_ipn_'.md5('s2member_transient_'.$_paypal_s)) && set_transient($transient_ipn, time(), 31556926 * 10))
|
63 |
{
|
@@ -94,6 +94,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
94 |
|
95 |
if((!$is_refund_or_reversal && !$is_delayed_eot && !get_user_option('s2member_auto_eot_time', $user_id))
|
96 |
|| ($is_refund_or_reversal && $is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,partial_refunds,reversals')
|
|
|
97 |
|| ($is_refund_or_reversal && !$is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,reversals')
|
98 |
|| ($is_refund && !$is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds')
|
99 |
|| ($is_reversal && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'reversals')
|
@@ -117,7 +118,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
117 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_before_demote', get_defined_vars());
|
118 |
do_action('ws_plugin__s2member_during_collective_mods', $user_id, get_defined_vars(), $eot_del_type, 'modification', $demotion_role);
|
119 |
do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'modification');
|
120 |
-
unset($__refs, $__v);
|
121 |
|
122 |
if($existing_role !== $demotion_role) // Only if NOT the existing Role.
|
123 |
$user->set_role($demotion_role); // Give User the demotion Role.
|
@@ -127,25 +128,28 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
127 |
if(preg_match('/^access_s2member_ccap_/', $cap))
|
128 |
$user->remove_cap($ccap = $cap);
|
129 |
|
130 |
-
|
131 |
delete_user_option($user_id, 's2member_subscr_id');
|
132 |
delete_user_option($user_id, 's2member_subscr_baid');
|
133 |
delete_user_option($user_id, 's2member_subscr_cid');
|
134 |
-
delete_user_option($user_id, 's2member_subscr_gateway');
|
135 |
|
136 |
delete_user_option($user_id, 's2member_ipn_signup_vars');
|
137 |
-
if(!apply_filters('ws_plugin__s2member_preserve_paid_registration_times', TRUE
|
138 |
delete_user_option($user_id, 's2member_paid_registration_times');
|
139 |
|
140 |
delete_user_option($user_id, 's2member_last_status_scan');
|
141 |
delete_user_option($user_id, 's2member_first_payment_txn_id');
|
142 |
delete_user_option($user_id, 's2member_last_payment_time');
|
|
|
143 |
delete_user_option($user_id, 's2member_auto_eot_time');
|
144 |
|
145 |
delete_user_option($user_id, 's2member_file_download_access_log');
|
|
|
|
|
|
|
146 |
|
147 |
c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Demoted by s2Member: '.date('D M j, Y g:i a T'));
|
148 |
-
c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Paid Subscr. ID @ time of demotion: '.$paypal['subscr_gateway'].'
|
149 |
|
150 |
$paypal['s2member_log'][] = 'Member Level/Capabilities demoted to: '.ucwords(preg_replace('/_/', ' ', $demotion_role)).'.';
|
151 |
|
@@ -227,7 +231,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
227 |
}
|
228 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
229 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_demote', get_defined_vars());
|
230 |
-
unset($__refs, $__v);
|
231 |
}
|
232 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'delete')
|
233 |
{
|
@@ -239,7 +243,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
239 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
240 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_before_delete', get_defined_vars());
|
241 |
do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'removal-deletion');
|
242 |
-
unset($__refs, $__v);
|
243 |
|
244 |
if(is_multisite()) // Multisite does NOT actually delete; ONLY removes.
|
245 |
{
|
@@ -257,11 +261,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
257 |
|
258 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
259 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_delete', get_defined_vars());
|
260 |
-
unset($__refs, $__v);
|
261 |
}
|
262 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
263 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot', get_defined_vars());
|
264 |
-
unset($__refs, $__v);
|
265 |
}
|
266 |
else // Otherwise, treat this as if it were a cancellation. EOTs are currently disabled.
|
267 |
{
|
@@ -274,7 +278,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
274 |
|
275 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
276 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_disabled', get_defined_vars());
|
277 |
-
unset($__refs, $__v);
|
278 |
}
|
279 |
}
|
280 |
else $paypal['s2member_log'][] = 'Unable to (demote|delete) Member. The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access.';
|
@@ -294,7 +298,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
294 |
|
295 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
296 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_delayed', get_defined_vars());
|
297 |
-
unset($__refs, $__v);
|
298 |
}
|
299 |
else $paypal['s2member_log'][] = 'Ignoring Delayed EOT. The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access.';
|
300 |
}
|
@@ -425,7 +429,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
425 |
}
|
426 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
427 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_refund_reversal', get_defined_vars());
|
428 |
-
unset($__refs, $__v);
|
429 |
}
|
430 |
}
|
431 |
else // Else, this is a duplicate IPN. Must stop here.
|
@@ -436,11 +440,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
|
|
436 |
}
|
437 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
438 |
do_action('ws_plugin__s2member_during_paypal_notify_after_subscr_eot', get_defined_vars());
|
439 |
-
unset($__refs, $__v);
|
440 |
|
441 |
return apply_filters('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level', $paypal, get_defined_vars());
|
442 |
}
|
443 |
else return apply_filters('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level', FALSE, get_defined_vars());
|
444 |
}
|
445 |
}
|
446 |
-
}
|
57 |
{
|
58 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
59 |
do_action('ws_plugin__s2member_during_paypal_notify_before_subscr_eot', get_defined_vars());
|
60 |
+
unset($__refs, $__v); // Housekeeping.
|
61 |
|
62 |
if(!get_transient($transient_ipn = 's2m_ipn_'.md5('s2member_transient_'.$_paypal_s)) && set_transient($transient_ipn, time(), 31556926 * 10))
|
63 |
{
|
94 |
|
95 |
if((!$is_refund_or_reversal && !$is_delayed_eot && !get_user_option('s2member_auto_eot_time', $user_id))
|
96 |
|| ($is_refund_or_reversal && $is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,partial_refunds,reversals')
|
97 |
+
|| ($is_refund_or_reversal && !$is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,partial_refunds,reversals')
|
98 |
|| ($is_refund_or_reversal && !$is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,reversals')
|
99 |
|| ($is_refund && !$is_partial_refund && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds')
|
100 |
|| ($is_reversal && $GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'reversals')
|
118 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_before_demote', get_defined_vars());
|
119 |
do_action('ws_plugin__s2member_during_collective_mods', $user_id, get_defined_vars(), $eot_del_type, 'modification', $demotion_role);
|
120 |
do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'modification');
|
121 |
+
unset($__refs, $__v); // Housekeeping.
|
122 |
|
123 |
if($existing_role !== $demotion_role) // Only if NOT the existing Role.
|
124 |
$user->set_role($demotion_role); // Give User the demotion Role.
|
128 |
if(preg_match('/^access_s2member_ccap_/', $cap))
|
129 |
$user->remove_cap($ccap = $cap);
|
130 |
|
131 |
+
delete_user_option($user_id, 's2member_subscr_gateway');
|
132 |
delete_user_option($user_id, 's2member_subscr_id');
|
133 |
delete_user_option($user_id, 's2member_subscr_baid');
|
134 |
delete_user_option($user_id, 's2member_subscr_cid');
|
|
|
135 |
|
136 |
delete_user_option($user_id, 's2member_ipn_signup_vars');
|
137 |
+
if(!apply_filters('ws_plugin__s2member_preserve_paid_registration_times', TRUE))
|
138 |
delete_user_option($user_id, 's2member_paid_registration_times');
|
139 |
|
140 |
delete_user_option($user_id, 's2member_last_status_scan');
|
141 |
delete_user_option($user_id, 's2member_first_payment_txn_id');
|
142 |
delete_user_option($user_id, 's2member_last_payment_time');
|
143 |
+
delete_user_option($user_id, 's2member_last_auto_eot_time');
|
144 |
delete_user_option($user_id, 's2member_auto_eot_time');
|
145 |
|
146 |
delete_user_option($user_id, 's2member_file_download_access_log');
|
147 |
+
delete_user_option($user_id, 's2member_authnet_payment_failures');
|
148 |
+
|
149 |
+
update_user_option($user_id, 's2member_last_auto_eot_time', time());
|
150 |
|
151 |
c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Demoted by s2Member: '.date('D M j, Y g:i a T'));
|
152 |
+
c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Paid Subscr. ID @ time of demotion: '.$paypal['subscr_gateway'].' → '.$paypal['subscr_id']);
|
153 |
|
154 |
$paypal['s2member_log'][] = 'Member Level/Capabilities demoted to: '.ucwords(preg_replace('/_/', ' ', $demotion_role)).'.';
|
155 |
|
231 |
}
|
232 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
233 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_demote', get_defined_vars());
|
234 |
+
unset($__refs, $__v); // Housekeeping.
|
235 |
}
|
236 |
else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'delete')
|
237 |
{
|
243 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
244 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_before_delete', get_defined_vars());
|
245 |
do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'removal-deletion');
|
246 |
+
unset($__refs, $__v); // Housekeeping.
|
247 |
|
248 |
if(is_multisite()) // Multisite does NOT actually delete; ONLY removes.
|
249 |
{
|
261 |
|
262 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
263 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_delete', get_defined_vars());
|
264 |
+
unset($__refs, $__v); // Housekeeping.
|
265 |
}
|
266 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
267 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot', get_defined_vars());
|
268 |
+
unset($__refs, $__v); // Housekeeping.
|
269 |
}
|
270 |
else // Otherwise, treat this as if it were a cancellation. EOTs are currently disabled.
|
271 |
{
|
278 |
|
279 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
280 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_disabled', get_defined_vars());
|
281 |
+
unset($__refs, $__v); // Housekeeping.
|
282 |
}
|
283 |
}
|
284 |
else $paypal['s2member_log'][] = 'Unable to (demote|delete) Member. The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access.';
|
298 |
|
299 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
300 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_delayed', get_defined_vars());
|
301 |
+
unset($__refs, $__v); // Housekeeping.
|
302 |
}
|
303 |
else $paypal['s2member_log'][] = 'Ignoring Delayed EOT. The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access.';
|
304 |
}
|
429 |
}
|
430 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
431 |
do_action('ws_plugin__s2member_during_paypal_notify_during_subscr_eot_refund_reversal', get_defined_vars());
|
432 |
+
unset($__refs, $__v); // Housekeeping.
|
433 |
}
|
434 |
}
|
435 |
else // Else, this is a duplicate IPN. Must stop here.
|
440 |
}
|
441 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
442 |
do_action('ws_plugin__s2member_during_paypal_notify_after_subscr_eot', get_defined_vars());
|
443 |
+
unset($__refs, $__v); // Housekeeping.
|
444 |
|
445 |
return apply_filters('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level', $paypal, get_defined_vars());
|
446 |
}
|
447 |
else return apply_filters('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level', FALSE, get_defined_vars());
|
448 |
}
|
449 |
}
|
450 |
+
}
|
includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php
CHANGED
@@ -57,7 +57,7 @@ if(!class_exists('c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level'))
|
|
57 |
{
|
58 |
$paypal['s2member_log'][] = 's2Member `txn_type` identified as ( `web_accept|subscr_signup|subscr_payment` ).';
|
59 |
|
60 |
-
list($paypal['level'], $paypal['ccaps'], $paypal['eotper']) = preg_split('/\:/', $paypal['item_number'], 3);
|
61 |
|
62 |
$paypal['ip'] = (preg_match('/ip address/i', $paypal['option_name2']) && $paypal['option_selection2']) ? $paypal['option_selection2'] : '';
|
63 |
$paypal['ip'] = (!$paypal['ip'] && preg_match('/^[a-z0-9]+~[0-9\.]+$/i', $paypal['invoice'])) ? preg_replace('/^[a-z0-9]+~/i', '', $paypal['invoice']) : $paypal['ip'];
|
@@ -392,4 +392,4 @@ if(!class_exists('c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level'))
|
|
392 |
else return apply_filters('c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level', FALSE, get_defined_vars());
|
393 |
}
|
394 |
}
|
395 |
-
}
|
57 |
{
|
58 |
$paypal['s2member_log'][] = 's2Member `txn_type` identified as ( `web_accept|subscr_signup|subscr_payment` ).';
|
59 |
|
60 |
+
@list($paypal['level'], $paypal['ccaps'], $paypal['eotper']) = preg_split('/\:/', $paypal['item_number'], 3);
|
61 |
|
62 |
$paypal['ip'] = (preg_match('/ip address/i', $paypal['option_name2']) && $paypal['option_selection2']) ? $paypal['option_selection2'] : '';
|
63 |
$paypal['ip'] = (!$paypal['ip'] && preg_match('/^[a-z0-9]+~[0-9\.]+$/i', $paypal['invoice'])) ? preg_replace('/^[a-z0-9]+~/i', '', $paypal['invoice']) : $paypal['ip'];
|
392 |
else return apply_filters('c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level', FALSE, get_defined_vars());
|
393 |
}
|
394 |
}
|
395 |
+
}
|
includes/classes/paypal-return-in.inc.php
CHANGED
@@ -123,10 +123,10 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in"))
|
|
123 |
else // Extensive log reporting here. This is an area where many site owners find trouble. Depending on server configuration; remote HTTPS connections may fail.
|
124 |
{
|
125 |
if /* Enqueue an admin notice if the site owner is missing the PDT Identity Key. */ (!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"])
|
126 |
-
c_ws_plugin__s2member_admin_notices::enqueue_admin_notice("<strong>s2Member:</strong> You have no PayPal PDT Identity Token configured. PayPal Auto-Return handling failed. Please update your PayPal PDT Identity Key. See: <strong>s2Member
|
127 |
|
128 |
$paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
|
129 |
-
$paypal["s2member_log"][] = "Please make sure that you configure a PayPal PDT Identity Token for your installation of s2Member. See: `s2Member
|
130 |
$paypal["s2member_log"][] = "See also, this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner.";
|
131 |
$paypal["s2member_log"][] = /* Recording _POST + _GET vars for analysis and debugging. */ var_export ($_REQUEST, true);
|
132 |
|
123 |
else // Extensive log reporting here. This is an area where many site owners find trouble. Depending on server configuration; remote HTTPS connections may fail.
|
124 |
{
|
125 |
if /* Enqueue an admin notice if the site owner is missing the PDT Identity Key. */ (!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"])
|
126 |
+
c_ws_plugin__s2member_admin_notices::enqueue_admin_notice("<strong>s2Member:</strong> You have no PayPal PDT Identity Token configured. PayPal Auto-Return handling failed. Please update your PayPal PDT Identity Key. See: <strong>s2Member → PayPal Options → PayPal PDT/Auto-Return Integration</strong>. Thank you!", "*:*", true);
|
127 |
|
128 |
$paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
|
129 |
+
$paypal["s2member_log"][] = "Please make sure that you configure a PayPal PDT Identity Token for your installation of s2Member. See: `s2Member → PayPal Options → PayPal PDT/Auto-Return Integration`.";
|
130 |
$paypal["s2member_log"][] = "See also, this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner.";
|
131 |
$paypal["s2member_log"][] = /* Recording _POST + _GET vars for analysis and debugging. */ var_export ($_REQUEST, true);
|
132 |
|
includes/classes/paypal-utilities.inc.php
CHANGED
@@ -128,10 +128,10 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
|
|
128 |
unset($__refs, $__v);
|
129 |
|
130 |
if(is_multisite() && !is_main_site())
|
131 |
-
$key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt($current_blog->domain.$current_blog->path, false, false));
|
132 |
|
133 |
else // Else it's a standard Proxy Key; not on a Multisite Network, or not on the Main Site anyway.
|
134 |
-
$key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt(preg_replace("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]), false, false));
|
135 |
|
136 |
return apply_filters("ws_plugin__s2member_paypal_proxy_key_gen", $key, get_defined_vars());
|
137 |
}
|
@@ -684,4 +684,3 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
|
|
684 |
}
|
685 |
}
|
686 |
}
|
687 |
-
?>
|
128 |
unset($__refs, $__v);
|
129 |
|
130 |
if(is_multisite() && !is_main_site())
|
131 |
+
$key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt(strtolower($current_blog->domain.$current_blog->path), false, false));
|
132 |
|
133 |
else // Else it's a standard Proxy Key; not on a Multisite Network, or not on the Main Site anyway.
|
134 |
+
$key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt(preg_replace("/\:[0-9]+$/", "", strtolower($_SERVER["HTTP_HOST"])), false, false));
|
135 |
|
136 |
return apply_filters("ws_plugin__s2member_paypal_proxy_key_gen", $key, get_defined_vars());
|
137 |
}
|
684 |
}
|
685 |
}
|
686 |
}
|
|
includes/classes/profile-mods-4bp-in.inc.php
CHANGED
@@ -112,7 +112,7 @@ if(!class_exists('c_ws_plugin__s2member_profile_mods_4bp_in'))
|
|
112 |
{
|
113 |
c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, '', $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, TRUE, $user_id);
|
114 |
}
|
115 |
-
else if($role && $level >= 0)
|
116 |
{
|
117 |
c_ws_plugin__s2member_list_servers::process_list_server_removals($role, $level, $user->user_login, '', $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, $user_id);
|
118 |
}
|
@@ -121,4 +121,4 @@ if(!class_exists('c_ws_plugin__s2member_profile_mods_4bp_in'))
|
|
121 |
do_action('ws_plugin__s2member_after_handle_profile_modifications_4bp', get_defined_vars());
|
122 |
}
|
123 |
}
|
124 |
-
}
|
112 |
{
|
113 |
c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, '', $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, TRUE, $user_id);
|
114 |
}
|
115 |
+
else if($role && $level >= 0 && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'])
|
116 |
{
|
117 |
c_ws_plugin__s2member_list_servers::process_list_server_removals($role, $level, $user->user_login, '', $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, $user_id);
|
118 |
}
|
121 |
do_action('ws_plugin__s2member_after_handle_profile_modifications_4bp', get_defined_vars());
|
122 |
}
|
123 |
}
|
124 |
+
}
|
includes/classes/profile-mods-in.inc.php
CHANGED
@@ -136,7 +136,7 @@ if(!class_exists('c_ws_plugin__s2member_profile_mods_in'))
|
|
136 |
{
|
137 |
c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, ((!empty($userdata['user_pass'])) ? $userdata['user_pass'] : ''), $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, TRUE, $user_id);
|
138 |
}
|
139 |
-
else if($role && $level >= 0)
|
140 |
{
|
141 |
c_ws_plugin__s2member_list_servers::process_list_server_removals($role, $level, $user->user_login, ((!empty($userdata['user_pass'])) ? $userdata['user_pass'] : ''), $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, $user_id);
|
142 |
}
|
@@ -157,4 +157,4 @@ if(!class_exists('c_ws_plugin__s2member_profile_mods_in'))
|
|
157 |
do_action('ws_plugin__s2member_after_handle_profile_modifications', get_defined_vars());
|
158 |
}
|
159 |
}
|
160 |
-
}
|
136 |
{
|
137 |
c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, ((!empty($userdata['user_pass'])) ? $userdata['user_pass'] : ''), $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, TRUE, $user_id);
|
138 |
}
|
139 |
+
else if($role && $level >= 0 && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'])
|
140 |
{
|
141 |
c_ws_plugin__s2member_list_servers::process_list_server_removals($role, $level, $user->user_login, ((!empty($userdata['user_pass'])) ? $userdata['user_pass'] : ''), $user->user_email, $user->first_name, $user->last_name, $_SERVER['REMOTE_ADDR'], TRUE, $user_id);
|
142 |
}
|
157 |
do_action('ws_plugin__s2member_after_handle_profile_modifications', get_defined_vars());
|
158 |
}
|
159 |
}
|
160 |
+
}
|
includes/classes/register-in.inc.php
CHANGED
@@ -101,4 +101,3 @@ if (!class_exists ("c_ws_plugin__s2member_register_in"))
|
|
101 |
}
|
102 |
}
|
103 |
}
|
104 |
-
?>
|
101 |
}
|
102 |
}
|
103 |
}
|
|
includes/classes/register.inc.php
CHANGED
@@ -46,4 +46,3 @@ if (!class_exists ("c_ws_plugin__s2member_register"))
|
|
46 |
}
|
47 |
}
|
48 |
}
|
49 |
-
?>
|
46 |
}
|
47 |
}
|
48 |
}
|
|
includes/classes/registrations.inc.php
CHANGED
@@ -939,11 +939,11 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
|
|
939 |
|
940 |
$opt_in = (!empty($_pmr['ws_plugin__s2member_custom_reg_field_opt_in'])) ? TRUE : FALSE;
|
941 |
|
942 |
-
if(!($fname = $user->first_name)) // `Users
|
943 |
if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_first_name']))
|
944 |
$fname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_first_name'];
|
945 |
|
946 |
-
if(!($lname = $user->last_name)) // `Users
|
947 |
if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_last_name']))
|
948 |
$lname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_last_name'];
|
949 |
|
@@ -958,7 +958,7 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
|
|
958 |
if(!empty($GLOBALS['ws_plugin__s2member_generate_password_return']))
|
959 |
$pass = (string)$GLOBALS['ws_plugin__s2member_generate_password_return'];
|
960 |
|
961 |
-
if(!$pass) // Also try the `Users
|
962 |
if(!empty($_pmr['pass1'])) // Field in `/user-new.php`.
|
963 |
$pass = (string)$_pmr['pass1'];
|
964 |
|
939 |
|
940 |
$opt_in = (!empty($_pmr['ws_plugin__s2member_custom_reg_field_opt_in'])) ? TRUE : FALSE;
|
941 |
|
942 |
+
if(!($fname = $user->first_name)) // `Users → Add New`.
|
943 |
if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_first_name']))
|
944 |
$fname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_first_name'];
|
945 |
|
946 |
+
if(!($lname = $user->last_name)) // `Users → Add New`.
|
947 |
if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_last_name']))
|
948 |
$lname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_last_name'];
|
949 |
|
958 |
if(!empty($GLOBALS['ws_plugin__s2member_generate_password_return']))
|
959 |
$pass = (string)$GLOBALS['ws_plugin__s2member_generate_password_return'];
|
960 |
|
961 |
+
if(!$pass) // Also try the `Users → Add New` form.
|
962 |
if(!empty($_pmr['pass1'])) // Field in `/user-new.php`.
|
963 |
$pass = (string)$_pmr['pass1'];
|
964 |
|
includes/classes/s-badge-status-in.inc.php
CHANGED
@@ -96,4 +96,3 @@ if (!class_exists ("c_ws_plugin__s2member_s_badge_status_in"))
|
|
96 |
}
|
97 |
}
|
98 |
}
|
99 |
-
?>
|
96 |
}
|
97 |
}
|
98 |
}
|
|
includes/classes/s-badge-status.inc.php
CHANGED
@@ -46,4 +46,3 @@ if (!class_exists ("c_ws_plugin__s2member_s_badge_status"))
|
|
46 |
}
|
47 |
}
|
48 |
}
|
49 |
-
?>
|
46 |
}
|
47 |
}
|
48 |
}
|
|
includes/classes/sc-eots-in.inc.php
ADDED
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Shortcode `[s2Eot /]` (inner processing routines).
|
4 |
+
*
|
5 |
+
* Copyright: © 2009-2011
|
6 |
+
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
+
* (coded in the USA)
|
8 |
+
*
|
9 |
+
* Released under the terms of the GNU General Public License.
|
10 |
+
* You should have received a copy of the GNU General Public License,
|
11 |
+
* along with this software. In the main directory, see: /licensing/
|
12 |
+
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
+
*
|
14 |
+
* @package s2Member\s2Eot
|
15 |
+
* @since 150713
|
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_sc_eots_in'))
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* Shortcode `[s2Eot /]` (inner processing routines).
|
24 |
+
*
|
25 |
+
* @package s2Member\s2Eot
|
26 |
+
* @since 150713
|
27 |
+
*/
|
28 |
+
class c_ws_plugin__s2member_sc_eots_in
|
29 |
+
{
|
30 |
+
/**
|
31 |
+
* Handles the Shortcode for: `[s2Eot /]`.
|
32 |
+
*
|
33 |
+
* @package s2Member\s2Eot
|
34 |
+
* @since 150713
|
35 |
+
*
|
36 |
+
* @attaches-to ``add_shortcode('s2Eot');``
|
37 |
+
*
|
38 |
+
* @param array $attr An array of Attributes.
|
39 |
+
* @param string $content Content inside the Shortcode.
|
40 |
+
* @param string $shortcode The actual Shortcode name itself.
|
41 |
+
*
|
42 |
+
* @return string Value of the requested data.
|
43 |
+
*/
|
44 |
+
public static function sc_eot_details($attr = array(), $content = '', $shortcode = '')
|
45 |
+
{
|
46 |
+
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
47 |
+
do_action('ws_plugin__s2member_before_sc_eot_details', get_defined_vars());
|
48 |
+
unset($__refs, $__v); // Allow variables to be modified by reference.
|
49 |
+
|
50 |
+
c_ws_plugin__s2member_no_cache::no_cache_constants(true);
|
51 |
+
|
52 |
+
$mode = ''; // Initialize shortcode mode and validate.
|
53 |
+
if(!empty($attr['mode']) && in_array(strtolower($attr['mode']), array('fixed', 'next'), TRUE))
|
54 |
+
$mode = strtolower($attr['mode']); // A specific mode; i.e., `fixed`, `next`.
|
55 |
+
|
56 |
+
if(empty($attr['user_id']) || !(integer)$attr['user_id'])
|
57 |
+
$attr['user_id'] = $user_id = get_current_user_id();
|
58 |
+
else $user_id = (integer)$attr['user_id'];
|
59 |
+
|
60 |
+
$subscr_gateway = get_user_option('s2member_subscr_gateway', $user_id);
|
61 |
+
$subscr_id = get_user_option('s2member_subscr_id', $user_id);
|
62 |
+
$subscr_cid = get_user_option('s2member_subscr_cid', $user_id);
|
63 |
+
$auto_eot_time = get_user_option('s2member_auto_eot_time', $user_id);
|
64 |
+
|
65 |
+
$attr = shortcode_atts( // Attributes.
|
66 |
+
array(
|
67 |
+
'debug' => 'no', // Off.
|
68 |
+
'user_id' => '0', // Current.
|
69 |
+
'date_format' => 'M jS, Y, g:i a T',
|
70 |
+
'round_to' => '', // Optional rounding.
|
71 |
+
'offset' => '0', // Optional time offset.
|
72 |
+
'timezone' => '', // Default timezone; i.e., GMT/UTC.
|
73 |
+
'future_format' => $mode ? '%%date%%' : '<strong class="s2member-sc-eot-label -future">'._x('Access Expires:', 's2member-front', 's2member').'</strong> <span class="s2member-sc-eot-date -future">%%date%%</span>',
|
74 |
+
'past_format' => $mode ? '%%date%%' : '<strong class="s2member-sc-eot-label -past">'._x('Access Expired:', 's2member-front', 's2member').'</strong> <span class="s2member-sc-eot-date -past">%%date%%</span>',
|
75 |
+
'next_format' => $mode ? '%%date%%' : '<strong class="s2member-sc-eot-label -next">'._x('Next Payment:', 's2member-front', 's2member').'</strong> <span class="s2member-sc-eot-date -next">%%date%%</span>',
|
76 |
+
'empty_format' => $mode ? (in_array($subscr_gateway, array('stripe', 'paypal', 'clickbank'), TRUE) ? _x('N/A', 's2member-front', 's2member') : _x('—', 's2member-front', 's2member')) : '',
|
77 |
+
),
|
78 |
+
c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr)
|
79 |
+
);
|
80 |
+
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
81 |
+
do_action('ws_plugin__s2member_before_sc_eot_details_after_shortcode_atts', get_defined_vars());
|
82 |
+
unset($__refs, $__v); // Allow variables to be modified by reference.
|
83 |
+
|
84 |
+
// Collect and cache the EOT for this user.
|
85 |
+
|
86 |
+
$prefix = 's2m_eot_'; // Transient prefix for this shortcode.
|
87 |
+
$hash_vars = $user_id.$subscr_gateway.$subscr_id.$subscr_cid.$auto_eot_time;
|
88 |
+
$transient = $prefix.md5('s2member_sc_eot_'.$mode.serialize($attr).$hash_vars);
|
89 |
+
|
90 |
+
if(!is_array($eot = get_transient($transient)))
|
91 |
+
{
|
92 |
+
$eot = c_ws_plugin__s2member_utils_users::get_user_eot($user_id, true, $mode);
|
93 |
+
set_transient($transient, $eot, DAY_IN_SECONDS / 2);
|
94 |
+
}
|
95 |
+
if($eot['time'] && $attr['round_to'])
|
96 |
+
$eot['time'] = strtotime($attr['round_to'], $eot['time']);
|
97 |
+
|
98 |
+
if($eot['time'] && (integer)$attr['offset'])
|
99 |
+
$eot['time'] = $eot['time'] + (integer)$attr['offset'];
|
100 |
+
|
101 |
+
// Initialize EOT details/output format.
|
102 |
+
|
103 |
+
if($eot['type'] === 'fixed' && $eot['time'] && $eot['tense'] === 'past')
|
104 |
+
$details = $attr['past_format'];
|
105 |
+
|
106 |
+
else if($eot['type'] === 'fixed' && $eot['time'] && $eot['tense'] === 'future')
|
107 |
+
$details = $attr['future_format'];
|
108 |
+
|
109 |
+
else if($eot['type'] === 'next' && $eot['time'] && $eot['tense'] === 'future')
|
110 |
+
$details = $attr['next_format'];
|
111 |
+
|
112 |
+
else $details = $attr['empty_format'];
|
113 |
+
|
114 |
+
// Initialize EOT details/output date format.
|
115 |
+
|
116 |
+
$time = null; // Initialize the time calculation.
|
117 |
+
if($eot['time']) // // Do we have a time to work with?
|
118 |
+
{
|
119 |
+
$time = new DateTime(date('Y-m-d H:i:s', $eot['time']));
|
120 |
+
if($attr['timezone'] && strtoupper($attr['timezone']) !== 'UTC')
|
121 |
+
$time->setTimezone(new DateTimeZone($attr['timezone']));
|
122 |
+
}
|
123 |
+
if($time && $attr['date_format'] === 'timestamp')
|
124 |
+
$date = (string)$time->getTimestamp();
|
125 |
+
|
126 |
+
else if($time && $attr['date_format'] === 'default')
|
127 |
+
$date = $time->format(get_option('date_format'));
|
128 |
+
|
129 |
+
else if($time && $attr['date_format'])
|
130 |
+
$date = $time->format($attr['date_format']);
|
131 |
+
|
132 |
+
else if($time) // Default date/time format.
|
133 |
+
$date = $time->format('M jS, Y, g:i a T');
|
134 |
+
|
135 |
+
else $date = ''; // Default date; i.e., nothing.
|
136 |
+
|
137 |
+
$details = str_ireplace('%%date%%', esc_html($date), $details);
|
138 |
+
|
139 |
+
// Check special considerations and the current mode.
|
140 |
+
|
141 |
+
if($eot['type'] === 'fixed' && !$GLOBALS['WS_PLUGIN__']['s2member']['o']['auto_eot_system_enabled'])
|
142 |
+
{
|
143 |
+
$details = $attr['empty_format']; // EOTs are disabled on this site.
|
144 |
+
$eot['debug'] = 's2Member\'s Auto-EOT System is disabled on this site.';
|
145 |
+
}
|
146 |
+
else if($eot['type'] === 'fixed' && $mode === 'next')
|
147 |
+
{
|
148 |
+
$details = $attr['empty_format']; // Empty this.
|
149 |
+
$eot['debug'] = 'No fixed EOT time was found for this user.';
|
150 |
+
}
|
151 |
+
else if($eot['type'] === 'next' && $mode === 'fixed')
|
152 |
+
{
|
153 |
+
$details = $attr['empty_format']; // Empty this.
|
154 |
+
$eot['debug'] = 'No more payments needed from this user.';
|
155 |
+
}
|
156 |
+
// Wrapper and debug info...
|
157 |
+
|
158 |
+
if($details) // Wrapper for CSS styling.
|
159 |
+
$details = '<span class="ws-plugin--s2member-sc-eot">'.$details.'</span>';
|
160 |
+
|
161 |
+
if(filter_var($attr['debug'], FILTER_VALIDATE_BOOLEAN))
|
162 |
+
$details .= '<pre>'.esc_html($eot['debug'] ? $eot['debug'] : 'Unknown error.').'</pre>';
|
163 |
+
|
164 |
+
// Return the details/output from this shortcode.
|
165 |
+
|
166 |
+
return apply_filters('ws_plugin__s2member_sc_eot_details', $details, get_defined_vars());
|
167 |
+
}
|
168 |
+
}
|
169 |
+
}
|
includes/classes/sc-eots.inc.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Shortcode `[s2Eot /]`.
|
4 |
+
*
|
5 |
+
* Copyright: © 2009-2011
|
6 |
+
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
+
* (coded in the USA)
|
8 |
+
*
|
9 |
+
* Released under the terms of the GNU General Public License.
|
10 |
+
* You should have received a copy of the GNU General Public License,
|
11 |
+
* along with this software. In the main directory, see: /licensing/
|
12 |
+
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
+
*
|
14 |
+
* @package s2Member\s2Eot
|
15 |
+
* @since 150713
|
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_sc_eots'))
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* Shortcode `[s2Eot /]`.
|
24 |
+
*
|
25 |
+
* @package s2Member\s2Eot
|
26 |
+
* @since 150713
|
27 |
+
*/
|
28 |
+
class c_ws_plugin__s2member_sc_eots
|
29 |
+
{
|
30 |
+
/**
|
31 |
+
* Handles the Shortcode for: `[s2Eot /]`.
|
32 |
+
*
|
33 |
+
* @package s2Member\s2Eot
|
34 |
+
* @since 150713
|
35 |
+
*
|
36 |
+
* @attaches-to ``add_shortcode('s2Eot');``
|
37 |
+
*
|
38 |
+
* @param array $attr An array of Attributes.
|
39 |
+
* @param string $content Content inside the Shortcode.
|
40 |
+
* @param string $shortcode The actual Shortcode name itself.
|
41 |
+
*
|
42 |
+
* @return string Return-value of inner routine.
|
43 |
+
*/
|
44 |
+
public static function sc_eot_details($attr = array(), $content = '', $shortcode = '')
|
45 |
+
{
|
46 |
+
return c_ws_plugin__s2member_sc_eots_in::sc_eot_details($attr, $content, $shortcode);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
}
|
includes/classes/sc-files.inc.php
CHANGED
@@ -63,4 +63,3 @@ if(!class_exists("c_ws_plugin__s2member_sc_files"))
|
|
63 |
}
|
64 |
}
|
65 |
}
|
66 |
-
?>
|
63 |
}
|
64 |
}
|
65 |
}
|
|
includes/classes/sc-gets-in.inc.php
CHANGED
@@ -39,7 +39,7 @@ if(!class_exists('c_ws_plugin__s2member_sc_gets_in'))
|
|
39 |
* @param string $content Content inside the Shortcode.
|
40 |
* @param string $shortcode The actual Shortcode name itself.
|
41 |
*
|
42 |
-
* @return mixed Value of the requested data
|
43 |
*/
|
44 |
public static function sc_get_details($attr = array(), $content = '', $shortcode = '')
|
45 |
{
|
@@ -47,9 +47,22 @@ if(!class_exists('c_ws_plugin__s2member_sc_gets_in'))
|
|
47 |
do_action('ws_plugin__s2member_before_sc_get_details', get_defined_vars());
|
48 |
unset($__refs, $__v); // Allow variables to be modified by reference.
|
49 |
|
50 |
-
|
51 |
-
$attr = shortcode_atts(array('constant' => '', 'user_field' => '', 'user_option' => '', 'user_id' => ''), $attr);
|
52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
54 |
do_action('ws_plugin__s2member_before_sc_get_details_after_shortcode_atts', get_defined_vars());
|
55 |
unset($__refs, $__v); // Allow variables to be modified by reference.
|
@@ -60,11 +73,38 @@ if(!class_exists('c_ws_plugin__s2member_sc_gets_in'))
|
|
60 |
$get = constant($attr['constant']);
|
61 |
}
|
62 |
else if($attr['user_field'] && (is_user_logged_in() || $attr['user_id']))
|
63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
else if($attr['user_option'] && (is_user_logged_in() || $attr['user_id']))
|
66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
if(isset($get) && (is_array($get) || is_object($get)))
|
69 |
{
|
70 |
$_get_array = $get; // Temporary variable.
|
@@ -86,4 +126,4 @@ if(!class_exists('c_ws_plugin__s2member_sc_gets_in'))
|
|
86 |
return apply_filters('ws_plugin__s2member_sc_get_details', isset($get) ? $get : '', get_defined_vars());
|
87 |
}
|
88 |
}
|
89 |
-
}
|
39 |
* @param string $content Content inside the Shortcode.
|
40 |
* @param string $shortcode The actual Shortcode name itself.
|
41 |
*
|
42 |
+
* @return mixed Value of the requested data.
|
43 |
*/
|
44 |
public static function sc_get_details($attr = array(), $content = '', $shortcode = '')
|
45 |
{
|
47 |
do_action('ws_plugin__s2member_before_sc_get_details', get_defined_vars());
|
48 |
unset($__refs, $__v); // Allow variables to be modified by reference.
|
49 |
|
50 |
+
c_ws_plugin__s2member_no_cache::no_cache_constants(true);
|
|
|
51 |
|
52 |
+
$attr = shortcode_atts( // Attributes.
|
53 |
+
array(
|
54 |
+
// One of these.
|
55 |
+
'constant' => '',
|
56 |
+
'user_field' => '',
|
57 |
+
'user_option' => '',
|
58 |
+
|
59 |
+
// Options.
|
60 |
+
'user_id' => '',
|
61 |
+
'date_format' => '',
|
62 |
+
'size' => '',
|
63 |
+
),
|
64 |
+
c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr)
|
65 |
+
);
|
66 |
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
67 |
do_action('ws_plugin__s2member_before_sc_get_details_after_shortcode_atts', get_defined_vars());
|
68 |
unset($__refs, $__v); // Allow variables to be modified by reference.
|
73 |
$get = constant($attr['constant']);
|
74 |
}
|
75 |
else if($attr['user_field'] && (is_user_logged_in() || $attr['user_id']))
|
76 |
+
{
|
77 |
+
$user_field_args = array('size' => $attr['size']);
|
78 |
+
$get = c_ws_plugin__s2member_utils_users::get_user_field($attr['user_field'], (int)$attr['user_id'], $user_field_args);
|
79 |
+
|
80 |
+
if(preg_match('/time$/i', $attr['user_field']) && $attr['date_format'])
|
81 |
+
if(is_numeric($get) && strlen($get) === 10) // Timestamp?
|
82 |
+
{
|
83 |
+
if($attr['date_format'] === 'timestamp')
|
84 |
+
$get = (string)$get; // No change.
|
85 |
|
86 |
+
else if($attr['date_format'] === 'default')
|
87 |
+
$get = date(get_option('date_format'), (integer)$get);
|
88 |
+
|
89 |
+
else $get = date($attr['date_format'], (integer)$get);
|
90 |
+
}
|
91 |
+
}
|
92 |
else if($attr['user_option'] && (is_user_logged_in() || $attr['user_id']))
|
93 |
+
{
|
94 |
+
$get = get_user_option($attr['user_option'], (int)$attr['user_id']);
|
95 |
+
|
96 |
+
if(preg_match('/time$/i', $attr['user_option']) && $attr['date_format'])
|
97 |
+
if(is_numeric($get) && strlen($get) === 10) // Timestamp?
|
98 |
+
{
|
99 |
+
if($attr['date_format'] === 'timestamp')
|
100 |
+
$get = (string)$get; // No change.
|
101 |
|
102 |
+
else if($attr['date_format'] === 'default')
|
103 |
+
$get = date(get_option('date_format'), (integer)$get);
|
104 |
+
|
105 |
+
else $get = date($attr['date_format'], (integer)$get);
|
106 |
+
}
|
107 |
+
}
|
108 |
if(isset($get) && (is_array($get) || is_object($get)))
|
109 |
{
|
110 |
$_get_array = $get; // Temporary variable.
|
126 |
return apply_filters('ws_plugin__s2member_sc_get_details', isset($get) ? $get : '', get_defined_vars());
|
127 |
}
|
128 |
}
|
129 |
+
}
|
includes/classes/sc-gets.inc.php
CHANGED
@@ -46,4 +46,4 @@ if(!class_exists('c_ws_plugin__s2member_sc_gets'))
|
|
46 |
return c_ws_plugin__s2member_sc_gets_in::sc_get_details($attr, $content, $shortcode);
|
47 |
}
|
48 |
}
|
49 |
-
}
|
46 |
return c_ws_plugin__s2member_sc_gets_in::sc_get_details($attr, $content, $shortcode);
|
47 |
}
|
48 |
}
|
49 |
+
}
|
includes/classes/sc-if-conds-in.inc.php
CHANGED
@@ -60,6 +60,8 @@ if(!class_exists('c_ws_plugin__s2member_sc_if_conds_in'))
|
|
60 |
do_action('ws_plugin__s2member_before_sc_if_conditionals', get_defined_vars());
|
61 |
unset($__refs, $__v); // Allows variables to be modified by reference.
|
62 |
|
|
|
|
|
63 |
$blog_farm_safe = apply_filters('ws_plugin__s2member_sc_if_conditionals_blog_farm_safe',
|
64 |
array('is_user_logged_in', 'is_user_not_logged_in',
|
65 |
'user_is', 'user_is_not', 'user_can', 'user_cannot',
|
@@ -317,4 +319,4 @@ if(!class_exists('c_ws_plugin__s2member_sc_if_conds_in'))
|
|
317 |
return eval('return ('.(string)$expression.');');
|
318 |
}
|
319 |
}
|
320 |
-
}
|
60 |
do_action('ws_plugin__s2member_before_sc_if_conditionals', get_defined_vars());
|
61 |
unset($__refs, $__v); // Allows variables to be modified by reference.
|
62 |
|
63 |
+
c_ws_plugin__s2member_no_cache::no_cache_constants(true);
|
64 |
+
|
65 |
$blog_farm_safe = apply_filters('ws_plugin__s2member_sc_if_conditionals_blog_farm_safe',
|
66 |
array('is_user_logged_in', 'is_user_not_logged_in',
|
67 |
'user_is', 'user_is_not', 'user_can', 'user_cannot',
|
319 |
return eval('return ('.(string)$expression.');');
|
320 |
}
|
321 |
}
|
322 |
+
}
|
includes/classes/sc-paypal-button-e.inc.php
CHANGED
@@ -94,4 +94,3 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_e"))
|
|
94 |
}
|
95 |
}
|
96 |
}
|
97 |
-
?>
|
94 |
}
|
95 |
}
|
96 |
}
|
|
includes/classes/sc-paypal-button-in.inc.php
CHANGED
@@ -292,4 +292,3 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
|
|
292 |
}
|
293 |
}
|
294 |
}
|
295 |
-
?>
|
292 |
}
|
293 |
}
|
294 |
}
|
|
includes/classes/sc-paypal-button.inc.php
CHANGED
@@ -46,4 +46,3 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button"))
|
|
46 |
}
|
47 |
}
|
48 |
}
|
49 |
-
?>
|
46 |
}
|
47 |
}
|
48 |
}
|
|
includes/classes/sc-profile-in.inc.php
CHANGED
@@ -47,7 +47,7 @@ if(!class_exists('c_ws_plugin__s2member_sc_profile_in'))
|
|
47 |
do_action('ws_plugin__s2member_before_sc_profile', get_defined_vars());
|
48 |
unset($__refs, $__v);
|
49 |
|
50 |
-
c_ws_plugin__s2member_no_cache::no_cache_constants(
|
51 |
|
52 |
$tabindex = apply_filters('ws_plugin__s2member_sc_profile_tabindex', 0, get_defined_vars());
|
53 |
|
@@ -306,4 +306,4 @@ if(!class_exists('c_ws_plugin__s2member_sc_profile_in'))
|
|
306 |
return apply_filters('ws_plugin__s2member_sc_profile', ((!empty($code)) ? $code : NULL), get_defined_vars());
|
307 |
}
|
308 |
}
|
309 |
-
}
|
47 |
do_action('ws_plugin__s2member_before_sc_profile', get_defined_vars());
|
48 |
unset($__refs, $__v);
|
49 |
|
50 |
+
c_ws_plugin__s2member_no_cache::no_cache_constants(true);
|
51 |
|
52 |
$tabindex = apply_filters('ws_plugin__s2member_sc_profile_tabindex', 0, get_defined_vars());
|
53 |
|
306 |
return apply_filters('ws_plugin__s2member_sc_profile', ((!empty($code)) ? $code : NULL), get_defined_vars());
|
307 |
}
|
308 |
}
|
309 |
+
}
|
includes/classes/sc-profile.inc.php
CHANGED
@@ -46,4 +46,3 @@ if (!class_exists ("c_ws_plugin__s2member_sc_profile"))
|
|
46 |
}
|
47 |
}
|
48 |
}
|
49 |
-
?>
|
46 |
}
|
47 |
}
|
48 |
}
|
|
includes/classes/sc-s-badge-in.inc.php
CHANGED
@@ -1,59 +1,57 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Shortcode for `[s2Member-Security-Badge /]` (inner processing routines).
|
4 |
-
*
|
5 |
-
* Copyright: © 2009-2011
|
6 |
-
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
-
* (coded in the USA)
|
8 |
-
*
|
9 |
-
* Released under the terms of the GNU General Public License.
|
10 |
-
* You should have received a copy of the GNU General Public License,
|
11 |
-
* along with this software. In the main directory, see: /licensing/
|
12 |
-
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
-
*
|
14 |
-
* @package s2Member\Security_Badges
|
15 |
-
* @since 110524RC
|
16 |
-
*/
|
17 |
if(!defined('WPINC')) // MUST have WordPress.
|
18 |
-
exit(
|
19 |
|
20 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
{
|
22 |
/**
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
* @return string Resulting Security Badge code; HTML markup.
|
42 |
-
*/
|
43 |
-
public static function sc_s_badge ($attr = FALSE, $content = FALSE, $shortcode = FALSE)
|
44 |
-
{
|
45 |
-
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
|
46 |
-
do_action("ws_plugin__s2member_before_sc_s_badge", get_defined_vars ());
|
47 |
-
unset($__refs, $__v);
|
48 |
|
49 |
-
|
|
|
|
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
$code = c_ws_plugin__s2member_utilities::s_badge_gen ($attr["v"], false, false);
|
54 |
-
|
55 |
-
return apply_filters("ws_plugin__s2member_sc_s_badge", $code, get_defined_vars ());
|
56 |
-
}
|
57 |
-
}
|
58 |
}
|
59 |
-
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Shortcode for `[s2Member-Security-Badge /]` (inner processing routines).
|
4 |
+
*
|
5 |
+
* Copyright: © 2009-2011
|
6 |
+
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
+
* (coded in the USA)
|
8 |
+
*
|
9 |
+
* Released under the terms of the GNU General Public License.
|
10 |
+
* You should have received a copy of the GNU General Public License,
|
11 |
+
* along with this software. In the main directory, see: /licensing/
|
12 |
+
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
+
*
|
14 |
+
* @package s2Member\Security_Badges
|
15 |
+
* @since 110524RC
|
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_sc_s_badge_in'))
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* Shortcode for `[s2Member-Security-Badge /]` (inner processing routines).
|
24 |
+
*
|
25 |
+
* @package s2Member\Security_Badges
|
26 |
+
* @since 110524RC
|
27 |
+
*/
|
28 |
+
class c_ws_plugin__s2member_sc_s_badge_in
|
29 |
{
|
30 |
/**
|
31 |
+
* Handles the Shortcode for: `[s2Member-Security-Badge /]`.
|
32 |
+
*
|
33 |
+
* @package s2Member\Security_Badges
|
34 |
+
* @since 110524RC
|
35 |
+
*
|
36 |
+
* @attaches-to ``add_shortcode('s2Member-Security-Badge');``
|
37 |
+
*
|
38 |
+
* @param array $attr An array of Attributes.
|
39 |
+
* @param string $content Content inside the Shortcode.
|
40 |
+
* @param string $shortcode The actual Shortcode name itself.
|
41 |
+
*
|
42 |
+
* @return string Resulting Security Badge code; HTML markup.
|
43 |
+
*/
|
44 |
+
public static function sc_s_badge($attr = array(), $content = '', $shortcode = '')
|
45 |
+
{
|
46 |
+
foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
|
47 |
+
do_action('ws_plugin__s2member_before_sc_s_badge', get_defined_vars());
|
48 |
+
unset($__refs, $__v);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
+
$attr = c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr);
|
51 |
+
$attr = shortcode_atts(array('v' => '1'), $attr); // One attribute.
|
52 |
+
$code = c_ws_plugin__s2member_utilities::s_badge_gen($attr['v'], FALSE, FALSE);
|
53 |
|
54 |
+
return apply_filters('ws_plugin__s2member_sc_s_badge', $code, get_defined_vars());
|
55 |
+
}
|
|
|
|
|
|
|
|
|
|
|
56 |
}
|
57 |
+
}
|
includes/classes/sc-s-badge.inc.php
CHANGED
@@ -1,49 +1,49 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Shortcode for `[s2Member-Security-Badge /]`.
|
4 |
-
*
|
5 |
-
* Copyright: © 2009-2011
|
6 |
-
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
-
* (coded in the USA)
|
8 |
-
*
|
9 |
-
* Released under the terms of the GNU General Public License.
|
10 |
-
* You should have received a copy of the GNU General Public License,
|
11 |
-
* along with this software. In the main directory, see: /licensing/
|
12 |
-
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
-
*
|
14 |
-
* @package s2Member\Security_Badges
|
15 |
-
* @since 110524RC
|
16 |
-
*/
|
17 |
if(!defined('WPINC')) // MUST have WordPress.
|
18 |
-
exit (
|
19 |
|
20 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
{
|
22 |
/**
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
* @param string $shortcode The actual Shortcode name itself.
|
41 |
-
* @return inner Return-value of inner routine.
|
42 |
-
*/
|
43 |
-
public static function sc_s_badge ($attr = FALSE, $content = FALSE, $shortcode = FALSE)
|
44 |
-
{
|
45 |
-
return c_ws_plugin__s2member_sc_s_badge_in::sc_s_badge ($attr, $content, $shortcode);
|
46 |
-
}
|
47 |
-
}
|
48 |
}
|
49 |
-
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Shortcode for `[s2Member-Security-Badge /]`.
|
4 |
+
*
|
5 |
+
* Copyright: © 2009-2011
|
6 |
+
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
+
* (coded in the USA)
|
8 |
+
*
|
9 |
+
* Released under the terms of the GNU General Public License.
|
10 |
+
* You should have received a copy of the GNU General Public License,
|
11 |
+
* along with this software. In the main directory, see: /licensing/
|
12 |
+
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
+
*
|
14 |
+
* @package s2Member\Security_Badges
|
15 |
+
* @since 110524RC
|
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_sc_s_badge'))
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* Shortcode for `[s2Member-Security-Badge /]`.
|
24 |
+
*
|
25 |
+
* @package s2Member\Security_Badges
|
26 |
+
* @since 110524RC
|
27 |
+
*/
|
28 |
+
class c_ws_plugin__s2member_sc_s_badge
|
29 |
{
|
30 |
/**
|
31 |
+
* Handles the Shortcode for: `[s2Member-Security-Badge /]`.
|
32 |
+
*
|
33 |
+
* @package s2Member\Security_Badges
|
34 |
+
* @since 110524RC
|
35 |
+
*
|
36 |
+
* @attaches-to ``add_shortcode('s2Member-Security-Badge');``
|
37 |
+
*
|
38 |
+
* @param array $attr An array of Attributes.
|
39 |
+
* @param string $content Content inside the Shortcode.
|
40 |
+
* @param string $shortcode The actual Shortcode name itself.
|
41 |
+
*
|
42 |
+
* @return string Return-value of inner routine.
|
43 |
+
*/
|
44 |
+
public static function sc_s_badge($attr = array(), $content = '', $shortcode = '')
|
45 |
+
{
|
46 |
+
return c_ws_plugin__s2member_sc_s_badge_in::sc_s_badge($attr, $content, $shortcode);
|
47 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
}
|
49 |
+
}
|
includes/classes/sp-access.inc.php
CHANGED
@@ -177,4 +177,3 @@ if (!class_exists ("c_ws_plugin__s2member_sp_access"))
|
|
177 |
}
|
178 |
}
|
179 |
}
|
180 |
-
?>
|
177 |
}
|
178 |
}
|
179 |
}
|
|
includes/classes/ssl-in.inc.php
CHANGED
@@ -146,7 +146,7 @@ if(!class_exists('c_ws_plugin__s2member_ssl_in'))
|
|
146 |
$ssl_entire_tags = array_unique(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_ssl_buffer_entire_tags', array('script', 'style', 'iframe', 'object', 'embed', 'video'), get_defined_vars())));
|
147 |
$non_ssl_entire_tags = array_unique(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_non_ssl_buffer_entire_tags', array(), get_defined_vars())));
|
148 |
|
149 |
-
$ssl_attr_only_tags = array_unique(array_diff(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_ssl_buffer_attr_only_tags', array('link', 'img', 'input'), get_defined_vars())), $ssl_entire_tags));
|
150 |
$non_ssl_attr_only_tags = array_unique(array_diff(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_non_ssl_buffer_attr_only_tags', array('a'), get_defined_vars())), $non_ssl_entire_tags));
|
151 |
|
152 |
$buffer = ($ssl_entire_tags) ? preg_replace_callback('/\<('.implode('|', c_ws_plugin__s2member_utils_strings::preg_quote_deep($ssl_entire_tags, '/')).')(?![a-z_0-9\-])[^\>]*?\>.*?\<\/\\1\>/is', '_ws_plugin__s2member_force_ssl_buffer_callback', $buffer) : $buffer;
|
@@ -164,4 +164,4 @@ if(!class_exists('c_ws_plugin__s2member_ssl_in'))
|
|
164 |
}
|
165 |
}
|
166 |
}
|
167 |
-
}
|
146 |
$ssl_entire_tags = array_unique(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_ssl_buffer_entire_tags', array('script', 'style', 'iframe', 'object', 'embed', 'video'), get_defined_vars())));
|
147 |
$non_ssl_entire_tags = array_unique(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_non_ssl_buffer_entire_tags', array(), get_defined_vars())));
|
148 |
|
149 |
+
$ssl_attr_only_tags = array_unique(array_diff(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_ssl_buffer_attr_only_tags', array('link', 'img', 'form', 'input'), get_defined_vars())), $ssl_entire_tags));
|
150 |
$non_ssl_attr_only_tags = array_unique(array_diff(array_map('strtolower', apply_filters('_ws_plugin__s2member_force_non_ssl_buffer_attr_only_tags', array('a'), get_defined_vars())), $non_ssl_entire_tags));
|
151 |
|
152 |
$buffer = ($ssl_entire_tags) ? preg_replace_callback('/\<('.implode('|', c_ws_plugin__s2member_utils_strings::preg_quote_deep($ssl_entire_tags, '/')).')(?![a-z_0-9\-])[^\>]*?\>.*?\<\/\\1\>/is', '_ws_plugin__s2member_force_ssl_buffer_callback', $buffer) : $buffer;
|
164 |
}
|
165 |
}
|
166 |
}
|
167 |
+
}
|
includes/classes/user-deletions.inc.php
CHANGED
@@ -106,10 +106,10 @@ if(!class_exists('c_ws_plugin__s2member_user_deletions'))
|
|
106 |
unset($__refs, $__v);
|
107 |
|
108 |
delete_user_option($user_id, 's2member_custom');
|
|
|
109 |
delete_user_option($user_id, 's2member_subscr_id');
|
110 |
delete_user_option($user_id, 's2member_subscr_baid');
|
111 |
delete_user_option($user_id, 's2member_subscr_cid');
|
112 |
-
delete_user_option($user_id, 's2member_subscr_gateway');
|
113 |
|
114 |
delete_user_option($user_id, 's2member_custom_fields');
|
115 |
delete_user_option($user_id, 's2member_registration_ip');
|
@@ -128,6 +128,7 @@ if(!class_exists('c_ws_plugin__s2member_user_deletions'))
|
|
128 |
delete_user_option($user_id, 's2member_file_download_access_arc');
|
129 |
delete_user_option($user_id, 's2member_file_download_access_log');
|
130 |
|
|
|
131 |
delete_user_option($user_id, 's2member_login_counter');
|
132 |
delete_user_option($user_id, 's2member_notes');
|
133 |
|
@@ -219,4 +220,4 @@ if(!class_exists('c_ws_plugin__s2member_user_deletions'))
|
|
219 |
unset($__refs, $__v);
|
220 |
}
|
221 |
}
|
222 |
-
}
|
106 |
unset($__refs, $__v);
|
107 |
|
108 |
delete_user_option($user_id, 's2member_custom');
|
109 |
+
delete_user_option($user_id, 's2member_subscr_gateway');
|
110 |
delete_user_option($user_id, 's2member_subscr_id');
|
111 |
delete_user_option($user_id, 's2member_subscr_baid');
|
112 |
delete_user_option($user_id, 's2member_subscr_cid');
|
|
|
113 |
|
114 |
delete_user_option($user_id, 's2member_custom_fields');
|
115 |
delete_user_option($user_id, 's2member_registration_ip');
|
128 |
delete_user_option($user_id, 's2member_file_download_access_arc');
|
129 |
delete_user_option($user_id, 's2member_file_download_access_log');
|
130 |
|
131 |
+
delete_user_option($user_id, 's2member_last_auto_eot_time');
|
132 |
delete_user_option($user_id, 's2member_login_counter');
|
133 |
delete_user_option($user_id, 's2member_notes');
|
134 |
|
220 |
unset($__refs, $__v);
|
221 |
}
|
222 |
}
|
223 |
+
}
|
includes/classes/user-new-in.inc.php
CHANGED
@@ -154,7 +154,7 @@ if (!class_exists ("c_ws_plugin__s2member_user_new_in"))
|
|
154 |
unset($__refs, $__v);
|
155 |
|
156 |
$unfs .= '<tr>' . "\n";
|
157 |
-
$unfs .= '<th><label for="ws-plugin--s2member-user-new-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
158 |
$unfs .= '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_user_new_s2member_ccaps" id="ws-plugin--s2member-user-new-s2member-ccaps" value="' . format_to_edit ($_p["ws_plugin__s2member_user_new_s2member_ccaps"]) . '" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>' . "\n";
|
159 |
$unfs .= '</tr>' . "\n";
|
160 |
|
@@ -278,4 +278,3 @@ if (!class_exists ("c_ws_plugin__s2member_user_new_in"))
|
|
278 |
}
|
279 |
}
|
280 |
}
|
281 |
-
?>
|
154 |
unset($__refs, $__v);
|
155 |
|
156 |
$unfs .= '<tr>' . "\n";
|
157 |
+
$unfs .= '<th><label for="ws-plugin--s2member-user-new-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.' . ((is_multisite ()) ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '') . '\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
|
158 |
$unfs .= '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_user_new_s2member_ccaps" id="ws-plugin--s2member-user-new-s2member-ccaps" value="' . format_to_edit ($_p["ws_plugin__s2member_user_new_s2member_ccaps"]) . '" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>' . "\n";
|
159 |
$unfs .= '</tr>' . "\n";
|
160 |
|
278 |
}
|
279 |
}
|
280 |
}
|
|
includes/classes/user-new.inc.php
CHANGED
@@ -58,4 +58,3 @@ if (!class_exists ("c_ws_plugin__s2member_user_new"))
|
|
58 |
}
|
59 |
}
|
60 |
}
|
61 |
-
?>
|
58 |
}
|
59 |
}
|
60 |
}
|
|
includes/classes/user-notes.inc.php
CHANGED
@@ -93,4 +93,3 @@ if (!class_exists ("c_ws_plugin__s2member_user_notes"))
|
|
93 |
}
|
94 |
}
|
95 |
}
|
96 |
-
?>
|
93 |
}
|
94 |
}
|
95 |
}
|
|
includes/classes/user-securities.inc.php
CHANGED
@@ -128,7 +128,7 @@ if(!class_exists('c_ws_plugin__s2member_user_securities'))
|
|
128 |
*
|
129 |
* Demo accounts *( where the Username MUST be 'demo' )*, will NOT be allowed to change their Password.
|
130 |
* Any other restrictions you need to impose must be done through custom programming, using s2Member's Conditionals.
|
131 |
-
* See `s2Member
|
132 |
*
|
133 |
* @package s2Member\User_Securities
|
134 |
* @since 3.5
|
@@ -157,5 +157,111 @@ if(!class_exists('c_ws_plugin__s2member_user_securities'))
|
|
157 |
|
158 |
return apply_filters('ws_plugin__s2member_hide_password_fields', $show, get_defined_vars());
|
159 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
}
|
161 |
-
}
|
128 |
*
|
129 |
* Demo accounts *( where the Username MUST be 'demo' )*, will NOT be allowed to change their Password.
|
130 |
* Any other restrictions you need to impose must be done through custom programming, using s2Member's Conditionals.
|
131 |
+
* See `s2Member → API Scripting`.
|
132 |
*
|
133 |
* @package s2Member\User_Securities
|
134 |
* @since 3.5
|
157 |
|
158 |
return apply_filters('ws_plugin__s2member_hide_password_fields', $show, get_defined_vars());
|
159 |
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Acquires password minimum length.
|
163 |
+
*
|
164 |
+
* @package s2Member\User_Securities
|
165 |
+
* @since 150717
|
166 |
+
*
|
167 |
+
* @param string $password The password to score.
|
168 |
+
*
|
169 |
+
* @return integer Password minimum length.
|
170 |
+
*/
|
171 |
+
public static function min_password_length()
|
172 |
+
{
|
173 |
+
$min = (integer)$GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password_min_length'];
|
174 |
+
return max(6, (integer)apply_filters('ws_plugin__s2member_min_password_length', $min > 0 ? $min : 0));
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Acquires minimum password strength code.
|
179 |
+
*
|
180 |
+
* @package s2Member\User_Securities
|
181 |
+
* @since 150717
|
182 |
+
*
|
183 |
+
* @return string Minimum password strength code.
|
184 |
+
*/
|
185 |
+
public static function min_password_strength_code()
|
186 |
+
{
|
187 |
+
$code = $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password_min_strength'];
|
188 |
+
return apply_filters('ws_plugin__s2member_min_password_strength_code', trim($code));
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Acquires minimum password strength label.
|
193 |
+
*
|
194 |
+
* @package s2Member\User_Securities
|
195 |
+
* @since 150717
|
196 |
+
*
|
197 |
+
* @return string Minimum password strength label.
|
198 |
+
*/
|
199 |
+
public static function min_password_strength_label()
|
200 |
+
{
|
201 |
+
switch(self::min_password_strength_code())
|
202 |
+
{
|
203 |
+
case 'weak': return _x('`weak`, `good`, or `strong`', 's2member-front', 's2member');
|
204 |
+
case 'good': return _x('`good` or `strong` (i.e., use numbers, letters, and mixed caSe)', 's2member-front', 's2member');
|
205 |
+
case 'strong': return _x('`strong` (i.e., use numbers, letters, mixed caSe, and punctuation)', 's2member-front', 's2member');
|
206 |
+
}
|
207 |
+
return ''; // Default behavior.
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Acquires minimum password strength score.
|
212 |
+
*
|
213 |
+
* @package s2Member\User_Securities
|
214 |
+
* @since 150717
|
215 |
+
*
|
216 |
+
* @return integer Minimum password strength score.
|
217 |
+
*/
|
218 |
+
public static function min_password_strength_score()
|
219 |
+
{
|
220 |
+
$score = 0; // Default behavior.
|
221 |
+
|
222 |
+
switch(self::min_password_strength_code())
|
223 |
+
{
|
224 |
+
case 'n/a': $score = 0; break;
|
225 |
+
case 'weak': $score = 10; break;
|
226 |
+
case 'good': $score = 30; break;
|
227 |
+
case 'strong': $score = 50; break;
|
228 |
+
}
|
229 |
+
return apply_filters('ws_plugin__s2member_min_password_strength_score', $score > 0 ? $score : 0);
|
230 |
+
}
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Acquires password strength score.
|
234 |
+
*
|
235 |
+
* @package s2Member\User_Securities
|
236 |
+
* @since 150717
|
237 |
+
*
|
238 |
+
* @param string $password The password to score.
|
239 |
+
*
|
240 |
+
* @return integer Password strength score.
|
241 |
+
*/
|
242 |
+
public static function password_strength_score($password)
|
243 |
+
{
|
244 |
+
$score = 0; // Initialize score.
|
245 |
+
|
246 |
+
if(strlen($password) < 1)
|
247 |
+
return $score;
|
248 |
+
|
249 |
+
else if(strlen($password) < self::min_password_length())
|
250 |
+
return $score;
|
251 |
+
|
252 |
+
if(preg_match('/[0-9]/', $password))
|
253 |
+
$score += 10;
|
254 |
+
|
255 |
+
if(preg_match('/[a-z]/', $password))
|
256 |
+
$score += 10;
|
257 |
+
|
258 |
+
if(preg_match('/[A-Z]/', $password))
|
259 |
+
$score += 10;
|
260 |
+
|
261 |
+
if(preg_match('/[^0-9a-zA-Z]/', $password))
|
262 |
+
$score += $score === 30 ? 20 : 10;
|
263 |
+
|
264 |
+
return apply_filters('ws_plugin__s2member_password_strength_score', $score > 0 ? $score : 0);
|
265 |
+
}
|
266 |
}
|
267 |
+
}
|
includes/classes/users-list-in.inc.php
CHANGED
@@ -178,7 +178,7 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
|
|
178 |
unset($__refs, $__v);
|
179 |
|
180 |
echo '<tr>'."\n";
|
181 |
-
echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
182 |
echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="'.format_to_edit(((!empty($ccaps)) ? implode(",", $ccaps) : "")).'" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>'."\n";
|
183 |
echo '</tr>'."\n";
|
184 |
|
@@ -195,7 +195,7 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
|
|
195 |
echo '<tr>'."\n";
|
196 |
$auto_eot_time = get_user_option("s2member_auto_eot_time", $user_id);
|
197 |
$auto_eot_time = ($auto_eot_time) ? date("D M j, Y g:i a T", $auto_eot_time) : "";
|
198 |
-
echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e., Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>'.(($auto_eot_time) ? '<br /><small>(<a href="
|
199 |
echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="'.format_to_edit($auto_eot_time).'" class="regular-text" /></td>'."\n";
|
200 |
echo '</tr>'."\n";
|
201 |
|
@@ -210,7 +210,7 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
|
|
210 |
unset($__refs, $__v);
|
211 |
|
212 |
echo '<tr>'."\n";
|
213 |
-
echo '<th><label for="ws-plugin--s2member-profile-reset-pass-resend">Reset Password & Resend Welcome Email Message:</label> <a href="#" onclick="alert(\'Checking this box will tell s2Member to reset this User\\\'s password and then reprocess the New User Email Notification message against this User\\\'s account. This way they\\\'ll get an email message with their Username/Password.\\n\\nThis can be helpful in cases where a User/Member missed the original email message for some reason.\\n\\nThe User\\\'s password is reset to a new auto-generated password by default. However, you can provide a custom password by entering a new password of your choosing in the field above—provided by WordPress itself.\\n\\nIt is also possible to customize the New User Email Notification message with s2Member. Please see: `Dashboard
|
214 |
echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_reset_pass_resend" id="ws-plugin--s2member-profile-reset-pass-resend" value="1" /> Yes, reset password & resend welcome email message to this User.</label></td>'."\n";
|
215 |
echo '</tr>'."\n";
|
216 |
|
@@ -257,7 +257,7 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
|
|
257 |
unset($__refs, $__v);
|
258 |
|
259 |
echo '<tr>'."\n";
|
260 |
-
echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses (as configured in your s2Member
|
261 |
echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>'.((c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_at_or_above_max(strtolower($user->user_login)) || c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security(strtolower($user->user_login))) ? '<br /><em>*WARNING* this User is at (or above) max allowable IP addresses (based on your IP Restrictions).</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>').'</td>'."\n";
|
262 |
echo '</tr>'."\n";
|
263 |
|
@@ -583,4 +583,4 @@ if(!class_exists("c_ws_plugin__s2member_users_list_in"))
|
|
583 |
unset($__refs, $__v);
|
584 |
}
|
585 |
}
|
586 |
-
}
|
178 |
unset($__refs, $__v);
|
179 |
|
180 |
echo '<tr>'."\n";
|
181 |
+
echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.'.((is_multisite()) ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '').'\'); return false;" tabindex="-1">[?]</a>'.((is_multisite()) ? '<br /><small>(for this Blog)</small>' : '').'</th>'."\n";
|
182 |
echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="'.format_to_edit(((!empty($ccaps)) ? implode(",", $ccaps) : "")).'" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>'."\n";
|
183 |
echo '</tr>'."\n";
|
184 |
|
195 |
echo '<tr>'."\n";
|
196 |
$auto_eot_time = get_user_option("s2member_auto_eot_time", $user_id);
|
197 |
$auto_eot_time = ($auto_eot_time) ? date("D M j, Y g:i a T", $auto_eot_time) : "";
|
198 |
+
echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e., Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>'.(($auto_eot_time) ? '<br /><small>(<a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time" target="_blank" rel="external">Universal Time / GMT</a>)</small>' : '').'</th>'."\n";
|
199 |
echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="'.format_to_edit($auto_eot_time).'" class="regular-text" /></td>'."\n";
|
200 |
echo '</tr>'."\n";
|
201 |
|
210 |
unset($__refs, $__v);
|
211 |
|
212 |
echo '<tr>'."\n";
|
213 |
+
echo '<th><label for="ws-plugin--s2member-profile-reset-pass-resend">Reset Password & Resend Welcome Email Message:</label> <a href="#" onclick="alert(\'Checking this box will tell s2Member to reset this User\\\'s password and then reprocess the New User Email Notification message against this User\\\'s account. This way they\\\'ll get an email message with their Username/Password.\\n\\nThis can be helpful in cases where a User/Member missed the original email message for some reason.\\n\\nThe User\\\'s password is reset to a new auto-generated password by default. However, you can provide a custom password by entering a new password of your choosing in the field above—provided by WordPress itself.\\n\\nIt is also possible to customize the New User Email Notification message with s2Member. Please see: `Dashboard → s2Member → General Options → Email Configuration → New User Notifications`.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
|
214 |
echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_reset_pass_resend" id="ws-plugin--s2member-profile-reset-pass-resend" value="1" /> Yes, reset password & resend welcome email message to this User.</label></td>'."\n";
|
215 |
echo '</tr>'."\n";
|
216 |
|
257 |
unset($__refs, $__v);
|
258 |
|
259 |
echo '<tr>'."\n";
|
260 |
+
echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses (as configured in your s2Member → General Options). Once that limit is reached, s2Member assumes there has been a security breach. At that time, s2Member will place a temporary ban (preventing access).\\n\\nIf you have spoken to a legitimate Customer that is receiving an error upon logging in (ex: 503 / too many IP addresses), you can remove this temporary ban by checking the box below. If the abusive behavior continues, s2Member will automatically re-instate IP Restrictions in the future. If you would like to gain further control over IP Restrictions, please check your General Options panel for s2Member.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
|
261 |
echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>'.((c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_at_or_above_max(strtolower($user->user_login)) || c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security(strtolower($user->user_login))) ? '<br /><em>*WARNING* this User is at (or above) max allowable IP addresses (based on your IP Restrictions).</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>').'</td>'."\n";
|
262 |
echo '</tr>'."\n";
|
263 |
|
583 |
unset($__refs, $__v);
|
584 |
}
|
585 |
}
|
586 |
+
}
|
includes/classes/utilities.inc.php
CHANGED
@@ -151,10 +151,42 @@ if(!class_exists('c_ws_plugin__s2member_utilities'))
|
|
151 |
{
|
152 |
if($v && file_exists(($template = dirname(dirname(__FILE__)).'/templates/badges/s-badge.php')))
|
153 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
$badge = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
|
155 |
-
|
156 |
-
$badge = preg_replace('/%%
|
157 |
-
$badge = preg_replace('/%%
|
|
|
|
|
|
|
158 |
}
|
159 |
return !empty($badge) ? $badge : ''; // Return Security Badge.
|
160 |
}
|
151 |
{
|
152 |
if($v && file_exists(($template = dirname(dirname(__FILE__)).'/templates/badges/s-badge.php')))
|
153 |
{
|
154 |
+
switch((integer)$v) // Width/height based on variation.
|
155 |
+
{
|
156 |
+
case 1: // Variation number 1.
|
157 |
+
|
158 |
+
$width_height_attrs = 'width="200" height="55"';
|
159 |
+
$width_height_styles = 'width:200px; height:55px;';
|
160 |
+
|
161 |
+
break; // Break switch loop.
|
162 |
+
|
163 |
+
case 2: // Variation number 2.
|
164 |
+
|
165 |
+
$width_height_attrs = 'width="180" height="58"';
|
166 |
+
$width_height_styles = 'width:180px; height:58px;';
|
167 |
+
|
168 |
+
break; // Break switch loop.
|
169 |
+
|
170 |
+
case 3: // Variation number 3.
|
171 |
+
|
172 |
+
$width_height_attrs = 'width="80" height="15"';
|
173 |
+
$width_height_styles = 'width:80px; height:15px;';
|
174 |
+
|
175 |
+
break; // Break switch loop.
|
176 |
+
|
177 |
+
default: // Default case handler.
|
178 |
+
|
179 |
+
$width_height_attrs = $width_height_styles = '';
|
180 |
+
|
181 |
+
break; // Break switch loop.
|
182 |
+
}
|
183 |
$badge = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
|
184 |
+
|
185 |
+
$badge = preg_replace('/%%v%%/i', (string)(integer)$v, $badge);
|
186 |
+
$badge = preg_replace('/%%site_url%%/i', urlencode(home_url()), $badge);
|
187 |
+
$badge = preg_replace('/%%no_cache%%/i', $no_cache ? '&no_cache='.urlencode(mt_rand()) : '', $badge);
|
188 |
+
$badge = preg_replace('/%%display_on_failure%%/i', $display_on_failure ? '&display_on_failure=1' : '', $badge);
|
189 |
+
$badge = preg_replace(array('/%%width_height_attrs%%/i', '/%%width_height_styles%%/i'), array($width_height_attrs, $width_height_styles), $badge);
|
190 |
}
|
191 |
return !empty($badge) ? $badge : ''; // Return Security Badge.
|
192 |
}
|
includes/classes/utils-arrays.inc.php
CHANGED
@@ -229,4 +229,3 @@ if (!class_exists ("c_ws_plugin__s2member_utils_arrays"))
|
|
229 |
}
|
230 |
}
|
231 |
}
|
232 |
-
?>
|
229 |
}
|
230 |
}
|
231 |
}
|
|
includes/classes/utils-captchas.inc.php
CHANGED
@@ -15,9 +15,9 @@
|
|
15 |
* @since 3.5
|
16 |
*/
|
17 |
if(!defined('WPINC')) // MUST have WordPress.
|
18 |
-
exit (
|
19 |
|
20 |
-
if (!class_exists (
|
21 |
{
|
22 |
/**
|
23 |
* Captcha utilities.
|
@@ -27,6 +27,19 @@ if (!class_exists ("c_ws_plugin__s2member_utils_captchas"))
|
|
27 |
*/
|
28 |
class c_ws_plugin__s2member_utils_captchas
|
29 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
/**
|
31 |
* Public/private keys to use for reCAPTCHA™.
|
32 |
*
|
@@ -35,13 +48,43 @@ if (!class_exists ("c_ws_plugin__s2member_utils_captchas"))
|
|
35 |
*
|
36 |
* @return array An array with with two elements: `public` and `private`.
|
37 |
*/
|
38 |
-
public static function recaptcha_keys
|
39 |
{
|
40 |
-
|
41 |
-
|
|
|
|
|
42 |
|
43 |
-
return apply_filters(
|
44 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
/**
|
46 |
* Verifies a reCAPTCHA™ code via Google.
|
47 |
*
|
@@ -52,13 +95,27 @@ if (!class_exists ("c_ws_plugin__s2member_utils_captchas"))
|
|
52 |
* @param string $response The value of `recaptcha_response_field` during form submission.
|
53 |
* @return bool True if ``$response`` is valid, else false.
|
54 |
*/
|
55 |
-
public static function recaptcha_code_validates
|
56 |
{
|
57 |
-
$keys = c_ws_plugin__s2member_utils_captchas::recaptcha_keys
|
58 |
-
$post_vars = array("privatekey" => $keys["private"], "remoteip" => $_SERVER["REMOTE_ADDR"], "challenge" => $challenge, "response" => $response);
|
59 |
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
}
|
|
|
62 |
/**
|
63 |
* Builds a reCAPTCHA™ JavaScript `script` tag for display.
|
64 |
*
|
@@ -70,18 +127,23 @@ if (!class_exists ("c_ws_plugin__s2member_utils_captchas"))
|
|
70 |
* @param string $error Optional. An error message to display.
|
71 |
* @return string HTML markup for JavaScript tag.
|
72 |
*/
|
73 |
-
public static function recaptcha_script_tag
|
74 |
{
|
75 |
-
$theme
|
76 |
-
$tabindex
|
77 |
-
$keys
|
78 |
|
79 |
-
|
80 |
-
|
81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
-
return $options
|
84 |
}
|
85 |
}
|
86 |
}
|
87 |
-
?>
|
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_utils_captchas'))
|
21 |
{
|
22 |
/**
|
23 |
* Captcha utilities.
|
27 |
*/
|
28 |
class c_ws_plugin__s2member_utils_captchas
|
29 |
{
|
30 |
+
/**
|
31 |
+
* Which reCAPTCHA™ version.
|
32 |
+
*
|
33 |
+
* @package s2Member\Utilities
|
34 |
+
* @since 150717
|
35 |
+
*
|
36 |
+
* @return string The version number.
|
37 |
+
*/
|
38 |
+
public static function recaptcha_version()
|
39 |
+
{
|
40 |
+
return apply_filters('ws_plugin__s2member_recaptcha_version', '1', get_defined_vars());
|
41 |
+
}
|
42 |
+
|
43 |
/**
|
44 |
* Public/private keys to use for reCAPTCHA™.
|
45 |
*
|
48 |
*
|
49 |
* @return array An array with with two elements: `public` and `private`.
|
50 |
*/
|
51 |
+
public static function recaptcha_keys()
|
52 |
{
|
53 |
+
// NOTE: Version 2 keys are only possible w/ s2Member Pro filters.
|
54 |
+
|
55 |
+
$public = $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['public_key'];
|
56 |
+
$private = $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['private_key'];
|
57 |
|
58 |
+
return apply_filters('ws_plugin__s2member_recaptcha_keys', array('public' => $public, 'private' => $private), get_defined_vars ());
|
59 |
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* reCAPTCHA™ post vars.
|
63 |
+
*
|
64 |
+
* @package s2Member\Utilities
|
65 |
+
* @since 150717
|
66 |
+
*
|
67 |
+
* @param array $post_vars Existing post vars array.
|
68 |
+
*
|
69 |
+
* @return array Post vars array, with reCAPTCHA™ challenge/response.
|
70 |
+
*/
|
71 |
+
public static function recaptcha_post_vars($post_vars = array())
|
72 |
+
{
|
73 |
+
$post_vars = (array)$post_vars; // Force array.
|
74 |
+
|
75 |
+
if(self::recaptcha_version() === '2')
|
76 |
+
{
|
77 |
+
$post_vars['g-recaptcha-response'] = isset($_POST['g-recaptcha-response']) ? trim(stripslashes((string)$_POST['g-recaptcha-response'])) : '';
|
78 |
+
$post_vars['recaptcha_challenge_field'] = $post_vars['recaptcha_response_field'] = $post_vars['g-recaptcha-response']; // Compatibility.
|
79 |
+
|
80 |
+
return apply_filters('ws_plugin__s2member_recaptcha_post_vars', $post_vars, get_defined_vars());
|
81 |
+
}
|
82 |
+
$post_vars['recaptcha_challenge_field'] = isset($_POST['recaptcha_challenge_field']) ? trim(stripslashes((string)$_POST['recaptcha_challenge_field'])) : '';
|
83 |
+
$post_vars['recaptcha_response_field'] = isset($_POST['recaptcha_response_field']) ? trim(stripslashes((string)$_POST['recaptcha_response_field'])) : '';
|
84 |
+
|
85 |
+
return apply_filters('ws_plugin__s2member_recaptcha_post_vars', $post_vars, get_defined_vars());
|
86 |
+
}
|
87 |
+
|
88 |
/**
|
89 |
* Verifies a reCAPTCHA™ code via Google.
|
90 |
*
|
95 |
* @param string $response The value of `recaptcha_response_field` during form submission.
|
96 |
* @return bool True if ``$response`` is valid, else false.
|
97 |
*/
|
98 |
+
public static function recaptcha_code_validates($challenge = '', $response = '')
|
99 |
{
|
100 |
+
$keys = c_ws_plugin__s2member_utils_captchas::recaptcha_keys();
|
|
|
101 |
|
102 |
+
if(self::recaptcha_version() === '2') // New API verifier.
|
103 |
+
{
|
104 |
+
$api_post_vars = array('secret' => $keys['private'], 'response' => $response, 'remoteip' => $_SERVER['REMOTE_ADDR']);
|
105 |
+
$api_response = c_ws_plugin__s2member_utils_urls::remote('https://www.google.com/recaptcha/api/siteverify', $api_post_vars);
|
106 |
+
$api_response = json_decode($api_response);
|
107 |
+
|
108 |
+
return is_object($api_response) && !empty($api_response->success);
|
109 |
+
}
|
110 |
+
else // Old API call; note that this is NOT over SSL for some reason.
|
111 |
+
{
|
112 |
+
$api_post_vars = array('privatekey' => $keys['private'], 'challenge' => $challenge, 'response' => $response, 'remoteip' => $_SERVER['REMOTE_ADDR']);
|
113 |
+
$api_response = c_ws_plugin__s2member_utils_urls::remote ('http://www.google.com/recaptcha/api/verify', $api_post_vars);
|
114 |
+
|
115 |
+
return preg_match('/^true/i', trim($api_response));
|
116 |
+
}
|
117 |
}
|
118 |
+
|
119 |
/**
|
120 |
* Builds a reCAPTCHA™ JavaScript `script` tag for display.
|
121 |
*
|
127 |
* @param string $error Optional. An error message to display.
|
128 |
* @return string HTML markup for JavaScript tag.
|
129 |
*/
|
130 |
+
public static function recaptcha_script_tag($theme = '', $tabindex = '', $error = '')
|
131 |
{
|
132 |
+
$theme = $theme ? $theme : 'clean';
|
133 |
+
$tabindex = strlen($tabindex) ? (int)$tabindex : -1;
|
134 |
+
$keys = c_ws_plugin__s2member_utils_captchas::recaptcha_keys();
|
135 |
|
136 |
+
if(self::recaptcha_version() === '2') // New API verifier.
|
137 |
+
{
|
138 |
+
$theme = !$theme || in_array($theme, array('red', 'white', 'clean', 'blackglass'), TRUE) ? 'light' : $theme;
|
139 |
+
return '<div class="g-recaptcha" data-sitekey="'.esc_attr($keys['public']).'" data-size="normal" data-theme="'.esc_attr($theme).'" data-tabindex="'.esc_attr($tabindex).'"></div>'.
|
140 |
+
'<script src="https://www.google.com/recaptcha/api.js"></script>';
|
141 |
+
}
|
142 |
+
$options = '<script type="text/javascript">'."if(typeof RecaptchaOptions !== 'object'){ var RecaptchaOptions = {theme: '".c_ws_plugin__s2member_utils_strings::esc_js_sq($theme)."', lang: '".c_ws_plugin__s2member_utils_strings::esc_js_sq($GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'])."', tabindex: ".$tabindex." }; }".'</script>'."\n";
|
143 |
+
$no_tabindex_icons = '<script type="text/javascript">'."if(typeof jQuery === 'function'){ jQuery('td a[id^=\"recaptcha\"]').removeAttr('tabindex'); }".'</script>';
|
144 |
+
$adjustments = !apply_filters('c_ws_plugin__s2member_utils_tabindex_recaptcha_icons', false, get_defined_vars ()) ? $no_tabindex_icons : '';
|
145 |
|
146 |
+
return $options.'<script type="text/javascript" src="'.esc_attr('https://www.google.com/recaptcha/api/challenge?k='.urlencode($keys['public'])).($error ? '&error='.urlencode($error) : '').'"></script>'.$adjustments;
|
147 |
}
|
148 |
}
|
149 |
}
|
|
includes/classes/utils-css.inc.php
CHANGED
@@ -82,4 +82,3 @@ if (!class_exists ("c_ws_plugin__s2member_utils_css"))
|
|
82 |
}
|
83 |
}
|
84 |
}
|
85 |
-
?>
|
82 |
}
|
83 |
}
|
84 |
}
|
|
includes/classes/utils-cur.inc.php
CHANGED
@@ -45,13 +45,19 @@ if(!class_exists('c_ws_plugin__s2member_utils_cur'))
|
|
45 |
{
|
46 |
if(is_numeric($a) && strlen($from) === 3 && strlen($to) === 3)
|
47 |
{
|
48 |
-
$
|
49 |
-
$endpoint = 'http://www.
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
}
|
56 |
return ''; // Default return value.
|
57 |
}
|
@@ -99,4 +105,4 @@ if(!class_exists('c_ws_plugin__s2member_utils_cur'))
|
|
99 |
return '$'; // Else `$` sign (default value).
|
100 |
}
|
101 |
}
|
102 |
-
}
|
45 |
{
|
46 |
if(is_numeric($a) && strlen($from) === 3 && strlen($to) === 3)
|
47 |
{
|
48 |
+
$regex = '/\<span\s+class\s*\=\s*(?:["\'])?bld(?:["\'])?\s*\>(?P<conversion>[0-9.]+)\s+'.preg_quote($to, '/').'\s*\<\/span\>/i';
|
49 |
+
$endpoint = 'http://www.google.com/finance/converter?a='.urlencode($a).'&from='.urlencode($from).'&to='.urlencode($to);
|
50 |
|
51 |
+
$prefix = 's2m_cur'; // Transient prefix.
|
52 |
+
$transient = $prefix.md5('s2member_cur_convert_'.$endpoint);
|
53 |
+
|
54 |
+
if(!($response = get_transient($transient)))
|
55 |
+
{
|
56 |
+
$response = c_ws_plugin__s2member_utils_urls::remote($endpoint);
|
57 |
+
set_transient($transient, $response, DAY_IN_SECONDS / 2);
|
58 |
+
}
|
59 |
+
if($response && preg_match($regex, $response, $m))
|
60 |
+
return number_format((float)$m['conversion'], 2, '.', '');
|
61 |
}
|
62 |
return ''; // Default return value.
|
63 |
}
|
105 |
return '$'; // Else `$` sign (default value).
|
106 |
}
|
107 |
}
|
108 |
+
}
|
includes/classes/utils-dirs.inc.php
CHANGED
@@ -204,4 +204,3 @@ if (!class_exists ("c_ws_plugin__s2member_utils_dirs"))
|
|
204 |
}
|
205 |
}
|
206 |
}
|
207 |
-
?>
|
204 |
}
|
205 |
}
|
206 |
}
|
|
includes/classes/utils-forms.inc.php
CHANGED
@@ -46,7 +46,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_forms"))
|
|
46 |
{
|
47 |
foreach ((array)c_ws_plugin__s2member_utils_forms::form_whips_2_array($form) as $name => $value)
|
48 |
{
|
49 |
-
if (strlen ($name) && strlen ($value)) // Check $name
|
50 |
|
51 |
if (strlen ($value = (preg_match ("/^http(s)?\:\/\//i", $value)) ? rawurlencode ($value) : urlencode ($value)))
|
52 |
{
|
@@ -95,4 +95,3 @@ if (!class_exists ("c_ws_plugin__s2member_utils_forms"))
|
|
95 |
}
|
96 |
}
|
97 |
}
|
98 |
-
?>
|
46 |
{
|
47 |
foreach ((array)c_ws_plugin__s2member_utils_forms::form_whips_2_array($form) as $name => $value)
|
48 |
{
|
49 |
+
if (strlen ($name) && strlen ($value)) // Check $name → $value lengths.
|
50 |
|
51 |
if (strlen ($value = (preg_match ("/^http(s)?\:\/\//i", $value)) ? rawurlencode ($value) : urlencode ($value)))
|
52 |
{
|
95 |
}
|
96 |
}
|
97 |
}
|
|
includes/classes/utils-html.inc.php
CHANGED
@@ -71,4 +71,3 @@ if (!class_exists ("c_ws_plugin__s2member_utils_html"))
|
|
71 |
}
|
72 |
}
|
73 |
}
|
74 |
-
?>
|
71 |
}
|
72 |
}
|
73 |
}
|
|
includes/classes/utils-time.inc.php
CHANGED
@@ -133,17 +133,27 @@ if(!class_exists('c_ws_plugin__s2member_utils_time'))
|
|
133 |
public static function auto_eot_time($user_id = 0, $period1 = '', $period3 = '', $eotper = '', $lpt = 0, $ext = 0)
|
134 |
{
|
135 |
$eot_grace_time = (integer)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time'];
|
136 |
-
$eot_grace_time = (integer)apply_filters('ws_plugin__s2member_eot_grace_time', $eot_grace_time
|
|
|
137 |
|
138 |
-
if($user_id && ($user = new WP_User ($user_id)) && $user->ID)
|
139 |
{
|
140 |
-
$registration_time
|
141 |
-
$last_payment_time
|
142 |
-
$last_payment_time
|
143 |
-
|
144 |
-
if(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
{
|
146 |
-
list
|
147 |
|
148 |
$days = 0; // Days start at 0.
|
149 |
|
@@ -157,9 +167,9 @@ if(!class_exists('c_ws_plugin__s2member_utils_time'))
|
|
157 |
$p1_days = (int)$num * (int)$days;
|
158 |
$p1_time = $p1_days * 86400;
|
159 |
}
|
160 |
-
if(
|
161 |
{
|
162 |
-
list
|
163 |
|
164 |
$days = 0; // Days start at 0.
|
165 |
|
@@ -173,22 +183,19 @@ if(!class_exists('c_ws_plugin__s2member_utils_time'))
|
|
173 |
$p3_days = (int)$num * (int)$days;
|
174 |
$p3_time = $p3_days * 86400;
|
175 |
}
|
176 |
-
if(!$last_payment_time) //
|
177 |
-
|
178 |
-
$auto_eot_time = $registration_time + $p1_time + $eot_grace_time;
|
179 |
|
180 |
-
|
181 |
-
else if($p1_time && $last_payment_time <= $registration_time + $p1_time)
|
182 |
$auto_eot_time = $last_payment_time + $p1_time + $eot_grace_time;
|
183 |
|
184 |
-
else
|
185 |
-
$auto_eot_time = $last_payment_time + $p3_time + $eot_grace_time;
|
186 |
}
|
187 |
else if($eotper) // Otherwise, if we have a specific EOT period; calculate from today.
|
188 |
{
|
189 |
-
if(
|
190 |
{
|
191 |
-
list
|
192 |
|
193 |
$days = 0; // Days start at 0.
|
194 |
|
@@ -199,19 +206,16 @@ if(!class_exists('c_ws_plugin__s2member_utils_time'))
|
|
199 |
$days = ($span === 'M') ? 30 : $days;
|
200 |
$days = ($span === 'Y') ? 365 : $days;
|
201 |
}
|
202 |
-
|
203 |
$eot_days = (int)$num * (int)$days;
|
204 |
$eot_time = $eot_days * 86400;
|
205 |
}
|
206 |
$auto_eot_time = strtotime('now') + $eot_time + $eot_grace_time;
|
207 |
}
|
208 |
-
settype($auto_eot_time, 'integer'); // Force to integer type here.
|
209 |
-
|
210 |
if($ext && $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_time_ext_behavior'] === 'extend')
|
211 |
if((int)$ext > strtotime('now')) // Existing EOT Time must be in the future.
|
212 |
$auto_eot_time = $auto_eot_time + ((int)$ext - strtotime('now'));
|
213 |
|
214 |
-
return
|
215 |
}
|
216 |
|
217 |
/**
|
@@ -347,4 +351,4 @@ if(!class_exists('c_ws_plugin__s2member_utils_time'))
|
|
347 |
return $amount_period_term; // Return converted value.
|
348 |
}
|
349 |
}
|
350 |
-
}
|
133 |
public static function auto_eot_time($user_id = 0, $period1 = '', $period3 = '', $eotper = '', $lpt = 0, $ext = 0)
|
134 |
{
|
135 |
$eot_grace_time = (integer)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time'];
|
136 |
+
$eot_grace_time = (integer)apply_filters('ws_plugin__s2member_eot_grace_time', $eot_grace_time);
|
137 |
+
$p1_time = $p3_time = $eot_time = $auto_eot_time = 0; // Intialize.
|
138 |
|
139 |
+
if($user_id && ($user = new WP_User ($user_id)) && $user->ID)
|
140 |
{
|
141 |
+
$registration_time = strtotime($user->user_registered);
|
142 |
+
$last_payment_time = get_user_option('s2member_last_payment_time', $user_id);
|
143 |
+
$last_payment_time = (int)$lpt ? (int)$lpt : (int)$last_payment_time;
|
144 |
+
$last_paid_access_cap_time = 0; // Initialize the last access cap time.
|
145 |
+
if(($access_cap_times = c_ws_plugin__s2member_access_cap_times::get_access_cap_times($user_id)))
|
146 |
+
foreach(array_reverse($access_cap_times, TRUE) as $_time => $_cap)
|
147 |
+
if(strpos($_cap, '-') !== 0 && $_cap !== 'level0')
|
148 |
+
{
|
149 |
+
$last_paid_access_cap_time = (integer)$_time;
|
150 |
+
break; // Got what we need; stop here.
|
151 |
+
}
|
152 |
+
unset($_time, $_cap); // Housekeeping.
|
153 |
+
|
154 |
+
if(($period1 = trim(strtoupper($period1))))
|
155 |
{
|
156 |
+
list($num, $span) = preg_split('/ /', $period1, 2);
|
157 |
|
158 |
$days = 0; // Days start at 0.
|
159 |
|
167 |
$p1_days = (int)$num * (int)$days;
|
168 |
$p1_time = $p1_days * 86400;
|
169 |
}
|
170 |
+
if(($period3 = trim(strtoupper($period3))))
|
171 |
{
|
172 |
+
list($num, $span) = preg_split('/ /', $period3, 2);
|
173 |
|
174 |
$days = 0; // Days start at 0.
|
175 |
|
183 |
$p3_days = (int)$num * (int)$days;
|
184 |
$p3_time = $p3_days * 86400;
|
185 |
}
|
186 |
+
if(!$last_payment_time) // No last payment time; i.e., has paid nothing yet?
|
187 |
+
$auto_eot_time = ($last_paid_access_cap_time ? $last_paid_access_cap_time : $registration_time) + $p1_time + $eot_grace_time;
|
|
|
188 |
|
189 |
+
else if($p1_time && $last_payment_time <= ($last_paid_access_cap_time ? $last_paid_access_cap_time : $registration_time) + $p1_time)
|
|
|
190 |
$auto_eot_time = $last_payment_time + $p1_time + $eot_grace_time;
|
191 |
|
192 |
+
else $auto_eot_time = $last_payment_time + $p3_time + $eot_grace_time;
|
|
|
193 |
}
|
194 |
else if($eotper) // Otherwise, if we have a specific EOT period; calculate from today.
|
195 |
{
|
196 |
+
if(($eotper = trim(strtoupper($eotper))))
|
197 |
{
|
198 |
+
list($num, $span) = preg_split('/ /', $eotper, 2);
|
199 |
|
200 |
$days = 0; // Days start at 0.
|
201 |
|
206 |
$days = ($span === 'M') ? 30 : $days;
|
207 |
$days = ($span === 'Y') ? 365 : $days;
|
208 |
}
|
|
|
209 |
$eot_days = (int)$num * (int)$days;
|
210 |
$eot_time = $eot_days * 86400;
|
211 |
}
|
212 |
$auto_eot_time = strtotime('now') + $eot_time + $eot_grace_time;
|
213 |
}
|
|
|
|
|
214 |
if($ext && $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_time_ext_behavior'] === 'extend')
|
215 |
if((int)$ext > strtotime('now')) // Existing EOT Time must be in the future.
|
216 |
$auto_eot_time = $auto_eot_time + ((int)$ext - strtotime('now'));
|
217 |
|
218 |
+
return $auto_eot_time <= 0 ? strtotime('now') : $auto_eot_time;
|
219 |
}
|
220 |
|
221 |
/**
|
351 |
return $amount_period_term; // Return converted value.
|
352 |
}
|
353 |
}
|
354 |
+
}
|
includes/classes/utils-urls.inc.php
CHANGED
@@ -15,9 +15,9 @@
|
|
15 |
* @since 3.5
|
16 |
*/
|
17 |
if(!defined('WPINC')) // MUST have WordPress.
|
18 |
-
exit(
|
19 |
|
20 |
-
if(!class_exists(
|
21 |
{
|
22 |
/**
|
23 |
* URL utilities.
|
@@ -37,8 +37,9 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
37 |
*/
|
38 |
public static function wp_signup_url()
|
39 |
{
|
40 |
-
return apply_filters(
|
41 |
}
|
|
|
42 |
/**
|
43 |
* Builds a WordPress registration URL to `/wp-login.php?action=register`.
|
44 |
*
|
@@ -49,8 +50,9 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
49 |
*/
|
50 |
public static function wp_register_url()
|
51 |
{
|
52 |
-
return apply_filters(
|
53 |
}
|
|
|
54 |
/**
|
55 |
* Builds a BuddyPress registration URL to `/register`.
|
56 |
*
|
@@ -61,34 +63,36 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
61 |
*/
|
62 |
public static function bp_register_url()
|
63 |
{
|
64 |
-
if(
|
65 |
-
return home_url(
|
66 |
|
67 |
-
return
|
68 |
}
|
|
|
69 |
/**
|
70 |
* Filters content redirection status *(uses 302s for browsers)*.
|
71 |
*
|
72 |
* @package s2Member\Utilities
|
73 |
* @since 3.5
|
74 |
*
|
75 |
-
* @attaches-to ``add_filter(
|
76 |
*
|
77 |
* @param int|string $status A numeric redirection status code.
|
78 |
* @return int|str A numeric status redirection code, possibly modified to a value of `302`.
|
79 |
*
|
80 |
-
* @see
|
81 |
*/
|
82 |
public static function redirect_browsers_using_302_status($status = FALSE)
|
83 |
{
|
84 |
-
$engines =
|
85 |
|
86 |
-
if(
|
87 |
-
if(($is_browser = preg_match(
|
88 |
-
|
89 |
|
90 |
-
return
|
91 |
}
|
|
|
92 |
/**
|
93 |
* Encodes all types of amperands to `amp;`, for use in XHTML code.
|
94 |
*
|
@@ -102,8 +106,9 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
102 |
*/
|
103 |
public static function e_amps($url_uri_query = FALSE)
|
104 |
{
|
105 |
-
return str_replace(
|
106 |
}
|
|
|
107 |
/**
|
108 |
* Normalizes amperands to `&` when working with URLs, URIs, and/or query strings.
|
109 |
*
|
@@ -115,10 +120,11 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
115 |
*/
|
116 |
public static function n_amps($url_uri_query = FALSE)
|
117 |
{
|
118 |
-
$amps = implode(
|
119 |
|
120 |
-
return
|
121 |
}
|
|
|
122 |
/**
|
123 |
* Parses out a full valid URI, from either a full URL, or a partial URI.
|
124 |
*
|
@@ -134,13 +140,13 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
134 |
{
|
135 |
if(is_string($url_uri) && is_array($parse = c_ws_plugin__s2member_utils_urls::parse_url($url_uri)))
|
136 |
{
|
137 |
-
$parse[
|
138 |
|
139 |
-
return
|
140 |
}
|
141 |
-
|
142 |
-
return /* Empty string. */ "";
|
143 |
}
|
|
|
144 |
/**
|
145 |
* Parses a URL/URI with same args as PHP's ``parse_url()`` function.
|
146 |
*
|
@@ -157,22 +163,23 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
157 |
*/
|
158 |
public static function parse_url($url_uri = FALSE, $component = FALSE, $clean_path = TRUE)
|
159 |
{
|
160 |
-
$component =
|
161 |
|
162 |
-
if(is_string($url_uri) &&
|
163 |
{
|
164 |
-
list($_, $query) = preg_split /* Split @ query string marker. */(
|
165 |
-
$query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace(
|
166 |
-
$url_uri = /* Put it all back together again, after the above modifications. */ $_.
|
167 |
-
unset
|
168 |
}
|
169 |
-
$parse = @parse_url
|
170 |
|
171 |
-
if($clean_path &&
|
172 |
-
$parse[
|
173 |
|
174 |
-
return
|
175 |
}
|
|
|
176 |
/**
|
177 |
* Responsible for all remote communications processed by s2Member.
|
178 |
*
|
@@ -182,58 +189,59 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
182 |
* @since 3.5
|
183 |
*
|
184 |
* @param string $url Full URL with possible query string parameters.
|
185 |
-
* @param string|array $
|
186 |
* @param array $args Optional. An array of additional arguments used by ``wp_remote_request()``.
|
187 |
* @param bool $return_array Optional. If true, instead of a string, we return an array with elements:
|
188 |
* `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
|
189 |
* @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
|
190 |
*/
|
191 |
-
public static function remote($url = FALSE, $
|
192 |
{
|
193 |
-
if(
|
194 |
-
|
195 |
-
$args = /* Force array, and disable SSL verification. */ (!is_array($args)) ? array(): $args;
|
196 |
|
197 |
-
|
198 |
|
199 |
-
|
|
|
|
|
200 |
|
201 |
-
|
202 |
-
|
203 |
|
204 |
-
|
205 |
-
|
206 |
|
207 |
-
|
208 |
-
|
209 |
|
210 |
-
|
211 |
-
|
212 |
-
unset($__refs, $__v);
|
213 |
|
214 |
-
|
|
|
|
|
215 |
|
216 |
-
|
217 |
|
218 |
-
|
219 |
-
{
|
220 |
-
$a = array("code" => (int)wp_remote_retrieve_response_code($response));
|
221 |
-
$a = array_merge($a, array("message" => wp_remote_retrieve_response_message($response)));
|
222 |
-
$a = array_merge($a, array("headers" => wp_remote_retrieve_headers($response)));
|
223 |
-
$a = array_merge($a, array("body" => wp_remote_retrieve_body($response)));
|
224 |
-
$a = array_merge($a, array("response" => $response));
|
225 |
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
|
|
|
|
|
|
230 |
|
231 |
-
|
232 |
-
return false; // Remote request failed, return false.
|
233 |
}
|
234 |
-
|
235 |
-
return
|
|
|
|
|
236 |
}
|
|
|
237 |
/**
|
238 |
* Shortens a long URL, based on s2Member configuration.
|
239 |
*
|
@@ -245,37 +253,61 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
245 |
* @param bool $try_backups Defaults to true. If a failure occurs with the first API, we'll try others until we have success.
|
246 |
* @return str|bool The shortened URL on success, else false on failure.
|
247 |
*/
|
248 |
-
public static function shorten($url =
|
249 |
{
|
250 |
-
$url
|
251 |
-
$
|
252 |
-
|
253 |
-
$default_url_shortener
|
254 |
-
$
|
255 |
-
|
256 |
-
$
|
257 |
-
|
258 |
-
if($url &&
|
259 |
{
|
260 |
-
if(!$api_sp
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
}
|
278 |
-
return
|
279 |
}
|
280 |
/**
|
281 |
* Removes all s2Member-generated signatures from a full URL, a partial URI, or just a query string.
|
@@ -289,12 +321,13 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
289 |
*/
|
290 |
public static function remove_s2member_sigs($url_uri_query = FALSE, $sig_var = FALSE)
|
291 |
{
|
292 |
-
$url_uri_query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false,
|
293 |
-
$sig_var
|
294 |
-
$sigs
|
295 |
|
296 |
-
return trim(remove_query_arg($sigs, $url_uri_query),
|
297 |
}
|
|
|
298 |
/**
|
299 |
* Adds an s2Member-generated signature onto a full URL, a partial URI, or just a query string.
|
300 |
*
|
@@ -307,27 +340,27 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
307 |
*/
|
308 |
public static function add_s2member_sig($url_uri_query = FALSE, $sig_var = FALSE)
|
309 |
{
|
310 |
-
$url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false,
|
311 |
-
$sig_var
|
312 |
|
313 |
$url_uri_query = $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($url_uri_query, $sig_var);
|
314 |
-
if(
|
315 |
-
$query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY),
|
316 |
|
317 |
-
$key =
|
318 |
|
319 |
-
if($url_uri_query && is_string
|
320 |
{
|
321 |
-
wp_parse_str
|
322 |
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
|
323 |
$vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
|
324 |
|
325 |
-
$sig =
|
326 |
-
|
327 |
$url_uri_query = add_query_arg($sig_var, urlencode($sig), $url_uri_query);
|
328 |
}
|
329 |
-
return
|
330 |
}
|
|
|
331 |
/**
|
332 |
* Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string.
|
333 |
*
|
@@ -342,35 +375,35 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
|
|
342 |
*/
|
343 |
public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
|
344 |
{
|
345 |
-
$url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false,
|
346 |
-
if(
|
347 |
-
$query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY),
|
348 |
|
349 |
-
$check_time =
|
350 |
-
$exp_secs
|
351 |
-
$sig_var
|
352 |
|
353 |
-
$key =
|
354 |
|
355 |
-
if(preg_match_all
|
356 |
{
|
357 |
-
$query =
|
358 |
|
359 |
-
wp_parse_str
|
360 |
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
|
361 |
$vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
|
362 |
|
363 |
-
|
|
|
|
|
|
|
364 |
|
365 |
-
if
|
366 |
-
return
|
367 |
|
368 |
-
|
369 |
-
return /* Do they match up? */ ($sig === $valid_sig);
|
370 |
}
|
371 |
-
|
372 |
-
return /* False, it's NOT ok. */ false;
|
373 |
}
|
374 |
}
|
375 |
}
|
376 |
-
?>
|
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_utils_urls'))
|
21 |
{
|
22 |
/**
|
23 |
* URL utilities.
|
37 |
*/
|
38 |
public static function wp_signup_url()
|
39 |
{
|
40 |
+
return apply_filters('wp_signup_location', site_url('/wp-signup.php'));
|
41 |
}
|
42 |
+
|
43 |
/**
|
44 |
* Builds a WordPress registration URL to `/wp-login.php?action=register`.
|
45 |
*
|
50 |
*/
|
51 |
public static function wp_register_url()
|
52 |
{
|
53 |
+
return apply_filters('wp_register_location', add_query_arg('action', urlencode('register'), wp_login_url()), get_defined_vars());
|
54 |
}
|
55 |
+
|
56 |
/**
|
57 |
* Builds a BuddyPress registration URL to `/register`.
|
58 |
*
|
63 |
*/
|
64 |
public static function bp_register_url()
|
65 |
{
|
66 |
+
if(c_ws_plugin__s2member_utils_conds::bp_is_installed())
|
67 |
+
return home_url(function_exists('bp_get_signup_slug') ? bp_get_signup_slug().'/' : BP_REGISTER_SLUG.'/');
|
68 |
|
69 |
+
return false;
|
70 |
}
|
71 |
+
|
72 |
/**
|
73 |
* Filters content redirection status *(uses 302s for browsers)*.
|
74 |
*
|
75 |
* @package s2Member\Utilities
|
76 |
* @since 3.5
|
77 |
*
|
78 |
+
* @attaches-to ``add_filter('ws_plugin__s2member_content_redirect_status');``
|
79 |
*
|
80 |
* @param int|string $status A numeric redirection status code.
|
81 |
* @return int|str A numeric status redirection code, possibly modified to a value of `302`.
|
82 |
*
|
83 |
+
* @see https://en.wikipedia.org/wiki/Web_browser_engine
|
84 |
*/
|
85 |
public static function redirect_browsers_using_302_status($status = FALSE)
|
86 |
{
|
87 |
+
$engines = 'msie|trident|gecko|webkit|presto|konqueror|playstation';
|
88 |
|
89 |
+
if((int)$status === 301 && !empty($_SERVER['HTTP_USER_AGENT']))
|
90 |
+
if(($is_browser = preg_match('/('.$engines.')[\/ ]([0-9\.]+)/i', $_SERVER['HTTP_USER_AGENT'])))
|
91 |
+
$status = 302; // Use 302 for browser engines.
|
92 |
|
93 |
+
return $status;
|
94 |
}
|
95 |
+
|
96 |
/**
|
97 |
* Encodes all types of amperands to `amp;`, for use in XHTML code.
|
98 |
*
|
106 |
*/
|
107 |
public static function e_amps($url_uri_query = FALSE)
|
108 |
{
|
109 |
+
return str_replace('&', '&', c_ws_plugin__s2member_utils_urls::n_amps((string)$url_uri_query));
|
110 |
}
|
111 |
+
|
112 |
/**
|
113 |
* Normalizes amperands to `&` when working with URLs, URIs, and/or query strings.
|
114 |
*
|
120 |
*/
|
121 |
public static function n_amps($url_uri_query = FALSE)
|
122 |
{
|
123 |
+
$amps = implode('|', array_keys(c_ws_plugin__s2member_utils_strings::$ampersand_entities));
|
124 |
|
125 |
+
return preg_replace('/(?:'.$amps.')/', '&', (string)$url_uri_query);
|
126 |
}
|
127 |
+
|
128 |
/**
|
129 |
* Parses out a full valid URI, from either a full URL, or a partial URI.
|
130 |
*
|
140 |
{
|
141 |
if(is_string($url_uri) && is_array($parse = c_ws_plugin__s2member_utils_urls::parse_url($url_uri)))
|
142 |
{
|
143 |
+
$parse['path'] = !empty($parse['path']) ? (strpos($parse['path'], '/') === 0 ? $parse['path'] : '/'.$parse['path']) : '/';
|
144 |
|
145 |
+
return !empty($parse['query']) ? $parse['path'].'?'.$parse['query'] : $parse['path'];
|
146 |
}
|
147 |
+
return ''; // Default return value.
|
|
|
148 |
}
|
149 |
+
|
150 |
/**
|
151 |
* Parses a URL/URI with same args as PHP's ``parse_url()`` function.
|
152 |
*
|
163 |
*/
|
164 |
public static function parse_url($url_uri = FALSE, $component = FALSE, $clean_path = TRUE)
|
165 |
{
|
166 |
+
$component = $component === FALSE || $component === -1 ? -1 : $component;
|
167 |
|
168 |
+
if(is_string($url_uri) && strpos($url_uri, '?') !== FALSE)
|
169 |
{
|
170 |
+
list($_, $query) = preg_split /* Split @ query string marker. */('/\?/', $url_uri, 2);
|
171 |
+
$query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace('://', urlencode('://'), $query);
|
172 |
+
$url_uri = /* Put it all back together again, after the above modifications. */ $_.'?'.$query;
|
173 |
+
unset($_, $query); // A little housekeeping here. Unset these vars.
|
174 |
}
|
175 |
+
$parse = @parse_url($url_uri, $component); // Let PHP work its magic via ``parse_url()``.
|
176 |
|
177 |
+
if($clean_path && is_array($parse) && !empty($parse['path']) && is_string($parse['path']))
|
178 |
+
$parse['path'] = preg_replace('/\/+/', '/', $parse['path']);
|
179 |
|
180 |
+
return $component !== -1 ? (string)$parse : $parse;
|
181 |
}
|
182 |
+
|
183 |
/**
|
184 |
* Responsible for all remote communications processed by s2Member.
|
185 |
*
|
189 |
* @since 3.5
|
190 |
*
|
191 |
* @param string $url Full URL with possible query string parameters.
|
192 |
+
* @param string|array $post_body Optional. Either a string of POST data, or an array.
|
193 |
* @param array $args Optional. An array of additional arguments used by ``wp_remote_request()``.
|
194 |
* @param bool $return_array Optional. If true, instead of a string, we return an array with elements:
|
195 |
* `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
|
196 |
* @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
|
197 |
*/
|
198 |
+
public static function remote($url = FALSE, $post_body = FALSE, $args = FALSE, $return_array = FALSE)
|
199 |
{
|
200 |
+
if(!$url || !is_string($url))
|
201 |
+
return false;
|
|
|
202 |
|
203 |
+
$args = !is_array($args) ? array() : $args;
|
204 |
|
205 |
+
$args['s2member'] = WS_PLUGIN__S2MEMBER_VERSION; // s2Member connection.
|
206 |
+
$args['httpversion'] = !isset($args['httpversion']) ? '1.1' : $args['httpversion'];
|
207 |
+
$args['user-agent'] = !isset($args['user-agent']) ? 's2Member v'.WS_PLUGIN__S2MEMBER_VERSION.'; '.home_url() : $args['user-agent'];
|
208 |
|
209 |
+
if(!isset($args['sslverify']) && c_ws_plugin__s2member_utils_conds::is_localhost())
|
210 |
+
$args['sslverify'] = FALSE; // Force this off on localhost installs.
|
211 |
|
212 |
+
else if(!isset($args['sslverify']) && strcasecmp(self::parse_url($url, PHP_URL_HOST), $_SERVER['HTTP_HOST']) === 0)
|
213 |
+
$args['sslverify'] = FALSE; // Don't require verification when posting to self.
|
214 |
|
215 |
+
if($post_body && (is_array($post_body) || is_string($post_body)))
|
216 |
+
$args = array_merge($args, array('method' => 'POST', 'body' => $post_body));
|
217 |
|
218 |
+
if(!empty($args['method']) && strcasecmp((string)$args['method'], 'DELETE') === 0 && version_compare(get_bloginfo('version'), '3.4', '<'))
|
219 |
+
add_filter('use_curl_transport', '__return_false', /* ID via priority. */ 111209554);
|
|
|
220 |
|
221 |
+
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
|
222 |
+
do_action('ws_plugin__s2member_before_wp_remote_request', get_defined_vars());
|
223 |
+
unset($__refs, $__v); // Housekeeping.
|
224 |
|
225 |
+
$response = wp_remote_request($url, $args);
|
226 |
|
227 |
+
remove_filter('use_curl_transport', '__return_false', 111209554);
|
|
|
|
|
|
|
|
|
|
|
|
|
228 |
|
229 |
+
if($return_array && !is_wp_error($response) && is_array($response))
|
230 |
+
{
|
231 |
+
$a = array('code' => (int)wp_remote_retrieve_response_code($response));
|
232 |
+
$a = array_merge($a, array('message' => wp_remote_retrieve_response_message($response)));
|
233 |
+
$a = array_merge($a, array('headers' => wp_remote_retrieve_headers($response)));
|
234 |
+
$a = array_merge($a, array('body' => wp_remote_retrieve_body($response)));
|
235 |
+
$a = array_merge($a, array('response' => $response));
|
236 |
|
237 |
+
return $a; // Return array w/ ``$response`` too.
|
|
|
238 |
}
|
239 |
+
if(!is_wp_error($response) && is_array($response))
|
240 |
+
return wp_remote_retrieve_body($response);
|
241 |
+
|
242 |
+
return false; // Remote request failed, return false.
|
243 |
}
|
244 |
+
|
245 |
/**
|
246 |
* Shortens a long URL, based on s2Member configuration.
|
247 |
*
|
253 |
* @param bool $try_backups Defaults to true. If a failure occurs with the first API, we'll try others until we have success.
|
254 |
* @return str|bool The shortened URL on success, else false on failure.
|
255 |
*/
|
256 |
+
public static function shorten($url = '', $api_sp = '', $try_backups = TRUE)
|
257 |
{
|
258 |
+
$url = $url && is_string($url) ? $url : FALSE;
|
259 |
+
$apis = array('tiny_url', 'bitly', 'goo_gl'); // Supported APIs.
|
260 |
+
$api_sp = $api_sp && is_string($api_sp) ? strtolower($api_sp) : FALSE;
|
261 |
+
$default_url_shortener = $GLOBALS['WS_PLUGIN__']['s2member']['o']['default_url_shortener'];
|
262 |
+
$default_url_shortener_key = $GLOBALS['WS_PLUGIN__']['s2member']['o']['default_url_shortener_key'];
|
263 |
+
$default_custom_str_url_shortener = $GLOBALS['WS_PLUGIN__']['s2member']['o']['default_custom_str_url_shortener'];
|
264 |
+
$api = $api_sp ? $api_sp : $default_url_shortener;
|
265 |
+
|
266 |
+
if($url && $api) // If specific, use it. Otherwise, try customs, else use the default shortening API.
|
267 |
{
|
268 |
+
if(!$api_sp // If not a specific API, give filters a chance to shorten it here.
|
269 |
+
&& ($custom_url = trim(apply_filters('ws_plugin__s2member_url_shorten', FALSE, get_defined_vars())))
|
270 |
+
&& stripos($custom_url, 'http') === 0)
|
271 |
+
return ($shorter_url = $custom_url);
|
272 |
+
|
273 |
+
else if(!$api_sp // If not specific, try custom settings.
|
274 |
+
&& stripos($default_custom_str_url_shortener, 'http') === 0
|
275 |
+
&& ($custom_url = trim(self::remote(str_ireplace(array('%%s2_long_url%%', '%%s2_long_url_md5%%'), array(rawurlencode($url), urlencode(md5($url))), $default_custom_str_url_shortener))))
|
276 |
+
&& stripos($custom_url, 'http') === 0)
|
277 |
+
return ($shorter_url = $custom_url);
|
278 |
+
|
279 |
+
else if($api === 'tiny_url' // Using the TinyURL API in this case?
|
280 |
+
&& ($tiny_url = trim(self::remote('http://tinyurl.com/api-create.php?url='.rawurlencode($url))))
|
281 |
+
&& stripos($tiny_url, 'http') === 0)
|
282 |
+
return ($shorter_url = $tiny_url);
|
283 |
+
|
284 |
+
else if($api === 'bitly' // Using the Bitly API in this case?
|
285 |
+
&& ($bitly_endpoint = 'https://api-ssl.bitly.com/v3/shorten')
|
286 |
+
&& ($bitly_endpoint_key = $default_url_shortener_key) // Must be configured by site owner.
|
287 |
+
&& ($bitly_endpoint = add_query_arg('access_token', urlencode($bitly_endpoint_key), $bitly_endpoint))
|
288 |
+
&& ($bitly_endpoint = add_query_arg('longUrl', urlencode($url), $bitly_endpoint))
|
289 |
+
&& ($bitly_response = json_decode(trim(self::remote($bitly_endpoint))))
|
290 |
+
&& !empty($bitly_response->data->url) && stripos($bitly_url = $bitly_response->data->url, 'http') === 0)
|
291 |
+
return ($shorter_url = $bitly_url);
|
292 |
+
|
293 |
+
else if($api === 'goo_gl' // Using the Google API in this case?
|
294 |
+
&& ($goo_gl_endpoint = 'https://www.googleapis.com/urlshortener/v1/url')
|
295 |
+
&& ($goo_gl_endpoint_headers = array('headers' => array('Content-Type' => 'application/json')))
|
296 |
+
&& ($goo_gl_endpoint_key = $default_url_shortener_key) // Must be configured by site owner.
|
297 |
+
&& ($goo_gl_endpoint = add_query_arg('key', urlencode($goo_gl_endpoint_key), $goo_gl_endpoint))
|
298 |
+
&& ($goo_gl_response = json_decode(trim(self::remote($goo_gl_endpoint, json_encode(array('longUrl' => $url)), $goo_gl_endpoint_headers))))
|
299 |
+
&& !empty($goo_gl_response->id) && stripos($goo_gl_url = $goo_gl_response->id, 'http') === 0)
|
300 |
+
return ($shorter_url = $goo_gl_url);
|
301 |
+
|
302 |
+
else if($try_backups && count($apis) > 1) // Try backups?
|
303 |
+
{
|
304 |
+
foreach(array_diff($apis, array($api)) as $_backup_api)
|
305 |
+
if(($_backup_api_url = self::shorten($url, $_backup_api, FALSE)))
|
306 |
+
return ($shorter_url = $_backup_api_url);
|
307 |
+
unset($_backup_api, $_backup_api_url); // Housekeeping.
|
308 |
+
}
|
309 |
}
|
310 |
+
return FALSE; // Default return value.
|
311 |
}
|
312 |
/**
|
313 |
* Removes all s2Member-generated signatures from a full URL, a partial URI, or just a query string.
|
321 |
*/
|
322 |
public static function remove_s2member_sigs($url_uri_query = FALSE, $sig_var = FALSE)
|
323 |
{
|
324 |
+
$url_uri_query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, '?&=');
|
325 |
+
$sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : '_s2member_sig';
|
326 |
+
$sigs = array_unique(array($sig_var, '_s2member_sig'));
|
327 |
|
328 |
+
return trim(remove_query_arg($sigs, $url_uri_query), '?&=');
|
329 |
}
|
330 |
+
|
331 |
/**
|
332 |
* Adds an s2Member-generated signature onto a full URL, a partial URI, or just a query string.
|
333 |
*
|
340 |
*/
|
341 |
public static function add_s2member_sig($url_uri_query = FALSE, $sig_var = FALSE)
|
342 |
{
|
343 |
+
$url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, '?&=');
|
344 |
+
$sig_var = $sig_var && is_string($sig_var) ? $sig_var : '_s2member_sig';
|
345 |
|
346 |
$url_uri_query = $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($url_uri_query, $sig_var);
|
347 |
+
if(preg_match('/^(?:[a-z]+\:\/\/|\/)/i', $url_uri_query)) // Is this a full URL or a partial URI?
|
348 |
+
$query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), '?&=');
|
349 |
|
350 |
+
$key = c_ws_plugin__s2member_utils_encryption::key(); // Obtain key.
|
351 |
|
352 |
+
if($url_uri_query && is_string($query)) // We DO allow empty query strings. So we can sign a URL without one.
|
353 |
{
|
354 |
+
wp_parse_str($query, $vars); // Parse the query string into an array of ``$vars``.
|
355 |
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
|
356 |
$vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
|
357 |
|
358 |
+
$sig = ($time = time()).'-'.md5($key.$time.$vars);
|
|
|
359 |
$url_uri_query = add_query_arg($sig_var, urlencode($sig), $url_uri_query);
|
360 |
}
|
361 |
+
return $url_uri_query; // Possibly with a ``$sig_var`` variable.
|
362 |
}
|
363 |
+
|
364 |
/**
|
365 |
* Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string.
|
366 |
*
|
375 |
*/
|
376 |
public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
|
377 |
{
|
378 |
+
$url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, '?&=');
|
379 |
+
if(preg_match('/^(?:[a-z]+\:\/\/|\/)/i', $url_uri_query)) // Is this a full URL or a partial URI?
|
380 |
+
$query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), '?&=');
|
381 |
|
382 |
+
$check_time = (bool)$check_time; // Check time?
|
383 |
+
$exp_secs = is_numeric($exp_secs) ? (int)$exp_secs : 10;
|
384 |
+
$sig_var = $sig_var && is_string($sig_var) ? $sig_var : '_s2member_sig';
|
385 |
|
386 |
+
$key = c_ws_plugin__s2member_utils_encryption::key(); // Obtain key.
|
387 |
|
388 |
+
if(preg_match_all('/'.preg_quote($sig_var, '/').'\=([0-9]+)-([^&$]+)/', $query, $sigs))
|
389 |
{
|
390 |
+
$query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var);
|
391 |
|
392 |
+
wp_parse_str($query, $vars); // Parse the query string into an array of ``$vars``.
|
393 |
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
|
394 |
$vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
|
395 |
|
396 |
+
$i = count($sigs[1]) - 1; // Last one.
|
397 |
+
$time = $sigs[1][$i]; // Timestamp.
|
398 |
+
$sig = $sigs[2][$i]; // Signature.
|
399 |
+
$valid_sig = md5($key.$time.$vars);
|
400 |
|
401 |
+
if($check_time) // This must NOT be older than ``$exp_secs`` seconds ago.
|
402 |
+
return $sig === $valid_sig && $time >= strtotime('-'.$exp_secs.' seconds');
|
403 |
|
404 |
+
return $sig === $valid_sig;
|
|
|
405 |
}
|
406 |
+
return false; // False, it's NOT ok.
|
|
|
407 |
}
|
408 |
}
|
409 |
}
|
|
includes/classes/utils-users.inc.php
CHANGED
@@ -311,40 +311,43 @@ if(!class_exists('c_ws_plugin__s2member_utils_users'))
|
|
311 |
* `s2member_access_role`, `s2member_access_level`, `s2member_access_label`,
|
312 |
* `s2member_access_ccaps`, etc, etc. ).
|
313 |
* @param int|string $user_id Optional. Defaults to the current User's ID.
|
|
|
314 |
*
|
315 |
* @return mixed The value of the requested field, or false if the field does not exist.
|
316 |
*/
|
317 |
-
public static function get_user_field($field_id = '', $user_id = 0)
|
318 |
{
|
319 |
-
global $wpdb;
|
320 |
-
/** @var wpdb $wpdb */
|
321 |
|
322 |
-
$current_user = wp_get_current_user(); // Current
|
323 |
|
324 |
-
if(is_object($user =
|
|
|
325 |
{
|
326 |
-
|
327 |
-
return $user->$field_id;
|
328 |
|
329 |
-
|
330 |
-
return $user->
|
331 |
|
332 |
-
else if(isset
|
|
|
|
|
|
|
333 |
return $user->{$wpdb->prefix.$field_id};
|
334 |
|
335 |
-
else if(isset
|
336 |
return $user->data->{$wpdb->prefix.$field_id};
|
337 |
|
338 |
else if(strcasecmp($field_id, 'full_name') === 0)
|
339 |
return trim($user->first_name.' '.$user->last_name);
|
340 |
|
341 |
-
else if(preg_match('/^(email|user_email)$/i', $field_id))
|
342 |
return $user->user_email;
|
343 |
|
344 |
-
else if(preg_match('/^(login|user_login)$/i', $field_id))
|
345 |
return $user->user_login;
|
346 |
|
347 |
-
else if(preg_match('/^(s2member_)?registration_time$/i', $field_id))
|
348 |
return $user->user_registered;
|
349 |
|
350 |
else if(strcasecmp($field_id, 's2member_access_role') === 0)
|
@@ -359,8 +362,8 @@ if(!class_exists('c_ws_plugin__s2member_utils_users'))
|
|
359 |
else if(strcasecmp($field_id, 's2member_access_ccaps') === 0)
|
360 |
return c_ws_plugin__s2member_user_access::user_access_ccaps($user);
|
361 |
|
362 |
-
else if(strcasecmp($field_id, 'ip') === 0 &&
|
363 |
-
return $_SERVER['REMOTE_ADDR'];
|
364 |
|
365 |
else if(strcasecmp($field_id, 's2member_registration_ip') === 0 || strcasecmp($field_id, 'reg_ip') === 0 || strcasecmp($field_id, 'ip') === 0)
|
366 |
return get_user_option('s2member_registration_ip', $user_id);
|
@@ -368,11 +371,329 @@ if(!class_exists('c_ws_plugin__s2member_utils_users'))
|
|
368 |
else if(strcasecmp($field_id, 's2member_subscr_or_wp_id') === 0)
|
369 |
return ($subscr_id = get_user_option('s2member_subscr_id', $user_id)) ? $subscr_id : $user_id;
|
370 |
|
|
|
|
|
|
|
371 |
else if(is_array($fields = get_user_option('s2member_custom_fields', $user_id)))
|
372 |
-
|
373 |
-
|
|
|
|
|
374 |
}
|
375 |
return FALSE; // Otherwise, return false.
|
376 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
377 |
}
|
378 |
-
}
|
311 |
* `s2member_access_role`, `s2member_access_level`, `s2member_access_label`,
|
312 |
* `s2member_access_ccaps`, etc, etc. ).
|
313 |
* @param int|string $user_id Optional. Defaults to the current User's ID.
|
314 |
+
* @param array $args Any additional behavioral args. Since v150717.
|
315 |
*
|
316 |
* @return mixed The value of the requested field, or false if the field does not exist.
|
317 |
*/
|
318 |
+
public static function get_user_field($field_id = '', $user_id = 0, $args = array())
|
319 |
{
|
320 |
+
global $wpdb; /** @var wpdb $wpdb Reference for IDEs. */
|
|
|
321 |
|
322 |
+
$current_user = wp_get_current_user(); // Current user.
|
323 |
|
324 |
+
if(is_object($user = $user_id ? new WP_User($user_id) : $current_user)
|
325 |
+
&& !empty($user->ID) && ($user_id = $user->ID))
|
326 |
{
|
327 |
+
$args = (array)$args; // Force array.
|
|
|
328 |
|
329 |
+
if(isset($user->{$field_id}))
|
330 |
+
return $user->{$field_id};
|
331 |
|
332 |
+
else if(isset($user->data->{$field_id}))
|
333 |
+
return $user->data->{$field_id};
|
334 |
+
|
335 |
+
else if(isset($user->{$wpdb->prefix.$field_id}))
|
336 |
return $user->{$wpdb->prefix.$field_id};
|
337 |
|
338 |
+
else if(isset($user->data->{$wpdb->prefix.$field_id}))
|
339 |
return $user->data->{$wpdb->prefix.$field_id};
|
340 |
|
341 |
else if(strcasecmp($field_id, 'full_name') === 0)
|
342 |
return trim($user->first_name.' '.$user->last_name);
|
343 |
|
344 |
+
else if(preg_match('/^(?:email|user_email)$/i', $field_id))
|
345 |
return $user->user_email;
|
346 |
|
347 |
+
else if(preg_match('/^(?:login|user_login)$/i', $field_id))
|
348 |
return $user->user_login;
|
349 |
|
350 |
+
else if(preg_match('/^(?:s2member_)?registration_time$/i', $field_id))
|
351 |
return $user->user_registered;
|
352 |
|
353 |
else if(strcasecmp($field_id, 's2member_access_role') === 0)
|
362 |
else if(strcasecmp($field_id, 's2member_access_ccaps') === 0)
|
363 |
return c_ws_plugin__s2member_user_access::user_access_ccaps($user);
|
364 |
|
365 |
+
else if(strcasecmp($field_id, 'ip') === 0 && !empty($current_user->ID) && $current_user->ID === $user_id)
|
366 |
+
return $_SERVER['REMOTE_ADDR']; // Current IP address.
|
367 |
|
368 |
else if(strcasecmp($field_id, 's2member_registration_ip') === 0 || strcasecmp($field_id, 'reg_ip') === 0 || strcasecmp($field_id, 'ip') === 0)
|
369 |
return get_user_option('s2member_registration_ip', $user_id);
|
371 |
else if(strcasecmp($field_id, 's2member_subscr_or_wp_id') === 0)
|
372 |
return ($subscr_id = get_user_option('s2member_subscr_id', $user_id)) ? $subscr_id : $user_id;
|
373 |
|
374 |
+
else if(strcasecmp($field_id, 'avatar') === 0) // Avatar with a specific size?
|
375 |
+
return get_avatar($user_id, !empty($args['size']) ? $args['size'] : 96);
|
376 |
+
|
377 |
else if(is_array($fields = get_user_option('s2member_custom_fields', $user_id)))
|
378 |
+
{
|
379 |
+
$field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($field_id));
|
380 |
+
if(isset($fields[$field_var])) return $fields[$field_var];
|
381 |
+
}
|
382 |
}
|
383 |
return FALSE; // Otherwise, return false.
|
384 |
}
|
385 |
+
|
386 |
+
/**
|
387 |
+
* Auto EOT time, else NPR (next payment time).
|
388 |
+
*
|
389 |
+
* @package s2Member\Utilities
|
390 |
+
* @since 150713
|
391 |
+
*
|
392 |
+
* @param int|string $user_id Optional. Defaults to the current User's ID.
|
393 |
+
* @param bool $check_gateway Defaults to a true value. If this is false, it is only possible to return a fixed EOT time.
|
394 |
+
* In other words, if this is false and there is no EOT time, empty values will be returned. Be careful with this, because not checking
|
395 |
+
* the payment gateway can result in an inaccurate return value. Only set to false if you want to limit the check to a fixed hard-coded EOT time.
|
396 |
+
* @param string $favor Defaults to a value of `fixed`; i.e., if a fixed EOT time is available, that is returned in favor of a next payment time.
|
397 |
+
* You can set this to `next` if you'd like to favor a next payment time (when applicable) instead of returning a fixed EOT time.
|
398 |
+
*
|
399 |
+
* @return array An associative array of EOT details; with the following elements.
|
400 |
+
*
|
401 |
+
* - `type` One of `fixed` (a fixed EOT time), `next` (next payment time; i.e., an ongoing recurring subscription); or an empty string if there is no EOT for the user.
|
402 |
+
* - `time` The timestamp (UTC time) that represents the EOT (End Of Term); else `0` if there is no EOT time.
|
403 |
+
* - `tense` If time is now (or earlier) this will be `past`. If time is in the future, this will be `future`. If there is no time, this is an empty string.
|
404 |
+
* - `debug` A string of details that explain to a developer what was returned. For debugging only.
|
405 |
+
*/
|
406 |
+
public static function get_user_eot($user_id = 0, $check_gateway = TRUE, $favor = 'fixed')
|
407 |
+
{
|
408 |
+
if(!($user_id = (integer)$user_id)) // Empty user ID in this call?
|
409 |
+
$user_id = get_current_user_id(); // Assume current user.
|
410 |
+
|
411 |
+
if(!$favor || !in_array($favor, array('fixed', 'next'), TRUE))
|
412 |
+
$favor = 'fixed'; // Default behavior.
|
413 |
+
|
414 |
+
$now = time(); // Current timestamp.
|
415 |
+
$grace_time = (integer)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time'];
|
416 |
+
$grace_time = (integer)apply_filters('ws_plugin__s2member_eot_grace_time', $grace_time);
|
417 |
+
$demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role('subscriber');
|
418 |
+
$empty_response = array('type' => '', 'time' => 0, 'tense' => '', 'debug' => '');
|
419 |
+
|
420 |
+
if(!$user_id || !($user = new WP_User($user_id)) || !$user->ID)
|
421 |
+
return array_merge($empty_response, array('debug' => 'Invalid user ID.'));
|
422 |
+
|
423 |
+
$ipn_signup_vars = self::get_user_ipn_signup_vars($user->ID);
|
424 |
+
$subscr_gateway = (string)get_user_option('s2member_subscr_gateway', $user->ID);
|
425 |
+
$subscr_id = (string)get_user_option('s2member_subscr_id', $user->ID);
|
426 |
+
$subscr_cid = (string)get_user_option('s2member_subscr_cid', $user->ID);
|
427 |
+
$last_auto_eot_time = (integer)get_user_option('s2member_last_auto_eot_time', $user->ID);
|
428 |
+
$auto_eot_time = (integer)get_user_option('s2member_auto_eot_time', $user->ID);
|
429 |
+
|
430 |
+
if($auto_eot_time) // They have a hard-coded EOT time at present?
|
431 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
432 |
+
'debug' => 'This is a fixed EOT time recorded by s2Member. It can be altered in the WordPress Dashboard for this user.');
|
433 |
+
|
434 |
+
if(!$subscr_gateway && !$subscr_id && !$subscr_cid && $last_auto_eot_time // EOTd?
|
435 |
+
&& (!user_can($user->ID, 'access_s2member_level1') || c_ws_plugin__s2member_user_access::user_access_role($user) === $demotion_role)
|
436 |
+
&& !c_ws_plugin__s2member_user_access::user_access_ccaps($user) // And no CCAPs either?
|
437 |
+
) return array('type' => 'fixed', 'time' => $last_auto_eot_time, 'tense' => $last_auto_eot_time <= $now ? 'past' : 'future',
|
438 |
+
'debug' => 'This is an archived/fixed EOT time recorded by s2Member; i.e., the date this customer\'s access expired.');
|
439 |
+
|
440 |
+
if(!$subscr_gateway || !$subscr_id || !is_array($ipn_signup_vars) || !$ipn_signup_vars)
|
441 |
+
return array_merge($empty_response, array('debug' => 'This user has no subscription; i.e., missing `subscr_id`, `subscr_gateway` or `ipn_signup_vars`.'));
|
442 |
+
|
443 |
+
if(empty($ipn_signup_vars['txn_type']) || $ipn_signup_vars['txn_type'] !== 'subscr_signup')
|
444 |
+
return array_merge($empty_response, array('debug' => 'This user has no subscription; i.e., `txn_type` != `subscr_signup`.'));
|
445 |
+
|
446 |
+
$auto_eot_time // Update this now; i.e., build a new EOT time based on IPN signup vars.
|
447 |
+
= c_ws_plugin__s2member_utils_time::auto_eot_time($user->ID, $ipn_signup_vars['period1'], $ipn_signup_vars['period3']);
|
448 |
+
|
449 |
+
if($check_gateway) switch($subscr_gateway) // A bit different for each payment gateway.
|
450 |
+
{
|
451 |
+
case 'paypal': // PayPal (PayPal Pro only).
|
452 |
+
|
453 |
+
if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()
|
454 |
+
|| !class_exists('c_ws_plugin__s2member_pro_paypal_utilities')
|
455 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username']
|
456 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password']
|
457 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature']
|
458 |
+
) return array_merge($empty_response, array('debug' => 'PayPal Pro API credentials missing in your s2Member configuration.'));
|
459 |
+
|
460 |
+
if($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_payflow_api_username'])
|
461 |
+
{
|
462 |
+
if(!($api_response = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id)) || !empty($api_response['__error']))
|
463 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says there is no subscription for this user.'));
|
464 |
+
|
465 |
+
if(preg_match('/^(?:Pending|PendingProfile)$/i', $api_response['STATUS']))
|
466 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says the subscription for this user is currently pending changes. Unable to determine at this moment. Please try again in 15 minutes.'));
|
467 |
+
|
468 |
+
if(!preg_match('/^(?:Active|ActiveProfile)$/i', $api_response['STATUS']))
|
469 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
470 |
+
'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription is no longer active, and thus, access should be terminated at this time.');
|
471 |
+
|
472 |
+
if($api_response['TERM'] > 0 && $api_response['PAYMENTSLEFT'] <= 0)
|
473 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
474 |
+
'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription has reached its last payment, and thus, access should be terminated at this time.');
|
475 |
+
|
476 |
+
if($api_response['TERM'] <= 0 || $api_response['PAYMENTSLEFT'] > 0)
|
477 |
+
if($api_response['NEXTPAYMENT'] && strlen($api_response['NEXTPAYMENT']) === 8) // MMDDYYYY format is not `strtotime()` compatible.
|
478 |
+
if(($time = strtotime(substr($api_response['NEXTPAYMENT'], -4).'-'.substr($api_response['NEXTPAYMENT'], 0, 2).'-'.substr($api_response['NEXTPAYMENT'], 2, 2))) > $now)
|
479 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
480 |
+
'debug' => 'The PayPal Pro API says this is the next payment time.');
|
481 |
+
}
|
482 |
+
else // Use PayPal Pro API (old flavor).
|
483 |
+
{
|
484 |
+
$api_args = array(
|
485 |
+
'METHOD' => 'GetRecurringPaymentsProfileDetails',
|
486 |
+
'PROFILEID' => $subscr_id,
|
487 |
+
);
|
488 |
+
if(!($api_response = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($api_args)) || !empty($api_response['__error']))
|
489 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says there is no subscription for this user.'));
|
490 |
+
|
491 |
+
if(preg_match('/^(?:Pending|PendingProfile)$/i', $api_response['STATUS']))
|
492 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says the subscription for this user is currently pending changes. Unable to determine at this moment. Please try again in 15 minutes.'));
|
493 |
+
|
494 |
+
if(!preg_match('/^(?:Active|ActiveProfile)$/i', $api_response['STATUS']))
|
495 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
496 |
+
'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription is no longer active, and thus, access should be terminated at this time.');
|
497 |
+
|
498 |
+
if($api_response['TOTALBILLINGCYCLES'] > 0 && $api_response['NUMCYCLESREMAINING'] <= 0)
|
499 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
500 |
+
'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription has reached its last payment, and thus, access should be terminated at this time.');
|
501 |
+
|
502 |
+
if($api_response['TOTALBILLINGCYCLES'] <= 0 || $api_response['NUMCYCLESREMAINING'] > 0)
|
503 |
+
if($api_response['NEXTBILLINGDATE'] && ($time = strtotime($api_response['NEXTBILLINGDATE'])) > $now)
|
504 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
505 |
+
'debug' => 'The PayPal Pro API says this is the next payment time.');
|
506 |
+
}
|
507 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and there are no more payments needed from this user.'));
|
508 |
+
|
509 |
+
break; // Break switch.
|
510 |
+
|
511 |
+
case 'authnet': // Authorize.Net (EOT only; w/ limited functionality).
|
512 |
+
|
513 |
+
if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()
|
514 |
+
|| !class_exists('c_ws_plugin__s2member_pro_authnet_utilities')
|
515 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_authnet_api_login_id']
|
516 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_authnet_api_trans_key']
|
517 |
+
) return array_merge($empty_response, array('debug' => 'Authorize.Net API credentials missing in your s2Member configuration.'));
|
518 |
+
|
519 |
+
$api_args = array(
|
520 |
+
'x_method' => 'status',
|
521 |
+
'x_subscription_id' => $subscr_id,
|
522 |
+
);
|
523 |
+
if(!($api_response = c_ws_plugin__s2member_pro_authnet_utilities::authnet_arb_response($api_args)) || !empty($api_response['__error']))
|
524 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the Authorize.Net API says there is no subscription for this user.'));
|
525 |
+
|
526 |
+
if(!preg_match('/^(?:active)$/i', $api_response['subscription_status']))
|
527 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
528 |
+
'debug' => 'This is the estimated EOT time. The Authorize.Net API says this subscription is no longer active, and thus, access should be terminated at this time.');
|
529 |
+
|
530 |
+
// Next payment time not possible with Authorize.Net at this time.
|
531 |
+
// Fixed recurring intervals not possible to query with Authorize.Net at this time.
|
532 |
+
return array_merge($empty_response, array('debug' => 'Partially-supported payment gateway; unable to determine.'));
|
533 |
+
|
534 |
+
break; // Break switch.
|
535 |
+
|
536 |
+
case 'stripe': // Stripe payment gateway (best).
|
537 |
+
|
538 |
+
if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()
|
539 |
+
|| !class_exists('c_ws_plugin__s2member_pro_stripe_utilities')
|
540 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_stripe_api_publishable_key']
|
541 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_stripe_api_secret_key']
|
542 |
+
) return array_merge($empty_response, array('debug' => 'Stripe API credentials missing in your s2Member configuration.'));
|
543 |
+
|
544 |
+
if(!$subscr_cid) return array_merge($empty_response, array('debug' => 'No fixed EOT, and no `subscr_cid` on file. Unable to determine.'));
|
545 |
+
|
546 |
+
if(!is_object($stripe_subscription = c_ws_plugin__s2member_pro_stripe_utilities::get_customer_subscription($subscr_cid, $subscr_id)) || empty($stripe_subscription->id))
|
547 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the Stripe API says there is no subscription for this user.'));
|
548 |
+
|
549 |
+
if((integer)$stripe_subscription->ended_at > 0) // Done?
|
550 |
+
{
|
551 |
+
$time = $stripe_subscription->ended_at + $grace_time;
|
552 |
+
return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
553 |
+
'debug' => 'The Stripe API says this subscription reached an expiration on this date + grace time.');
|
554 |
+
}
|
555 |
+
if(in_array($stripe_subscription->status, array('canceled', 'unpaid'), TRUE) || $stripe_subscription->cancel_at_period_end)
|
556 |
+
{
|
557 |
+
$time = $stripe_subscription->current_period_end + $grace_time;
|
558 |
+
return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
559 |
+
'debug' => 'The Stripe API says this subscription was cancelled, and thus, should EOT on this date + grace time.');
|
560 |
+
}
|
561 |
+
if(isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times)
|
562 |
+
&& !$stripe_subscription->plan->metadata->recurring) // Non-recurring subscription?
|
563 |
+
{
|
564 |
+
$time = (integer)$stripe_subscription->start;
|
565 |
+
$time += $stripe_subscription->plan->trial_period_days * DAY_IN_SECONDS;
|
566 |
+
|
567 |
+
switch($stripe_subscription->plan->interval)
|
568 |
+
{
|
569 |
+
case 'day': // Every X days in this case.
|
570 |
+
$time += (DAY_IN_SECONDS * $stripe_subscription->plan->interval_count) * 1;
|
571 |
+
break; // Break switch now.
|
572 |
+
|
573 |
+
case 'week': // Every X weeks in this case.
|
574 |
+
$time += (WEEK_IN_SECONDS * $stripe_subscription->plan->interval_count) * 1;
|
575 |
+
break; // Break switch now.
|
576 |
+
|
577 |
+
case 'month': // Every X months in this case.
|
578 |
+
$time += ((WEEK_IN_SECONDS * 4) * $stripe_subscription->plan->interval_count) * 1;
|
579 |
+
break; // Break switch now.
|
580 |
+
|
581 |
+
case 'year': // Every X years in this case.
|
582 |
+
$time += (YEAR_IN_SECONDS * $stripe_subscription->plan->interval_count) * 1;
|
583 |
+
break; // Break switch now.
|
584 |
+
}
|
585 |
+
if($favor === 'next' && $stripe_subscription->current_period_end + 1 < $time)
|
586 |
+
{
|
587 |
+
if($stripe_subscription->current_period_end + 1 > $now)
|
588 |
+
{
|
589 |
+
$time = $stripe_subscription->current_period_end + 1;
|
590 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
591 |
+
'debug' => 'The Stripe API says this is the next payment time.');
|
592 |
+
}
|
593 |
+
return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.'));
|
594 |
+
}
|
595 |
+
$time += $grace_time; // Now add grace to the final EOT time.
|
596 |
+
return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
597 |
+
'debug' => 'The Stripe API says this subscription will be completely over on this date + grace time.');
|
598 |
+
}
|
599 |
+
if(isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times)
|
600 |
+
&& $stripe_subscription->plan->metadata->recurring && $stripe_subscription->plan->metadata->recurring_times <= 0)
|
601 |
+
{
|
602 |
+
if($stripe_subscription->current_period_end + 1 > $now)
|
603 |
+
{
|
604 |
+
$time = $stripe_subscription->current_period_end + 1;
|
605 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
606 |
+
'debug' => 'The Stripe API says this is the next payment time.');
|
607 |
+
}
|
608 |
+
return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.'));
|
609 |
+
}
|
610 |
+
if(isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times)
|
611 |
+
&& $stripe_subscription->plan->metadata->recurring && $stripe_subscription->plan->metadata->recurring_times > 0)
|
612 |
+
{
|
613 |
+
$time = (integer)$stripe_subscription->start;
|
614 |
+
$time += $stripe_subscription->plan->trial_period_days * DAY_IN_SECONDS;
|
615 |
+
|
616 |
+
switch($stripe_subscription->plan->interval)
|
617 |
+
{
|
618 |
+
case 'day': // Every X days in this case.
|
619 |
+
$time += (DAY_IN_SECONDS * $stripe_subscription->plan->interval_count)
|
620 |
+
* $stripe_subscription->plan->metadata->recurring_times;
|
621 |
+
break; // Break switch now.
|
622 |
+
|
623 |
+
case 'week': // Every X weeks in this case.
|
624 |
+
$time += (WEEK_IN_SECONDS * $stripe_subscription->plan->interval_count)
|
625 |
+
* $stripe_subscription->plan->metadata->recurring_times;
|
626 |
+
break; // Break switch now.
|
627 |
+
|
628 |
+
case 'month': // Every X months in this case.
|
629 |
+
$time += ((WEEK_IN_SECONDS * 4) * $stripe_subscription->plan->interval_count)
|
630 |
+
* $stripe_subscription->plan->metadata->recurring_times;
|
631 |
+
break; // Break switch now.
|
632 |
+
|
633 |
+
case 'year': // Every X years in this case.
|
634 |
+
$time += (YEAR_IN_SECONDS * $stripe_subscription->plan->interval_count)
|
635 |
+
* $stripe_subscription->plan->metadata->recurring_times;
|
636 |
+
break; // Break switch now.
|
637 |
+
}
|
638 |
+
if($favor === 'next' && $stripe_subscription->current_period_end + 1 < $time)
|
639 |
+
{
|
640 |
+
if($stripe_subscription->current_period_end + 1 > $now)
|
641 |
+
{
|
642 |
+
$time = $stripe_subscription->current_period_end + 1;
|
643 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
644 |
+
'debug' => 'The Stripe API says this is the next payment time.');
|
645 |
+
}
|
646 |
+
return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.'));
|
647 |
+
}
|
648 |
+
$time += $grace_time; // Now add grace to the final EOT time.
|
649 |
+
return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
650 |
+
'debug' => 'The Stripe API says this subscription will be completely over on this date + grace time.');
|
651 |
+
}
|
652 |
+
if($stripe_subscription->current_period_end + 1 > $now)
|
653 |
+
{
|
654 |
+
$time = $stripe_subscription->current_period_end + 1;
|
655 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
656 |
+
'debug' => 'The Stripe API says this is the next payment time.');
|
657 |
+
}
|
658 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and Stripe says there are no more payments needed from this user.'));
|
659 |
+
|
660 |
+
break; // Break switch.
|
661 |
+
|
662 |
+
case 'clickbank': // ClickBank (limited functionality).
|
663 |
+
|
664 |
+
if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()
|
665 |
+
|| !class_exists('c_ws_plugin__s2member_pro_clickbank_utilities')
|
666 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_username']
|
667 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_clerk_key']
|
668 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_developer_key']
|
669 |
+
|| !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_secret_key']
|
670 |
+
) return array_merge($empty_response, array('debug' => 'ClickBank API credentials missing in your s2Member configuration.'));
|
671 |
+
|
672 |
+
if(empty($ipn_signup_vars['txn_id'])) // ClickBank receipt number.
|
673 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and no `txn_id` on file. Unable to determine.'));
|
674 |
+
|
675 |
+
if(!($api_response = c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_api_order($ipn_signup_vars['txn_id'])))
|
676 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the ClickBank API says there is no subscription for this user.'));
|
677 |
+
|
678 |
+
if(!preg_match('/^(?:TEST_)?SALE$/i', $api_response['txnType']) || !$api_response['recurring'])
|
679 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and the ClickBank API says there is no recurring subscription for this user.'));
|
680 |
+
|
681 |
+
if(strcasecmp($api_response['status'], 'active') !== 0 || $api_response['futurePayments'] <= 0)
|
682 |
+
return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future',
|
683 |
+
'debug' => 'This is the estimated EOT time. The ClickBank API says this subscription no longer active, or it has reached its last payment, and thus, access should be terminated at this time.');
|
684 |
+
|
685 |
+
if($api_response['nextPaymentDate'] && ($time = strtotime($api_response['nextPaymentDate'])) > $now)
|
686 |
+
return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future',
|
687 |
+
'debug' => 'The ClickBank API says this is the next payment time.');
|
688 |
+
|
689 |
+
return array_merge($empty_response, array('debug' => 'No fixed EOT, and there are no more payments needed from this user.'));
|
690 |
+
|
691 |
+
break; // Break switch.
|
692 |
+
|
693 |
+
default: // Default case handler.
|
694 |
+
return array_merge($empty_response, array('debug' => 'Partially-supported payment gateway; unable to determine.'));
|
695 |
+
}
|
696 |
+
return array_merge($empty_response, array('debug' => 'Payment gateway check disabled; unable to determine.'));
|
697 |
+
}
|
698 |
}
|
699 |
+
}
|
includes/classes/wp-footer.inc.php
CHANGED
@@ -1,59 +1,56 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* WordPress footer code.
|
4 |
-
*
|
5 |
-
* Copyright: © 2009-2011
|
6 |
-
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
-
* (coded in the USA)
|
8 |
-
*
|
9 |
-
* Released under the terms of the GNU General Public License.
|
10 |
-
* You should have received a copy of the GNU General Public License,
|
11 |
-
* along with this software. In the main directory, see: /licensing/
|
12 |
-
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
-
*
|
14 |
-
* @package s2Member\WP_Footer
|
15 |
-
* @since 110524RC
|
16 |
-
*/
|
17 |
if(!defined('WPINC')) // MUST have WordPress.
|
18 |
-
exit (
|
19 |
|
20 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
{
|
22 |
/**
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
* @package s2Member\WP_Footer
|
34 |
-
* @since 110524RC
|
35 |
-
*
|
36 |
-
* @return null
|
37 |
-
*/
|
38 |
-
public static function wp_footer_code ()
|
39 |
-
{
|
40 |
-
do_action("ws_plugin__s2member_before_wp_footer_code", get_defined_vars ());
|
41 |
-
|
42 |
-
if (($code = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["wp_footer_code"]))
|
43 |
-
{
|
44 |
-
if (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ())
|
45 |
-
{
|
46 |
-
echo /* No PHP here. */ do_shortcode ($code) . "\n";
|
47 |
-
}
|
48 |
-
else // Otherwise, safe to allow PHP code.
|
49 |
-
{
|
50 |
-
echo do_shortcode (c_ws_plugin__s2member_utilities::evl ($code));
|
51 |
-
}
|
52 |
-
}
|
53 |
-
do_action("ws_plugin__s2member_after_wp_footer_code", get_defined_vars ());
|
54 |
|
55 |
-
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
}
|
|
|
|
|
58 |
}
|
59 |
-
|
1 |
<?php
|
2 |
/**
|
3 |
+
* WordPress footer code.
|
4 |
+
*
|
5 |
+
* Copyright: © 2009-2011
|
6 |
+
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
7 |
+
* (coded in the USA)
|
8 |
+
*
|
9 |
+
* Released under the terms of the GNU General Public License.
|
10 |
+
* You should have received a copy of the GNU General Public License,
|
11 |
+
* along with this software. In the main directory, see: /licensing/
|
12 |
+
* If not, see: {@link http://www.gnu.org/licenses/}.
|
13 |
+
*
|
14 |
+
* @package s2Member\WP_Footer
|
15 |
+
* @since 110524RC
|
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_wp_footer'))
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* WordPress footer code.
|
24 |
+
*
|
25 |
+
* @package s2Member\WP_Footer
|
26 |
+
* @since 110524RC
|
27 |
+
*/
|
28 |
+
class c_ws_plugin__s2member_wp_footer
|
29 |
{
|
30 |
/**
|
31 |
+
* Generates footer code, when/if configured.
|
32 |
+
*
|
33 |
+
* @package s2Member\WP_Footer
|
34 |
+
* @since 110524RC
|
35 |
+
*
|
36 |
+
* @return null
|
37 |
+
*/
|
38 |
+
public static function wp_footer_code()
|
39 |
+
{
|
40 |
+
do_action('ws_plugin__s2member_before_wp_footer_code', get_defined_vars());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
+
if(($code = $GLOBALS['WS_PLUGIN__']['s2member']['o']['wp_footer_code']))
|
43 |
+
{
|
44 |
+
if(is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site())
|
45 |
+
{
|
46 |
+
echo do_shortcode($code)."\n";
|
47 |
+
}
|
48 |
+
else // Otherwise, safe to allow PHP code.
|
49 |
+
{
|
50 |
+
echo do_shortcode(c_ws_plugin__s2member_utilities::evl($code));
|
51 |
+
}
|
52 |
}
|
53 |
+
do_action('ws_plugin__s2member_after_wp_footer_code', get_defined_vars());
|
54 |
+
}
|
55 |
}
|
56 |
+
}
|
includes/codes.inc.php
CHANGED
@@ -21,6 +21,7 @@ Add WordPress Editor Shortcodes.
|
|
21 |
*/
|
22 |
add_shortcode('s2Key', 'c_ws_plugin__s2member_sc_keys::sc_get_key');
|
23 |
add_shortcode('s2Get', 'c_ws_plugin__s2member_sc_gets::sc_get_details');
|
|
|
24 |
add_shortcode('s2File', 'c_ws_plugin__s2member_sc_files::sc_get_file');
|
25 |
add_shortcode('s2Stream', 'c_ws_plugin__s2member_sc_files::sc_get_stream');
|
26 |
|
@@ -38,4 +39,4 @@ add_shortcode('__________s2If', 'c_ws_plugin__s2member_sc_if_conds::sc_if_condit
|
|
38 |
|
39 |
add_shortcode('s2Member-Profile', 'c_ws_plugin__s2member_sc_profile::sc_profile');
|
40 |
add_shortcode('s2Member-PayPal-Button', 'c_ws_plugin__s2member_sc_paypal_button::sc_paypal_button');
|
41 |
-
add_shortcode('s2Member-Security-Badge', 'c_ws_plugin__s2member_sc_s_badge::sc_s_badge');
|
21 |
*/
|
22 |
add_shortcode('s2Key', 'c_ws_plugin__s2member_sc_keys::sc_get_key');
|
23 |
add_shortcode('s2Get', 'c_ws_plugin__s2member_sc_gets::sc_get_details');
|
24 |
+
add_shortcode('s2Eot', 'c_ws_plugin__s2member_sc_eots::sc_eot_details');
|
25 |
add_shortcode('s2File', 'c_ws_plugin__s2member_sc_files::sc_get_file');
|
26 |
add_shortcode('s2Stream', 'c_ws_plugin__s2member_sc_files::sc_get_stream');
|
27 |
|
39 |
|
40 |
add_shortcode('s2Member-Profile', 'c_ws_plugin__s2member_sc_profile::sc_profile');
|
41 |
add_shortcode('s2Member-PayPal-Button', 'c_ws_plugin__s2member_sc_paypal_button::sc_paypal_button');
|
42 |
+
add_shortcode('s2Member-Security-Badge', 'c_ws_plugin__s2member_sc_s_badge::sc_s_badge');
|
includes/externals/aweber/aweber.php
CHANGED
@@ -290,5 +290,3 @@ class AWeberAPI extends AWeberAPIBase {
|
|
290 |
return $this->adapter->getAccessToken();
|
291 |
}
|
292 |
}
|
293 |
-
|
294 |
-
?>
|
290 |
return $this->adapter->getAccessToken();
|
291 |
}
|
292 |
}
|
|
|
|
includes/externals/aweber/aweber_entry_data_array.php
CHANGED
@@ -62,7 +62,3 @@ class AWeberEntryDataArray implements ArrayAccess, Countable, Iterator {
|
|
62 |
|
63 |
|
64 |
}
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
?>
|
62 |
|
63 |
|
64 |
}
|
|
|
|
|
|
|
|
includes/externals/aweber/curl_object.php
CHANGED
@@ -4,10 +4,10 @@
|
|
4 |
* CurlInterface
|
5 |
*
|
6 |
* An object-oriented shim that wraps the standard PHP cURL library.
|
7 |
-
*
|
8 |
* This interface has been created so that cURL functionality can be stubbed
|
9 |
* out for unit testing, or swapped for an alternative library.
|
10 |
-
*
|
11 |
* @see curl
|
12 |
* @package
|
13 |
* @version $id$
|
@@ -19,19 +19,19 @@ interface CurlInterface {
|
|
19 |
*
|
20 |
* Encapsulates curl_errno - Returns the last error number
|
21 |
* @param resource $ch - A cURL handle returned by init.
|
22 |
-
* @access public
|
23 |
* @return the error number or 0 if no error occured.
|
24 |
*/
|
25 |
-
public function errno($ch);
|
26 |
-
|
27 |
/**
|
28 |
* error
|
29 |
*
|
30 |
* Encapsulates curl_error - Return last error string
|
31 |
* @param resource $ch - A cURL handle returned by init.
|
32 |
-
* @access public
|
33 |
* @return the error messge or '' if no error occured.
|
34 |
-
*/
|
35 |
public function error($ch);
|
36 |
|
37 |
/**
|
@@ -39,9 +39,9 @@ interface CurlInterface {
|
|
39 |
*
|
40 |
* Encapsulates curl_exec - Perform a cURL session.
|
41 |
* @param resource $ch - A cURL handle returned by init.
|
42 |
-
* @access public
|
43 |
* @return TRUE on success, FALSE on failure.
|
44 |
-
*/
|
45 |
public function execute($ch);
|
46 |
|
47 |
/**
|
@@ -49,11 +49,11 @@ interface CurlInterface {
|
|
49 |
*
|
50 |
* Encapsulates curl_init - Initialize a cURL session.
|
51 |
* @param string $url - url to use.
|
52 |
-
* @access public
|
53 |
* @return cURL handle on success, FALSE on failure.
|
54 |
-
*/
|
55 |
public function init($url);
|
56 |
-
|
57 |
/**
|
58 |
* setopt
|
59 |
*
|
@@ -61,9 +61,9 @@ interface CurlInterface {
|
|
61 |
* @param resource $ch - A cURL handle returned by init.
|
62 |
* @param int $opt - The CURLOPT to set.
|
63 |
* @param mixed $value - The value to set.
|
64 |
-
* @access public
|
65 |
* @return True on success, FALSE on failure.
|
66 |
-
*/
|
67 |
public function setopt ($ch , $option , $value);
|
68 |
}
|
69 |
|
@@ -77,27 +77,25 @@ interface CurlInterface {
|
|
77 |
* @version $id$
|
78 |
*/
|
79 |
class CurlObject implements CurlInterface {
|
80 |
-
|
81 |
public function errno($ch) {
|
82 |
return curl_errno($ch);
|
83 |
-
}
|
84 |
|
85 |
public function error($ch) {
|
86 |
return curl_error($ch);
|
87 |
-
}
|
88 |
-
|
89 |
public function execute($ch) {
|
90 |
return curl_exec($ch);
|
91 |
}
|
92 |
|
93 |
public function init($url) {
|
94 |
-
return curl_init($url);
|
95 |
}
|
96 |
-
|
97 |
public function setopt ($ch , $option , $value) {
|
98 |
return curl_setopt($ch, $option, $value);
|
99 |
}
|
100 |
|
101 |
}
|
102 |
-
|
103 |
-
?>
|
4 |
* CurlInterface
|
5 |
*
|
6 |
* An object-oriented shim that wraps the standard PHP cURL library.
|
7 |
+
*
|
8 |
* This interface has been created so that cURL functionality can be stubbed
|
9 |
* out for unit testing, or swapped for an alternative library.
|
10 |
+
*
|
11 |
* @see curl
|
12 |
* @package
|
13 |
* @version $id$
|
19 |
*
|
20 |
* Encapsulates curl_errno - Returns the last error number
|
21 |
* @param resource $ch - A cURL handle returned by init.
|
22 |
+
* @access public
|
23 |
* @return the error number or 0 if no error occured.
|
24 |
*/
|
25 |
+
public function errno($ch);
|
26 |
+
|
27 |
/**
|
28 |
* error
|
29 |
*
|
30 |
* Encapsulates curl_error - Return last error string
|
31 |
* @param resource $ch - A cURL handle returned by init.
|
32 |
+
* @access public
|
33 |
* @return the error messge or '' if no error occured.
|
34 |
+
*/
|
35 |
public function error($ch);
|
36 |
|
37 |
/**
|
39 |
*
|
40 |
* Encapsulates curl_exec - Perform a cURL session.
|
41 |
* @param resource $ch - A cURL handle returned by init.
|
42 |
+
* @access public
|
43 |
* @return TRUE on success, FALSE on failure.
|
44 |
+
*/
|
45 |
public function execute($ch);
|
46 |
|
47 |
/**
|
49 |
*
|
50 |
* Encapsulates curl_init - Initialize a cURL session.
|
51 |
* @param string $url - url to use.
|
52 |
+
* @access public
|
53 |
* @return cURL handle on success, FALSE on failure.
|
54 |
+
*/
|
55 |
public function init($url);
|
56 |
+
|
57 |
/**
|
58 |
* setopt
|
59 |
*
|
61 |
* @param resource $ch - A cURL handle returned by init.
|
62 |
* @param int $opt - The CURLOPT to set.
|
63 |
* @param mixed $value - The value to set.
|
64 |
+
* @access public
|
65 |
* @return True on success, FALSE on failure.
|
66 |
+
*/
|
67 |
public function setopt ($ch , $option , $value);
|
68 |
}
|
69 |
|
77 |
* @version $id$
|
78 |
*/
|
79 |
class CurlObject implements CurlInterface {
|
80 |
+
|
81 |
public function errno($ch) {
|
82 |
return curl_errno($ch);
|
83 |
+
}
|
84 |
|
85 |
public function error($ch) {
|
86 |
return curl_error($ch);
|
87 |
+
}
|
88 |
+
|
89 |
public function execute($ch) {
|
90 |
return curl_exec($ch);
|
91 |
}
|
92 |
|
93 |
public function init($url) {
|
94 |
+
return curl_init($url);
|
95 |
}
|
96 |
+
|
97 |
public function setopt ($ch , $option , $value) {
|
98 |
return curl_setopt($ch, $option, $value);
|
99 |
}
|
100 |
|
101 |
}
|
|
|
|
includes/externals/aweber/oauth_adapter.php
CHANGED
@@ -6,6 +6,3 @@ interface AWeberOAuthAdapter {
|
|
6 |
public function getRequestToken($callbackUrl=false);
|
7 |
|
8 |
}
|
9 |
-
|
10 |
-
|
11 |
-
?>
|
6 |
public function getRequestToken($callbackUrl=false);
|
7 |
|
8 |
}
|
|
|
|
|
|
includes/externals/aweber/oauth_application.php
CHANGED
@@ -239,9 +239,9 @@ class OAuthApplication implements AWeberOAuthAdapter {
|
|
239 |
/**
|
240 |
* _addParametersToUrl
|
241 |
*
|
242 |
-
* Adds the parameters in associative array $data to the
|
243 |
* given URL
|
244 |
-
* @param String $url URL
|
245 |
* @param array $data Parameters to be added as a query string to
|
246 |
* the URL provided
|
247 |
* @access protected
|
@@ -430,7 +430,7 @@ class OAuthApplication implements AWeberOAuthAdapter {
|
|
430 |
* makeRequest
|
431 |
*
|
432 |
* Public facing function to make a request
|
433 |
-
*
|
434 |
* @param mixed $method
|
435 |
* @param mixed $url - Reserved characters in query params MUST be escaped
|
436 |
* @param mixed $data - Reserved characters in values MUST NOT be escaped
|
@@ -440,7 +440,7 @@ class OAuthApplication implements AWeberOAuthAdapter {
|
|
440 |
public function makeRequest($method, $url, $data=array()) {
|
441 |
|
442 |
if ($this->debug) echo "\n** {$method}: $url\n";
|
443 |
-
|
444 |
switch (strtoupper($method)) {
|
445 |
case 'POST':
|
446 |
$oauth = $this->prepareRequest($method, $url, $data);
|
@@ -677,5 +677,3 @@ class OAuthUser {
|
|
677 |
}
|
678 |
|
679 |
}
|
680 |
-
|
681 |
-
?>
|
239 |
/**
|
240 |
* _addParametersToUrl
|
241 |
*
|
242 |
+
* Adds the parameters in associative array $data to the
|
243 |
* given URL
|
244 |
+
* @param String $url URL
|
245 |
* @param array $data Parameters to be added as a query string to
|
246 |
* the URL provided
|
247 |
* @access protected
|
430 |
* makeRequest
|
431 |
*
|
432 |
* Public facing function to make a request
|
433 |
+
*
|
434 |
* @param mixed $method
|
435 |
* @param mixed $url - Reserved characters in query params MUST be escaped
|
436 |
* @param mixed $data - Reserved characters in values MUST NOT be escaped
|
440 |
public function makeRequest($method, $url, $data=array()) {
|
441 |
|
442 |
if ($this->debug) echo "\n** {$method}: $url\n";
|
443 |
+
|
444 |
switch (strtoupper($method)) {
|
445 |
case 'POST':
|
446 |
$oauth = $this->prepareRequest($method, $url, $data);
|
677 |
}
|
678 |
|
679 |
}
|
|
|
|
includes/externals/mailchimp/Mailchimp-o.php
CHANGED
@@ -2451,4 +2451,3 @@ class Mailchimp_o {
|
|
2451 |
}
|
2452 |
|
2453 |
}
|
2454 |
-
?>
|
2451 |
}
|
2452 |
|
2453 |
}
|
|
includes/externals/mailchimp/Mailchimp/Campaigns.php
CHANGED
@@ -78,7 +78,7 @@ class Mailchimp_Campaigns {
|
|
78 |
* - schedule_hour string optional an hour between 0 and 24 - default to 4 (4am <em>local time</em>) - applies to all schedule types
|
79 |
* - schedule_weekday string optional for "weekly" only, a number specifying the day of the week to send: 0 (Sunday) - 6 (Saturday) - defaults to 1 (Monday)
|
80 |
* - schedule_monthday string optional for "monthly" only, a number specifying the day of the month to send (1 - 28) or "last" for the last day of a given month. Defaults to the 1st day of the month
|
81 |
-
* - days associative_array optional used for "daily" schedules only, an array of the <a href="
|
82 |
* - 1 bool optional Monday, defaults to true
|
83 |
* - 2 bool optional Tuesday, defaults to true
|
84 |
* - 3 bool optional Wednesday, defaults to true
|
@@ -108,7 +108,7 @@ class Mailchimp_Campaigns {
|
|
108 |
* - campaign_url string optional sort of, required for "campaignClicko"
|
109 |
* - schedule_hour int The hour of the day - 24 hour format in GMT - the autoresponder should be triggered, ignored for "hourly"
|
110 |
* - use_import_time boolean whether or not imported subscribers (ie, <em>any</em> non-double optin subscribers) will receive
|
111 |
-
* - days associative_array optional used for "daily" schedules only, an array of the <a href="
|
112 |
* - 1 bool optional Monday, defaults to true
|
113 |
* - 2 bool optional Tuesday, defaults to true
|
114 |
* - 3 bool optional Wednesday, defaults to true
|
@@ -374,5 +374,3 @@ Caveats:<br/><ul class='bullets'>
|
|
374 |
}
|
375 |
|
376 |
}
|
377 |
-
|
378 |
-
|
78 |
* - schedule_hour string optional an hour between 0 and 24 - default to 4 (4am <em>local time</em>) - applies to all schedule types
|
79 |
* - schedule_weekday string optional for "weekly" only, a number specifying the day of the week to send: 0 (Sunday) - 6 (Saturday) - defaults to 1 (Monday)
|
80 |
* - schedule_monthday string optional for "monthly" only, a number specifying the day of the month to send (1 - 28) or "last" for the last day of a given month. Defaults to the 1st day of the month
|
81 |
+
* - days associative_array optional used for "daily" schedules only, an array of the <a href="https://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on
|
82 |
* - 1 bool optional Monday, defaults to true
|
83 |
* - 2 bool optional Tuesday, defaults to true
|
84 |
* - 3 bool optional Wednesday, defaults to true
|
108 |
* - campaign_url string optional sort of, required for "campaignClicko"
|
109 |
* - schedule_hour int The hour of the day - 24 hour format in GMT - the autoresponder should be triggered, ignored for "hourly"
|
110 |
* - use_import_time boolean whether or not imported subscribers (ie, <em>any</em> non-double optin subscribers) will receive
|
111 |
+
* - days associative_array optional used for "daily" schedules only, an array of the <a href="https://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on<
|
112 |
* - 1 bool optional Monday, defaults to true
|
113 |
* - 2 bool optional Tuesday, defaults to true
|
114 |
* - 3 bool optional Wednesday, defaults to true
|
374 |
}
|
375 |
|
376 |
}
|
|
|
|
includes/externals/mailchimp/Mailchimp/Lists.php
CHANGED
@@ -395,7 +395,7 @@ data or specific members of a list? If so, checkout the <a href="/export/1.0/lis
|
|
395 |
* - choices array optional kind of - an array of strings to use as the choices for radio and dropdown type fields
|
396 |
* - dateformat string optional only valid for birthday and date fields. For birthday type, must be "MM/DD" (default) or "DD/MM". For date type, must be "MM/DD/YYYY" (default) or "DD/MM/YYYY". Any other values will be converted to the default.
|
397 |
* - phoneformat string optional "US" is the default - any other value will cause them to be unformatted (international)
|
398 |
-
* - defaultcountry string optional the <a href="http://
|
399 |
* @return associative_array the full data for the new merge var, just like merge-vars returns
|
400 |
* - name string Name/description of the merge field
|
401 |
* - req bool Denotes whether the field is required (true) or not (false)
|
395 |
* - choices array optional kind of - an array of strings to use as the choices for radio and dropdown type fields
|
396 |
* - dateformat string optional only valid for birthday and date fields. For birthday type, must be "MM/DD" (default) or "DD/MM". For date type, must be "MM/DD/YYYY" (default) or "DD/MM/YYYY". Any other values will be converted to the default.
|
397 |
* - phoneformat string optional "US" is the default - any other value will cause them to be unformatted (international)
|
398 |
+
* - defaultcountry string optional the <a href="http://s2member.com/r/iso-3166/" target="_blank">ISO 3166 2 digit character code</a> for the default country. Defaults to "US". Anything unrecognized will be converted to the default.
|
399 |
* @return associative_array the full data for the new merge var, just like merge-vars returns
|
400 |
* - name string Name/description of the merge field
|
401 |
* - req bool Denotes whether the field is required (true) or not (false)
|
includes/externals/markdown/nc-markdown.inc.php
CHANGED
@@ -1471,4 +1471,3 @@ class NC_Markdown_Parser {
|
|
1471 |
}
|
1472 |
|
1473 |
}
|
1474 |
-
?>
|
1471 |
}
|
1472 |
|
1473 |
}
|
|
includes/functions/api-functions.inc.php
CHANGED
@@ -102,7 +102,7 @@ if(!function_exists("is_user_not_logged_in"))
|
|
102 |
*
|
103 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
104 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
105 |
-
* All of their other {@link http://
|
106 |
*
|
107 |
* @package s2Member\API_Functions
|
108 |
* @since 110524RC
|
@@ -187,7 +187,7 @@ if(!function_exists("user_is"))
|
|
187 |
*
|
188 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
189 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
190 |
-
* All of their other {@link http://
|
191 |
*
|
192 |
* @package s2Member\API_Functions
|
193 |
* @since 110524RC
|
@@ -265,7 +265,7 @@ if(!function_exists("user_is_not"))
|
|
265 |
*
|
266 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
267 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
268 |
-
* All of their other {@link http://
|
269 |
*
|
270 |
* @package s2Member\API_Functions
|
271 |
* @since 3.5
|
@@ -349,7 +349,7 @@ if(!function_exists("current_user_is"))
|
|
349 |
*
|
350 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
351 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
352 |
-
* All of their other {@link http://
|
353 |
*
|
354 |
* @package s2Member\API_Functions
|
355 |
* @since 3.5
|
@@ -431,7 +431,7 @@ if(!function_exists("current_user_is_not"))
|
|
431 |
*
|
432 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
433 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
434 |
-
* All of their other {@link http://
|
435 |
*
|
436 |
* @package s2Member\API_Functions
|
437 |
* @since 3.5
|
@@ -510,7 +510,7 @@ if(!function_exists("current_user_is_for_blog"))
|
|
510 |
*
|
511 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
512 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
513 |
-
* All of their other {@link http://
|
514 |
*
|
515 |
* @package s2Member\API_Functions
|
516 |
* @since 3.5
|
@@ -579,7 +579,7 @@ if(!function_exists("current_user_is_not_for_blog"))
|
|
579 |
*
|
580 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
581 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
582 |
-
* All of their other {@link http://
|
583 |
*
|
584 |
* @package s2Member\API_Functions
|
585 |
* @since 3.5
|
@@ -648,7 +648,7 @@ if(!function_exists("user_cannot"))
|
|
648 |
*
|
649 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
650 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
651 |
-
* All of their other {@link http://
|
652 |
*
|
653 |
* @package s2Member\API_Functions
|
654 |
* @since 3.5
|
@@ -717,7 +717,7 @@ if(!function_exists("current_user_cannot"))
|
|
717 |
*
|
718 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
719 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
720 |
-
* All of their other {@link http://
|
721 |
*
|
722 |
* @package s2Member\API_Functions
|
723 |
* @since 3.5
|
@@ -1852,7 +1852,7 @@ if(!function_exists("detach_s2member_query_filters"))
|
|
1852 |
* Generates a File Download URL that provides access to a File protected by s2Member.
|
1853 |
*
|
1854 |
* By default, s2Member uses your Basic Download Restrictions. For more information on this,
|
1855 |
-
* please check your Dashboard under: `s2Member
|
1856 |
*
|
1857 |
* ———— HTML/PHP Code Samples ————
|
1858 |
* ```
|
@@ -1888,7 +1888,7 @@ if(!function_exists("detach_s2member_query_filters"))
|
|
1888 |
*
|
1889 |
* o ``"file_download" => "file.zip"`` Location of the file, relative to the `/s2member-files/` directory; or, relative to the root of your Amazon S3 Bucket, when applicable.
|
1890 |
* o ``"file_download_key" => false`` Defaults to `false`. If `true`, s2Member will return a URL with an s2Member-generated File Download Key. You don't need to generate the File Download Key yourself, s2Member does it for you. If you set this to `ip-forever`, the File Download Key that s2Member generates will last forever, for a specific IP Address; otherwise, by default, all File Download Keys expire after 24 hours automatically. If you set this to `universal`, s2Member will generate a File Download Key that is good for anyone/everyone forever, with NO restrictions on who/where/when a file is accessed *(e.g., be careful with this one)*.
|
1891 |
-
* o ``"file_stream" => false`` Defaults to `false`. If `true`, s2Member will return a URL containing a parameter/directive, which forces the File Download to take place over the RTMP protocol. This ONLY works when/if s2Member is configured to run with both Amazon S3/CloudFront. Please note however, it's better to use the example code provided in the your Dashboard. See: `s2Member
|
1892 |
* o ``"file_inline" => null`` Defaults to `null`. If `true`, s2Member will serve the file inline, instead of as an actual File Download. If empty, s2Member will look at your Inline File Extensions configuration, and serve the file inline; if, and only if, its extension matches one found in your configuration. By default, s2Member serves all files as attachments *(i.e., downloads)*. Please check your Dashboard regarding Inline File Extensions. Also note, this Shortcode Attribute does NOTHING for files served via Amazon CloudFront. See the tech-notes listed in the Amazon CloudFront section of your Dashboard for further details and workarounds.
|
1893 |
* o ``"file_storage" => null`` Defaults to `null`. Can be one of `local|s3|cf`. When specified, s2Member will serve the file from a specific source location. For example, if you've configured Amazon S3 and/or CloudFront; but, there are a few files that you want to upload locally to the `/s2member-files/` directory; you can force s2Member to serve a file from local storage by setting ``"file_storage" => "local"`` explicitly.
|
1894 |
* o ``"file_remote" => false`` Defaults to `false`. If `true`, s2Member will authenticate access to the File Download via Remote Header Authorization, instead of through your web site. This is similar to `.htaccess` protection routines of yester-year. Please check the Remote Authorization and Podcasting section in your Dashboard for further details about how this works.
|
@@ -1900,14 +1900,14 @@ if(!function_exists("detach_s2member_query_filters"))
|
|
1900 |
* o ``"count_against_user" => false`` Defaults to `false`. If `true`, it will automatically force ``"check_user" => true`` as well. In other words, s2Member will authenticate the current User, and if authenticated, count this File Download URL against the current User's account record in real-time *(i.e., as the URL is being generated)*. This is off by default. By default, s2Member will simply generate a File Download URL, and upon a User/Member clicking the URL, s2Member will authenticate the User/Member at that time, count the File Download against their account record, and serve the File Download. In other words, under normal circumstances, there is no reason to set ``"check_user" => true`` and/or ``"count_against_user" => true`` when generating the URL itself. However, this is a useful config option when ``"url_to_storage_source" => true``. Please note, when ``"check_user" => true`` and/or ``"count_against_user" => true``, this API Function will return `false` in situations where the current User/Member does NOT have access to the file.
|
1901 |
* o ``"check_user => false`` Defaults to `false`. If `true`, s2Member will authenticate the current User before allowing the File Download URL to be generated. This is off by default. By default, s2Member will simply generate a File Download URL, and upon a User/Member clicking the URL, s2Member will authenticate the User/Member at that time, and serve the File Download to the User/Member. In other words, under normal circumstances, there is no reason to set ``"check_user" => true`` and/or ``"count_against_user" => true`` when generating the URL itself. However, this IS a useful config option when ``"url_to_storage_source" => true``. Please note, when ``"check_user" => true`` and/or ``"count_against_user" => true``, this API Function will return `false` in situations where the current User/Member does NOT have access to the file.
|
1902 |
*
|
1903 |
-
* **Parameter $get_streamer_array(bool Optional).** Defaults to `false`. If `true`, this API Function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member
|
1904 |
*
|
1905 |
* @package s2Member\API_Functions
|
1906 |
* @since 110926
|
1907 |
*
|
1908 |
* @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.
|
1909 |
* 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`.
|
1910 |
-
* @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this API Function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member
|
1911 |
* @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.
|
1912 |
*
|
1913 |
* @see s2Member\API_Functions\s2member_file_download_key()
|
@@ -1923,7 +1923,7 @@ if(!function_exists("s2member_file_download_url"))
|
|
1923 |
* Generates a File Download Key that provides access to a File protected by s2Member.
|
1924 |
*
|
1925 |
* By default, s2Member uses your Basic Download Restrictions. For more information on this,
|
1926 |
-
* please check your Dashboard under: `s2Member
|
1927 |
*
|
1928 |
* ———— Advanced Download Restrictions ————
|
1929 |
*
|
@@ -2131,7 +2131,7 @@ if(!function_exists("s2member_total_unique_downloads_of"))
|
|
2131 |
* Obtains the Last Login Time for the current User, and/or for a particular User.
|
2132 |
*
|
2133 |
* The Last Login Time, is the time at which the Username last logged into the site.
|
2134 |
-
* There's nothing special about this. This simply returns a {@link
|
2135 |
*
|
2136 |
* ———— Code Sample Using Function Parameters ————
|
2137 |
* ```
|
@@ -2152,7 +2152,7 @@ if(!function_exists("s2member_total_unique_downloads_of"))
|
|
2152 |
* @since 130210
|
2153 |
*
|
2154 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2155 |
-
* @return int A {@link
|
2156 |
* The Last Login Time, is the time at which the Username last logged into the site.
|
2157 |
* If the User has never logged into the site (or s2Member has never recorded them logging in), this will return `0`.
|
2158 |
*
|
@@ -2169,7 +2169,7 @@ if(!function_exists("s2member_last_login_time"))
|
|
2169 |
* Obtains the Registration Time for the current User, and/or for a particular User.
|
2170 |
*
|
2171 |
* The Registration Time, is the time at which the Username was created for the account, that's it.
|
2172 |
-
* There's nothing special about this. This simply returns a {@link
|
2173 |
*
|
2174 |
* ———— Code Sample Using Function Parameters ————
|
2175 |
* ```
|
@@ -2190,7 +2190,7 @@ if(!function_exists("s2member_last_login_time"))
|
|
2190 |
* @since 3.5
|
2191 |
*
|
2192 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2193 |
-
* @return int A {@link
|
2194 |
* The Registration Time, is the time at which the Username was created for the account, that's it.
|
2195 |
*
|
2196 |
* @see s2Member\API_Functions\get_user_field()
|
@@ -2234,7 +2234,7 @@ if(!function_exists("s2member_registration_time"))
|
|
2234 |
*
|
2235 |
* @param string $level Optional. Defaults to the first/initial Paid Registration Time, regardless of Level#.
|
2236 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2237 |
-
* @return int A {@link
|
2238 |
*
|
2239 |
* @see s2Member\API_Functions\get_user_field()
|
2240 |
*/
|
@@ -2440,9 +2440,9 @@ if(!function_exists("s2member_access_cap_times") && !function_exists("s2member_c
|
|
2440 |
*/
|
2441 |
if(!function_exists("get_user_field"))
|
2442 |
{
|
2443 |
-
function get_user_field($field_id = FALSE, $user_id = FALSE)
|
2444 |
{
|
2445 |
-
return c_ws_plugin__s2member_utils_users::get_user_field($field_id, $user_id);
|
2446 |
}
|
2447 |
}
|
2448 |
/**
|
@@ -2732,4 +2732,40 @@ if(!function_exists("s2member_login_ips_for"))
|
|
2732 |
return (is_array($ips)) ? $ips : array();
|
2733 |
}
|
2734 |
}
|
2735 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
*
|
103 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
104 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
105 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
106 |
*
|
107 |
* @package s2Member\API_Functions
|
108 |
* @since 110524RC
|
187 |
*
|
188 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
189 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
190 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
191 |
*
|
192 |
* @package s2Member\API_Functions
|
193 |
* @since 110524RC
|
265 |
*
|
266 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
267 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
268 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
269 |
*
|
270 |
* @package s2Member\API_Functions
|
271 |
* @since 3.5
|
349 |
*
|
350 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
351 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
352 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
353 |
*
|
354 |
* @package s2Member\API_Functions
|
355 |
* @since 3.5
|
431 |
*
|
432 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
433 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
434 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
435 |
*
|
436 |
* @package s2Member\API_Functions
|
437 |
* @since 3.5
|
510 |
*
|
511 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
512 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
513 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
514 |
*
|
515 |
* @package s2Member\API_Functions
|
516 |
* @since 3.5
|
579 |
*
|
580 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
581 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
582 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
583 |
*
|
584 |
* @package s2Member\API_Functions
|
585 |
* @since 3.5
|
648 |
*
|
649 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
650 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
651 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
652 |
*
|
653 |
* @package s2Member\API_Functions
|
654 |
* @since 3.5
|
717 |
*
|
718 |
* WordPress Subscribers are at Membership Level 0. If you're allowing Open Registration, Subscribers will be at Level 0 *(a Free Subscriber)*.
|
719 |
* WordPress Administrators, Editors, Authors, and Contributors have Level 4 access, with respect to s2Member.
|
720 |
+
* All of their other {@link http://s2member.com/r/wordpress-rolescaps/ Roles/Capabilities} are left untouched.
|
721 |
*
|
722 |
* @package s2Member\API_Functions
|
723 |
* @since 3.5
|
1852 |
* Generates a File Download URL that provides access to a File protected by s2Member.
|
1853 |
*
|
1854 |
* By default, s2Member uses your Basic Download Restrictions. For more information on this,
|
1855 |
+
* please check your Dashboard under: `s2Member → Download Options → Basic Download Restrictions`.
|
1856 |
*
|
1857 |
* ———— HTML/PHP Code Samples ————
|
1858 |
* ```
|
1888 |
*
|
1889 |
* o ``"file_download" => "file.zip"`` Location of the file, relative to the `/s2member-files/` directory; or, relative to the root of your Amazon S3 Bucket, when applicable.
|
1890 |
* o ``"file_download_key" => false`` Defaults to `false`. If `true`, s2Member will return a URL with an s2Member-generated File Download Key. You don't need to generate the File Download Key yourself, s2Member does it for you. If you set this to `ip-forever`, the File Download Key that s2Member generates will last forever, for a specific IP Address; otherwise, by default, all File Download Keys expire after 24 hours automatically. If you set this to `universal`, s2Member will generate a File Download Key that is good for anyone/everyone forever, with NO restrictions on who/where/when a file is accessed *(e.g., be careful with this one)*.
|
1891 |
+
* o ``"file_stream" => false`` Defaults to `false`. If `true`, s2Member will return a URL containing a parameter/directive, which forces the File Download to take place over the RTMP protocol. This ONLY works when/if s2Member is configured to run with both Amazon S3/CloudFront. Please note however, it's better to use the example code provided in the your Dashboard. See: `s2Member → Download Options → JW Player and the RTMP Protocol`. Also note, if ``$get_streamer_array`` is passed, s2Member will automatically force ``"file_stream" => true`` for you.
|
1892 |
* o ``"file_inline" => null`` Defaults to `null`. If `true`, s2Member will serve the file inline, instead of as an actual File Download. If empty, s2Member will look at your Inline File Extensions configuration, and serve the file inline; if, and only if, its extension matches one found in your configuration. By default, s2Member serves all files as attachments *(i.e., downloads)*. Please check your Dashboard regarding Inline File Extensions. Also note, this Shortcode Attribute does NOTHING for files served via Amazon CloudFront. See the tech-notes listed in the Amazon CloudFront section of your Dashboard for further details and workarounds.
|
1893 |
* o ``"file_storage" => null`` Defaults to `null`. Can be one of `local|s3|cf`. When specified, s2Member will serve the file from a specific source location. For example, if you've configured Amazon S3 and/or CloudFront; but, there are a few files that you want to upload locally to the `/s2member-files/` directory; you can force s2Member to serve a file from local storage by setting ``"file_storage" => "local"`` explicitly.
|
1894 |
* o ``"file_remote" => false`` Defaults to `false`. If `true`, s2Member will authenticate access to the File Download via Remote Header Authorization, instead of through your web site. This is similar to `.htaccess` protection routines of yester-year. Please check the Remote Authorization and Podcasting section in your Dashboard for further details about how this works.
|
1900 |
* o ``"count_against_user" => false`` Defaults to `false`. If `true`, it will automatically force ``"check_user" => true`` as well. In other words, s2Member will authenticate the current User, and if authenticated, count this File Download URL against the current User's account record in real-time *(i.e., as the URL is being generated)*. This is off by default. By default, s2Member will simply generate a File Download URL, and upon a User/Member clicking the URL, s2Member will authenticate the User/Member at that time, count the File Download against their account record, and serve the File Download. In other words, under normal circumstances, there is no reason to set ``"check_user" => true`` and/or ``"count_against_user" => true`` when generating the URL itself. However, this is a useful config option when ``"url_to_storage_source" => true``. Please note, when ``"check_user" => true`` and/or ``"count_against_user" => true``, this API Function will return `false` in situations where the current User/Member does NOT have access to the file.
|
1901 |
* o ``"check_user => false`` Defaults to `false`. If `true`, s2Member will authenticate the current User before allowing the File Download URL to be generated. This is off by default. By default, s2Member will simply generate a File Download URL, and upon a User/Member clicking the URL, s2Member will authenticate the User/Member at that time, and serve the File Download to the User/Member. In other words, under normal circumstances, there is no reason to set ``"check_user" => true`` and/or ``"count_against_user" => true`` when generating the URL itself. However, this IS a useful config option when ``"url_to_storage_source" => true``. Please note, when ``"check_user" => true`` and/or ``"count_against_user" => true``, this API Function will return `false` in situations where the current User/Member does NOT have access to the file.
|
1902 |
*
|
1903 |
+
* **Parameter $get_streamer_array(bool Optional).** Defaults to `false`. If `true`, this API 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`. Note, if this is true, s2Member will automatically force ``"url_to_storage_source" => true`` and ``"file_stream" => true``. For that reason, you should carefully review the details and warning above regarding `url_to_storage_source`. If you set ``$get_streamer_array``, you should also set ``"check_user" => true`` and ``"count_against_user" => true``.
|
1904 |
*
|
1905 |
* @package s2Member\API_Functions
|
1906 |
* @since 110926
|
1907 |
*
|
1908 |
* @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.
|
1909 |
* 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`.
|
1910 |
+
* @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this API 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`. Note, if this is true, s2Member will automatically force ``"url_to_storage_source" => true`` and ``"file_stream" => true``. For that reason, you should carefully review the details and warning above regarding `url_to_storage_source`. If you set ``$get_streamer_array``, you should also set ``"check_user" => true`` and ``"count_against_user" => true``.
|
1911 |
* @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.
|
1912 |
*
|
1913 |
* @see s2Member\API_Functions\s2member_file_download_key()
|
1923 |
* Generates a File Download Key that provides access to a File protected by s2Member.
|
1924 |
*
|
1925 |
* By default, s2Member uses your Basic Download Restrictions. For more information on this,
|
1926 |
+
* please check your Dashboard under: `s2Member → Download Options → Basic Download Restrictions`.
|
1927 |
*
|
1928 |
* ———— Advanced Download Restrictions ————
|
1929 |
*
|
2131 |
* Obtains the Last Login Time for the current User, and/or for a particular User.
|
2132 |
*
|
2133 |
* The Last Login Time, is the time at which the Username last logged into the site.
|
2134 |
+
* There's nothing special about this. This simply returns a {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
|
2135 |
*
|
2136 |
* ———— Code Sample Using Function Parameters ————
|
2137 |
* ```
|
2152 |
* @since 130210
|
2153 |
*
|
2154 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2155 |
+
* @return int A {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
|
2156 |
* The Last Login Time, is the time at which the Username last logged into the site.
|
2157 |
* If the User has never logged into the site (or s2Member has never recorded them logging in), this will return `0`.
|
2158 |
*
|
2169 |
* Obtains the Registration Time for the current User, and/or for a particular User.
|
2170 |
*
|
2171 |
* The Registration Time, is the time at which the Username was created for the account, that's it.
|
2172 |
+
* There's nothing special about this. This simply returns a {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
|
2173 |
*
|
2174 |
* ———— Code Sample Using Function Parameters ————
|
2175 |
* ```
|
2190 |
* @since 3.5
|
2191 |
*
|
2192 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2193 |
+
* @return int A {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
|
2194 |
* The Registration Time, is the time at which the Username was created for the account, that's it.
|
2195 |
*
|
2196 |
* @see s2Member\API_Functions\get_user_field()
|
2234 |
*
|
2235 |
* @param string $level Optional. Defaults to the first/initial Paid Registration Time, regardless of Level#.
|
2236 |
* @param int $user_id Optional. Defaults to the current User's ID.
|
2237 |
+
* @return int A {@link https://en.wikipedia.org/wiki/Unix_time Unix Timestamp}.
|
2238 |
*
|
2239 |
* @see s2Member\API_Functions\get_user_field()
|
2240 |
*/
|
2440 |
*/
|
2441 |
if(!function_exists("get_user_field"))
|
2442 |
{
|
2443 |
+
function get_user_field($field_id = FALSE, $user_id = FALSE, $args = array())
|
2444 |
{
|
2445 |
+
return c_ws_plugin__s2member_utils_users::get_user_field($field_id, $user_id, $args);
|
2446 |
}
|
2447 |
}
|
2448 |
/**
|
2732 |
return (is_array($ips)) ? $ips : array();
|
2733 |
}
|
2734 |
}
|
2735 |
+
|
2736 |
+
/**
|
2737 |
+
* Auto EOT time, else NPR (next payment time).
|
2738 |
+
*
|
2739 |
+
* ———— PHP Code Samples ————
|
2740 |
+
* ```
|
2741 |
+
* <!php print_r($eot = s2member_eot()); !>
|
2742 |
+
* ```
|
2743 |
+
* ———— Shortcode Equivalent ————
|
2744 |
+
* ```
|
2745 |
+
* [s2Eot /]
|
2746 |
+
* ```
|
2747 |
+
*
|
2748 |
+
* @package s2Member\API_Functions
|
2749 |
+
* @since 150713
|
2750 |
+
*
|
2751 |
+
* @param string|int $user_id Defaults to the current user ID.
|
2752 |
+
* @param bool $check_gateway Defaults to a true value. If this is false, it is only possible to return a fixed EOT time.
|
2753 |
+
* In other words, if this is false and there is no EOT time, empty values will be returned. Be careful with this, because not checking
|
2754 |
+
* the payment gateway can result in an inaccurate return value. Only set to false if you want to limit the check to a fixed hard-coded EOT time.
|
2755 |
+
* @param string $favor Defaults to a value of `fixed`; i.e., if a fixed EOT time is available, that is returned in favor of a next payment time.
|
2756 |
+
* You can set this to `next` if you'd like to favor a next payment time (when applicable) instead of returning a fixed EOT time.
|
2757 |
+
*
|
2758 |
+
* @return array An associative array of EOT details; with the following elements.
|
2759 |
+
*
|
2760 |
+
* - `type` One of `fixed` (a fixed EOT time), `next` (next payment time; i.e., ongoing recurring subscription), or an empty string if there is no EOT for the user.
|
2761 |
+
* - `time` The timestamp (UTC time) that represents the EOT (End Of Term); else `0` if there is no EOT time.
|
2762 |
+
* - `tense` One of `past`, `future`, or an empty string if there is no EOT time. If time is now (or earlier) this will be `past`. If time is in the future, this will be `future`.
|
2763 |
+
* - `debug` A string of details that explain to a developer what was returned. For debugging only.
|
2764 |
+
*/
|
2765 |
+
if(!function_exists('s2member_eot'))
|
2766 |
+
{
|
2767 |
+
function s2member_eot($user_id = 0, $check_gateway = true, $favor = 'fixed')
|
2768 |
+
{
|
2769 |
+
return c_ws_plugin__s2member_utils_users::get_user_eot($user_id, $check_gateway, $favor);
|
2770 |
+
}
|
2771 |
+
}
|
includes/functions/deprecated.inc.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
/**
|
3 |
* Deprecated functions from previous versions of s2Member.
|
4 |
*
|
5 |
-
* See: {@link
|
6 |
*
|
7 |
* Copyright: © 2009-2011
|
8 |
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
@@ -105,4 +105,3 @@ function ws_plugin__s2member_enqueue_admin_notice ($notice = FALSE, $on_pages =
|
|
105 |
{
|
106 |
return c_ws_plugin__s2member_admin_notices::enqueue_admin_notice ($notice, $on_pages, $error, $time, $dismiss);
|
107 |
}
|
108 |
-
?>
|
2 |
/**
|
3 |
* Deprecated functions from previous versions of s2Member.
|
4 |
*
|
5 |
+
* See: {@link https://en.wikipedia.org/wiki/Deprecation}
|
6 |
*
|
7 |
* Copyright: © 2009-2011
|
8 |
* {@link http://www.websharks-inc.com/ WebSharks, Inc.}
|
105 |
{
|
106 |
return c_ws_plugin__s2member_admin_notices::enqueue_admin_notice ($notice, $on_pages, $error, $time, $dismiss);
|
107 |
}
|
|
includes/functions/pluggables.inc.php
CHANGED
@@ -41,4 +41,3 @@ if (!function_exists ("wp_new_user_notification"))
|
|
41 |
}
|
42 |
$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["pluggables"]["wp_new_user_notification"] = true;
|
43 |
}
|
44 |
-
?>
|
41 |
}
|
42 |
$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["pluggables"]["wp_new_user_notification"] = true;
|
43 |
}
|
|
includes/hooks.inc.php
CHANGED
@@ -210,4 +210,5 @@ Register the activation | de-activation routines.
|
|
210 |
*/
|
211 |
register_activation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::activate');
|
212 |
register_deactivation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::deactivate');
|
213 |
-
register_uninstall_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::uninstall');
|
|
210 |
*/
|
211 |
register_activation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::activate');
|
212 |
register_deactivation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::deactivate');
|
213 |
+
register_uninstall_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::uninstall');
|
214 |
+
add_filter('auto_update_plugin', 'c_ws_plugin__s2member_installation::auto_update_filter', PHP_INT_MAX-10, 2); // Disallow s2Member update.
|
includes/menu-pages/api-ops.inc.php
CHANGED
@@ -206,7 +206,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
206 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
207 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
208 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
209 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
210 |
echo '</ul>'."\n";
|
211 |
|
212 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -327,7 +327,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
327 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
328 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
329 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
330 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
331 |
echo '</ul>'."\n";
|
332 |
|
333 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -450,7 +450,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
450 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
451 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
452 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
453 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
454 |
echo '</ul>'."\n";
|
455 |
|
456 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -551,7 +551,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
551 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
552 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
553 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
554 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
555 |
echo '</ul>'."\n";
|
556 |
|
557 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -654,7 +654,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
654 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
655 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
656 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
657 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
658 |
echo '</ul>'."\n";
|
659 |
|
660 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -760,7 +760,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
|
|
760 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
761 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
762 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
763 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
764 |
echo '</ul>'."\n";
|
765 |
|
766 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
206 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
207 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
208 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
209 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
210 |
echo '</ul>'."\n";
|
211 |
|
212 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
327 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
328 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
329 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
330 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
331 |
echo '</ul>'."\n";
|
332 |
|
333 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
450 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
451 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
452 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
453 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
454 |
echo '</ul>'."\n";
|
455 |
|
456 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
551 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
552 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
553 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
554 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
555 |
echo '</ul>'."\n";
|
556 |
|
557 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
654 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
655 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
656 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
657 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
658 |
echo '</ul>'."\n";
|
659 |
|
660 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
760 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
761 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
762 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
763 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
764 |
echo '</ul>'."\n";
|
765 |
|
766 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
includes/menu-pages/code-samples/api-mop-vars-ro.x-php
CHANGED
@@ -24,7 +24,7 @@ Here is a breakdown on each of these Variables:
|
|
24 |
* `s2member_seeking` = [post|page|catg|ptag]-[ID number] (Post ID, Page ID, Category ID, Tag ID)
|
25 |
Or: `s2member_seeking` = ruri-[base64 encoded URI] (only applies w/ Membership URI Restrictions)
|
26 |
Or: `s2member_seeking` = file-[protected file name] (only applies w/ Download Restrictions)
|
27 |
-
Or: `s2member_seeking` = bbpress (only applies when the s2Member
|
28 |
* `s2member_level_req` = a Membership Level # required for access (only applies to Membership Level Access)
|
29 |
* `s2member_ccap_req` = a Custom Capability required for access (only applies to Custom Capability Restrictions)
|
30 |
* `s2member_sp_req` = a Specific Post/Page ID required (only applies to Specific Post/Page Access Restrictions)
|
24 |
* `s2member_seeking` = [post|page|catg|ptag]-[ID number] (Post ID, Page ID, Category ID, Tag ID)
|
25 |
Or: `s2member_seeking` = ruri-[base64 encoded URI] (only applies w/ Membership URI Restrictions)
|
26 |
Or: `s2member_seeking` = file-[protected file name] (only applies w/ Download Restrictions)
|
27 |
+
Or: `s2member_seeking` = bbpress (only applies when the s2Member → bbPress Bridge is installed)
|
28 |
* `s2member_level_req` = a Membership Level # required for access (only applies to Membership Level Access)
|
29 |
* `s2member_ccap_req` = a Custom Capability required for access (only applies to Custom Capability Restrictions)
|
30 |
* `s2member_sp_req` = a Specific Post/Page ID required (only applies to Specific Post/Page Access Restrictions)
|
includes/menu-pages/code-samples/current-user-access-label.x-php
CHANGED
@@ -4,4 +4,4 @@ This may output something like: Gold Member
|
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
-
[s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
+
[s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
includes/menu-pages/code-samples/current-user-access-level.x-php
CHANGED
@@ -36,4 +36,4 @@
|
|
36 |
|
37 |
[s2If !is_user_logged_in()]
|
38 |
Some public content.
|
39 |
-
[/s2If]
|
36 |
|
37 |
[s2If !is_user_logged_in()]
|
38 |
Some public content.
|
39 |
+
[/s2If]
|
includes/menu-pages/code-samples/current-user-can-constants-2.x-php
CHANGED
@@ -10,4 +10,4 @@
|
|
10 |
Some content for Free Subscribers.
|
11 |
<?php } else if(S2MEMBER_CURRENT_USER_ACCESS_LEVEL === -1){ ?>
|
12 |
Some public content.
|
13 |
-
<?php } ?>
|
10 |
Some content for Free Subscribers.
|
11 |
<?php } else if(S2MEMBER_CURRENT_USER_ACCESS_LEVEL === -1){ ?>
|
12 |
Some public content.
|
13 |
+
<?php } ?>
|
includes/menu-pages/code-samples/current-user-can-full-access.x-php
CHANGED
@@ -2,4 +2,4 @@
|
|
2 |
Some content for Members who are logged in with an s2Member Level >= 1.
|
3 |
<?php } else { ?>
|
4 |
Some public content.
|
5 |
-
<?php } ?>
|
2 |
Some content for Members who are logged in with an s2Member Level >= 1.
|
3 |
<?php } else { ?>
|
4 |
Some public content.
|
5 |
+
<?php } ?>
|
includes/menu-pages/code-samples/current-user-custom.x-php
CHANGED
@@ -4,4 +4,4 @@ This may output something like: www.yourdomain.com|cv1|cv2|cv3
|
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
-
[s2Get constant="S2MEMBER_CURRENT_USER_CUSTOM" /]
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
+
[s2Get constant="S2MEMBER_CURRENT_USER_CUSTOM" /]
|
includes/menu-pages/code-samples/current-user-downloads-allowed-is-unlimited.x-php
CHANGED
@@ -9,5 +9,5 @@ every [s2Get constant="S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED_DAYS" /] days.
|
|
9 |
|
10 |
**NOTE** The use of `[s2If php=""]` and `[else]` requires s2Member Pro.
|
11 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
12 |
-
Please visit `Dashboard
|
13 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
9 |
|
10 |
**NOTE** The use of `[s2If php=""]` and `[else]` requires s2Member Pro.
|
11 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
12 |
+
Please visit `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`
|
13 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
includes/menu-pages/code-samples/current-user-email.x-php
CHANGED
@@ -4,4 +4,4 @@ This may output something like: johnsmith@example.com
|
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
-
[s2Get constant="S2MEMBER_CURRENT_USER_EMAIL" /]
|
4 |
|
5 |
---- s2member Shortcode Equivalent ----
|
6 |
|
7 |
+
[s2Get constant="S2MEMBER_CURRENT_USER_EMAIL" /]
|
includes/menu-pages/code-samples/current-user-fields.x-php
CHANGED
@@ -27,4 +27,4 @@ Or, to include the JSON encoded array in a JavaScript routine.
|
|
27 |
<script type="text/javascript">
|
28 |
var fieldsObj = [s2Get constant="S2MEMBER_CURRENT_USER_FIELDS" /];
|
29 |
document.write(fieldsObj.display_name);
|
30 |
-
</script>
|
27 |
<script type="text/javascript">
|
28 |
var fieldsObj = [s2Get constant="S2MEMBER_CURRENT_USER_FIELDS" /];
|
29 |
document.write(fieldsObj.display_name);
|
30 |
+
</script>
|
includes/menu-pages/code-samples/current-user-paid-registration-days-dripping.x-php
CHANGED
@@ -26,7 +26,7 @@
|
|
26 |
|
27 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
28 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
29 |
-
Please visit `Dashboard
|
30 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
31 |
|
32 |
---- Another s2member Shortcode Equivalent ----
|
26 |
|
27 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
28 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
29 |
+
Please visit `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`
|
30 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
31 |
|
32 |
---- Another s2member Shortcode Equivalent ----
|
includes/menu-pages/code-samples/current-user-paid-registration-days.x-php
CHANGED
@@ -33,7 +33,7 @@ In this example, the longer they've been a "paying" Member, the more they get.
|
|
33 |
|
34 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
35 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
36 |
-
Please visit `Dashboard
|
37 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
38 |
|
39 |
---- Another s2member Shortcode Equivalent ----
|
33 |
|
34 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
35 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
36 |
+
Please visit `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`
|
37 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
38 |
|
39 |
---- Another s2member Shortcode Equivalent ----
|
includes/menu-pages/code-samples/current-user-registration-days.x-php
CHANGED
@@ -33,7 +33,7 @@ In this example, the longer they've been registered (for free or otherwise), the
|
|
33 |
|
34 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
35 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
36 |
-
Please visit `Dashboard
|
37 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
38 |
|
39 |
---- Another s2member Shortcode Equivalent ----
|
33 |
|
34 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
35 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
36 |
+
Please visit `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`
|
37 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
38 |
|
39 |
---- Another s2member Shortcode Equivalent ----
|
includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php
CHANGED
@@ -51,5 +51,5 @@
|
|
51 |
|
52 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
53 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
54 |
-
Please visit `Dashboard
|
55 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
51 |
|
52 |
**NOTE** The use of `[s2If php=""]` requires s2Member Pro.
|
53 |
**NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
|
54 |
+
Please visit `Dashboard → s2Member → Restriction Options → Simple Shortcode Conditionals`
|
55 |
to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
|
includes/menu-pages/code-samples/sc-s2-conditional-supplements-1-farm.x-php
CHANGED
@@ -17,7 +17,7 @@
|
|
17 |
You have [s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
18 |
|
19 |
^ This uses the s2Get Shortcode to retrieve the value of s2Member API Constants.
|
20 |
-
These are also documented under: `s2Member
|
21 |
|
22 |
So, this might come out to something like:
|
23 |
`Hi there John.
|
17 |
You have [s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
18 |
|
19 |
^ This uses the s2Get Shortcode to retrieve the value of s2Member API Constants.
|
20 |
+
These are also documented under: `s2Member → API Scripting`.
|
21 |
|
22 |
So, this might come out to something like:
|
23 |
`Hi there John.
|
includes/menu-pages/code-samples/sc-s2-conditional-supplements-1.x-php
CHANGED
@@ -19,7 +19,7 @@
|
|
19 |
You have [s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
20 |
|
21 |
^ This uses the s2Get Shortcode to retrieve the value of s2Member API Constants.
|
22 |
-
These are also documented under: `s2Member
|
23 |
|
24 |
So, this might come out to something like:
|
25 |
`Hi there John.
|
19 |
You have [s2Get constant="S2MEMBER_CURRENT_USER_ACCESS_LABEL" /].
|
20 |
|
21 |
^ This uses the s2Get Shortcode to retrieve the value of s2Member API Constants.
|
22 |
+
These are also documented under: `s2Member → API Scripting`.
|
23 |
|
24 |
So, this might come out to something like:
|
25 |
`Hi there John.
|
includes/menu-pages/down-ops.inc.php
CHANGED
@@ -159,7 +159,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
159 |
|
160 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">'."\n";
|
161 |
echo '<h3>Advanced Download Restrictions (optional, for greater flexibility)</h3>'."\n";
|
162 |
-
echo '<p>By default, s2Member uses your Basic Download Restrictions, as configured above. However, you can force s2Member to allow File Downloads, using an extra query string parameter: <code>&s2member_file_download_key=[Key]</code>. A File Download `Key` is passed through this parameter; it tells s2Member to allow the download of this particular file, regardless of Membership Level; and WITHOUT checking any Basic Restrictions, that you may or may not have configured above. The creation of a File Download `Key`, requires a small PHP code snippet. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://
|
163 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_advanced_restrictions", get_defined_vars());
|
164 |
|
165 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -252,18 +252,18 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
252 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">'."\n";
|
253 |
echo '<h3>Amazon S3/CDN Storage & Delivery (optional)</h3>'."\n";
|
254 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/Gr87ZBJQE0I" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
|
255 |
-
echo '<a href="http://
|
256 |
echo '<p>Please note, all of this is optional. s2Member can be configured here to ONLY use Amazon S3 <em>(i.e., without Amazon CloudFront)</em>. Or, s2Member can be configured to use BOTH Amazon S3 and Amazon CloudFront together. If you want to use Amazon S3 Storage, but you don\'t care about Amazon CloudFront, feel free to leave the entire Amazon CloudFront section empty. The configuration options in the Amazon CloudFront section are ONLY required if you are planning to use both Amazon S3 and Amazon CloudFront together.</p>'."\n";
|
257 |
-
echo '<p>Amazon Simple Storage Service (<a href="http://
|
258 |
echo '<p>If you configure the options below, s2Member will assume all protected files are inside your Amazon S3 Bucket; and the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory is no longer used at all. That being said, all other aspects of s2Member\'s File Download protection remain the same. The only thing that changes, is the location of your protected files. In other words, Basic Download Restrictions, Download Keys, Inline Extensions, Custom Capability and/or Membership Level Files will all continue to work just as before. The only difference is that s2Member will use your Amazon S3 Bucket as a CDN <em>(i.e., Content Delivery Network)</em> instead of the local <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.</p>'."\n";
|
259 |
-
echo '<p>s2Member assumes that you\'re creating a new Amazon S3 Bucket, specifically for this installation; and that your Bucket is NOT available publicly. In other words, if you type this URL into your browser <em>(i.e., <code>http://your-bucket-name.s3.amazonaws.com/</code>)</em>, you should get an error that says: <code>Access Denied</code>. That\'s good, that\'s exactly what you want. You can create your Amazon S3 Bucket using the <a href="
|
260 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_amazon_s3", get_defined_vars());
|
261 |
|
262 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
263 |
|
264 |
-
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member uses "Digitally Signed URLs", authenticated by the Amazon S3 API. Documented for developers <a href="http://
|
265 |
-
echo '<p><em><strong>Linking To Protected Files:</strong> Nothing changes. s2Member\'s integration with Amazon S3 serves protected files through the same links that all s2Member site owners use. For example, you might use: <code>'.esc_html(home_url("/?s2member_file_download=example-file.zip")).'</code>, where <strong>s2member_file_download</strong> = the file, relative to the root of your Amazon S3 Bucket. In other words, just the file name in most cases. s2Member will redirect Users/Members to a digitally signed Amazon S3 URL, which allows them access to a particular file via Amazon S3. For further details, please review this section of your Dashboard: <strong>s2Member
|
266 |
-
echo '<p><em><strong>Content Type, Disposition & Inline Files:</strong> The query string parameter <code>&s2member_file_inline=yes</code> DOES work for files served directly through Amazon S3. s2Member DOES have control over the <code>Content-Type</code> and <code>Content-Disposition</code> headers for files being served through Amazon S3. However, Amazon CloudFront servers do NOT automatically determine the MIME type for the objects they serve. If you integrate both Amazon S3 and CloudFront, s2Member will NOT have control over headers. Therefore, when you upload a file to your Amazon S3 Bucket, you should set its Content-Type header. Again, with the Amazon S3/CloudFront combination, you MUST configure headers yourself (such as <code>Content-Type: video/webm</code>, or <code>Content-Disposition: inline|attachment</code>) that you want Amazon CloudFront to send for a particular file. It\'s quite easy. You do this by setting <strong>Properties
|
267 |
|
268 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
269 |
|
@@ -293,7 +293,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
293 |
echo '<option value="sa-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'sa-east-1') ? ' selected="selected"' : '').'>sa-east-1</option>'."\n";
|
294 |
echo '<option value="us-gov-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-gov-west-1') ? ' selected="selected"' : '').'>us-gov-west-1</option>'."\n";
|
295 |
echo '</select><br />'."\n";
|
296 |
-
echo 'See: <a href="http://
|
297 |
echo '</td>'."\n";
|
298 |
echo '</tr>'."\n";
|
299 |
echo '<tr>'."\n";
|
@@ -327,7 +327,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
327 |
|
328 |
echo '<td>'."\n";
|
329 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_access_key" id="ws-plugin--s2member-amazon-s3-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"]).'" /><br />'."\n";
|
330 |
-
echo 'See: <strong>Amazon Web Services Account
|
331 |
echo '<em><small>Amazon suggests creating a new IAM user. Use the Keys for that IAM user here.</small></em>'."\n";
|
332 |
echo '</td>'."\n";
|
333 |
|
@@ -345,7 +345,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
345 |
|
346 |
echo '<td>'."\n";
|
347 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_secret_key" id="ws-plugin--s2member-amazon-s3-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"]).'" /><br />'."\n";
|
348 |
-
echo 'See: <strong>Amazon Web Services Account
|
349 |
echo '</td>'."\n";
|
350 |
|
351 |
echo '</tr>'."\n";
|
@@ -366,20 +366,20 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
366 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">'."\n";
|
367 |
echo '<h3>Amazon S3/CloudFront CDN Storage & Delivery (optional)</h3>'."\n";
|
368 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/Gr87ZBJQE0I" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
|
369 |
-
echo '<a href="http://
|
370 |
echo '<p>Please note, all of this is optional. s2Member can be configured to ONLY use Amazon S3 <em>(i.e., without Amazon CloudFront)</em>. Or, s2Member can be configured to use BOTH Amazon S3 and Amazon CloudFront together. If you don\'t want to use Amazon CloudFront, please leave this entire section empty. The configuration options in this section are ONLY required if you are planning to use both Amazon S3 and Amazon CloudFront together.</p>'."\n";
|
371 |
-
echo '<p>Amazon Simple Storage Service (<a href="http://
|
372 |
echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the section below regarding <code>JW Player & RTMP Protocol Examples</code>. s2Member will automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
|
373 |
echo '<p>If you configure the options below, s2Member will assume all protected files are inside your Amazon S3 Bucket; and the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory is no longer used at all. That being said, all other aspects of s2Member\'s File Download protection remain the same. The only thing that changes, is the location of your protected files. In other words, Basic Download Restrictions, Download Keys, Custom Capability and/or Membership Level Files will all continue to work just as before. The only difference is that s2Member will use your Amazon S3 Bucket, automatically connecting it to both of the Amazon CloudFront Distributions, which s2Member auto-configures for you <em>(see below)</em>. In this way, s2Member uses Amazon CloudFront as a CDN <em>(i.e., Content Delivery Network)</em> for your protected files.</p>'."\n";
|
374 |
-
echo '<p>s2Member assumes that you\'re creating a new Amazon S3 Bucket, specifically for this installation; and that your Bucket is NOT available publicly. In other words, if you type this URL into your browser <em>(i.e., <code>http://your-bucket-name.s3.amazonaws.com/</code>)</em>, you should get an error that says: <code>Access Denied</code>. That\'s good, that\'s exactly what you want. You can create your Amazon S3 Bucket using the <a href="
|
375 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_amazon_cf", get_defined_vars());
|
376 |
|
377 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
378 |
|
379 |
-
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member\'s auto-configuration routines for Amazon CloudFront (below), are designed to create & configure various components on your Amazon Web Services account, which are all requirements for you to <a href="http://
|
380 |
-
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member uses "Digitally Signed URLs", authenticated by the Amazon CloudFront API. Documented for developers <a href="http://
|
381 |
-
echo '<p><em><strong>Linking To Protected Files:</strong> RTMP streams are special, but nothing else changes. s2Member\'s integration with Amazon S3/CloudFront serves protected files through the same links that all s2Member site owners use. For example, you might use: <code>'.esc_html(home_url("/?s2member_file_download=example-file.zip")).'</code>, where <strong>s2member_file_download</strong> = the file, relative to the root of your Amazon S3 Bucket. In other words, just the file name in most cases. s2Member will redirect Users/Members to a digitally signed Amazon CloudFront URL, which allows them access to a particular file via Amazon CloudFront. For further details, please review this section of your Dashboard: <strong>s2Member
|
382 |
-
echo '<p><em><strong>Content Type, Disposition & Inline Files:</strong> An IMPORTANT issue. The query string parameter <code>&s2member_file_inline=yes</code> does NOTHING for files served via Amazon CloudFront. s2Member has NO control over the <code>Content-Type</code> and/or <code>Content-Disposition</code> headers for a file being served through Amazon CloudFront, and CloudFront servers do NOT automatically determine the MIME type for the objects they serve. Therefore, when you upload a file to your Amazon S3 Bucket, you should set its Content-Type header. That is, you MUST configure headers yourself (such as <code>Content-Type: video/webm</code>, or <code>Content-Disposition: inline|attachment</code>) that you want Amazon CloudFront to send for a particular file. It\'s quite easy. You do this by setting <strong>Properties
|
383 |
echo (stripos(PHP_OS, "win") === 0 && c_ws_plugin__s2member_utils_conds::is_localhost()) ? '<p><em><strong>Localhost Developers:</strong> s2Member\'s Amazon CloudFront integration requires the <a href="http://php.net/manual/en/function.openssl-sign.php" target="_blank" rel="external">openssl_sign()</a> function in PHP so it can digitially sign CloudFront URLs. This function is sometimes problematic on localhost servers such as WAMP & EasyPHP. We recommend installing <a href="http://www.slproweb.com/products/Win32OpenSSL.html" target="_blank" rel="external">this lightweight alternative for Windows</a> while you\'re developing. s2Member will automatically find it here: <code>C:\OpenSSL-Win[32/64]\bin\openssl.exe</code>.'.((file_exists("c:\openssl-win32\bin\openssl.exe") || file_exists("c:\openssl-win64\bin\openssl.exe")) ? ' <strong class="ws-menu-page-hilite">( s2Member has detected that OpenSSL-Win[32/64] IS installed in the correct location, thank you! )</strong>' : ' <strong class="ws-menu-page-hilite">(s2Member has detected that OpenSSL-Win[32/64] is NOT currently available)</strong>').'</em></p>'."\n" : '';
|
384 |
|
385 |
if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distros_auto_config_status"] === "configured")
|
@@ -405,7 +405,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
405 |
|
406 |
echo '<td>'."\n";
|
407 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_cf_files_private_key_id" id="ws-plugin--s2member-amazon-cf-files-private-key-id" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key_id"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key_id"]).'" /><br />'."\n";
|
408 |
-
echo 'See: <strong>Amazon Web Services Account
|
409 |
echo '</td>'."\n";
|
410 |
|
411 |
echo '</tr>'."\n";
|
@@ -423,7 +423,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
423 |
echo '<td>'."\n";
|
424 |
echo '<input type="hidden" name="ws_plugin__s2member_amazon_cf_files_private_key" id="ws-plugin--s2member-amazon-cf-files-private-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" />'."\n";
|
425 |
echo '<textarea name="ws_plugin__s2member_amazon_cf_files_private_key_entry" id="ws-plugin--s2member-amazon-cf-files-private-key-entry" rows="3" wrap="off" spellcheck="false">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'</textarea><br />'."\n";
|
426 |
-
echo 'See: <strong>Amazon Web Services Account
|
427 |
echo '<em>* Note, s2Member needs your <strong>Private Key file</strong>, NOT your Public Key file.</em>'."\n";
|
428 |
echo '</td>'."\n";
|
429 |
|
@@ -660,16 +660,16 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
660 |
echo '<h3>PHP Code Examples (for more advanced integrations via PHP—in WordPress themes)</h3>'."\n";
|
661 |
|
662 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
|
663 |
-
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <strong>s2Member
|
664 |
|
665 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
|
666 |
-
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex
|
667 |
|
668 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
|
669 |
-
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex
|
670 |
|
671 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
|
672 |
-
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex
|
673 |
|
674 |
echo '</div>'."\n";
|
675 |
|
@@ -709,7 +709,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
709 |
|
710 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shortcode-attrs-section">'."\n";
|
711 |
echo '<h3>Shortcode Attributes & API Functions (Explained In Full Detail)</h3>'."\n";
|
712 |
-
echo '<p>s2Member makes <a href="http://
|
713 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs", get_defined_vars());
|
714 |
|
715 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -761,7 +761,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
761 |
echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code>—you should upload the <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
|
762 |
echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e., click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
|
763 |
echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="video_ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>, <code>player_captions="{file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.s2member.com/r/jw-player-video-captions/" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
|
764 |
-
echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://
|
765 |
echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
|
766 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
|
767 |
echo '</ul>'."\n";
|
@@ -804,7 +804,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
804 |
|
805 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-gzip-conflicts-section">'."\n";
|
806 |
echo '<h3>Preventing GZIP Conflicts On Server (Instructions)</h3>'."\n";
|
807 |
-
echo '<p>Protected files served by s2Member through PHP scripts, are already compressed. Therefore, <a href="http://
|
808 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_gzip_conflicts", get_defined_vars());
|
809 |
|
810 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -855,7 +855,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
855 |
|
856 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">'."\n";
|
857 |
echo '<h3>Restricting Files, Based On Custom Capabilities</h3>'."\n";
|
858 |
-
echo '<p>If you\'re NOT familiar with Custom Capabilities yet, please read: <strong>Dashboard
|
859 |
echo '<p>You can create Custom Capability Sub-directories under: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'</code>. For instance, if you have a Custom Capability <code>music</code>, you can place protected files that should ONLY be accessible to Members with <code>access_s2member_ccap_music</code>, inside: <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/access-s2member-ccap-music/</code>. Some examples are provided below.</p>'."\n";
|
860 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_custom_capability_files", get_defined_vars());
|
861 |
|
159 |
|
160 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">'."\n";
|
161 |
echo '<h3>Advanced Download Restrictions (optional, for greater flexibility)</h3>'."\n";
|
162 |
+
echo '<p>By default, s2Member uses your Basic Download Restrictions, as configured above. However, you can force s2Member to allow File Downloads, using an extra query string parameter: <code>&s2member_file_download_key=[Key]</code>. A File Download `Key` is passed through this parameter; it tells s2Member to allow the download of this particular file, regardless of Membership Level; and WITHOUT checking any Basic Restrictions, that you may or may not have configured above. The creation of a File Download `Key`, requires a small PHP code snippet. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://s2member.com/r/ezphp/" target="_blank" rel="external">ezPHP</a>). There is also a Shortcode equivalent, which does NOT require PHP at all, as seen below.</p>'."\n";
|
163 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_advanced_restrictions", get_defined_vars());
|
164 |
|
165 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
252 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">'."\n";
|
253 |
echo '<h3>Amazon S3/CDN Storage & Delivery (optional)</h3>'."\n";
|
254 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/Gr87ZBJQE0I" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
|
255 |
+
echo '<a href="http://s2member.com/r/amazon-s3/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/amazon-logo.png" class="ws-menu-page-right" style="width:250px; height:100px; border:0;" alt="." /></a>'."\n";
|
256 |
echo '<p>Please note, all of this is optional. s2Member can be configured here to ONLY use Amazon S3 <em>(i.e., without Amazon CloudFront)</em>. Or, s2Member can be configured to use BOTH Amazon S3 and Amazon CloudFront together. If you want to use Amazon S3 Storage, but you don\'t care about Amazon CloudFront, feel free to leave the entire Amazon CloudFront section empty. The configuration options in the Amazon CloudFront section are ONLY required if you are planning to use both Amazon S3 and Amazon CloudFront together.</p>'."\n";
|
257 |
+
echo '<p>Amazon Simple Storage Service (<a href="http://s2member.com/r/amazon-s3/" target="_blank" rel="external">Amazon S3</a>). Amazon S3 is storage for the Internet. It is designed to make web-scale computing easier for developers. Amazon S3 provides a simple web services interface that can be used to store and retrieve any amount of data, at any time, from anywhere on the web. It gives developers access to the same highly scalable, reliable, secure, fast, inexpensive infrastructure that Amazon uses to run its own global network of web sites. s2Member has been integrated with Amazon S3, so that <em>(if you wish)</em>, instead of using the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory, you can store all of your protected files inside an Amazon S3 Bucket.</p>'."\n";
|
258 |
echo '<p>If you configure the options below, s2Member will assume all protected files are inside your Amazon S3 Bucket; and the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory is no longer used at all. That being said, all other aspects of s2Member\'s File Download protection remain the same. The only thing that changes, is the location of your protected files. In other words, Basic Download Restrictions, Download Keys, Inline Extensions, Custom Capability and/or Membership Level Files will all continue to work just as before. The only difference is that s2Member will use your Amazon S3 Bucket as a CDN <em>(i.e., Content Delivery Network)</em> instead of the local <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.</p>'."\n";
|
259 |
+
echo '<p>s2Member assumes that you\'re creating a new Amazon S3 Bucket, specifically for this installation; and that your Bucket is NOT available publicly. In other words, if you type this URL into your browser <em>(i.e., <code>http://your-bucket-name.s3.amazonaws.com/</code>)</em>, you should get an error that says: <code>Access Denied</code>. That\'s good, that\'s exactly what you want. You can create your Amazon S3 Bucket using the <a href="http://s2member.com/r/amazon-s3-console/" target="_blank" rel="external">Amazon interface</a>. Or, some people prefer to use this popular Firefox extension (<a href="http://s2member.com/r/s3-fox-organizer/" target="_blank" rel="external">S3 Fox Organizer</a>).</p>'."\n";
|
260 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_amazon_s3", get_defined_vars());
|
261 |
|
262 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
263 |
|
264 |
+
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member uses "Digitally Signed URLs", authenticated by the Amazon S3 API. Documented for developers <a href="http://s2member.com/r/amazon-s3-digital-signing-process/" target="_blank" rel="external">here</a>. To put it simply, s2Member will generate Amazon S3 URLs (internally); which allow Customers temporary access to specific files inside your S3 Bucket. s2Member\'s Digitally Signed URLs leading to Amazon S3, give a Customer 24 hours to connect to the file inside your S3 Bucket. This connection period of 24 hours is largely irrelevant when used in combination with s2Member, because access is renewed for another 24 hours each time you make a file available to a User/Member, and they are authenticated by your configuration of s2Member. This connection period of 24 hours is just a secondary line of defense to further prevent the possibility of link sharing. If you need to change this connection timeout of <code>24 hours</code> for some reason (not likely), you can use this WordPress Filter: <code>ws_plugin__s2member_amazon_s3_file_expires_time</code>.</em></p>'."\n";
|
265 |
+
echo '<p><em><strong>Linking To Protected Files:</strong> Nothing changes. s2Member\'s integration with Amazon S3 serves protected files through the same links that all s2Member site owners use. For example, you might use: <code>'.esc_html(home_url("/?s2member_file_download=example-file.zip")).'</code>, where <strong>s2member_file_download</strong> = the file, relative to the root of your Amazon S3 Bucket. In other words, just the file name in most cases. s2Member will redirect Users/Members to a digitally signed Amazon S3 URL, which allows them access to a particular file via Amazon S3. For further details, please review this section of your Dashboard: <strong>s2Member → Download Options → Basic Download Restrictions</strong>. Also see: <strong>s2Member → Download Options → Advanced Mod-Rewrite Linkage</strong>.</em></p>'."\n";
|
266 |
+
echo '<p><em><strong>Content Type, Disposition & Inline Files:</strong> The query string parameter <code>&s2member_file_inline=yes</code> DOES work for files served directly through Amazon S3. s2Member DOES have control over the <code>Content-Type</code> and <code>Content-Disposition</code> headers for files being served through Amazon S3. However, Amazon CloudFront servers do NOT automatically determine the MIME type for the objects they serve. If you integrate both Amazon S3 and CloudFront, s2Member will NOT have control over headers. Therefore, when you upload a file to your Amazon S3 Bucket, you should set its Content-Type header. Again, with the Amazon S3/CloudFront combination, you MUST configure headers yourself (such as <code>Content-Type: video/webm</code>, or <code>Content-Disposition: inline|attachment</code>) that you want Amazon CloudFront to send for a particular file. It\'s quite easy. You do this by setting <strong>Properties → Metadata (i.e., headers)</strong> on a per-file basis, from inside your Amazon S3 Management Console. In short, when you upload a file to your Amazon S3 Bucket, if you want that file to be served a certain way, be sure to configure its <strong>Properties → Metadata</strong> accordingly.</em></p>'."\n";
|
267 |
|
268 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
269 |
|
293 |
echo '<option value="sa-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'sa-east-1') ? ' selected="selected"' : '').'>sa-east-1</option>'."\n";
|
294 |
echo '<option value="us-gov-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-gov-west-1') ? ' selected="selected"' : '').'>us-gov-west-1</option>'."\n";
|
295 |
echo '</select><br />'."\n";
|
296 |
+
echo 'See: <a href="http://s2member.com/r/aws-s3-region-codes/" target="_blank">http://s2member.com/r/aws-s3-region-codes/</a>'."\n";
|
297 |
echo '</td>'."\n";
|
298 |
echo '</tr>'."\n";
|
299 |
echo '<tr>'."\n";
|
327 |
|
328 |
echo '<td>'."\n";
|
329 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_access_key" id="ws-plugin--s2member-amazon-s3-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"]).'" /><br />'."\n";
|
330 |
+
echo 'See: <strong>Amazon Web Services Account → Security Credentials → Access Keys</strong><br />'."\n";
|
331 |
echo '<em><small>Amazon suggests creating a new IAM user. Use the Keys for that IAM user here.</small></em>'."\n";
|
332 |
echo '</td>'."\n";
|
333 |
|
345 |
|
346 |
echo '<td>'."\n";
|
347 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_secret_key" id="ws-plugin--s2member-amazon-s3-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"]).'" /><br />'."\n";
|
348 |
+
echo 'See: <strong>Amazon Web Services Account → Security Credentials → Access Keys</strong><br />'."\n";
|
349 |
echo '</td>'."\n";
|
350 |
|
351 |
echo '</tr>'."\n";
|
366 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">'."\n";
|
367 |
echo '<h3>Amazon S3/CloudFront CDN Storage & Delivery (optional)</h3>'."\n";
|
368 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/Gr87ZBJQE0I" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>'."\n";
|
369 |
+
echo '<a href="http://s2member.com/r/amazon-cloudfront/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/amazon-logo.png" class="ws-menu-page-right" style="width:250px; height:100px; border:0;" alt="." /></a>'."\n";
|
370 |
echo '<p>Please note, all of this is optional. s2Member can be configured to ONLY use Amazon S3 <em>(i.e., without Amazon CloudFront)</em>. Or, s2Member can be configured to use BOTH Amazon S3 and Amazon CloudFront together. If you don\'t want to use Amazon CloudFront, please leave this entire section empty. The configuration options in this section are ONLY required if you are planning to use both Amazon S3 and Amazon CloudFront together.</p>'."\n";
|
371 |
+
echo '<p>Amazon Simple Storage Service (<a href="http://s2member.com/r/amazon-s3/" target="_blank" rel="external">Amazon S3</a>) combined with <a href="http://s2member.com/r/amazon-cloudfront/" target="_blank" rel="external">Amazon CloudFront</a>. Amazon CloudFront is a web service for content delivery. It integrates with other Amazon Web Services <em>(i.e., Amazon S3 Storage)</em> to give developers and businesses an easy way to distribute content to end users with low latency, and with high data transfer speeds. Amazon CloudFront delivers your static and streaming content using a global network of edge locations. Requests for your Amazon S3 Bucket Objects <em>(i.e., your protected files)</em> are automatically routed to the nearest edge location, so content is delivered with the best possible performance. s2Member has been integrated with both Amazon S3 and with Amazon CloudFront. So <em>(if you wish)</em>, instead of using the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory, you can store all of your protected files inside an Amazon S3 Bucket and serve them via Amazon CloudFront. But again, please understand, the configuration options in this section are ONLY required if you\'re going to use both Amazon S3 & CloudFront together.</p>'."\n";
|
372 |
echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the section below regarding <code>JW Player & RTMP Protocol Examples</code>. s2Member will automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
|
373 |
echo '<p>If you configure the options below, s2Member will assume all protected files are inside your Amazon S3 Bucket; and the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory is no longer used at all. That being said, all other aspects of s2Member\'s File Download protection remain the same. The only thing that changes, is the location of your protected files. In other words, Basic Download Restrictions, Download Keys, Custom Capability and/or Membership Level Files will all continue to work just as before. The only difference is that s2Member will use your Amazon S3 Bucket, automatically connecting it to both of the Amazon CloudFront Distributions, which s2Member auto-configures for you <em>(see below)</em>. In this way, s2Member uses Amazon CloudFront as a CDN <em>(i.e., Content Delivery Network)</em> for your protected files.</p>'."\n";
|
374 |
+
echo '<p>s2Member assumes that you\'re creating a new Amazon S3 Bucket, specifically for this installation; and that your Bucket is NOT available publicly. In other words, if you type this URL into your browser <em>(i.e., <code>http://your-bucket-name.s3.amazonaws.com/</code>)</em>, you should get an error that says: <code>Access Denied</code>. That\'s good, that\'s exactly what you want. You can create your Amazon S3 Bucket using the <a href="http://s2member.com/r/amazon-s3-console/" target="_blank" rel="external">Amazon interface</a>. Or, some people prefer to use this popular Firefox extension (<a href="http://s2member.com/r/s3-fox-organizer/" target="_blank" rel="external">S3 Fox Organizer</a>). You will also need to enable CloudFront inside your Web Services account at Amazon. Don\'t worry about creating or configuring any CloudFront Distributions, s2Member will auto-create and auto-configure those for you, allowing you to serve protected files.</p>'."\n";
|
375 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_amazon_cf", get_defined_vars());
|
376 |
|
377 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
378 |
|
379 |
+
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member\'s auto-configuration routines for Amazon CloudFront (below), are designed to create & configure various components on your Amazon Web Services account, which are all requirements for you to <a href="http://s2member.com/r/amazon-cloudfront-digitally-signed-urls/" target="_blank" rel="external">serve protected files through the Amazon S3/CloudFront combination</a>. These components include: an Origin Access Identity, read permissions for the Origin Access Identity, and two private content Distributions. One private content Distribution for file downloads, and another private content Distribution for streaming media files; both connected to and sourced by your Amazon S3 Bucket. In addition, s2Member will automatically configure an ACL & Policy (i.e., permissions) on your Amazon S3 Bucket to make sure your protected object/files are NOT available to the public.</em></p>'."\n";
|
380 |
+
echo '<p><em><strong>Dev Note w/Technical Details:</strong> s2Member uses "Digitally Signed URLs", authenticated by the Amazon CloudFront API. Documented for developers <a href="http://s2member.com/r/amazon-cloudfront-protected-files-for-developers/" target="_blank" rel="external">here</a>. To put it simply, s2Member will generate Amazon CloudFront URLs (internally); which allow Customers temporary access to specific files inside your S3 Bucket—via CloudFront Distributions. s2Member\'s Digitally Signed URLs leading to Amazon S3/CloudFront, give a Customer 24 hours to connect to the file inside your S3 Bucket. This connection period of 24 hours is largely irrelevant when used in combination with s2Member, because access is renewed for another 24 hours each time you make a file available to a User/Member, and they are authenticated by your configuration of s2Member. This connection period of 24 hours is just a secondary line of defense to further prevent the possibility of link sharing. If you need to change this connection timeout of <code>24 hours</code> for some reason (not likely), you can use this WordPress Filter: <code>ws_plugin__s2member_amazon_cf_file_expires_time</code>.</em></p>'."\n";
|
381 |
+
echo '<p><em><strong>Linking To Protected Files:</strong> RTMP streams are special, but nothing else changes. s2Member\'s integration with Amazon S3/CloudFront serves protected files through the same links that all s2Member site owners use. For example, you might use: <code>'.esc_html(home_url("/?s2member_file_download=example-file.zip")).'</code>, where <strong>s2member_file_download</strong> = the file, relative to the root of your Amazon S3 Bucket. In other words, just the file name in most cases. s2Member will redirect Users/Members to a digitally signed Amazon CloudFront URL, which allows them access to a particular file via Amazon CloudFront. For further details, please review this section of your Dashboard: <strong>s2Member → Download Options → Basic Download Restrictions</strong>. Also see: <strong>s2Member → Download Options → Advanced Mod-Rewrite Linkage</strong>. If you\'re streaming audio/video files over the RTMP protocol, please review the section below: <code>JW Player & RTMP Protocol Examples</code>.</em></p>'."\n";
|
382 |
+
echo '<p><em><strong>Content Type, Disposition & Inline Files:</strong> An IMPORTANT issue. The query string parameter <code>&s2member_file_inline=yes</code> does NOTHING for files served via Amazon CloudFront. s2Member has NO control over the <code>Content-Type</code> and/or <code>Content-Disposition</code> headers for a file being served through Amazon CloudFront, and CloudFront servers do NOT automatically determine the MIME type for the objects they serve. Therefore, when you upload a file to your Amazon S3 Bucket, you should set its Content-Type header. That is, you MUST configure headers yourself (such as <code>Content-Type: video/webm</code>, or <code>Content-Disposition: inline|attachment</code>) that you want Amazon CloudFront to send for a particular file. It\'s quite easy. You do this by setting <strong>Properties → Metadata (i.e., headers)</strong> on a per-file basis, from inside your Amazon S3 Management Console. In short, when you upload a file to your Amazon S3 Bucket, if you want that file to be served a certain way, be sure to configure its <strong>Properties → Metadata</strong> accordingly.</em></p>'."\n";
|
383 |
echo (stripos(PHP_OS, "win") === 0 && c_ws_plugin__s2member_utils_conds::is_localhost()) ? '<p><em><strong>Localhost Developers:</strong> s2Member\'s Amazon CloudFront integration requires the <a href="http://php.net/manual/en/function.openssl-sign.php" target="_blank" rel="external">openssl_sign()</a> function in PHP so it can digitially sign CloudFront URLs. This function is sometimes problematic on localhost servers such as WAMP & EasyPHP. We recommend installing <a href="http://www.slproweb.com/products/Win32OpenSSL.html" target="_blank" rel="external">this lightweight alternative for Windows</a> while you\'re developing. s2Member will automatically find it here: <code>C:\OpenSSL-Win[32/64]\bin\openssl.exe</code>.'.((file_exists("c:\openssl-win32\bin\openssl.exe") || file_exists("c:\openssl-win64\bin\openssl.exe")) ? ' <strong class="ws-menu-page-hilite">( s2Member has detected that OpenSSL-Win[32/64] IS installed in the correct location, thank you! )</strong>' : ' <strong class="ws-menu-page-hilite">(s2Member has detected that OpenSSL-Win[32/64] is NOT currently available)</strong>').'</em></p>'."\n" : '';
|
384 |
|
385 |
if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distros_auto_config_status"] === "configured")
|
405 |
|
406 |
echo '<td>'."\n";
|
407 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_cf_files_private_key_id" id="ws-plugin--s2member-amazon-cf-files-private-key-id" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key_id"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key_id"]).'" /><br />'."\n";
|
408 |
+
echo 'See: <strong>Amazon Web Services Account → Security Credentials → CloudFront Key Pairs</strong>'."\n";
|
409 |
echo '</td>'."\n";
|
410 |
|
411 |
echo '</tr>'."\n";
|
423 |
echo '<td>'."\n";
|
424 |
echo '<input type="hidden" name="ws_plugin__s2member_amazon_cf_files_private_key" id="ws-plugin--s2member-amazon-cf-files-private-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" />'."\n";
|
425 |
echo '<textarea name="ws_plugin__s2member_amazon_cf_files_private_key_entry" id="ws-plugin--s2member-amazon-cf-files-private-key-entry" rows="3" wrap="off" spellcheck="false">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'</textarea><br />'."\n";
|
426 |
+
echo 'See: <strong>Amazon Web Services Account → Security Credentials → CloudFront Key Pairs</strong><br />'."\n";
|
427 |
echo '<em>* Note, s2Member needs your <strong>Private Key file</strong>, NOT your Public Key file.</em>'."\n";
|
428 |
echo '</td>'."\n";
|
429 |
|
660 |
echo '<h3>PHP Code Examples (for more advanced integrations via PHP—in WordPress themes)</h3>'."\n";
|
661 |
|
662 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
|
663 |
+
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <strong>s2Member → Download Options → Advanced Mod Rewrite Linkage</strong>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
|
664 |
|
665 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
|
666 |
+
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
|
667 |
|
668 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
|
669 |
+
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
|
670 |
|
671 |
echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
|
672 |
+
echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
|
673 |
|
674 |
echo '</div>'."\n";
|
675 |
|
709 |
|
710 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shortcode-attrs-section">'."\n";
|
711 |
echo '<h3>Shortcode Attributes & API Functions (Explained In Full Detail)</h3>'."\n";
|
712 |
+
echo '<p>s2Member makes <a href="http://s2member.com/r/shortcode-reference/" target="_blank" rel="external">Shortcodes</a> available to you, which allow you to generate File Download URLs and/or File Download Keys. Like most Shortcodes for WordPress, s2Member reads Attributes in your Shortcode. Many site owners like to know exactly how these Shortcode Attributes work. Below, is a brief overview of each possible Shortcode Attribute.</p>'."\n";
|
713 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs", get_defined_vars());
|
714 |
|
715 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
761 |
echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code>—you should upload the <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
|
762 |
echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e., click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
|
763 |
echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="video_ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>, <code>player_captions="{file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.s2member.com/r/jw-player-video-captions/" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
|
764 |
+
echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://s2member.com/r/base64-encoding/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
|
765 |
echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
|
766 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
|
767 |
echo '</ul>'."\n";
|
804 |
|
805 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-gzip-conflicts-section">'."\n";
|
806 |
echo '<h3>Preventing GZIP Conflicts On Server (Instructions)</h3>'."\n";
|
807 |
+
echo '<p>Protected files served by s2Member through PHP scripts, are already compressed. Therefore, <a href="http://s2member.com/r/gzip-compression-explained/" target="_blank" rel="nofollow external xlink">GZIP compression</a> is not needed during protected file delivery. Some web servers (i.e., Apache, LiteSpeed, and similar) include GZIP compression rules through server-side extensions, like <code>mod_deflate</code> for example. While s2Member encourages the use of extensions like <code>mod_deflate</code>, it is best to disable GZIP automatically (i.e., temporarily) during s2Member\'s delivery of a protected file through a PHP script. This avoids conflicts on the server which might otherwise lead to corrupted file downloads. s2Member makes a valiant effort to accomplish this via PHP, all on its own. However, it never hurts to add this section of code to the root <code>.htaccess</code> file for your WordPress installation. Optional, but highly recommended.</p>'."\n";
|
808 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_gzip_conflicts", get_defined_vars());
|
809 |
|
810 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
855 |
|
856 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">'."\n";
|
857 |
echo '<h3>Restricting Files, Based On Custom Capabilities</h3>'."\n";
|
858 |
+
echo '<p>If you\'re NOT familiar with Custom Capabilities yet, please read: <strong>Dashboard → s2Member → API Scripting → Custom Capability Packages</strong>. Once you understand the basic concept of Custom Capabilities & Protected File Downloads, you\'ll see that (by default) s2Member does NOT handle File Download Protection with respect to Custom Capabilities. That\'s where Custom Capability Sub-directories come in.</p>'."\n";
|
859 |
echo '<p>You can create Custom Capability Sub-directories under: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'</code>. For instance, if you have a Custom Capability <code>music</code>, you can place protected files that should ONLY be accessible to Members with <code>access_s2member_ccap_music</code>, inside: <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/access-s2member-ccap-music/</code>. Some examples are provided below.</p>'."\n";
|
860 |
do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_custom_capability_files", get_defined_vars());
|
861 |
|
includes/menu-pages/els-ops.inc.php
CHANGED
@@ -54,10 +54,10 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
|
|
54 |
echo '<div class="ws-menu-page-group" title="MailChimp Integration">'."\n";
|
55 |
|
56 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-mailchimp-section">'."\n";
|
57 |
-
echo '<a href="http://www.s2member.com/mailchimp" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/mailchimp-stamp.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
58 |
echo '<h3>MailChimp List Server Integration (optional)</h3>'."\n";
|
59 |
-
echo '<p>s2Member can be integrated with MailChimp. MailChimp is an email marketing service. MailChimp makes it easy to send email newsletters to your Customers, manage your MailChimp subscriber lists, and track campaign performance. Although s2Member can be integrated with almost ANY list server, we highly recommend MailChimp; because of their <a href="http://
|
60 |
-
echo '<p>For now, we\'ve covered the basics. You can have your Members automatically subscribed to your MailChimp marketing lists <em>(i.e., newsletters / auto-responders)</em>. You\'ll need a <a href="http://www.s2member.com/mailchimp" target="_blank" rel="external">MailChimp account</a>, a <a href="http://
|
61 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_mailchimp", get_defined_vars());
|
62 |
|
63 |
echo '<table class="form-table">'."\n";
|
@@ -75,7 +75,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
|
|
75 |
|
76 |
echo '<td>'."\n";
|
77 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_mailchimp_api_key" id="ws-plugin--s2member-mailchimp-api-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["mailchimp_api_key"]).'" /><br />'."\n";
|
78 |
-
echo 'Once you have a MailChimp account, you\'ll need to <a href="http://
|
79 |
echo '</td>'."\n";
|
80 |
|
81 |
echo '</tr>'."\n";
|
@@ -209,11 +209,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
|
|
209 |
echo '<div class="ws-menu-page-group" title="AWeber Integration">'."\n";
|
210 |
|
211 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-aweber-section">'."\n";
|
212 |
-
echo '<a href="http://
|
213 |
echo '<h3>AWeber List Server Integration (optional)</h3>'."\n";
|
214 |
-
echo '<p>s2Member can be integrated with AWeber. AWeber is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you. You can have your Members automatically subscribed to your AWeber marketing lists <em>(i.e., newsletters / auto-responders)</em>. You\'ll need an <a href="http://
|
215 |
-
echo '<p><em><strong>AWeber Tip:</strong> If you want your Members to be subscribed to multiple AWeber List IDs at the same time, instead of comma-delimiting those List IDs here; we suggest a single List ID in your s2Member integration; then use <a href="
|
216 |
-
echo '<p><em><strong>AWeber Tip:</strong> This company is known to have a policy of rejecting role-based email addresses like: <code>admin@</code> or <code>webmaster@</code>. Therefore, if you integrate AWeber it is suggested that you configure s2Member to Force Personal Emails. Please see: <strong>s2Member
|
217 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_aweber", get_defined_vars());
|
218 |
|
219 |
echo '<table class="form-table">'."\n";
|
@@ -280,7 +280,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
|
|
280 |
echo '<td>'."\n";
|
281 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_level'.$n.'_aweber_list_ids" id="ws-plugin--s2member-level'.$n.'-aweber-list-ids" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_aweber_list_ids"]).'" /><br />'."\n";
|
282 |
echo 'New '.(($n === 0) ? 'Free Subscribers' : 'Level #'.$n.' Members').' will be subscribed to these List IDs.<br />'."\n";
|
283 |
-
echo 'Ex: <code>mylist, anotherlist</code>—See also: <a href="
|
284 |
echo '</td>'."\n";
|
285 |
|
286 |
echo '</tr>'."\n";
|
@@ -369,7 +369,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
|
|
369 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-opt-out-section">'."\n";
|
370 |
echo '<h3>Automate Un-Subscribe/Opt-Out Removals (optional)</h3>'."\n";
|
371 |
echo '<p>s2Member can automatically <em>(and silently)</em> remove Users/Members from the List Servers you\'ve configured above. s2Member is also capable of automating this, based on your own personal configuration preferences. Below, you can choose which Events you consider grounds for List Removal. It is also important to point out that s2Member will ONLY remove Users/Members from the Lists you\'ve configured at the Level the User/Member is or was at during the time of the Event. For example, if a Level #1 Member is deleted, they will ONLY be removed from the List(s) you\'ve configured at Level #1. If an account is upgraded from Level #1 to Level #2, they will ONLY be removed from the List(s) you\'ve configured at Level #1. Of course, all of this is based on the configuration below.</p>'."\n";
|
372 |
-
echo '<p><em><strong>Regarding AWeber Email Parser Integration::</strong> these will NOT work for AWeber until you <a href="http://
|
373 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_opt_out", get_defined_vars());
|
374 |
|
375 |
echo '<table class="form-table">'."\n";
|
54 |
echo '<div class="ws-menu-page-group" title="MailChimp Integration">'."\n";
|
55 |
|
56 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-mailchimp-section">'."\n";
|
57 |
+
echo '<a href="http://www.s2member.com/r/mailchimp/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/mailchimp-stamp.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
58 |
echo '<h3>MailChimp List Server Integration (optional)</h3>'."\n";
|
59 |
+
echo '<p>s2Member can be integrated with MailChimp. MailChimp is an email marketing service. MailChimp makes it easy to send email newsletters to your Customers, manage your MailChimp subscriber lists, and track campaign performance. Although s2Member can be integrated with almost ANY list server, we highly recommend MailChimp; because of their <a href="http://s2member.com/r/mailchimp-api-docs/" target="_blank" rel="external">powerful API for MailChimp services</a>. In future versions of s2Member, we plan to build additional features into s2Member that work with, and extend MailChimp services.</p>'."\n";
|
60 |
+
echo '<p>For now, we\'ve covered the basics. You can have your Members automatically subscribed to your MailChimp marketing lists <em>(i.e., newsletters / auto-responders)</em>. You\'ll need a <a href="http://www.s2member.com/r/mailchimp/" target="_blank" rel="external">MailChimp account</a>, a <a href="http://s2member.com/r/mailchimp-api-key/" target="_blank" rel="external">MailChimp API Key</a>, and your <a href="#" onclick="alert(\'To obtain your MailChimp List ID(s), log into your MailChimp account and click the Lists tab. Now click the (View) button, for the List(s) you want to integrate with s2Member. Then, click the (Settings) link. At the bottom of the (Settings) page, for each list; you\\\'ll find a Unique List ID.\'); return false;">MailChimp List IDs</a>.</p>'."\n";
|
61 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_mailchimp", get_defined_vars());
|
62 |
|
63 |
echo '<table class="form-table">'."\n";
|
75 |
|
76 |
echo '<td>'."\n";
|
77 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_mailchimp_api_key" id="ws-plugin--s2member-mailchimp-api-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["mailchimp_api_key"]).'" /><br />'."\n";
|
78 |
+
echo 'Once you have a MailChimp account, you\'ll need to <a href="http://s2member.com/r/mailchimp-api-key/" target="_blank" rel="external">add an API Key</a>.'."\n";
|
79 |
echo '</td>'."\n";
|
80 |
|
81 |
echo '</tr>'."\n";
|
209 |
echo '<div class="ws-menu-page-group" title="AWeber Integration">'."\n";
|
210 |
|
211 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-aweber-section">'."\n";
|
212 |
+
echo '<a href="http://s2member.com/r/aweber/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/aweber-logo.png" class="ws-menu-page-right ws-menu-page-bordered" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
213 |
echo '<h3>AWeber List Server Integration (optional)</h3>'."\n";
|
214 |
+
echo '<p>s2Member can be integrated with AWeber. AWeber is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you. You can have your Members automatically subscribed to your AWeber marketing lists <em>(i.e., newsletters / auto-responders)</em>. You\'ll need an <a href="http://s2member.com/r/aweber/" target="_blank" rel="external">AWeber account</a> and your <a href="#" onclick="alert(\'To obtain your AWeber List ID(s), log into your AWeber account. Click on the Lists tab. On that page you\\\'ll find a Unique List ID associated with each of your lists. AWeber sometimes refers to this as a List Name instead of a List ID.\'); return false;">AWeber List IDs</a>. You will ALSO need either an API Authorization Code (if you choose the API option below); or a <a href="http://www.s2member.com/kb/aweber-email-parser-for-s2member/" target="_blank" rel="external">Custom Email Parser</a> for the s2Member application.</p>'."\n";
|
215 |
+
echo '<p><em><strong>AWeber Tip:</strong> If you want your Members to be subscribed to multiple AWeber List IDs at the same time, instead of comma-delimiting those List IDs here; we suggest a single List ID in your s2Member integration; then use <a href="http://s2member.com/r/aweber-automation-rules/" target="_blank" rel="external">AWeber Automation Rules</a> for this. Automation Rules can also reduce the number of email confirmation notices that Members receive.</em></p>'."\n";
|
216 |
+
echo '<p><em><strong>AWeber Tip:</strong> This company is known to have a policy of rejecting role-based email addresses like: <code>admin@</code> or <code>webmaster@</code>. Therefore, if you integrate AWeber it is suggested that you configure s2Member to Force Personal Emails. Please see: <strong>s2Member → General Options → Registration/Profile Fields & Options</strong>.</em></p>'."\n";
|
217 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_aweber", get_defined_vars());
|
218 |
|
219 |
echo '<table class="form-table">'."\n";
|
280 |
echo '<td>'."\n";
|
281 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_level'.$n.'_aweber_list_ids" id="ws-plugin--s2member-level'.$n.'-aweber-list-ids" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_aweber_list_ids"]).'" /><br />'."\n";
|
282 |
echo 'New '.(($n === 0) ? 'Free Subscribers' : 'Level #'.$n.' Members').' will be subscribed to these List IDs.<br />'."\n";
|
283 |
+
echo 'Ex: <code>mylist, anotherlist</code>—See also: <a href="http://s2member.com/r/aweber-automation-rules/" target="_blank" rel="external">Automation Rules</a>'."\n";
|
284 |
echo '</td>'."\n";
|
285 |
|
286 |
echo '</tr>'."\n";
|
369 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-opt-out-section">'."\n";
|
370 |
echo '<h3>Automate Un-Subscribe/Opt-Out Removals (optional)</h3>'."\n";
|
371 |
echo '<p>s2Member can automatically <em>(and silently)</em> remove Users/Members from the List Servers you\'ve configured above. s2Member is also capable of automating this, based on your own personal configuration preferences. Below, you can choose which Events you consider grounds for List Removal. It is also important to point out that s2Member will ONLY remove Users/Members from the Lists you\'ve configured at the Level the User/Member is or was at during the time of the Event. For example, if a Level #1 Member is deleted, they will ONLY be removed from the List(s) you\'ve configured at Level #1. If an account is upgraded from Level #1 to Level #2, they will ONLY be removed from the List(s) you\'ve configured at Level #1. Of course, all of this is based on the configuration below.</p>'."\n";
|
372 |
+
echo '<p><em><strong>Regarding AWeber Email Parser Integration::</strong> these will NOT work for AWeber until you <a href="http://s2member.com/r/aweber-notification-email/" target="_blank" rel="external">add a Notification Email</a> to your AWeber account matching the "EMail From Address" configured in <strong>s2Member → General Options → EMail Configuration</strong>. Which is currently set to: <code>'.esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_email"]).'</code>. This is a required step if you want s2Member to be authenticated when it emails List Removal requests to AWeber. Please note, this only applies to AWeber integration via "email". If you choose to integrate via the AWeber API instead (recommended) this is not necessary/applicable.</em></p>'."\n";
|
373 |
do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_opt_out", get_defined_vars());
|
374 |
|
375 |
echo '<table class="form-table">'."\n";
|
includes/menu-pages/gen-ops.inc.php
CHANGED
@@ -56,7 +56,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
56 |
|
57 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-uninstall-section">'."\n";
|
58 |
echo '<h3>Plugin Deletion Safeguards (highly recommended)</h3>'."\n";
|
59 |
-
echo '<p>By default, s2Member will retain all of it\'s Roles, Capabilities, and your Configuration Options when/if you delete s2Member from the Plugins Menu in WordPress. However, if you would like for s2Member to erase itself completely, please choose: <code>No (upon deletion, erase all data/options)</code
|
60 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_uninstall", get_defined_vars());
|
61 |
|
62 |
echo '<table class="form-table">'."\n";
|
@@ -353,11 +353,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
353 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
354 |
|
355 |
echo '<h3 style="margin:0;">New User Email Message (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-new-user-email-details\').toggle(); return false;" class="ws-dotted-link">click to customize</a>)</h3>'."\n";
|
356 |
-
echo '<p style="margin:0;">This email is sent to all new Users/Members. It should always contain their Username/Password. In addition to this email, s2Member will also send new paying Customers a Signup Confirmation Email, which you can customize from your Dashboard, under: <strong>s2Member
|
357 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_email", get_defined_vars());
|
358 |
|
359 |
echo '<div id="ws-plugin--s2member-new-user-email-details" style="display:none;">'."\n";
|
360 |
-
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> please note that BuddyPress does NOT send this email to Users that register through the BuddyPress registration system. This is because BuddyPress sends each User an activation link; eliminating the need for this email all together. However, you CAN still customize s2Member\'s separate email to paying Members. See: <strong>s2Member
|
361 |
echo '<table class="form-table">'."\n";
|
362 |
echo '<tbody>'."\n";
|
363 |
echo '<tr>'."\n";
|
@@ -413,7 +413,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
413 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
414 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
415 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
416 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
417 |
echo '</ul>'."\n";
|
418 |
|
419 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -516,7 +516,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
516 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
517 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
518 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
519 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
520 |
echo '</ul>'."\n";
|
521 |
|
522 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -556,7 +556,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
556 |
|
557 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
|
558 |
echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
|
559 |
-
echo '<p>On the Main Site of a Multisite Network, the settings for Open Registration are consolidated into the <strong>s2Member
|
560 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
|
561 |
echo '</div>'."\n";
|
562 |
|
@@ -610,8 +610,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
610 |
|
611 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
|
612 |
echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
|
613 |
-
echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>(at Level #0)</em>, along with several Primary Roles for paid Membership <em>(i.e., Levels 1-4)</em>, created by the s2Member plugin.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' s2Member also supports unlimited Custom Capability Packages <em>(see <strong>s2Member
|
614 |
-
echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <strong>s2Member
|
615 |
echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><strong>See also:</strong> These KB articles: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities</a> and <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
616 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
|
617 |
|
@@ -668,7 +668,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
668 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
669 |
|
670 |
echo '<input type="button" value="Reset Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-reset-roles-button" style="min-width:175px;" />'."\n";
|
671 |
-
echo '<p>The button to the right, is a nifty tool, which allows you to reset s2Member\'s internal Roles and Capabilities that integrate with WordPress. If you, or a developer working with you, has made attempts to alter the default <em>internal</em> Role/Capability sets that come with s2Member, and you need to reset them back to the way s2Member expects them to be, please use this tool. <em>Attn Developers: it is also possible lock-in your modified Roles/Capabilities with an s2Member Filter. Please see <a href="http://
|
672 |
|
673 |
echo '</div>'."\n";
|
674 |
|
@@ -839,7 +839,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
839 |
echo '<option value="repeat-y"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat-y") ? ' selected="selected"' : '').'>Tile Vertically ( background-repeat: repeat-y; )</option>'."\n";
|
840 |
echo '<option value="no-repeat"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "no-repeat") ? ' selected="selected"' : '').'>No Tiles ( background-repeat: no-repeat; )</option>'."\n";
|
841 |
echo '</select><br />'."\n";
|
842 |
-
echo 'This controls the way your Background Image is styled with CSS. [ <a href="http://
|
843 |
echo '</td>'."\n";
|
844 |
|
845 |
echo '</tr>'."\n";
|
@@ -1147,16 +1147,32 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1147 |
echo '</th>'."\n";
|
1148 |
|
1149 |
echo '</tr>'."\n";
|
1150 |
-
echo '<tr>'."\n";
|
1151 |
|
1152 |
-
echo '<td>'."\n";
|
1153 |
-
echo '<
|
1154 |
-
echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>No (send auto-generated passwords via email; after registration)</option>'."\n";
|
1155 |
-
echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>Yes (allow members to create their own password during registration)</option>'."\n";
|
1156 |
-
echo '</select><br />'."\n";
|
1157 |
-
echo 'Auto-generated Passwords are recommended for best security; i.e., this also serves as a form of email confirmation.'."\n";
|
1158 |
echo (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site()) ? '<br /><em>* For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. <a href="#" onclick="alert(\'For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. A User must wait for the activation/confirmation email; where a randomly generated Password will be assigned. Please note, this limitation only affects your Main Site, via `/wp-signup.php`. In other words, your Customers (i.e., other Blog Owners) will still have the ability to allow Custom Passwords with s2Member. YOU are affected by this limitation, NOT them.\\n\\n* NOTE: s2Member (Pro) removes this limitation.\\nIf you install the s2Member Pro Add-on, you WILL be able to allow Custom Passwords through s2Member Pro-Forms; even on a Multisite Blog Farm.\'); return false;" tabindex="-1">[?]</a></em>'."\n" : '';
|
1159 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Does not affect BuddyPress registration form (always <code>yes</code> with BuddyPress registration).</em>'."\n" : '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1160 |
echo '</td>'."\n";
|
1161 |
|
1162 |
echo '</tr>'."\n";
|
@@ -1175,7 +1191,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1175 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_custom_reg_force_personal_emails" id="ws-plugin--s2member-custom-reg-force-personal-emails" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]).'" /><br />'."\n";
|
1176 |
echo 'To force personal email addresses, provide a comma-delimited list of email users to reject. <a href="#" onclick="alert(\'s2Member will reject [user]@ (based on your configuration here). A JavaScript alert message will be issued, asking the User to, `please use a personal email address`.\'); return false;" tabindex="-1">[?]</a><br />'."\n";
|
1177 |
echo 'Ex: <code>info,help,admin,webmaster,hostmaster,sales,support,spam</code><br />'."\n";
|
1178 |
-
echo 'See: <a href="http://
|
1179 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Affects BuddyPress registration form too.</em>'."\n" : '';
|
1180 |
echo '</td>'."\n";
|
1181 |
|
@@ -1308,7 +1324,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1308 |
echo '<h3>Membership Options Page (required, please customize this)</h3>'."\n";
|
1309 |
echo '<p>Please create and/or choose an existing Page that showcases your Membership Options. This special Page is where you\'ll insert the Payment Button(s) generated for you by s2Member (or Pro-Forms; if you\'re running s2Member Pro). This Page serves as your lead-in signup page <em>(i.e., you\'ll give visitors one or more registration options here, and they\'ll pay for the option they choose)</em>.</p>'."\n";
|
1310 |
echo '<p>Your Membership Options Page should detail all of the features that come with Membership to your site, and provide a Payment Button (or Pro-Form; if you\'re running s2Member Pro) for each Level of access you plan to offer. This is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</p>'."\n";
|
1311 |
-
echo '<p><em><strong>Tip:</strong> If you allow Open Registration (i.e., Free Subscribers), you might want to place a link on your Membership Options Page, which points directly to your free Registration Form, instead of routing a Customer through your Payment Gateway first. It\'s a matter of preference though. For further details, please check the section above: <strong>s2Member
|
1312 |
echo c_ws_plugin__s2member_utils_conds::bp_is_installed() ? '<p><em><strong>BuddyPress:</strong> Even with BuddyPress, s2Member still needs a Membership Options Page. This is where your Payment Buttons (or Pro-Forms; if you\'re running s2Member Pro) will go, giving people the ability to pay you. And again, this is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</em></p>'."\n" : '';
|
1313 |
echo '<p><em><strong>Always Public:</strong> This Page must be public at all times. In fact, s2Member will not allow this Page to be restricted in any way. <strong>Note:</strong> for technical reasons, your Membership Options Page <strong>cannot</strong> be set to your Front Page (i.e., your Home Page); or your Posts Page (i.e., your main Blog page). Please create a separate (dedicated) Page in WordPress, and then designate it as your Membership Options Page below.</em></p>'."\n";
|
1314 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_options_page", get_defined_vars());
|
@@ -1359,7 +1375,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1359 |
echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>Yes (enable MOP Vars in all redirections; recommended behavior)</option>'."\n";
|
1360 |
echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>No (don\'t include the additional details provided by MOP Vars)</option>'."\n";
|
1361 |
echo '</select><br />'."\n";
|
1362 |
-
echo 'See also: <strong>Dashboard
|
1363 |
echo 'Recommended setting: (<code>Yes, enable MOP Vars</code>)'."\n";
|
1364 |
echo '</td>'."\n";
|
1365 |
|
@@ -1382,7 +1398,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1382 |
echo '<h3>Giving Members The Ability To Modify Their Profile</h3>'."\n";
|
1383 |
echo '<p>s2Member can be configured to redirect Members away from the <a href="'.esc_attr(admin_url("/profile.php")).'" target="_blank" rel="external">default Profile Editing Panel</a> that is built into WordPress. When/if a Member attempts to access the default Profile Editing Panel, they\'ll instead be redirected to the Login Welcome Page that you\'ve configured with s2Member. <strong>Why would I redirect away from the default Profile Editing Panel?</strong> Unless you\'ve made some drastic modifications to your WordPress installation, the default Profile Editing Panel that comes with WordPress is <em>not</em> suited for any sort of public access.</p>'."\n";
|
1384 |
echo '<p>So instead of using this default Profile Editing Panel, s2Member provides you <em>(the site owner)</em> with a special Shortcode: <code>[s2Member-Profile /]</code>. You can insert this into your Login Welcome Page, or any Post/Page for that matter <em>(even into a Text Widget)</em>. This Shortcode produces an Inline Profile Editing Form that supports all aspects of s2Member, including Password changes; and any Custom Registration/Profile Fields that you\'ve configured with s2Member. Alternatively, you can send your Members to a <a href="'.esc_attr(home_url("/?s2member_profile=1")).'" target="_blank" rel="external">special Stand-Alone version</a>. The stand-alone version makes it possible for you to <a href="#" onclick="if(!window.open(\''.home_url("/?s2member_profile=1").'\', \'_popup\', \'width=600,height=400,left=100,screenX=100,top=100,screenY=100,location=0,menubar=0,toolbar=0,status=0,scrollbars=1,resizable=1\')) alert(\'Please disable popup blockers and try again!\'); return false;" rel="external">open it up in a popup window</a>, or embed it into your Login Welcome Page using an IFRAME. Code samples below.</p>'."\n";
|
1385 |
-
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress already provides Users/Members with a Profile Editing Panel, powered by your theme. If you\'ve configured Custom Registration/Profile Fields with s2Member, you can also enable s2Member\'s Profile Field integration with BuddyPress (recommended). For further details, see: <strong>s2Member
|
1386 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_profile_modifications", get_defined_vars());
|
1387 |
|
1388 |
echo '<table class="form-table">'."\n";
|
@@ -1449,26 +1465,18 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1449 |
|
1450 |
echo '<td>'."\n";
|
1451 |
echo '<select name="ws_plugin__s2member_default_url_shortener" id="ws-plugin--s2member-default-url-shortener">'."\n";
|
1452 |
-
echo '<option value="tiny_url"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "tiny_url") ? ' selected="selected"' : '').'>tinyurl.com (free
|
1453 |
-
echo '<option value="
|
|
|
1454 |
echo '</select>'."\n";
|
1455 |
echo '</td>'."\n";
|
1456 |
|
1457 |
echo '</tr>'."\n";
|
1458 |
echo '<tr>'."\n";
|
1459 |
|
1460 |
-
echo '<th>'."\n";
|
1461 |
-
echo '<label for="ws-plugin--s2member-default-custom-str-url-shortener">'."\n";
|
1462 |
-
echo 'Custom URL Shortening Service API (Optional/Advanced):'."\n";
|
1463 |
-
echo '</label>'."\n";
|
1464 |
-
echo '</th>'."\n";
|
1465 |
-
|
1466 |
-
echo '</tr>'."\n";
|
1467 |
-
echo '<tr>'."\n";
|
1468 |
-
|
1469 |
echo '<td>'."\n";
|
1470 |
-
echo '<input type="
|
1471 |
-
echo '
|
1472 |
echo '</td>'."\n";
|
1473 |
|
1474 |
echo '</tr>'."\n";
|
@@ -1501,4 +1509,4 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
|
|
1501 |
}
|
1502 |
}
|
1503 |
|
1504 |
-
new c_ws_plugin__s2member_menu_page_gen_ops ();
|
56 |
|
57 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-uninstall-section">'."\n";
|
58 |
echo '<h3>Plugin Deletion Safeguards (highly recommended)</h3>'."\n";
|
59 |
+
echo '<p>By default, s2Member will retain all of it\'s Roles, Capabilities, and your Configuration Options when/if you delete s2Member from the Plugins Menu in WordPress. However, if you would like for s2Member to erase itself completely, please choose: <code>No (upon deletion, erase all data/options)</code>. See also: <a href="http://s2member.com/kb-article/how-do-i-uninstall-s2member/" target="_blank" rel="external">s2Member Uninstall Instructions</a></p>';
|
60 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_uninstall", get_defined_vars());
|
61 |
|
62 |
echo '<table class="form-table">'."\n";
|
353 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
354 |
|
355 |
echo '<h3 style="margin:0;">New User Email Message (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-new-user-email-details\').toggle(); return false;" class="ws-dotted-link">click to customize</a>)</h3>'."\n";
|
356 |
+
echo '<p style="margin:0;">This email is sent to all new Users/Members. It should always contain their Username/Password. In addition to this email, s2Member will also send new paying Customers a Signup Confirmation Email, which you can customize from your Dashboard, under: <strong>s2Member → PayPal Options</strong>. You may wish to customize these emails further, by providing details that are specifically geared to your site.</p>'."\n";
|
357 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_new_user_email", get_defined_vars());
|
358 |
|
359 |
echo '<div id="ws-plugin--s2member-new-user-email-details" style="display:none;">'."\n";
|
360 |
+
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> please note that BuddyPress does NOT send this email to Users that register through the BuddyPress registration system. This is because BuddyPress sends each User an activation link; eliminating the need for this email all together. However, you CAN still customize s2Member\'s separate email to paying Members. See: <strong>s2Member → PayPal Options → Signup Confirmation Email</strong>.</em></p>'."\n" : '';
|
361 |
echo '<table class="form-table">'."\n";
|
362 |
echo '<tbody>'."\n";
|
363 |
echo '<tr>'."\n";
|
413 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
414 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
415 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
416 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
417 |
echo '</ul>'."\n";
|
418 |
|
419 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
516 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
517 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
518 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
519 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
520 |
echo '</ul>'."\n";
|
521 |
|
522 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
556 |
|
557 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-open-registration-section">'."\n";
|
558 |
echo '<h3>Open Registration / Free Subscribers (optional)</h3>'."\n";
|
559 |
+
echo '<p>On the Main Site of a Multisite Network, the settings for Open Registration are consolidated into the <strong>s2Member → Multisite (Config)</strong> panel.</p>'."\n";
|
560 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_open_registration", get_defined_vars());
|
561 |
echo '</div>'."\n";
|
562 |
|
610 |
|
611 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-membership-levels-section">'."\n";
|
612 |
echo '<h3>Membership Levels (required, please customize these)</h3>'."\n";
|
613 |
+
echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. s2Member supports Free Subscribers <em>(at Level #0)</em>, along with several Primary Roles for paid Membership <em>(i.e., Levels 1-4)</em>, created by the s2Member plugin.'.((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? ' s2Member also supports unlimited Custom Capability Packages <em>(see <strong>s2Member → API Scripting → Custom Capabilities</strong>)</em>' : '').'. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>'."\n";
|
614 |
+
echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro</a>. However, Custom Capabilities are possible in all versions of s2Member, including the free version. Custom Capabilities are a great way to extend s2Member in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating s2Member for a client, please check your Dashboard, under: <strong>s2Member → API Scripting → Custom Capabilities</strong>. We also recommend <a href="http://www.s2member.com/videos/A2C07377CF60025E/" target="_blank" rel="external">this video tutorial</a>.</em></p>'."\n" : '';
|
615 |
echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<p><strong>See also:</strong> These KB articles: <a href="http://www.s2member.com/kb/roles-caps/" target="_blank" rel="external">s2Member Roles/Capabilities</a> and <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
616 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
|
617 |
|
668 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
669 |
|
670 |
echo '<input type="button" value="Reset Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-reset-roles-button" style="min-width:175px;" />'."\n";
|
671 |
+
echo '<p>The button to the right, is a nifty tool, which allows you to reset s2Member\'s internal Roles and Capabilities that integrate with WordPress. If you, or a developer working with you, has made attempts to alter the default <em>internal</em> Role/Capability sets that come with s2Member, and you need to reset them back to the way s2Member expects them to be, please use this tool. <em>Attn Developers: it is also possible lock-in your modified Roles/Capabilities with an s2Member Filter. Please see <a href="http://s2member.com/kb-article/locking-s2member-rolescapabilities/" target="_blank" rel="external">this KB article for details</a>.</em></p>'."\n";
|
672 |
|
673 |
echo '</div>'."\n";
|
674 |
|
839 |
echo '<option value="repeat-y"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "repeat-y") ? ' selected="selected"' : '').'>Tile Vertically ( background-repeat: repeat-y; )</option>'."\n";
|
840 |
echo '<option value="no-repeat"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_reg_background_image_repeat"] === "no-repeat") ? ' selected="selected"' : '').'>No Tiles ( background-repeat: no-repeat; )</option>'."\n";
|
841 |
echo '</select><br />'."\n";
|
842 |
+
echo 'This controls the way your Background Image is styled with CSS. [ <a href="http://s2member.com/r/css-background-repeat/" target="_blank" rel="external">learn more</a> ]'."\n";
|
843 |
echo '</td>'."\n";
|
844 |
|
845 |
echo '</tr>'."\n";
|
1147 |
echo '</th>'."\n";
|
1148 |
|
1149 |
echo '</tr>'."\n";
|
1150 |
+
echo '<tr style="padding-bottom:0;">'."\n";
|
1151 |
|
1152 |
+
echo '<td style="padding-bottom:0;">'."\n";
|
1153 |
+
echo '<em><strong>Note:</strong> Custom passwords are easier for users. However, auto-generated passwords are recommended for best security; i.e., auto-generated passwords also serve as a form of email confirmation.</em>'."\n";
|
|
|
|
|
|
|
|
|
1154 |
echo (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site()) ? '<br /><em>* For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. <a href="#" onclick="alert(\'For security purposes, Custom Passwords are not possible on the Main Site of a Blog Farm. A User must wait for the activation/confirmation email; where a randomly generated Password will be assigned. Please note, this limitation only affects your Main Site, via `/wp-signup.php`. In other words, your Customers (i.e., other Blog Owners) will still have the ability to allow Custom Passwords with s2Member. YOU are affected by this limitation, NOT them.\\n\\n* NOTE: s2Member (Pro) removes this limitation.\\nIf you install the s2Member Pro Add-on, you WILL be able to allow Custom Passwords through s2Member Pro-Forms; even on a Multisite Blog Farm.\'); return false;" tabindex="-1">[?]</a></em>'."\n" : '';
|
1155 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Does not affect BuddyPress registration form (always <code>yes</code> with BuddyPress registration).</em>'."\n" : '';
|
1156 |
+
echo '<br /><select name="ws_plugin__s2member_custom_reg_password" id="ws-plugin--s2member-custom-reg-password"'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && is_main_site() && !c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? ' disabled="disabled"' : '').'>'."\n";
|
1157 |
+
echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>No (send auto-generated passwords via email; after registration)</option>'."\n";
|
1158 |
+
echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"]) ? ' selected="selected"' : '').'>Yes (allow members to create their own password during registration)</option>'."\n";
|
1159 |
+
echo '</select>'."\n";
|
1160 |
+
echo '</td>'."\n";
|
1161 |
+
|
1162 |
+
echo '</tr>'."\n";
|
1163 |
+
echo '<tr style="padding-top:0;">'."\n";
|
1164 |
+
|
1165 |
+
echo '<td style="padding-top:2px;">'."\n";
|
1166 |
+
echo '<div id="ws-plugin--s2member-custom-reg-password-settings">'."\n";
|
1167 |
+
echo '<small><em><strong>Note:</strong> Minimum characters and password strength also impact profile updates, so it\'s a good idea to configure these even if you\'re using auto-generated passwords during registration.</em></small><br />'."\n";
|
1168 |
+
echo '<small>Minimum characters:</small> <input type="text" autocomplete="off" name="ws_plugin__s2member_custom_reg_password_min_length" id="ws-plugin--s2member-custom-reg-password-min-length" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_length"]).'" maxlength="2" size="2" style="width:auto;" />'."\n";
|
1169 |
+
echo '<small>Minimum strength:</small> <select name="ws_plugin__s2member_custom_reg_password_min_strength" id="ws-plugin--s2member-custom-reg-password-min-strength" style="width:auto;">'."\n";
|
1170 |
+
echo '<option value="n/a"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'n/a') ? ' selected="selected"' : '').'>N/A (do not enforce a password strength requirement)</option>'."\n";
|
1171 |
+
echo '<option value="weak"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'weak') ? ' selected="selected"' : '').'>Weak (only needs to meet minimum length requirement)</option>'."\n";
|
1172 |
+
echo '<option value="good"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'good') ? ' selected="selected"' : '').'>Good (must have numbers, letters, and mixed caSe)</option>'."\n";
|
1173 |
+
echo '<option value="strong"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password_min_strength"] === 'strong') ? ' selected="selected"' : '').'>Strong (must have numbers, letters, mixed caSe, and punctuation)</option>'."\n";
|
1174 |
+
echo '</select>'."\n";
|
1175 |
+
echo '</div>'."\n";
|
1176 |
echo '</td>'."\n";
|
1177 |
|
1178 |
echo '</tr>'."\n";
|
1191 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_custom_reg_force_personal_emails" id="ws-plugin--s2member-custom-reg-force-personal-emails" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]).'" /><br />'."\n";
|
1192 |
echo 'To force personal email addresses, provide a comma-delimited list of email users to reject. <a href="#" onclick="alert(\'s2Member will reject [user]@ (based on your configuration here). A JavaScript alert message will be issued, asking the User to, `please use a personal email address`.\'); return false;" tabindex="-1">[?]</a><br />'."\n";
|
1193 |
echo 'Ex: <code>info,help,admin,webmaster,hostmaster,sales,support,spam</code><br />'."\n";
|
1194 |
+
echo 'See: <a href="http://s2member.com/r/mailchimp-role-based-emails/" target="_blank" rel="external">this article</a> for a more complete list.'."\n";
|
1195 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<br /><em>* Affects BuddyPress registration form too.</em>'."\n" : '';
|
1196 |
echo '</td>'."\n";
|
1197 |
|
1324 |
echo '<h3>Membership Options Page (required, please customize this)</h3>'."\n";
|
1325 |
echo '<p>Please create and/or choose an existing Page that showcases your Membership Options. This special Page is where you\'ll insert the Payment Button(s) generated for you by s2Member (or Pro-Forms; if you\'re running s2Member Pro). This Page serves as your lead-in signup page <em>(i.e., you\'ll give visitors one or more registration options here, and they\'ll pay for the option they choose)</em>.</p>'."\n";
|
1326 |
echo '<p>Your Membership Options Page should detail all of the features that come with Membership to your site, and provide a Payment Button (or Pro-Form; if you\'re running s2Member Pro) for each Level of access you plan to offer. This is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</p>'."\n";
|
1327 |
+
echo '<p><em><strong>Tip:</strong> If you allow Open Registration (i.e., Free Subscribers), you might want to place a link on your Membership Options Page, which points directly to your free Registration Form, instead of routing a Customer through your Payment Gateway first. It\'s a matter of preference though. For further details, please check the section above: <strong>s2Member → General Options → Open Registration</strong>.</em></p>'."\n";
|
1328 |
echo c_ws_plugin__s2member_utils_conds::bp_is_installed() ? '<p><em><strong>BuddyPress:</strong> Even with BuddyPress, s2Member still needs a Membership Options Page. This is where your Payment Buttons (or Pro-Forms; if you\'re running s2Member Pro) will go, giving people the ability to pay you. And again, this is also the Page that anyone could be redirected to <em>(by s2Member)</em>, should they attempt to access an area of your site that requires access to something they\'re currenty not allowed to view.</em></p>'."\n" : '';
|
1329 |
echo '<p><em><strong>Always Public:</strong> This Page must be public at all times. In fact, s2Member will not allow this Page to be restricted in any way. <strong>Note:</strong> for technical reasons, your Membership Options Page <strong>cannot</strong> be set to your Front Page (i.e., your Home Page); or your Posts Page (i.e., your main Blog page). Please create a separate (dedicated) Page in WordPress, and then designate it as your Membership Options Page below.</em></p>'."\n";
|
1330 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_membership_options_page", get_defined_vars());
|
1375 |
echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>Yes (enable MOP Vars in all redirections; recommended behavior)</option>'."\n";
|
1376 |
echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page_vars_enable"]) ? ' selected="selected"' : '').'>No (don\'t include the additional details provided by MOP Vars)</option>'."\n";
|
1377 |
echo '</select><br />'."\n";
|
1378 |
+
echo 'See also: <strong>Dashboard → s2Member → API / Scripting → Membership Options Page / Variables</strong><br />'."\n";
|
1379 |
echo 'Recommended setting: (<code>Yes, enable MOP Vars</code>)'."\n";
|
1380 |
echo '</td>'."\n";
|
1381 |
|
1398 |
echo '<h3>Giving Members The Ability To Modify Their Profile</h3>'."\n";
|
1399 |
echo '<p>s2Member can be configured to redirect Members away from the <a href="'.esc_attr(admin_url("/profile.php")).'" target="_blank" rel="external">default Profile Editing Panel</a> that is built into WordPress. When/if a Member attempts to access the default Profile Editing Panel, they\'ll instead be redirected to the Login Welcome Page that you\'ve configured with s2Member. <strong>Why would I redirect away from the default Profile Editing Panel?</strong> Unless you\'ve made some drastic modifications to your WordPress installation, the default Profile Editing Panel that comes with WordPress is <em>not</em> suited for any sort of public access.</p>'."\n";
|
1400 |
echo '<p>So instead of using this default Profile Editing Panel, s2Member provides you <em>(the site owner)</em> with a special Shortcode: <code>[s2Member-Profile /]</code>. You can insert this into your Login Welcome Page, or any Post/Page for that matter <em>(even into a Text Widget)</em>. This Shortcode produces an Inline Profile Editing Form that supports all aspects of s2Member, including Password changes; and any Custom Registration/Profile Fields that you\'ve configured with s2Member. Alternatively, you can send your Members to a <a href="'.esc_attr(home_url("/?s2member_profile=1")).'" target="_blank" rel="external">special Stand-Alone version</a>. The stand-alone version makes it possible for you to <a href="#" onclick="if(!window.open(\''.home_url("/?s2member_profile=1").'\', \'_popup\', \'width=600,height=400,left=100,screenX=100,top=100,screenY=100,location=0,menubar=0,toolbar=0,status=0,scrollbars=1,resizable=1\')) alert(\'Please disable popup blockers and try again!\'); return false;" rel="external">open it up in a popup window</a>, or embed it into your Login Welcome Page using an IFRAME. Code samples below.</p>'."\n";
|
1401 |
+
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress already provides Users/Members with a Profile Editing Panel, powered by your theme. If you\'ve configured Custom Registration/Profile Fields with s2Member, you can also enable s2Member\'s Profile Field integration with BuddyPress (recommended). For further details, see: <strong>s2Member → General Options → Registration/Profile Fields</strong>.</em></p>'."\n" : '';
|
1402 |
do_action("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_profile_modifications", get_defined_vars());
|
1403 |
|
1404 |
echo '<table class="form-table">'."\n";
|
1465 |
|
1466 |
echo '<td>'."\n";
|
1467 |
echo '<select name="ws_plugin__s2member_default_url_shortener" id="ws-plugin--s2member-default-url-shortener">'."\n";
|
1468 |
+
echo '<option value="tiny_url"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "tiny_url") ? ' selected="selected"' : '').'>tinyurl.com (free; no API key)</option>'."\n";
|
1469 |
+
echo '<option value="bitly"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "bitly") ? ' selected="selected"' : '').'>Bitly (free; API key required)</option>'."\n";
|
1470 |
+
echo '<option value="goo_gl"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"] === "goo_gl") ? ' selected="selected"' : '').'>goo.gl (almost-free; API key required)</option>'."\n";
|
1471 |
echo '</select>'."\n";
|
1472 |
echo '</td>'."\n";
|
1473 |
|
1474 |
echo '</tr>'."\n";
|
1475 |
echo '<tr>'."\n";
|
1476 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1477 |
echo '<td>'."\n";
|
1478 |
+
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_default_url_shortener_key" id="ws-plugin--s2member-default-url-shortener-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener_key"]).'" /><br />'."\n";
|
1479 |
+
echo '<em>If you choose Bitly, enter your <a href="http://s2member.com/r/bitly-oauth-access-token/" target="_blank" rel="external">Bitly oAuth Access Token</a>. If you choose Google, <a href="http://s2member.com/r/google-console-create-project/" target="_blank" rel="external">create a new Google Project</a>, enable the URL Shortening API in your Project, generate a Public API Key and enter it here.</em>'."\n";
|
1480 |
echo '</td>'."\n";
|
1481 |
|
1482 |
echo '</tr>'."\n";
|
1509 |
}
|
1510 |
}
|
1511 |
|
1512 |
+
new c_ws_plugin__s2member_menu_page_gen_ops ();
|
includes/menu-pages/integrations.inc.php
CHANGED
@@ -53,7 +53,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_integrations"))
|
|
53 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-bbpress-section">'."\n";
|
54 |
echo '<h3>bbPress Plugin Integration (easy peasy)</h3>'."\n";
|
55 |
echo '<input type="button" value="Update Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-update-roles-button" style="min-width:175px;" />'."\n";
|
56 |
-
echo '<p>The plugin version of <a href="http://
|
57 |
echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/roles-caps/#s2-roles-caps" target="_blank" rel="external">s2Member Roles/Capabilities (Including <strong>bbPress</strong> Support)</a>.</p>'."\n";
|
58 |
|
59 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
53 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-bbpress-section">'."\n";
|
54 |
echo '<h3>bbPress Plugin Integration (easy peasy)</h3>'."\n";
|
55 |
echo '<input type="button" value="Update Roles/Capabilities" class="ws-menu-page-right ws-plugin--s2member-update-roles-button" style="min-width:175px;" />'."\n";
|
56 |
+
echo '<p>The plugin version of <a href="http://s2member.com/r/bbpress/" target="_blank" rel="external">bbPress 2.0+</a> integrates seamlessly with WordPress. If bbPress was already installed when you activated s2Member, your s2Member Roles/Capabilities are already configured to work in harmony with bbPress. If you didn\'t, you can simply click the "Update Roles/Capabilities" button here. That\'s all it takes. Once your Roles/Capbilities are updated, s2Member and bbPress are fully integrated with each other.</p>'."\n";
|
57 |
echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/roles-caps/#s2-roles-caps" target="_blank" rel="external">s2Member Roles/Capabilities (Including <strong>bbPress</strong> Support)</a>.</p>'."\n";
|
58 |
|
59 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
includes/menu-pages/menu-pages-s-min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
jQuery(document).ready(function($){var esc_attr=esc_html=function(string){if(/[&\<\>"']/.test(string=String(string))){string=string.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),string=string.replace(/"/g,""").replace(/'/g,"'")}return string};ws_plugin__s2member_generateSecurityKey=function(obj){if(!obj){obj="#ws-plugin--s2member-sec-encryption-key"}var mt_rand=function(min,max){min=(arguments.length<1)?0:min;max=(arguments.length<2)?2147483647:max;return Math.floor(Math.random()*(max-min+1))+min};var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#%^&*()";for(var i=0,key="";i<64;i++){key+=chars.substr(mt_rand(0,chars.length-1),1)}$(obj).val(key);return false};if(location.href.match(/page\=ws-plugin--s2member/)){$("input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button").click(function(){var $this=$(this);$this.val("one moment please ...");var levels='<?php echo (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; ?>';var resetUpdate=($this.hasClass("ws-plugin--s2member-reset-roles-button"))?"Reset":"Update";$.post(ajaxurl,{action:"ws_plugin__s2member_update_roles_via_ajax",ws_plugin__s2member_update_roles_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-update-roles-via-ajax")); ?>'},function(response){if(response==="1"){alert("s2Member's Roles/Capabilities "+((resetUpdate.toLowerCase()==="reset")?"have been successfully reset":"updated successfully")+".\nYour installation of s2Member has Membership Levels 0-"+levels+"."),$this.val(resetUpdate+" Roles/Capabilities")}else{if(response==="l"){alert("Sorry, your request failed.\ns2Member's Roles/Capabilities are locked by Filter:\nws_plugin__s2member_lock_roles_caps"),$this.val(resetUpdate+" Roles/Capabilities")}else{alert("Sorry, your request failed.\nAccess denied. Do you have the ability to `create_users`?"),$this.val(resetUpdate+" Roles/Capabilities")}}});return false})}if(location.href.match(/page\=ws-plugin--s2member-logs/)){$("input#ws-plugin--s2member-gateway-debug-logs-extensive-1").click(function(){var $this=$(this),thisChecked=(this.checked)?true:false;if(thisChecked){$("input#ws-plugin--s2member-gateway-debug-logs-1").attr("checked","checked")}});var $toggles=$("a.ws-plugin--s2member-log-file-viewport-toggle");$toggles.click(function(){$("textarea#ws-plugin--s2member-log-file-viewer").each(function(){var $viewer=$(this);if($viewer.attr("data-state")!=="expanded"){$viewer.css({height:($viewer.prop("scrollHeight")+50)+"px","overflow-y":"auto"});$toggles.html("⇑ normalize viewport ❙");$viewer.attr("data-state","expanded")}else{$viewer.css({height:"auto","overflow-y":"scroll"});$toggles.html("⇓ expand viewport ⇓");$viewer.attr("data-state","scrolling")}});return false})}if(location.href.match(/page\=ws-plugin--s2member-mms-ops/)){$("select#ws-plugin--s2member-mms-registration-file").change(function(){if($(this).val()==="wp-signup"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").show(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").hide(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").show();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0")[((gv==="all")?"show":"hide")]();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val(((gv==="all")?((l0v>0)?l0v:"1"):"0"))}else{if($(this).val()==="wp-login"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").hide(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").show(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").hide();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0").hide();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val("0")}}}).trigger("change");$("select#ws-plugin--s2member-mms-registration-grants").change(function(){$("select#ws-plugin--s2member-mms-registration-file").trigger("change")})}if(location.href.match(/page\=ws-plugin--s2member-gen-ops/)){ws_plugin__s2member_enableSecurityKey=function(){if(confirm("Edit Key? Are you sure?\nThis could break your installation!\n\n*Note* If you've been testing s2Member, feel free to change this Key before you go live. Just don't go live, and then change it. You'll have unhappy Customers. Data corruption WILL occur! For your safety, s2Member keeps a history of the last 10 Keys that you've used. If you get yourself into a real situation, s2Member will let you revert back to a previous Key.")){$("input#ws-plugin--s2member-sec-encryption-key").removeAttr("disabled")}return false};ws_plugin__s2member_securityKeyHistory=function(){$("div#ws-plugin--s2member-sec-encryption-key-history").toggle();return false};$("select#ws-plugin--s2member-new-user-emails-enabled").change(function(){var $pluggable=$("input#ws-plugin--s2member-pluggables-wp-new-user-notification"),$this=$(this),$newUserEmails=$("div#ws-plugin--s2member-new-user-emails");if($pluggable.val()==="0"||$this.val()==="0"){($pluggable.val()==="0")?$this.attr("disabled","disabled"):$this.removeAttr("disabled");$(":input",$newUserEmails).attr("disabled","disabled"),$newUserEmails.css("opacity","0.5")}else{$this.removeAttr("disabled"),$(":input",$newUserEmails).removeAttr("disabled"),$newUserEmails.css("opacity","")}}).trigger("change");$("select#ws-plugin--s2member-login-reg-design-enabled").change(function(){var $this=$(this),$loginRegDesign=$("div#ws-plugin--s2member-login-reg-design");if($this.val()==="0"){$(":input",$loginRegDesign).attr("disabled","disabled"),$loginRegDesign.css("opacity","0.5"),$loginRegDesign.hide()}else{$(":input",$loginRegDesign).removeAttr("disabled"),$loginRegDesign.css("opacity",""),$loginRegDesign.show()}}).trigger("change");if($("input#ws-plugin--s2member-custom-reg-fields").length&&$("div#ws-plugin--s2member-custom-reg-field-configuration").length){(function(){var i,fieldDefaults,tools,table,$tools,$table;var $fields=$("input#ws-plugin--s2member-custom-reg-fields");var $configuration=$("div#ws-plugin--s2member-custom-reg-field-configuration");var fields=($fields.val())?$.JSON.parse($fields.val()):[];fields=(fields instanceof Array)?fields:[];fieldDefaults={section:"no",sectitle:"",id:"",label:"",type:"text",deflt:"",options:"",expected:"",required:"yes",levels:"all",editable:"yes",classes:"",styles:"",attrs:""};for(i=0;i<fields.length;i++){fields[i]=$.extend(true,{},fieldDefaults,fields[i])}tools='<div id="ws-plugin--s2member-custom-reg-field-configuration-tools"></div>',table='<table id="ws-plugin--s2member-custom-reg-field-configuration-table"></table>';$configuration.html(tools+table);$tools=$("div#ws-plugin--s2member-custom-reg-field-configuration-tools"),$table=$("table#ws-plugin--s2member-custom-reg-field-configuration-table");ws_plugin__s2member_customRegFieldSectionChange=function(select){var section=$(select).val();var sectitle_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle";(section==="yes")?$(sectitle_trs).css("display",""):$(sectitle_trs).css("display","none")};ws_plugin__s2member_customRegFieldTypeChange=function(select){var type=$(select).val();var deflt_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt",options_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-options",expected_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected";(type.match(/^(text|textarea)$/))?$(deflt_trs).css("display",""):$(deflt_trs).css("display","none");(type.match(/^(select|selects|checkboxes|radios)$/))?$(options_trs).css("display",""):$(options_trs).css("display","none");(type.match(/^(text|textarea)$/))?$(expected_trs).css("display",""):$(expected_trs).css("display","none")};ws_plugin__s2member_customRegFieldDelete=function(index){var newFields=new Array();for(var i=0;i<fields.length;i++){if(i!==index){newFields.push(fields[i])}}fields=newFields,updateFields(),buildTable()};ws_plugin__s2member_customRegFieldMoveUp=function(index){if(typeof fields[index]==="object"&&typeof fields[index-1]==="object"){var prevFieldObj=fields[index-1],thisFieldObj=fields[index];fields[index-1]=thisFieldObj,fields[index]=prevFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldMoveDown=function(index){if(typeof fields[index]==="object"&&typeof fields[index+1]==="object"){var nextFieldObj=fields[index+1],thisFieldObj=fields[index];fields[index+1]=thisFieldObj,fields[index]=nextFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldCreate=function(){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field))){fields.push(field),updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+(fields.length-1);alert('Field created successfully.\n* Remember to "Save All Changes".')},500)}};ws_plugin__s2member_customRegFieldUpdate=function(index){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field,index))){fields[index]=field,updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+index;alert('Field updated successfully.\n* Remember to "Save All Changes".')},500)}};ws_plugin__s2member_customRegFieldAdd=function(){buildTools(true)};ws_plugin__s2member_customRegFieldEdit=function(index){buildTools(false,index),scrollReset()};ws_plugin__s2member_customRegFieldCancel=function(){buildTools(),scrollReset()};var validateField=function(field,index){var editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,errors=[],options,i;if(typeof field!=="object"||typeof(field=$.extend(true,{},fieldDefaults,field))!=="object"){alert("Invalid field object. Please try again.");return false}field.sectitle=(field.section==="yes")?field.sectitle:"";field.deflt=(field.type.match(/^(text|textarea)$/))?field.deflt:"";field.deflt=(field.type.match(/^(text)$/))?field.deflt.replace(/[\r\n\t ]+/g," "):field.deflt;field.options=(field.type.match(/^(select|selects|checkboxes|radios)$/))?field.options:"";field.expected=(field.type.match(/^(text|textarea)$/))?field.expected:"";if(!field.id){errors.push("Unique Field ID:\nThis is required. Please try again.")}else{if(fieldIdExists(field.id)&&(!editing||field.id!==fields[index].id)){errors.push("Unique Field ID:\nThat Field ID already exists. Please try again.")}}if(!field.label){errors.push("Field Label/Description:\nThis is required. Please try again.")}if(field.type.match(/^(select|selects|checkboxes|radios)$/)&&!field.options){errors.push("Option Configuration File:\nThis is required. Please try again.")}else{if(field.type.match(/^(select|selects|checkboxes|radios)$/)){for(i=0;i<(options=field.options.split(/[\r\n]+/)).length;i++){if(!(options[i]=$.trim(options[i])).match(/^([^\|]*)(\|)([^\|]*)(\|default)?$/)){errors.push("Option Configuration File:\nInvalid configuration at line #"+(i+1)+".");break}}field.options=$.trim(options.join("\n"))}}if(!(field.levels=field.levels.replace(/ /g,""))){errors.push("Applicable Levels:\nThis is required. Please try again.")}else{if(!field.levels.match(/^(all|[0-9,]+)$/)){errors.push("Applicable Levels:\nShould be comma-delimited Levels, or just type: all.\n(examples: 0,1,2,3,4 or type the word: all)")}}if(field.classes&&field.classes.match(/[^a-z 0-9 _ \-]/i)){errors.push("CSS Classes:\nContains invalid characters. Please try again.\n(only: alphanumerics, underscores, hyphens, spaces)")}if(field.styles&&field.styles.match(/["\=\>\<]/)){errors.push('CSS Styles:\nContains invalid characters. Please try again.\n(do NOT use these characters: = " < >)')}if(field.attrs&&field.attrs.match(/[\>\<]/)){errors.push("Other Attributes:\nContains invalid characters. Please try again.\n(do NOT use these characters: < >)")}if(errors.length>0){alert(errors.join("\n\n"));return false}else{return field}};var updateFields=function(){$fields.val(((fields.length>0)?$.JSON.stringify(fields):""))};var fieldId2Var=function(fieldId){return(typeof fieldId==="string")?$.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g,"_"):""};var fieldTypeDesc=function(type){var types={text:"Text (single line)",textarea:"Textarea (multi-line)",select:"Select Menu (drop-down)",selects:"Select Menu (multi-option)",checkbox:"Checkbox (single)",pre_checkbox:"Checkbox (pre-checked)",checkboxes:"Checkboxes (multi-option)",radios:"Radio Buttons (multi-option)"};if(typeof types[type]==="string"){return types[type]}return""};var fieldIdExists=function(fieldId){for(var i=0;i<fields.length;i++){if(fields[i].id===fieldId){return true}}};var scrollReset=function(){scrollTo(0,$("div.ws-plugin--s2member-custom-reg-fields-section").offset()["top"]-100)};var buildTools=function(adding,index){var i=0,html="",form="",w=0,h=0,editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,displayForm=(adding||editing)?true:false,field=(editing)?$.extend(true,{},fieldDefaults,fields[index]):fieldDefaults;html+='<a href="#" onclick="ws_plugin__s2member_customRegFieldAdd(); return false;">Add New Field</a>';tb_remove(),$("div#ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form").remove();if(displayForm){form+='<div id="ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form">';form+='<table id="ws-plugin--s2member-custom-reg-field-configuration-tools-form">';form+="<tbody>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">Starts A New Section?</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<select property="section" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section" onchange="ws_plugin__s2member_customRegFieldSectionChange(this);">';form+='<option value="no"'+((field.section==="no")?' selected="selected"':"")+'">No (this Field flows normally)</option>';form+='<option value="yes"'+((field.section==="yes")?' selected="selected"':"")+'">Yes (this Field begins a new section)</option>';form+="</select><br />";form+="<small>Optional. Allows Fields to be grouped into sections.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+'><td colspan="2"><hr /></td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+">";form+='<td colspan="2">';form+="Title for this new section? (optional)<br />";form+='<input type="text" property="sectitle" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle" value="'+esc_attr(field.sectitle)+'" /><br />';form+="<small>If empty, a simple divider will be used by default.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-type"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">Form Field Type: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<select property="type" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type" onchange="ws_plugin__s2member_customRegFieldTypeChange(this);">';form+='<option value="text"'+((field.type==="text")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("text"))+"</option>";form+='<option value="textarea"'+((field.type==="textarea")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("textarea"))+"</option>";form+='<option value="select"'+((field.type==="select")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("select"))+"</option>";form+='<option value="selects"'+((field.type==="selects")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("selects"))+"</option>";form+='<option value="checkbox"'+((field.type==="checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkbox"))+"</option>";form+='<option value="pre_checkbox"'+((field.type==="pre_checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("pre_checkbox"))+"</option>";form+='<option value="checkboxes"'+((field.type==="checkboxes")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkboxes"))+"</option>";form+='<option value="radios"'+((field.type==="radios")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("radios"))+"</option>";form+="</select><br />";form+="<small>The options below may change, based on the Field Type you choose here.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-label"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">Field Label/Desc: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<input type="text" property="label" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label" value="'+esc_attr(field.label)+'" /><br />';form+="<small>Examples: <code>Choose Country</code>, <code>Street Address</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-id"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">Unique Field ID: *</label></label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<input type="text" property="id" maxlength="25" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id" value="'+esc_attr(field.id)+'" /><br />';form+="<small>Examples: <code>country_code</code>, <code>street_address</code></small><br />";form+='<small>e.g., <code>[s2Get user_field="country_code" /]</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-required"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">Field Required: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<select property="required" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<option value="yes"'+((field.required==="yes")?' selected="selected"':"")+'">Yes (required)</option>';form+='<option value="no"'+((field.required==="no")?' selected="selected"':"")+'">No (optional)</option>';form+="</select><br />";form+='<small>If <code>yes</code>, only Users/Members will be "required" to enter this field.</small><br />';form+="<small>* Administrators are exempt from this requirement.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt">Default Text Value: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="deflt" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt" rows="1">'+esc_html(field.deflt)+"</textarea><br />";form+="<small>Default value before user input is received.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options">Option Configuration File: * (one option per line)</label><br />';form+="<small>Use a pipe <code>|</code> delimited format: <code>option value|option label</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="options" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options" rows="3">'+esc_html(field.options)+"</textarea><br />";form+="Here is a quick example:<br />";form+="<small>You can also specify a <em>default</em> option:</small><br />";form+="<code>US|United States|default</code><br />";form+="<code>CA|Canada</code><br />";form+="<code>VI|Virgin Islands (U.S.)</code>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">Expected Format: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<select property="expected" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">';form+='<option value=""'+((field.expected==="")?' selected="selected"':"")+'">Anything Goes</option>';form+='<option disabled="disabled"></option>';form+='<optgroup label="Specific Input Types">';form+='<option value="numeric-wp-commas"'+((field.expected==="numeric-wp-commas")?' selected="selected"':"")+'">Numeric (with or without decimals, commas allowed)</option>';form+='<option value="numeric"'+((field.expected==="numeric")?' selected="selected"':"")+'">Numeric (with or without decimals, no commas)</option>';form+='<option value="integer"'+((field.expected==="integer")?' selected="selected"':"")+'">Integer (whole number, without any decimals)</option>';form+='<option value="integer-gt-0"'+((field.expected==="integer-gt-0")?' selected="selected"':"")+'">Integer > 0 (whole number, no decimals, greater than 0)</option>';form+='<option value="float"'+((field.expected==="float")?' selected="selected"':"")+'">Float (floating point number, decimals required)</option>';form+='<option value="float-gt-0"'+((field.expected==="float-gt-0")?' selected="selected"':"")+'">Float > 0 (floating point number, decimals required, greater than 0)</option>';form+='<option value="date"'+((field.expected==="date")?' selected="selected"':"")+'">Date (required date format: dd/mm/yyyy)</option>';form+='<option value="email"'+((field.expected==="email")?' selected="selected"':"")+'">Email (require valid email)</option>';form+='<option value="url"'+((field.expected==="url")?' selected="selected"':"")+'">Full URL (starting with http or https)</option>';form+='<option value="domain"'+((field.expected==="domain")?' selected="selected"':"")+'">Domain Name (domain name only, without http)</option>';form+='<option value="phone"'+((field.expected==="phone")?' selected="selected"':"")+'">Phone # (10 digits w/possible hyphens,spaces,brackets)</option>';form+='<option value="uszip"'+((field.expected==="uszip")?' selected="selected"':"")+'">US Zipcode (5-9 digits w/possible hyphen)</option>';form+='<option value="cazip"'+((field.expected==="cazip")?' selected="selected"':"")+'">Canadian Zipcode (6 alpha-numerics w/possible space)</option>';form+='<option value="uczip"'+((field.expected==="uczip")?' selected="selected"':"")+'">US/Canadian Zipcode (either a US or Canadian zipcode)</option>';form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Any Character Combination">';for(i=1;i<=25;i++){form+='<option value="any-'+i+'"'+((field.expected==="any-"+i)?' selected="selected"':"")+'">Any Character Combination ('+i+" character minimum)</option>";form+='<option value="any-'+i+'-e"'+((field.expected==="any-"+i+"-e")?' selected="selected"':"")+'">Any Character Combination (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics, Spaces & Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected==="alphanumerics-spaces-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics, Spaces & Punctuation ('+i+" character minimum)</option>";form+='<option value="alphanumerics-spaces-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-spaces-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics, Spaces & Punctuation (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics & Spaces Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-'+i+'"'+((field.expected==="alphanumerics-spaces-"+i)?' selected="selected"':"")+'">Alphanumerics & Spaces ('+i+" character minimum)</option>";form+='<option value="alphanumerics-spaces-'+i+'-e"'+((field.expected==="alphanumerics-spaces-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics & Spaces (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics & Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-punctuation-'+i+'"'+((field.expected==="alphanumerics-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics & Punctuation ('+i+" character minimum)</option>";form+='<option value="alphanumerics-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics & Punctuation (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-'+i+'"'+((field.expected==="alphanumerics-"+i)?' selected="selected"':"")+'">Alphanumerics ('+i+" character minimum)</option>";form+='<option value="alphanumerics-'+i+'-e"'+((field.expected==="alphanumerics-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphabetics Only">';for(i=1;i<=25;i++){form+='<option value="alphabetics-'+i+'"'+((field.expected==="alphabetics-"+i)?' selected="selected"':"")+'">Alphabetics ('+i+" character minimum)</option>";form+='<option value="alphabetics-'+i+'-e"'+((field.expected==="alphabetics-"+i+"-e")?' selected="selected"':"")+'">Alphabetics (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Numeric Digits Only">';for(i=1;i<=25;i++){form+='<option value="numerics-'+i+'"'+((field.expected==="numerics-"+i)?' selected="selected"':"")+'">Numeric Digits ('+i+" digit minimum)</option>";form+='<option value="numerics-'+i+'-e"'+((field.expected==="numerics-"+i+"-e")?' selected="selected"':"")+'">Numeric Digits (exactly '+i+" digit"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+="</select><br />";form+="<small>Only Users/Members will be required to meet this criteria.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">Applicable Membership Levels: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<input type="text" property="levels" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels" value="'+esc_attr(field.levels)+'" /><br />';form+="<small>Please use comma-delimited Level #'s: <code>0,1,2,3,4</code> or type: <code>all</code>.</small><br />";form+="<small>This allows you to enable this field - only at specific Membership Levels.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">Allow Profile Edits: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<select property="editable" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<option value="yes"'+((field.editable==="yes")?' selected="selected"':"")+'">Yes (editable)</option>';form+='<option value="no"'+((field.editable==="no")?' selected="selected"':"")+'">No (uneditable after registration)</option>';form+='<option value="no-invisible"'+((field.editable==="no-invisible")?' selected="selected"':"")+'">No (uneditable & totally invisible after registration)</option>';form+='<option value="no-always-invisible"'+((field.editable==="no-always-invisible")?' selected="selected"':"")+'">No (uneditable & totally invisible, both during & after registration)</option>';form+='<option value="yes-invisible"'+((field.editable==="yes-invisible")?' selected="selected"':"")+'">Yes (editable after registration / invisible during registration)</option>';form+="</select><br />";form+="<small>If <code>No</code>, this field will be un-editable after registration.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">CSS Classes: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<input type="text" property="classes" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes" value="'+esc_attr(field.classes)+'" /><br />';form+="<small>Example: <code>my-style-1 my-style-2</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">CSS Styles: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<input type="text" property="styles" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles" value="'+esc_attr(field.styles)+'" /><br />';form+="<small>Example: <code>color:#000000; background:#FFFFFF;</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">Other Attributes: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<input type="text" property="attrs" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs" value="'+esc_attr(field.attrs)+'" /><br />';form+='<small>Example: <code>onkeyup="" onblur=""</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons">';form+='<td align="left">';form+='<input type="button" value="Cancel" onclick="ws_plugin__s2member_customRegFieldCancel();" />';form+="</td>";form+='<td align="right">';form+='<input type="button" value="'+((editing)?"Update This Field":"Create Registration Field")+'" onclick="'+((editing)?"ws_plugin__s2member_customRegFieldUpdate("+index+");":"ws_plugin__s2member_customRegFieldCreate();")+'" />';form+="</td>";form+="</tr>";form+="</tbody>";form+="</table>";form+="<div>";$("body").append(form);tb_show(((editing)?"Editing Registration/Profile Field":"New Custom Registration/Profile Field"),"#TB_inline?inlineId=ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form");$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form").show()}$tools.html(html)};var buildTable=function(){var l=fields.length,i=0,html="",eo="o";html+="<tbody>";html+="<tr>";html+="<th>Order</th>";html+="<th>Field Type</th>";html+="<th>Unique ID</th>";html+="<th>Required</th>";html+="<th>Levels</th>";html+="<th>- Tools -</th>";html+="</tr>";if(fields.length>0){for(i=0;i<fields.length;i++){html+='<tr class="'+esc_attr((eo=(eo==="o")?"e":"o"))+((fields[i].section==="yes")?" s":"")+" ws-plugin--s2member-custom-reg-field-configuration-table-row-"+i+'">';html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-move-up" href="#" onclick="ws_plugin__s2member_customRegFieldMoveUp('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-move-down" href="#" onclick="ws_plugin__s2member_customRegFieldMoveDown('+i+'); return false;"></a></td>';html+='<td nowrap="nowrap">'+esc_html(fieldTypeDesc(fields[i].type))+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].id)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].required)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].levels)+"</td>";html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-edit" href="#" onclick="ws_plugin__s2member_customRegFieldEdit('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-delete" href="#" onclick="ws_plugin__s2member_customRegFieldDelete('+i+'); return false;"></a></td>';html+="</tr>"}}else{html+="<tr>";html+='<td colspan="6">No Custom Fields are configured.</td>';html+="</tr>"}html+="</tbody>";$table.html(html)};buildTools(),buildTable()})()}}if(location.href.match(/page\=ws-plugin--s2member-res-ops/)){$("input#ws-plugin--s2member-brute-force-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's Brute Force Restriction Logs have all been reset."),$this.val("Reset Brute Force Logs")});return false});$("input#ws-plugin--s2member-ip-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's IP Restriction Logs have all been reset."),$this.val("Reset IP Restriction Logs")});return false});$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').change(function(){var thisChange=$(this).val();$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="all"&&this.checked){$this.nextAll(checkboxes).attr({checked:"checked",disabled:"disabled"})}else{if(val==="all"&&!this.checked){$this.nextAll(checkboxes).removeAttr("disabled");(thisChange==="all")?$this.nextAll(checkboxes).removeAttr("checked"):null}}})}).last().trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-down-ops/)){var updateCloudFrontPrivateKey=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyEntry=$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry");var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyEntryValue=$.trim($visiblePrivateKeyEntry.val());if((hiddenPrivateKeyValue&&!visiblePrivateKeyEntryValue)||visiblePrivateKeyEntryValue.match(/[^\r\n\u25CF]/)){$hiddenPrivateKey.val(visiblePrivateKeyEntryValue),$visiblePrivateKeyEntry.val(visiblePrivateKeyEntryValue.replace(/[^\r\n]/g,String.fromCharCode(9679)))}};$("form#ws-plugin--s2member-options-form").submit(updateCloudFrontPrivateKey);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontPrivateKey).trigger("change");var updateCloudFrontDistroCfgs=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyId=$("input#ws-plugin--s2member-amazon-cf-files-private-key-id");var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistrosStatus=$("input#ws-plugin--s2member-amazon-cf-files-distros-auto-config-status");var autoConfigDistrosStatusValue=$.trim($autoConfigDistrosStatus.val());var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyIdValue=$.trim($visiblePrivateKeyId.val());var hiddenPrivateKeyPrevConfigValue=$.trim($hiddenPrivateKey.attr("data-s-prev-config-value")),visiblePrivateKeyIdPrevConfigValue=$.trim($visiblePrivateKeyId.attr("data-s-prev-config-value"));if(autoConfigDistrosStatusValue==="configured"&&((visiblePrivateKeyIdPrevConfigValue&&visiblePrivateKeyIdValue!==visiblePrivateKeyIdPrevConfigValue)||(hiddenPrivateKeyPrevConfigValue&&hiddenPrivateKeyValue!==hiddenPrivateKeyPrevConfigValue))){alert("s2Member will need to delete and re-configure your Amazon CloudFront distributions if you change this. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}else{if(autoConfigDistrosStatusValue!=="configured"&&visiblePrivateKeyIdValue&&hiddenPrivateKeyValue){alert("s2Member will need to auto-configure your Amazon CloudFront distributions for you. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}}};$("input#ws-plugin--s2member-amazon-cf-files-private-key-id").change(updateCloudFrontDistroCfgs);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontDistroCfgs);$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames").change(function(){var $this=$(this),thisChecked=(this.checked)?true:false;var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistroCnames=$("div#ws-plugin--s2member-amazon-cf-files-auto-configure-distro-cnames");(thisChecked)?$autoConfigDistroCnames.show():$autoConfigDistroCnames.hide();(thisChecked)?$autoConfigDistros.attr("checked","checked"):null}).trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-paypal-ops/)){$("select#ws-plugin--s2member-auto-eot-system-enabled").change(function(){var $this=$(this),val=$this.val();var $viaCron=$("p#ws-plugin--s2member-auto-eot-system-enabled-via-cron");if(val==2){$viaCron.show()}else{$viaCron.hide()}})}if(location.href.match(/page\=ws-plugin--s2member-paypal-buttons/)){$("div.ws-menu-page select[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification)-term$/)}).change(function(){var button=this.id.replace(/^ws-plugin--s2member-(.+?)-term$/g,"$1");var trialDisabled=($(this).val().split("-")[2].replace(/[^0-1BN]/g,"")==="BN")?1:0;$("p#ws-plugin--s2member-"+button+"-trial-line").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-trial-then").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-20p-rule").css("display",(trialDisabled?"none":""));(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-period").val(0):null;(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-amount").val("0.00"):null});$("div.ws-menu-page input[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification|ccap)-ccaps$/)}).keyup(function(){var value=this.value.replace(/^(-all|-al|-a|-)[;,]*/gi,""),_all=(this.value.match(/^(-all|-al|-a|-)[;,]*/i))?"-all,":"";if(value.match(/[^a-z_0-9,]/)){this.value=_all+$.trim($.trim(value).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase())}});ws_plugin__s2member_paypalButtonGenerate=function(button){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="",labels={};eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");var shortCode=$("input#ws-plugin--s2member-"+button+"-shortcode");var code=$("textarea#ws-plugin--s2member-"+button+"-button");var modLevel=$("select#ws-plugin--s2member-modification-level");var level=(button==="modification")?modLevel.val().split(":",2)[1]:button.replace(/^level/,"");var label=labels["level"+level].replace(/"/g,"");var desc=$.trim($("input#ws-plugin--s2member-"+button+"-desc").val().replace(/"/g,""));var trialAmount=$("input#ws-plugin--s2member-"+button+"-trial-amount").val().replace(/[^0-9\.]/g,"");var trialPeriod=$("input#ws-plugin--s2member-"+button+"-trial-period").val().replace(/[^0-9]/g,"");var trialTerm=$("select#ws-plugin--s2member-"+button+"-trial-term").val().replace(/[^A-Z]/g,"");var regAmount=$("input#ws-plugin--s2member-"+button+"-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var regRecurTimes="",regRecurRetry="1";var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-"+button+"-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-"+button+"-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();trialPeriod=(regRecur==="BN")?"0":trialPeriod;trialAmount=(!trialAmount||isNaN(trialAmount)||trialAmount<0.01||trialPeriod<=0)?"0":trialAmount;var levelCcapsPer=(regRecur==="BN"&®Term!=="L")?level+":"+cCaps+":"+regPeriod+" "+regTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(trialAmount!=="0"&&(isNaN(trialAmount)||trialAmount<0)){alert("— Oops, a slight problem: —\n\nWhen provided, Trial Amount must be >= 0.00");return false}else{if(trialAmount!=="0"&&trialAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00");return false}else{if(trialTerm==="D"&&trialPeriod>90){alert("— Oops, a slight problem: —\n\nMaximum Trial Days is: 90.\nIf you want to offer more than 90 days, please choose Weeks or Months from the drop-down.");return false}else{if(trialTerm==="W"&&trialPeriod>52){alert("— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.");return false}else{if(trialTerm==="M"&&trialPeriod>24){alert("— Oops, a slight problem: —\n\nMaximum Trial Months is: 24.\nIf you want to offer more than 24 months, please choose Years from the drop-down.");return false}else{if(trialTerm==="Y"&&trialPeriod>5){alert("— Oops, a slight problem: —\n\nMax Trial Period Years is: 5.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}}}}}}code.html(code.val().replace(/ \<\!--(\<input type\="hidden" name\="(amount|src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/g," $1"));(parseInt(trialPeriod)<=0)?code.html(code.val().replace(/ (\<input type\="hidden" name\="(a1|p1|t1)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick$3")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="(src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick-subscriptions$3")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g," <!--$1-->")):null;shortCodeTemplateAttrs+=(button==="modification")?'modify="1" ':"";shortCodeTemplateAttrs+='level="'+esc_attr(level)+'" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'" custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"';shortCodeTemplateAttrs+=' ta="'+esc_attr(trialAmount)+'" tp="'+esc_attr(trialPeriod)+'" tt="'+esc_attr(trialTerm)+'" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'" rrt="'+esc_attr(regRecurTimes)+'" rra="'+esc_attr(regRecurRetry)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="modify" value\="(.*?)"/,' name="modify" value="'+((button==="modification")?"1":"0")+'"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="src" value\="(.*?)"/,' name="src" value="'+esc_attr(regRecur)+'"'));code.html(code.val().replace(/ name\="srt" value\="(.*?)"/,' name="srt" value="'+esc_attr(regRecurTimes)+'"'));code.html(code.val().replace(/ name\="sra" value\="(.*?)"/,' name="sra" value="'+esc_attr(regRecurRetry)+'"'));code.html(code.val().replace(/ name\="a1" value\="(.*?)"/,' name="a1" value="'+esc_attr(trialAmount)+'"'));code.html(code.val().replace(/ name\="p1" value\="(.*?)"/,' name="p1" value="'+esc_attr(trialPeriod)+'"'));code.html(code.val().replace(/ name\="t1" value\="(.*?)"/,' name="t1" value="'+esc_attr(trialTerm)+'"'));code.html(code.val().replace(/ name\="a3" value\="(.*?)"/,' name="a3" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="p3" value\="(.*?)"/,' name="p3" value="'+esc_attr(regPeriod)+'"'));code.html(code.val().replace(/ name\="t3" value\="(.*?)"/,' name="t3" value="'+esc_attr(regTerm)+'"'));$("div#ws-plugin--s2member-"+button+"-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));(button==="modification")?alert("Your Modification Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button."):alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalCcapButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-ccap-shortcode");var code=$("textarea#ws-plugin--s2member-ccap-button");var desc=$.trim($("input#ws-plugin--s2member-ccap-desc").val().replace(/"/g,""));var regAmount=$("input#ws-plugin--s2member-ccap-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-ccap-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-ccap-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-ccap-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-ccap-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-ccap-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();var levelCcapsPer=(regRecur==="BN"&®Term!=="L")?"*:"+cCaps+":"+regPeriod+" "+regTerm:"*:"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!cCaps||cCaps==="-all"){alert("— Oops, a slight problem: —\n\nPlease provide at least one Custom Capability.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}shortCodeTemplateAttrs+='level="*" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-ccap-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-sp-shortcode");var code=$("textarea#ws-plugin--s2member-sp-button");var leading=$("select#ws-plugin--s2member-sp-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-hours").val().replace(/[^0-9]/g,"");var regAmount=$("input#ws-plugin--s2member-sp-amount").val().replace(/[^0-9\.]/g,"");var desc=$.trim($("input#ws-plugin--s2member-sp-desc").val().replace(/"/g,""));var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-sp-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-sp-currency").val().replace(/[^A-Z]/g,"");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member ⥱ Restriction Options ⥱ Specific Post/Page Access.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}var spIdsHours="sp:"+ids+":"+hours;shortCodeTemplateAttrs+='sp="1" ids="'+esc_attr(ids)+'" exp="'+esc_attr(hours)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(spIdsHours)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-sp-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your WordPress Editor.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalRegLinkGenerate=function(){var level=$("select#ws-plugin--s2member-reg-link-level").val().replace(/[^0-9]/g,"");var subscrID=$.trim($("input#ws-plugin--s2member-reg-link-subscr-id").val());var custom=$.trim($("input#ws-plugin--s2member-reg-link-custom").val());var cCaps=$.trim($.trim($("input#ws-plugin--s2member-reg-link-ccaps").val()).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());var fixedTerm=$.trim($("input#ws-plugin--s2member-reg-link-fixed-term").val().replace(/[^A-Z 0-9]/gi,"").toUpperCase());var $link=$("p#ws-plugin--s2member-reg-link"),$loading=$("img#ws-plugin--s2member-reg-link-loading");var levelCcapsPer=(fixedTerm&&!fixedTerm.match(/L$/))?level+":"+cCaps+":"+fixedTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!subscrID){alert("— Oops, a slight problem: —\n\nPaid Subscr. ID is a required value.");return false}else{if(!custom||custom.indexOf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq ($_SERVER["HTTP_HOST"]); ?>')!==0){alert("— Oops, a slight problem: —\n\nThe Custom Value MUST start with your domain name.");return false}else{if(fixedTerm&&!fixedTerm.match(/^[1-9]+ (D|W|M|Y|L)$/)){alert("— Oops, a slight problem: —\n\nThe Fixed Term Length is not formatted properly.");return false}}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_reg_access_link_via_ajax",ws_plugin__s2member_reg_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-reg-access-link-via-ajax")); ?>',s2member_reg_access_link_subscr_gateway:"paypal",s2member_reg_access_link_subscr_id:subscrID,s2member_reg_access_link_custom:custom,s2member_reg_access_link_item_number:levelCcapsPer},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false};ws_plugin__s2member_paypalSpLinkGenerate=function(){var leading=$("select#ws-plugin--s2member-sp-link-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-link-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-link-hours").val().replace(/[^0-9]/g,"");var $link=$("p#ws-plugin--s2member-sp-link"),$loading=$("img#ws-plugin--s2member-sp-link-loading");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member ⥱ Restriction Options ⥱ Specific Post/Page Access.");return false}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_sp_access_link_via_ajax",ws_plugin__s2member_sp_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link-via-ajax")); ?>',s2member_sp_access_link_ids:ids,s2member_sp_access_link_hours:hours},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false}}if(location.href.match(/page\=ws-plugin--s2member-els-ops/)){$("select#ws-plugin--s2member-custom-reg-opt-in").change(function(){var $this=$(this),val=$this.val();var $rows=$("tr.ws-plugin--s2member-custom-reg-opt-in-label-row");var $prevImg=$("img.ws-plugin--s2member-custom-reg-opt-in-label-prev-img");if(val<=0){$rows.css("display","none"),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}else{if(val==1){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/unchecked\.png$/,"/checked.png"))}else{if(val==2){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}}}});$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').change(function(){var thisChange=$(this).val(),checkedIndexes=[];$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="removal-deletion"&&this.checked){$this.nextAll(checkboxes).slice(0,2).attr({checked:"checked",disabled:"disabled"})}else{if(val==="removal-deletion"&&!this.checked){$this.nextAll(checkboxes).slice(0,2).removeAttr("disabled");(thisChange==="removal-deletion")?$this.nextAll(checkboxes).slice(0,2).removeAttr("checked"):null}else{if(val==="modification"&&this.checked){$this.nextAll(checkboxes).slice(0,3).attr({checked:"checked",disabled:"disabled"})}else{if(val==="modification"&&!this.checked){(thisChange==="modification")?$this.nextAll(checkboxes).slice(0,3).removeAttr("checked"):null;$this.nextAll(checkboxes).slice(0,3).removeAttr("disabled")}}}}}).each(function(index){(this.checked)?checkedIndexes.push(index):null});$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").removeAttr("disabled");if($.inArray(3,checkedIndexes)===-1&&$.inArray(4,checkedIndexes)===-1&&$.inArray(5,checkedIndexes)===-1&&$.inArray(6,checkedIndexes)===-1){$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").attr("disabled","disabled")}}).last().trigger("change")}});
|
1 |
+
jQuery(document).ready(function($){var esc_attr=esc_html=function(string){if(/[&\<\>"']/.test(string=String(string))){string=string.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),string=string.replace(/"/g,""").replace(/'/g,"'")}return string};ws_plugin__s2member_generateSecurityKey=function(obj){if(!obj){obj="#ws-plugin--s2member-sec-encryption-key"}var mt_rand=function(min,max){min=(arguments.length<1)?0:min;max=(arguments.length<2)?2147483647:max;return Math.floor(Math.random()*(max-min+1))+min};var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#%^&*()";for(var i=0,key="";i<64;i++){key+=chars.substr(mt_rand(0,chars.length-1),1)}$(obj).val(key);return false};if(location.href.match(/page\=ws-plugin--s2member/)){$("input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button").click(function(){var $this=$(this);$this.val("one moment please ...");var levels='<?php echo (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; ?>';var resetUpdate=($this.hasClass("ws-plugin--s2member-reset-roles-button"))?"Reset":"Update";$.post(ajaxurl,{action:"ws_plugin__s2member_update_roles_via_ajax",ws_plugin__s2member_update_roles_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-update-roles-via-ajax")); ?>'},function(response){if(response==="1"){alert("s2Member's Roles/Capabilities "+((resetUpdate.toLowerCase()==="reset")?"have been successfully reset":"updated successfully")+".\nYour installation of s2Member has Membership Levels 0-"+levels+"."),$this.val(resetUpdate+" Roles/Capabilities")}else{if(response==="l"){alert("Sorry, your request failed.\ns2Member's Roles/Capabilities are locked by Filter:\nws_plugin__s2member_lock_roles_caps"),$this.val(resetUpdate+" Roles/Capabilities")}else{alert("Sorry, your request failed.\nAccess denied. Do you have the ability to `create_users`?"),$this.val(resetUpdate+" Roles/Capabilities")}}});return false});$("#ws-plugin--s2member-custom-reg-password").on("change",function(){$("#ws-plugin--s2member-custom-reg-password-settings").css("opacity",$(this).val()==="1"?"1":"0.9")}).trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-logs/)){$("input#ws-plugin--s2member-gateway-debug-logs-extensive-1").click(function(){var $this=$(this),thisChecked=(this.checked)?true:false;if(thisChecked){$("input#ws-plugin--s2member-gateway-debug-logs-1").attr("checked","checked")}});var $toggles=$("a.ws-plugin--s2member-log-file-viewport-toggle");$toggles.click(function(){$("textarea#ws-plugin--s2member-log-file-viewer").each(function(){var $viewer=$(this);if($viewer.attr("data-state")!=="expanded"){$viewer.css({height:($viewer.prop("scrollHeight")+50)+"px","overflow-y":"auto"});$toggles.html("⇑ normalize viewport ❙");$viewer.attr("data-state","expanded")}else{$viewer.css({height:"auto","overflow-y":"scroll"});$toggles.html("⇓ expand viewport ⇓");$viewer.attr("data-state","scrolling")}});return false})}if(location.href.match(/page\=ws-plugin--s2member-mms-ops/)){$("select#ws-plugin--s2member-mms-registration-file").change(function(){if($(this).val()==="wp-signup"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").show(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").hide(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").show();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0")[((gv==="all")?"show":"hide")]();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val(((gv==="all")?((l0v>0)?l0v:"1"):"0"))}else{if($(this).val()==="wp-login"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").hide(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").show(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").hide();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0").hide();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val("0")}}}).trigger("change");$("select#ws-plugin--s2member-mms-registration-grants").change(function(){$("select#ws-plugin--s2member-mms-registration-file").trigger("change")})}if(location.href.match(/page\=ws-plugin--s2member-gen-ops/)){ws_plugin__s2member_enableSecurityKey=function(){if(confirm("Edit Key? Are you sure?\nThis could break your installation!\n\n*Note* If you've been testing s2Member, feel free to change this Key before you go live. Just don't go live, and then change it. You'll have unhappy Customers. Data corruption WILL occur! For your safety, s2Member keeps a history of the last 10 Keys that you've used. If you get yourself into a real situation, s2Member will let you revert back to a previous Key.")){$("input#ws-plugin--s2member-sec-encryption-key").removeAttr("disabled")}return false};ws_plugin__s2member_securityKeyHistory=function(){$("div#ws-plugin--s2member-sec-encryption-key-history").toggle();return false};$("select#ws-plugin--s2member-new-user-emails-enabled").change(function(){var $pluggable=$("input#ws-plugin--s2member-pluggables-wp-new-user-notification"),$this=$(this),$newUserEmails=$("div#ws-plugin--s2member-new-user-emails");if($pluggable.val()==="0"||$this.val()==="0"){($pluggable.val()==="0")?$this.attr("disabled","disabled"):$this.removeAttr("disabled");$(":input",$newUserEmails).attr("disabled","disabled"),$newUserEmails.css("opacity","0.5")}else{$this.removeAttr("disabled"),$(":input",$newUserEmails).removeAttr("disabled"),$newUserEmails.css("opacity","")}}).trigger("change");$("select#ws-plugin--s2member-login-reg-design-enabled").change(function(){var $this=$(this),$loginRegDesign=$("div#ws-plugin--s2member-login-reg-design");if($this.val()==="0"){$(":input",$loginRegDesign).attr("disabled","disabled"),$loginRegDesign.css("opacity","0.5"),$loginRegDesign.hide()}else{$(":input",$loginRegDesign).removeAttr("disabled"),$loginRegDesign.css("opacity",""),$loginRegDesign.show()}}).trigger("change");if($("input#ws-plugin--s2member-custom-reg-fields").length&&$("div#ws-plugin--s2member-custom-reg-field-configuration").length){(function(){var i,fieldDefaults,tools,table,$tools,$table;var $fields=$("input#ws-plugin--s2member-custom-reg-fields");var $configuration=$("div#ws-plugin--s2member-custom-reg-field-configuration");var fields=($fields.val())?$.JSON.parse($fields.val()):[];fields=(fields instanceof Array)?fields:[];fieldDefaults={section:"no",sectitle:"",id:"",label:"",type:"text",deflt:"",options:"",expected:"",required:"yes",levels:"all",editable:"yes",classes:"",styles:"",attrs:""};for(i=0;i<fields.length;i++){fields[i]=$.extend(true,{},fieldDefaults,fields[i])}tools='<div id="ws-plugin--s2member-custom-reg-field-configuration-tools"></div>',table='<table id="ws-plugin--s2member-custom-reg-field-configuration-table"></table>';$configuration.html(tools+table);$tools=$("div#ws-plugin--s2member-custom-reg-field-configuration-tools"),$table=$("table#ws-plugin--s2member-custom-reg-field-configuration-table");ws_plugin__s2member_customRegFieldSectionChange=function(select){var section=$(select).val();var sectitle_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle";(section==="yes")?$(sectitle_trs).css("display",""):$(sectitle_trs).css("display","none")};ws_plugin__s2member_customRegFieldTypeChange=function(select){var type=$(select).val();var deflt_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt",options_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-options",expected_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected";(type.match(/^(text|textarea)$/))?$(deflt_trs).css("display",""):$(deflt_trs).css("display","none");(type.match(/^(select|selects|checkboxes|radios)$/))?$(options_trs).css("display",""):$(options_trs).css("display","none");(type.match(/^(text|textarea)$/))?$(expected_trs).css("display",""):$(expected_trs).css("display","none")};ws_plugin__s2member_customRegFieldDelete=function(index){var newFields=new Array();for(var i=0;i<fields.length;i++){if(i!==index){newFields.push(fields[i])}}fields=newFields,updateFields(),buildTable()};ws_plugin__s2member_customRegFieldMoveUp=function(index){if(typeof fields[index]==="object"&&typeof fields[index-1]==="object"){var prevFieldObj=fields[index-1],thisFieldObj=fields[index];fields[index-1]=thisFieldObj,fields[index]=prevFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldMoveDown=function(index){if(typeof fields[index]==="object"&&typeof fields[index+1]==="object"){var nextFieldObj=fields[index+1],thisFieldObj=fields[index];fields[index+1]=thisFieldObj,fields[index]=nextFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldCreate=function(){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field))){fields.push(field),updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+(fields.length-1);alert('Field created successfully.\n* Remember to "Save All Changes".')},500)}};ws_plugin__s2member_customRegFieldUpdate=function(index){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field,index))){fields[index]=field,updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+index;alert('Field updated successfully.\n* Remember to "Save All Changes".')},500)}};ws_plugin__s2member_customRegFieldAdd=function(){buildTools(true)};ws_plugin__s2member_customRegFieldEdit=function(index){buildTools(false,index),scrollReset()};ws_plugin__s2member_customRegFieldCancel=function(){buildTools(),scrollReset()};var validateField=function(field,index){var editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,errors=[],options,i;if(typeof field!=="object"||typeof(field=$.extend(true,{},fieldDefaults,field))!=="object"){alert("Invalid field object. Please try again.");return false}field.sectitle=(field.section==="yes")?field.sectitle:"";field.deflt=(field.type.match(/^(text|textarea)$/))?field.deflt:"";field.deflt=(field.type.match(/^(text)$/))?field.deflt.replace(/[\r\n\t ]+/g," "):field.deflt;field.options=(field.type.match(/^(select|selects|checkboxes|radios)$/))?field.options:"";field.expected=(field.type.match(/^(text|textarea)$/))?field.expected:"";if(!field.id){errors.push("Unique Field ID:\nThis is required. Please try again.")}else{if(fieldIdExists(field.id)&&(!editing||field.id!==fields[index].id)){errors.push("Unique Field ID:\nThat Field ID already exists. Please try again.")}}if(!field.label){errors.push("Field Label/Description:\nThis is required. Please try again.")}if(field.type.match(/^(select|selects|checkboxes|radios)$/)&&!field.options){errors.push("Option Configuration File:\nThis is required. Please try again.")}else{if(field.type.match(/^(select|selects|checkboxes|radios)$/)){for(i=0;i<(options=field.options.split(/[\r\n]+/)).length;i++){if(!(options[i]=$.trim(options[i])).match(/^([^\|]*)(\|)([^\|]*)(\|default)?$/)){errors.push("Option Configuration File:\nInvalid configuration at line #"+(i+1)+".");break}}field.options=$.trim(options.join("\n"))}}if(!(field.levels=field.levels.replace(/ /g,""))){errors.push("Applicable Levels:\nThis is required. Please try again.")}else{if(!field.levels.match(/^(all|[0-9,]+)$/)){errors.push("Applicable Levels:\nShould be comma-delimited Levels, or just type: all.\n(examples: 0,1,2,3,4 or type the word: all)")}}if(field.classes&&field.classes.match(/[^a-z 0-9 _ \-]/i)){errors.push("CSS Classes:\nContains invalid characters. Please try again.\n(only: alphanumerics, underscores, hyphens, spaces)")}if(field.styles&&field.styles.match(/["\=\>\<]/)){errors.push('CSS Styles:\nContains invalid characters. Please try again.\n(do NOT use these characters: = " < >)')}if(field.attrs&&field.attrs.match(/[\>\<]/)){errors.push("Other Attributes:\nContains invalid characters. Please try again.\n(do NOT use these characters: < >)")}if(errors.length>0){alert(errors.join("\n\n"));return false}else{return field}};var updateFields=function(){$fields.val(((fields.length>0)?$.JSON.stringify(fields):""))};var fieldId2Var=function(fieldId){return(typeof fieldId==="string")?$.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g,"_"):""};var fieldTypeDesc=function(type){var types={text:"Text (single line)",textarea:"Textarea (multi-line)",select:"Select Menu (drop-down)",selects:"Select Menu (multi-option)",checkbox:"Checkbox (single)",pre_checkbox:"Checkbox (pre-checked)",checkboxes:"Checkboxes (multi-option)",radios:"Radio Buttons (multi-option)"};if(typeof types[type]==="string"){return types[type]}return""};var fieldIdExists=function(fieldId){for(var i=0;i<fields.length;i++){if(fields[i].id===fieldId){return true}}};var scrollReset=function(){scrollTo(0,$("div.ws-plugin--s2member-custom-reg-fields-section").offset()["top"]-100)};var buildTools=function(adding,index){var i=0,html="",form="",w=0,h=0,editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,displayForm=(adding||editing)?true:false,field=(editing)?$.extend(true,{},fieldDefaults,fields[index]):fieldDefaults;html+='<a href="#" onclick="ws_plugin__s2member_customRegFieldAdd(); return false;">Add New Field</a>';tb_remove(),$("div#ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form").remove();if(displayForm){form+='<div id="ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form">';form+='<table id="ws-plugin--s2member-custom-reg-field-configuration-tools-form">';form+="<tbody>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">Starts A New Section?</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<select property="section" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section" onchange="ws_plugin__s2member_customRegFieldSectionChange(this);">';form+='<option value="no"'+((field.section==="no")?' selected="selected"':"")+'">No (this Field flows normally)</option>';form+='<option value="yes"'+((field.section==="yes")?' selected="selected"':"")+'">Yes (this Field begins a new section)</option>';form+="</select><br />";form+="<small>Optional. Allows Fields to be grouped into sections.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+'><td colspan="2"><hr /></td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+">";form+='<td colspan="2">';form+="Title for this new section? (optional)<br />";form+='<input type="text" property="sectitle" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle" value="'+esc_attr(field.sectitle)+'" /><br />';form+="<small>If empty, a simple divider will be used by default.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-type"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">Form Field Type: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<select property="type" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type" onchange="ws_plugin__s2member_customRegFieldTypeChange(this);">';form+='<option value="text"'+((field.type==="text")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("text"))+"</option>";form+='<option value="textarea"'+((field.type==="textarea")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("textarea"))+"</option>";form+='<option value="select"'+((field.type==="select")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("select"))+"</option>";form+='<option value="selects"'+((field.type==="selects")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("selects"))+"</option>";form+='<option value="checkbox"'+((field.type==="checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkbox"))+"</option>";form+='<option value="pre_checkbox"'+((field.type==="pre_checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("pre_checkbox"))+"</option>";form+='<option value="checkboxes"'+((field.type==="checkboxes")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkboxes"))+"</option>";form+='<option value="radios"'+((field.type==="radios")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("radios"))+"</option>";form+="</select><br />";form+="<small>The options below may change, based on the Field Type you choose here.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-label"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">Field Label/Desc: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<input type="text" property="label" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label" value="'+esc_attr(field.label)+'" /><br />';form+="<small>Examples: <code>Choose Country</code>, <code>Street Address</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-id"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">Unique Field ID: *</label></label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<input type="text" property="id" maxlength="25" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id" value="'+esc_attr(field.id)+'" /><br />';form+="<small>Examples: <code>country_code</code>, <code>street_address</code></small><br />";form+='<small>e.g., <code>[s2Get user_field="country_code" /]</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-required"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">Field Required: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<select property="required" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<option value="yes"'+((field.required==="yes")?' selected="selected"':"")+'">Yes (required)</option>';form+='<option value="no"'+((field.required==="no")?' selected="selected"':"")+'">No (optional)</option>';form+="</select><br />";form+='<small>If <code>yes</code>, only Users/Members will be "required" to enter this field.</small><br />';form+="<small>* Administrators are exempt from this requirement.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt">Default Text Value: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="deflt" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt" rows="1">'+esc_html(field.deflt)+"</textarea><br />";form+="<small>Default value before user input is received.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options">Option Configuration File: * (one option per line)</label><br />';form+="<small>Use a pipe <code>|</code> delimited format: <code>option value|option label</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="options" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options" rows="3">'+esc_html(field.options)+"</textarea><br />";form+="Here is a quick example:<br />";form+="<small>You can also specify a <em>default</em> option:</small><br />";form+="<code>US|United States|default</code><br />";form+="<code>CA|Canada</code><br />";form+="<code>VI|Virgin Islands (U.S.)</code>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">Expected Format: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<select property="expected" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">';form+='<option value=""'+((field.expected==="")?' selected="selected"':"")+'">Anything Goes</option>';form+='<option disabled="disabled"></option>';form+='<optgroup label="Specific Input Types">';form+='<option value="numeric-wp-commas"'+((field.expected==="numeric-wp-commas")?' selected="selected"':"")+'">Numeric (with or without decimals, commas allowed)</option>';form+='<option value="numeric"'+((field.expected==="numeric")?' selected="selected"':"")+'">Numeric (with or without decimals, no commas)</option>';form+='<option value="integer"'+((field.expected==="integer")?' selected="selected"':"")+'">Integer (whole number, without any decimals)</option>';form+='<option value="integer-gt-0"'+((field.expected==="integer-gt-0")?' selected="selected"':"")+'">Integer > 0 (whole number, no decimals, greater than 0)</option>';form+='<option value="float"'+((field.expected==="float")?' selected="selected"':"")+'">Float (floating point number, decimals required)</option>';form+='<option value="float-gt-0"'+((field.expected==="float-gt-0")?' selected="selected"':"")+'">Float > 0 (floating point number, decimals required, greater than 0)</option>';form+='<option value="date"'+((field.expected==="date")?' selected="selected"':"")+'">Date (required date format: dd/mm/yyyy)</option>';form+='<option value="email"'+((field.expected==="email")?' selected="selected"':"")+'">Email (require valid email)</option>';form+='<option value="url"'+((field.expected==="url")?' selected="selected"':"")+'">Full URL (starting with http or https)</option>';form+='<option value="domain"'+((field.expected==="domain")?' selected="selected"':"")+'">Domain Name (domain name only, without http)</option>';form+='<option value="phone"'+((field.expected==="phone")?' selected="selected"':"")+'">Phone # (10 digits w/possible hyphens,spaces,brackets)</option>';form+='<option value="uszip"'+((field.expected==="uszip")?' selected="selected"':"")+'">US Zipcode (5-9 digits w/possible hyphen)</option>';form+='<option value="cazip"'+((field.expected==="cazip")?' selected="selected"':"")+'">Canadian Zipcode (6 alpha-numerics w/possible space)</option>';form+='<option value="uczip"'+((field.expected==="uczip")?' selected="selected"':"")+'">US/Canadian Zipcode (either a US or Canadian zipcode)</option>';form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Any Character Combination">';for(i=1;i<=25;i++){form+='<option value="any-'+i+'"'+((field.expected==="any-"+i)?' selected="selected"':"")+'">Any Character Combination ('+i+" character minimum)</option>";form+='<option value="any-'+i+'-e"'+((field.expected==="any-"+i+"-e")?' selected="selected"':"")+'">Any Character Combination (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics, Spaces & Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected==="alphanumerics-spaces-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics, Spaces & Punctuation ('+i+" character minimum)</option>";form+='<option value="alphanumerics-spaces-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-spaces-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics, Spaces & Punctuation (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics & Spaces Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-'+i+'"'+((field.expected==="alphanumerics-spaces-"+i)?' selected="selected"':"")+'">Alphanumerics & Spaces ('+i+" character minimum)</option>";form+='<option value="alphanumerics-spaces-'+i+'-e"'+((field.expected==="alphanumerics-spaces-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics & Spaces (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics & Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-punctuation-'+i+'"'+((field.expected==="alphanumerics-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics & Punctuation ('+i+" character minimum)</option>";form+='<option value="alphanumerics-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics & Punctuation (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-'+i+'"'+((field.expected==="alphanumerics-"+i)?' selected="selected"':"")+'">Alphanumerics ('+i+" character minimum)</option>";form+='<option value="alphanumerics-'+i+'-e"'+((field.expected==="alphanumerics-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphabetics Only">';for(i=1;i<=25;i++){form+='<option value="alphabetics-'+i+'"'+((field.expected==="alphabetics-"+i)?' selected="selected"':"")+'">Alphabetics ('+i+" character minimum)</option>";form+='<option value="alphabetics-'+i+'-e"'+((field.expected==="alphabetics-"+i+"-e")?' selected="selected"':"")+'">Alphabetics (exactly '+i+" character"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Numeric Digits Only">';for(i=1;i<=25;i++){form+='<option value="numerics-'+i+'"'+((field.expected==="numerics-"+i)?' selected="selected"':"")+'">Numeric Digits ('+i+" digit minimum)</option>";form+='<option value="numerics-'+i+'-e"'+((field.expected==="numerics-"+i+"-e")?' selected="selected"':"")+'">Numeric Digits (exactly '+i+" digit"+((i>1)?"s":"")+")</option>"}form+="</optgroup>";form+="</select><br />";form+="<small>Only Users/Members will be required to meet this criteria.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">Applicable Membership Levels: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<input type="text" property="levels" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels" value="'+esc_attr(field.levels)+'" /><br />';form+="<small>Please use comma-delimited Level #'s: <code>0,1,2,3,4</code> or type: <code>all</code>.</small><br />";form+="<small>This allows you to enable this field - only at specific Membership Levels.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">Allow Profile Edits: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<select property="editable" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<option value="yes"'+((field.editable==="yes")?' selected="selected"':"")+'">Yes (editable)</option>';form+='<option value="no"'+((field.editable==="no")?' selected="selected"':"")+'">No (uneditable after registration)</option>';form+='<option value="no-invisible"'+((field.editable==="no-invisible")?' selected="selected"':"")+'">No (uneditable & totally invisible after registration)</option>';form+='<option value="no-always-invisible"'+((field.editable==="no-always-invisible")?' selected="selected"':"")+'">No (uneditable & totally invisible, both during & after registration)</option>';form+='<option value="yes-invisible"'+((field.editable==="yes-invisible")?' selected="selected"':"")+'">Yes (editable after registration / invisible during registration)</option>';form+="</select><br />";form+="<small>If <code>No</code>, this field will be un-editable after registration.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">CSS Classes: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<input type="text" property="classes" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes" value="'+esc_attr(field.classes)+'" /><br />';form+="<small>Example: <code>my-style-1 my-style-2</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">CSS Styles: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<input type="text" property="styles" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles" value="'+esc_attr(field.styles)+'" /><br />';form+="<small>Example: <code>color:#000000; background:#FFFFFF;</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">Other Attributes: (optional)</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<input type="text" property="attrs" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs" value="'+esc_attr(field.attrs)+'" /><br />';form+='<small>Example: <code>onkeyup="" onblur=""</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons"><td colspan="2"> </td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons">';form+='<td align="left">';form+='<input type="button" value="Cancel" onclick="ws_plugin__s2member_customRegFieldCancel();" />';form+="</td>";form+='<td align="right">';form+='<input type="button" value="'+((editing)?"Update This Field":"Create Registration Field")+'" onclick="'+((editing)?"ws_plugin__s2member_customRegFieldUpdate("+index+");":"ws_plugin__s2member_customRegFieldCreate();")+'" />';form+="</td>";form+="</tr>";form+="</tbody>";form+="</table>";form+="<div>";$("body").append(form);tb_show(((editing)?"Editing Registration/Profile Field":"New Custom Registration/Profile Field"),"#TB_inline?inlineId=ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form");$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form").show()}$tools.html(html)};var buildTable=function(){var l=fields.length,i=0,html="",eo="o";html+="<tbody>";html+="<tr>";html+="<th>Order</th>";html+="<th>Field Type</th>";html+="<th>Unique ID</th>";html+="<th>Required</th>";html+="<th>Levels</th>";html+="<th>- Tools -</th>";html+="</tr>";if(fields.length>0){for(i=0;i<fields.length;i++){html+='<tr class="'+esc_attr((eo=(eo==="o")?"e":"o"))+((fields[i].section==="yes")?" s":"")+" ws-plugin--s2member-custom-reg-field-configuration-table-row-"+i+'">';html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-move-up" href="#" onclick="ws_plugin__s2member_customRegFieldMoveUp('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-move-down" href="#" onclick="ws_plugin__s2member_customRegFieldMoveDown('+i+'); return false;"></a></td>';html+='<td nowrap="nowrap">'+esc_html(fieldTypeDesc(fields[i].type))+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].id)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].required)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].levels)+"</td>";html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-edit" href="#" onclick="ws_plugin__s2member_customRegFieldEdit('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-delete" href="#" onclick="ws_plugin__s2member_customRegFieldDelete('+i+'); return false;"></a></td>';html+="</tr>"}}else{html+="<tr>";html+='<td colspan="6">No Custom Fields are configured.</td>';html+="</tr>"}html+="</tbody>";$table.html(html)};buildTools(),buildTable()})()}}if(location.href.match(/page\=ws-plugin--s2member-res-ops/)){$("input#ws-plugin--s2member-brute-force-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's Brute Force Restriction Logs have all been reset."),$this.val("Reset Brute Force Logs")});return false});$("input#ws-plugin--s2member-ip-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's IP Restriction Logs have all been reset."),$this.val("Reset IP Restriction Logs")});return false});$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').change(function(){var thisChange=$(this).val();$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="all"&&this.checked){$this.nextAll(checkboxes).attr({checked:"checked",disabled:"disabled"})}else{if(val==="all"&&!this.checked){$this.nextAll(checkboxes).removeAttr("disabled");(thisChange==="all")?$this.nextAll(checkboxes).removeAttr("checked"):null}}})}).last().trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-down-ops/)){var updateCloudFrontPrivateKey=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyEntry=$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry");var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyEntryValue=$.trim($visiblePrivateKeyEntry.val());if((hiddenPrivateKeyValue&&!visiblePrivateKeyEntryValue)||visiblePrivateKeyEntryValue.match(/[^\r\n\u25CF]/)){$hiddenPrivateKey.val(visiblePrivateKeyEntryValue),$visiblePrivateKeyEntry.val(visiblePrivateKeyEntryValue.replace(/[^\r\n]/g,String.fromCharCode(9679)))}};$("form#ws-plugin--s2member-options-form").submit(updateCloudFrontPrivateKey);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontPrivateKey).trigger("change");var updateCloudFrontDistroCfgs=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyId=$("input#ws-plugin--s2member-amazon-cf-files-private-key-id");var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistrosStatus=$("input#ws-plugin--s2member-amazon-cf-files-distros-auto-config-status");var autoConfigDistrosStatusValue=$.trim($autoConfigDistrosStatus.val());var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyIdValue=$.trim($visiblePrivateKeyId.val());var hiddenPrivateKeyPrevConfigValue=$.trim($hiddenPrivateKey.attr("data-s-prev-config-value")),visiblePrivateKeyIdPrevConfigValue=$.trim($visiblePrivateKeyId.attr("data-s-prev-config-value"));if(autoConfigDistrosStatusValue==="configured"&&((visiblePrivateKeyIdPrevConfigValue&&visiblePrivateKeyIdValue!==visiblePrivateKeyIdPrevConfigValue)||(hiddenPrivateKeyPrevConfigValue&&hiddenPrivateKeyValue!==hiddenPrivateKeyPrevConfigValue))){alert("s2Member will need to delete and re-configure your Amazon CloudFront distributions if you change this. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}else{if(autoConfigDistrosStatusValue!=="configured"&&visiblePrivateKeyIdValue&&hiddenPrivateKeyValue){alert("s2Member will need to auto-configure your Amazon CloudFront distributions for you. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}}};$("input#ws-plugin--s2member-amazon-cf-files-private-key-id").change(updateCloudFrontDistroCfgs);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontDistroCfgs);$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames").change(function(){var $this=$(this),thisChecked=(this.checked)?true:false;var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistroCnames=$("div#ws-plugin--s2member-amazon-cf-files-auto-configure-distro-cnames");(thisChecked)?$autoConfigDistroCnames.show():$autoConfigDistroCnames.hide();(thisChecked)?$autoConfigDistros.attr("checked","checked"):null}).trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-paypal-ops/)){$("select#ws-plugin--s2member-auto-eot-system-enabled").change(function(){var $this=$(this),val=$this.val();var $viaCron=$("p#ws-plugin--s2member-auto-eot-system-enabled-via-cron");if(val==2){$viaCron.show()}else{$viaCron.hide()}})}if(location.href.match(/page\=ws-plugin--s2member-paypal-buttons/)){$("div.ws-menu-page select[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification)-term$/)}).change(function(){var button=this.id.replace(/^ws-plugin--s2member-(.+?)-term$/g,"$1");var trialDisabled=($(this).val().split("-")[2].replace(/[^0-1BN]/g,"")==="BN")?1:0;$("p#ws-plugin--s2member-"+button+"-trial-line").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-trial-then").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-20p-rule").css("display",(trialDisabled?"none":""));(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-period").val(0):null;(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-amount").val("0.00"):null});$("div.ws-menu-page input[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification|ccap)-ccaps$/)}).keyup(function(){var value=this.value.replace(/^(-all|-al|-a|-)[;,]*/gi,""),_all=(this.value.match(/^(-all|-al|-a|-)[;,]*/i))?"-all,":"";if(value.match(/[^a-z_0-9,]/)){this.value=_all+$.trim($.trim(value).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase())}});ws_plugin__s2member_paypalButtonGenerate=function(button){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="",labels={};eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");var shortCode=$("input#ws-plugin--s2member-"+button+"-shortcode");var code=$("textarea#ws-plugin--s2member-"+button+"-button");var modLevel=$("select#ws-plugin--s2member-modification-level");var level=(button==="modification")?modLevel.val().split(":",2)[1]:button.replace(/^level/,"");var label=labels["level"+level].replace(/"/g,"");var desc=$.trim($("input#ws-plugin--s2member-"+button+"-desc").val().replace(/"/g,""));var trialAmount=$("input#ws-plugin--s2member-"+button+"-trial-amount").val().replace(/[^0-9\.]/g,"");var trialPeriod=$("input#ws-plugin--s2member-"+button+"-trial-period").val().replace(/[^0-9]/g,"");var trialTerm=$("select#ws-plugin--s2member-"+button+"-trial-term").val().replace(/[^A-Z]/g,"");var regAmount=$("input#ws-plugin--s2member-"+button+"-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var regRecurTimes="",regRecurRetry="1";var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-"+button+"-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-"+button+"-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();trialPeriod=(regRecur==="BN")?"0":trialPeriod;trialAmount=(!trialAmount||isNaN(trialAmount)||trialAmount<0.01||trialPeriod<=0)?"0":trialAmount;var levelCcapsPer=(regRecur==="BN"&®Term!=="L")?level+":"+cCaps+":"+regPeriod+" "+regTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(trialAmount!=="0"&&(isNaN(trialAmount)||trialAmount<0)){alert("— Oops, a slight problem: —\n\nWhen provided, Trial Amount must be >= 0.00");return false}else{if(trialAmount!=="0"&&trialAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00");return false}else{if(trialTerm==="D"&&trialPeriod>90){alert("— Oops, a slight problem: —\n\nMaximum Trial Days is: 90.\nIf you want to offer more than 90 days, please choose Weeks or Months from the drop-down.");return false}else{if(trialTerm==="W"&&trialPeriod>52){alert("— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.");return false}else{if(trialTerm==="M"&&trialPeriod>24){alert("— Oops, a slight problem: —\n\nMaximum Trial Months is: 24.\nIf you want to offer more than 24 months, please choose Years from the drop-down.");return false}else{if(trialTerm==="Y"&&trialPeriod>5){alert("— Oops, a slight problem: —\n\nMax Trial Period Years is: 5.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}}}}}}code.html(code.val().replace(/ \<\!--(\<input type\="hidden" name\="(amount|src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/g," $1"));(parseInt(trialPeriod)<=0)?code.html(code.val().replace(/ (\<input type\="hidden" name\="(a1|p1|t1)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick$3")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="(src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick-subscriptions$3")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g," <!--$1-->")):null;shortCodeTemplateAttrs+=(button==="modification")?'modify="1" ':"";shortCodeTemplateAttrs+='level="'+esc_attr(level)+'" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'" custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"';shortCodeTemplateAttrs+=' ta="'+esc_attr(trialAmount)+'" tp="'+esc_attr(trialPeriod)+'" tt="'+esc_attr(trialTerm)+'" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'" rrt="'+esc_attr(regRecurTimes)+'" rra="'+esc_attr(regRecurRetry)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="modify" value\="(.*?)"/,' name="modify" value="'+((button==="modification")?"1":"0")+'"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="src" value\="(.*?)"/,' name="src" value="'+esc_attr(regRecur)+'"'));code.html(code.val().replace(/ name\="srt" value\="(.*?)"/,' name="srt" value="'+esc_attr(regRecurTimes)+'"'));code.html(code.val().replace(/ name\="sra" value\="(.*?)"/,' name="sra" value="'+esc_attr(regRecurRetry)+'"'));code.html(code.val().replace(/ name\="a1" value\="(.*?)"/,' name="a1" value="'+esc_attr(trialAmount)+'"'));code.html(code.val().replace(/ name\="p1" value\="(.*?)"/,' name="p1" value="'+esc_attr(trialPeriod)+'"'));code.html(code.val().replace(/ name\="t1" value\="(.*?)"/,' name="t1" value="'+esc_attr(trialTerm)+'"'));code.html(code.val().replace(/ name\="a3" value\="(.*?)"/,' name="a3" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="p3" value\="(.*?)"/,' name="p3" value="'+esc_attr(regPeriod)+'"'));code.html(code.val().replace(/ name\="t3" value\="(.*?)"/,' name="t3" value="'+esc_attr(regTerm)+'"'));$("div#ws-plugin--s2member-"+button+"-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));(button==="modification")?alert("Your Modification Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button."):alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalCcapButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-ccap-shortcode");var code=$("textarea#ws-plugin--s2member-ccap-button");var desc=$.trim($("input#ws-plugin--s2member-ccap-desc").val().replace(/"/g,""));var regAmount=$("input#ws-plugin--s2member-ccap-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-ccap-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-ccap-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-ccap-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-ccap-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-ccap-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();var levelCcapsPer=(regRecur==="BN"&®Term!=="L")?"*:"+cCaps+":"+regPeriod+" "+regTerm:"*:"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!cCaps||cCaps==="-all"){alert("— Oops, a slight problem: —\n\nPlease provide at least one Custom Capability.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}shortCodeTemplateAttrs+='level="*" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-ccap-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-sp-shortcode");var code=$("textarea#ws-plugin--s2member-sp-button");var leading=$("select#ws-plugin--s2member-sp-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-hours").val().replace(/[^0-9]/g,"");var regAmount=$("input#ws-plugin--s2member-sp-amount").val().replace(/[^0-9\.]/g,"");var desc=$.trim($("input#ws-plugin--s2member-sp-desc").val().replace(/"/g,""));var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-sp-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-sp-currency").val().replace(/[^A-Z]/g,"");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000&¤cyCode.toUpperCase()==="USD"){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}var spIdsHours="sp:"+ids+":"+hours;shortCodeTemplateAttrs+='sp="1" ids="'+esc_attr(ids)+'" exp="'+esc_attr(hours)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(spIdsHours)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-sp-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your WordPress Editor.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalRegLinkGenerate=function(){var level=$("select#ws-plugin--s2member-reg-link-level").val().replace(/[^0-9]/g,"");var subscrID=$.trim($("input#ws-plugin--s2member-reg-link-subscr-id").val());var custom=$.trim($("input#ws-plugin--s2member-reg-link-custom").val());var cCaps=$.trim($.trim($("input#ws-plugin--s2member-reg-link-ccaps").val()).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());var fixedTerm=$.trim($("input#ws-plugin--s2member-reg-link-fixed-term").val().replace(/[^A-Z 0-9]/gi,"").toUpperCase());var $link=$("p#ws-plugin--s2member-reg-link"),$loading=$("img#ws-plugin--s2member-reg-link-loading");var levelCcapsPer=(fixedTerm&&!fixedTerm.match(/L$/))?level+":"+cCaps+":"+fixedTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!subscrID){alert("— Oops, a slight problem: —\n\nPaid Subscr. ID is a required value.");return false}else{if(!custom||custom.indexOf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq ($_SERVER["HTTP_HOST"]); ?>')!==0){alert("— Oops, a slight problem: —\n\nThe Custom Value MUST start with your domain name.");return false}else{if(fixedTerm&&!fixedTerm.match(/^[1-9]+ (D|W|M|Y|L)$/)){alert("— Oops, a slight problem: —\n\nThe Fixed Term Length is not formatted properly.");return false}}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_reg_access_link_via_ajax",ws_plugin__s2member_reg_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-reg-access-link-via-ajax")); ?>',s2member_reg_access_link_subscr_gateway:"paypal",s2member_reg_access_link_subscr_id:subscrID,s2member_reg_access_link_custom:custom,s2member_reg_access_link_item_number:levelCcapsPer},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false};ws_plugin__s2member_paypalSpLinkGenerate=function(){var leading=$("select#ws-plugin--s2member-sp-link-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-link-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-link-hours").val().replace(/[^0-9]/g,"");var $link=$("p#ws-plugin--s2member-sp-link"),$loading=$("img#ws-plugin--s2member-sp-link-loading");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.");return false}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_sp_access_link_via_ajax",ws_plugin__s2member_sp_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link-via-ajax")); ?>',s2member_sp_access_link_ids:ids,s2member_sp_access_link_hours:hours},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false}}if(location.href.match(/page\=ws-plugin--s2member-els-ops/)){$("select#ws-plugin--s2member-custom-reg-opt-in").change(function(){var $this=$(this),val=$this.val();var $rows=$("tr.ws-plugin--s2member-custom-reg-opt-in-label-row");var $prevImg=$("img.ws-plugin--s2member-custom-reg-opt-in-label-prev-img");if(val<=0){$rows.css("display","none"),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}else{if(val==1){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/unchecked\.png$/,"/checked.png"))}else{if(val==2){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}}}});$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').change(function(){var thisChange=$(this).val(),checkedIndexes=[];$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="removal-deletion"&&this.checked){$this.nextAll(checkboxes).slice(0,2).attr({checked:"checked",disabled:"disabled"})}else{if(val==="removal-deletion"&&!this.checked){$this.nextAll(checkboxes).slice(0,2).removeAttr("disabled");(thisChange==="removal-deletion")?$this.nextAll(checkboxes).slice(0,2).removeAttr("checked"):null}else{if(val==="modification"&&this.checked){$this.nextAll(checkboxes).slice(0,3).attr({checked:"checked",disabled:"disabled"})}else{if(val==="modification"&&!this.checked){(thisChange==="modification")?$this.nextAll(checkboxes).slice(0,3).removeAttr("checked"):null;$this.nextAll(checkboxes).slice(0,3).removeAttr("disabled")}}}}}).each(function(index){(this.checked)?checkedIndexes.push(index):null});$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").removeAttr("disabled");if($.inArray(3,checkedIndexes)===-1&&$.inArray(4,checkedIndexes)===-1&&$.inArray(5,checkedIndexes)===-1&&$.inArray(6,checkedIndexes)===-1){$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").attr("disabled","disabled")}}).last().trigger("change")}});
|
includes/menu-pages/menu-pages-s.js
CHANGED
@@ -65,6 +65,9 @@ jQuery(document).ready(function($)
|
|
65 |
});
|
66 |
return false;
|
67 |
});
|
|
|
|
|
|
|
68 |
}
|
69 |
if(location.href.match(/page\=ws-plugin--s2member-logs/))
|
70 |
{
|
@@ -1157,7 +1160,7 @@ jQuery(document).ready(function($)
|
|
1157 |
|
1158 |
if /* Must have a Leading Post/Page ID to work with. Otherwise, Link generation will fail. */(!leading)
|
1159 |
{
|
1160 |
-
alert('— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it\'s because you\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
1161 |
return false;
|
1162 |
}
|
1163 |
else if(!regAmount || isNaN(regAmount) || regAmount < 0.01)
|
@@ -1247,7 +1250,7 @@ jQuery(document).ready(function($)
|
|
1247 |
|
1248 |
if /* Must have a Leading Post/Page ID to work with. Otherwise, Link generation will fail. */(!leading)
|
1249 |
{
|
1250 |
-
alert('— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it\'s because you\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
1251 |
return false;
|
1252 |
}
|
1253 |
for(var i = 0, ids = leading; i < additionals.length; i++)
|
@@ -1313,4 +1316,4 @@ jQuery(document).ready(function($)
|
|
1313 |
|
1314 |
}).last().trigger('change');
|
1315 |
}
|
1316 |
-
});
|
65 |
});
|
66 |
return false;
|
67 |
});
|
68 |
+
$('#ws-plugin--s2member-custom-reg-password').on('change', function(){
|
69 |
+
$('#ws-plugin--s2member-custom-reg-password-settings').css('opacity', $(this).val() === '1' ? '1' : '0.9');
|
70 |
+
}).trigger('change');
|
71 |
}
|
72 |
if(location.href.match(/page\=ws-plugin--s2member-logs/))
|
73 |
{
|
1160 |
|
1161 |
if /* Must have a Leading Post/Page ID to work with. Otherwise, Link generation will fail. */(!leading)
|
1162 |
{
|
1163 |
+
alert('— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it\'s because you\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.');
|
1164 |
return false;
|
1165 |
}
|
1166 |
else if(!regAmount || isNaN(regAmount) || regAmount < 0.01)
|
1250 |
|
1251 |
if /* Must have a Leading Post/Page ID to work with. Otherwise, Link generation will fail. */(!leading)
|
1252 |
{
|
1253 |
+
alert('— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it\'s because you\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.');
|
1254 |
return false;
|
1255 |
}
|
1256 |
for(var i = 0, ids = leading; i < additionals.length; i++)
|
1316 |
|
1317 |
}).last().trigger('change');
|
1318 |
}
|
1319 |
+
});
|
includes/menu-pages/menu-pages.css
CHANGED
@@ -526,6 +526,10 @@ div.ws-menu-page div.ws-menu-page-toolbox
|
|
526 |
z-index : 1;
|
527 |
position : relative;
|
528 |
margin-right : 25px;
|
|
|
|
|
|
|
|
|
529 |
}
|
530 |
div.ws-menu-page div.ws-menu-page-toolbox > .links
|
531 |
{
|
@@ -802,6 +806,10 @@ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr >
|
|
802 |
width : auto;
|
803 |
padding : 0 0.5em 0 0;
|
804 |
}
|
|
|
|
|
|
|
|
|
805 |
table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td
|
806 |
{
|
807 |
width : auto;
|
@@ -1022,4 +1030,4 @@ div.ws-menu-page-updates input[type = "radio"]
|
|
1022 |
{
|
1023 |
margin-right : 3px;
|
1024 |
vertical-align : middle;
|
1025 |
-
}
|
526 |
z-index : 1;
|
527 |
position : relative;
|
528 |
margin-right : 25px;
|
529 |
+
<?php if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()): ?>
|
530 |
+
font-size : 90%;
|
531 |
+
margin : -10px 25px 0 0;
|
532 |
+
<?php endif; ?>
|
533 |
}
|
534 |
div.ws-menu-page div.ws-menu-page-toolbox > .links
|
535 |
{
|
806 |
width : auto;
|
807 |
padding : 0 0.5em 0 0;
|
808 |
}
|
809 |
+
table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr:not(:first-child) > th
|
810 |
+
{
|
811 |
+
padding-top: 0.5em;
|
812 |
+
}
|
813 |
table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td
|
814 |
{
|
815 |
width : auto;
|
1030 |
{
|
1031 |
margin-right : 3px;
|
1032 |
vertical-align : middle;
|
1033 |
+
}
|
includes/menu-pages/mms-ops.inc.php
CHANGED
@@ -133,7 +133,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_mms_ops"))
|
|
133 |
echo '<h3>Multisite Registration (Main Site Configuration)</h3>'."\n";
|
134 |
echo '<p>s2Member supports Free Subscribers <em>(at Level #0)</em>, and several Primary Roles created by the s2Member plugin (<em> i.e., s2Member Levels 1-4, or up to the number of configured Levels )</em>. If you want your visitors to be capable of registering absolutely free, you will want to "allow" Open Registration. Whenever a visitor registers without paying, they\'ll automatically become a Free Subscriber, at Level #0.</p>'."\n";
|
135 |
echo '<p><strong>Running A Multisite Blog Farm?</strong> With Multisite Networking enabled, your Main Site could ALSO offer a Customer access to create a Blog of their own <em>(optional)</em>, where a Customer becomes a "Member" of your Main Site, and also a Blog Owner/Administrator of at least one other Blog on your Network. With s2Member installed <em>(Network wide)</em>, each of your Blog Owners could offer Membership too, using a single copy of the s2Member plugin, which is a great selling point<em>!</em> We refer to this type of installation as a Multisite Blog Farm.</p>'."\n";
|
136 |
-
echo '<p>Multisite Networking makes a new Registration Form available <em>(driven by your theme)</em>; which we refer to as: <code>/wp-signup.php</code>. If, and only if, you\'re planning to offer Blogs, you MUST use <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Multisite Registration Form.\\n* s2Member makes this form available to logged-in Super Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">/wp-signup.php</a>, instead of using the Standard Login/Registration Form. In a Multisite installation, we refer to the Standard Login/Registration Form, as: <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">/wp-login.php?action=register</a>. If you\'re planning to offer Membership Access only, and NOT Blogs, you can simply use the <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">Standard Login/Registration Form</a>, which is easily customized through <strong>s2Member
|
137 |
echo '<p>In either case, s2Member Pro-Forms are possible too. If you\'ve purchased s2Member Pro, you could use Pro-Forms instead of these WordPress defaults. That being said, even with s2Member Pro-Forms, if you are offering Blogs, you will still need to facilitate the actual creation of each Blog through <code>/wp-signup.php</code>. In other words, Customers can register through s2Member Pro-Forms, and even checkout. But when it comes time to setup a new Blog, you will need to redirect your Customer to <code>/wp-signup.php</code>, while they are logged-in. This will allow them to create a new Blog on your Network. That is, if they are allowed to <em>(based on your configuration below)</em>.</p>'."\n";
|
138 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form, powered by your theme.<br />(BuddyPress can handle both Membership and Blog creation in its integration)<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::bp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.\');">'.esc_html(c_ws_plugin__s2member_utils_urls::bp_register_url()).'</a>)</em></p>'."\n" : '';
|
139 |
do_action("ws_plugin__s2member_during_mms_ops_page_during_left_sections_during_mms_registration", get_defined_vars());
|
@@ -338,4 +338,3 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_mms_ops"))
|
|
338 |
}
|
339 |
|
340 |
new c_ws_plugin__s2member_menu_page_mms_ops();
|
341 |
-
?>
|
133 |
echo '<h3>Multisite Registration (Main Site Configuration)</h3>'."\n";
|
134 |
echo '<p>s2Member supports Free Subscribers <em>(at Level #0)</em>, and several Primary Roles created by the s2Member plugin (<em> i.e., s2Member Levels 1-4, or up to the number of configured Levels )</em>. If you want your visitors to be capable of registering absolutely free, you will want to "allow" Open Registration. Whenever a visitor registers without paying, they\'ll automatically become a Free Subscriber, at Level #0.</p>'."\n";
|
135 |
echo '<p><strong>Running A Multisite Blog Farm?</strong> With Multisite Networking enabled, your Main Site could ALSO offer a Customer access to create a Blog of their own <em>(optional)</em>, where a Customer becomes a "Member" of your Main Site, and also a Blog Owner/Administrator of at least one other Blog on your Network. With s2Member installed <em>(Network wide)</em>, each of your Blog Owners could offer Membership too, using a single copy of the s2Member plugin, which is a great selling point<em>!</em> We refer to this type of installation as a Multisite Blog Farm.</p>'."\n";
|
136 |
+
echo '<p>Multisite Networking makes a new Registration Form available <em>(driven by your theme)</em>; which we refer to as: <code>/wp-signup.php</code>. If, and only if, you\'re planning to offer Blogs, you MUST use <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_signup_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Multisite Registration Form.\\n* s2Member makes this form available to logged-in Super Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">/wp-signup.php</a>, instead of using the Standard Login/Registration Form. In a Multisite installation, we refer to the Standard Login/Registration Form, as: <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">/wp-login.php?action=register</a>. If you\'re planning to offer Membership Access only, and NOT Blogs, you can simply use the <a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::wp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your Standard Registration Form.\\n* s2Member makes this form available to logged-in Administrators, at all times (for testing purposes), regardless of configuration.'.((c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '').'\');">Standard Login/Registration Form</a>, which is easily customized through <strong>s2Member → General Options → Login/Registration Design</strong>.</p>'."\n";
|
137 |
echo '<p>In either case, s2Member Pro-Forms are possible too. If you\'ve purchased s2Member Pro, you could use Pro-Forms instead of these WordPress defaults. That being said, even with s2Member Pro-Forms, if you are offering Blogs, you will still need to facilitate the actual creation of each Blog through <code>/wp-signup.php</code>. In other words, Customers can register through s2Member Pro-Forms, and even checkout. But when it comes time to setup a new Blog, you will need to redirect your Customer to <code>/wp-signup.php</code>, while they are logged-in. This will allow them to create a new Blog on your Network. That is, if they are allowed to <em>(based on your configuration below)</em>.</p>'."\n";
|
138 |
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form, powered by your theme.<br />(BuddyPress can handle both Membership and Blog creation in its integration)<br />(<a href="'.esc_attr(c_ws_plugin__s2member_utils_urls::bp_register_url()).'" target="_blank" rel="external" onclick="alert(\'s2Member will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( '.c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_urls::bp_register_url()).' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.\');">'.esc_html(c_ws_plugin__s2member_utils_urls::bp_register_url()).'</a>)</em></p>'."\n" : '';
|
139 |
do_action("ws_plugin__s2member_during_mms_ops_page_during_left_sections_during_mms_registration", get_defined_vars());
|
338 |
}
|
339 |
|
340 |
new c_ws_plugin__s2member_menu_page_mms_ops();
|
|
includes/menu-pages/paypal-buttons.inc.php
CHANGED
@@ -51,7 +51,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
51 |
if (($ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_levelN_buttons = "ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_level" . $n . "_buttons"))
|
52 |
do_action($ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_levelN_buttons, get_defined_vars ());
|
53 |
|
54 |
-
echo '<div class="ws-menu-page-group" title="
|
55 |
|
56 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-level' . $n . '-buttons-section">' . "\n";
|
57 |
echo '<h3>Button Code Generator For Level #' . $n . ' Access</h3>' . "\n";
|
@@ -78,7 +78,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
78 |
echo '<p><span id="ws-plugin--s2member-level' . $n . '-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-level' . $n . '-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
|
79 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-level' . $n . '-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'level' . $n . '\');" /></p>' . "\n";
|
80 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-desc" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"]) . ' / description and pricing details here." size="73" /></p>' . "\n";
|
81 |
-
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
82 |
echo '</form>' . "\n";
|
83 |
echo '</td>' . "\n";
|
84 |
|
@@ -137,16 +137,16 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
137 |
{
|
138 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_modification_buttons", get_defined_vars ());
|
139 |
|
140 |
-
echo '<div class="ws-menu-page-group" title="
|
141 |
|
142 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-modification-buttons-section">' . "\n";
|
143 |
echo '<h3>Button Code Generator For Subscription Modifications</h3>' . "\n";
|
144 |
echo '<p>If you\'d like to give your Members <em>(and/or your Free Subscribers)</em> the ability to modify their billing plan, by switching to a more expensive option, or a less expensive option; generate a new PayPal Modification Button here. Configure the updated Level, pricing, terms, etc. Then, make that new Modification Button available to Members who are logged into their existing account with you. For example, you might want to insert a "Level #2" Upgrade Button into your Login Welcome Page, which would up-sell existing Level #1 Members to a more expensive plan that you offer.</p>' . "\n";
|
145 |
-
echo '<p><em><strong>Important Note:</strong> Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account (perhaps in your Login Welcome Page for s2Member), or in another location where you can be absolutely sure that a User/Member is logged in. s2Member\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <strong>s2Member
|
146 |
echo '<p><em><strong>Modification Process:</strong> When you send a Member to PayPal using a Subscription Modification Button, PayPal will ask them to login. Once they\'re logged in, instead of being able to signup for a new Membership, PayPal will provide them with the ability to upgrade and/or downgrade their existing Membership with you, by allowing them to switch to the Membership Plan that was specified in the Subscription Modification Button. PayPal handles this nicely, and you\'ll be happy to know that s2Member has been pre-configured to deal with this scenario as well, so that everything remains automated. Their Membership Access Level will either be promoted, or demoted, based on the actions they took at PayPal during the modification process. Once an existing Member completes their Subscription Modification at PayPal, they\'ll be brought back to their Login Welcome Page, instead of to the registration screen.</em></p>' . "\n";
|
147 |
echo '<p><em><strong>Also Works For Free Subscribers:</strong> Although a Free Subscriber does not have an existing PayPal Subscription, s2Member is capable of adapting to this scenario gracefully. Just make sure that your existing Free Subscribers <em>(the ones who wish to upgrade)</em> pay for their Membership through a Modification Button generated by s2Member. That will allow them to continue using their existing account with you. In other words, they can keep their existing Username <em>(and anything already associated with that Username)</em>, rather than being forced to re-register after checkout.</em></p>' . "\n";
|
148 |
echo '<p><em><strong>Make It More User-Friendly:</strong> You can make the Subscription Modification Process, more user-friendly, by setting up a <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can tell s2Member to use that Page Style whenever you generate your Button Code.\'); return false;">Custom Page Style at PayPal</a>, specifically for Subscription Modification Buttons. Use a custom header image, with a brief explanation to the Customer. Something like, "Log into PayPal", "You can Modify your Subscription!".</em></p>' . "\n";
|
149 |
-
echo '<p><em><strong>Integrating Conditionals:</strong> Since each Modification Button is configured for a specific Level, you may want to create multiple Modification Buttons, one for each combination you intend to make available. s2Member\'s API Conditionals can help you display the proper Button to each Customer, based on the status of their existing account. For further details, see: <strong>s2Member
|
150 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><em><strong>Independent Custom Capabilities:</strong> If you just want to sell an existing Member new Custom Capabilities, without affecting their paid Subscription in any way, please see the next Button Generator: <code>Capability (Buy Now) Buttons</code>. Independent Capability Buttons facilitate Buy Now functionality, specifically for Custom Capabilities, without affecting the Customer\'s primary Subscription and Membership Level Access.</em></p>' . "\n" : '';
|
151 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_modification_buttons", get_defined_vars ());
|
152 |
|
@@ -182,7 +182,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
182 |
echo '<p><span id="ws-plugin--s2member-modification-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-modification-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
|
183 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-modification-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'modification\');" /></p>' . "\n";
|
184 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
|
185 |
-
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
186 |
echo '</form>' . "\n";
|
187 |
echo '</td>' . "\n";
|
188 |
|
@@ -238,15 +238,15 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
238 |
{
|
239 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_ccap_buttons", get_defined_vars ());
|
240 |
|
241 |
-
echo '<div class="ws-menu-page-group" title="
|
242 |
|
243 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-ccap-buttons-section">' . "\n";
|
244 |
echo '<h3>Button Code Generator For Independent Custom Capabilities</h3>' . "\n";
|
245 |
-
echo '<p>This is VERY advanced. For further details, please check your Dashboard: <strong>s2Member
|
246 |
echo '<p>With s2Member, you can sell one or more Custom Capabilities using Buy Now functionality, to "existing" Users/Members, regardless of which Membership Level they have on your site <em>(i.e., you could even sell Independent Custom Capabilities to Users at Membership Level #0, normally referred to as Free Subscribers, if you like)</em>. So this is quite flexible. Independent Custom Capabilities do NOT rely on any specific Membership Level. That\'s why s2Member refers to these as `Independent` Custom Capabilities, because you can sell Capabilities this way, through Buy Now functionality, and the Customer\'s Membership Level Access, along with any existing paid Subscription they may already have with you, will remain completely unaffected. That being said, if you intend to charge a recurring fee for Custom Capabilities, please use a <code>Subscr. Modification Button</code> instead; because Independent Custom Capabilities can only be sold through Buy Now functionality.</p>' . "\n";
|
247 |
echo '<p>Independent Custom Capabilities are added to a Customer\'s account immediately after checkout, and the Customer will have the Custom Capabilities for as long as their Membership lasts, based on their primary Subscription with your site, and/or forever, if they have a Lifetime account with you. In other words, Independent Custom Capabilities will exist on the Customer\'s account forever, or until an EOT <em>(End Of Term)</em> occurs on their primary Subscription with you; in which case s2Member would demote or delete the Customer\'s account <em>(based on your EOT configuration)</em>, and all Custom Capabilities are removed as well.</p>' . "\n";
|
248 |
echo '<p>Very simple. All you do is customize the form fields provided, for each set of Custom Capabilities that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with s2Member seamlessly. The Customer will be granted additional access to one or more Custom Capabilities that you specify; while the Customer\'s Membership Level Access and any existing paid Subscription they may already have with you, will remain completely unaffected.</p>' . "\n";
|
249 |
-
echo '<p><em><strong>Important Note:</strong> Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account (perhaps in your Login Welcome Page for s2Member), or in another location where you can be absolutely sure that a User/Member is logged in. s2Member\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <strong>s2Member
|
250 |
echo '<p><em><strong>Please note:</strong> buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back & re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
|
251 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_ccap_buttons", get_defined_vars ());
|
252 |
|
@@ -266,7 +266,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
266 |
echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-ccap-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-ccap-terms.php"))) . '</select></p>' . "\n";
|
267 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-ccap-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalCcapButtonGenerate();" /></p>' . "\n";
|
268 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
|
269 |
-
echo '<p>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
270 |
echo '</form>' . "\n";
|
271 |
echo '</td>' . "\n";
|
272 |
|
@@ -316,7 +316,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
316 |
{
|
317 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_cancellation_buttons", get_defined_vars ());
|
318 |
|
319 |
-
echo '<div class="ws-menu-page-group" title="
|
320 |
|
321 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-cancellation-buttons-section">' . "\n";
|
322 |
echo '<h3>One Button Does It All For Cancellations (copy/paste)</h3>' . "\n";
|
@@ -393,11 +393,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
393 |
{
|
394 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_reg_links", get_defined_vars ());
|
395 |
|
396 |
-
echo '<div class="ws-menu-page-group" title="
|
397 |
|
398 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-reg-links-section">' . "\n";
|
399 |
echo '<h3>Registration Access Link Generator (for Customer Service)</h3>' . "\n";
|
400 |
-
echo '<p>s2Member automatically generates Registration Access Links for your Customers after checkout, and also sends them a link in a Confirmation Email. However, if you ever need to deal with a Customer Service issue that requires a new Registration Access Link to be created manually, you can use this tool for that. Alternatively, you can create their account yourself/manually by going to <strong>Users
|
401 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_reg_links", get_defined_vars ());
|
402 |
|
403 |
echo '<table class="form-table">' . "\n";
|
@@ -412,7 +412,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
412 |
echo '</select></p>' . "\n";
|
413 |
echo '<p>Paid Subscr. ID: <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-subscr-id" value="" size="50" /> <a href="#" onclick="alert(\'The Customer\\\'s Paid Subscr. ID (aka: Recurring Profile ID, Transaction ID) must be unique. This value can be obtained from inside your PayPal account under the History tab. Each paying Customer MUST be associated with a unique Paid Subscr. ID. If the Customer is NOT associated with a Paid Subscr. ID, you will need to generate a unique value for this field on your own. But keep in mind, s2Member will be unable to maintain future communication with the PayPal IPN (i.e., Notification) service if this value does not reflect a real Paid Subscr. ID that exists in your PayPal History log.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
414 |
echo '<p>Custom String Value: <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-custom" value="' . esc_attr ($_SERVER["HTTP_HOST"]) . '" size="30" /> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\'' . c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"]), 3) . '\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\n' . c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"]), 3) . '|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a> <input type="button" value="Generate Access Link" onclick="ws_plugin__s2member_paypalRegLinkGenerate();" /> <img id="ws-plugin--s2member-reg-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
|
415 |
-
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member
|
416 |
echo '<p>Fixed Term Length (for Buy Now transactions): <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-fixed-term" value="" size="10" /> <a href="#" onclick="alert(\'If the Customer purchased Membership through a Buy Now transaction (i.e., there is no Initial/Trial Period and no recurring charges for ongoing access), you may configure a Fixed Term Length in this field. This way the Customer\\\'s Membership Access is automatically revoked by s2Member at the appropriate time. This will be a numeric value, followed by a space, then a single letter.\\n\\nHere are some examples:\\n\\n1 D (this means 1 Day)\\n1 W (this means 1 Week)\\n1 M (this means 1 Month)\\n1 Y (this means 1 Year)\\n1 L (this means 1 Lifetime)\'); return false;">[?]</a></p>' . "\n";
|
417 |
echo '<p id="ws-plugin--s2member-reg-link" style="display:none;"></p>' . "\n";
|
418 |
echo '</form>' . "\n";
|
@@ -432,13 +432,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
432 |
{
|
433 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_sp_buttons", get_defined_vars ());
|
434 |
|
435 |
-
echo '<div class="ws-menu-page-group" title="
|
436 |
|
437 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-buttons-section">' . "\n";
|
438 |
echo '<h3>Button Code Generator For Specific Post/Page Buttons</h3>' . "\n";
|
439 |
echo '<p>s2Member now supports an additional layer of functionality (very powerful), which allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. Specific Post/Page Access works independently from Member Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons, and your Customers will NOT be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>' . "\n";
|
440 |
-
echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link (see: <strong>s2Member
|
441 |
-
echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by s2Member, might contain a download link for your eBook, access to file & music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created. To protect Specific Posts/Pages, please see: <strong>s2Member
|
442 |
echo '<p>Very simple. All you do is customize the form fields provided, for each Post/Page that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with s2Member seamlessly. You can even Package Additional Posts/Pages together into one transaction.</p>' . "\n";
|
443 |
echo '<p><em><strong>Please note:</strong> buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back & re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
|
444 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_sp_buttons", get_defined_vars ());
|
@@ -465,7 +465,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
465 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
466 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
467 |
|
468 |
-
echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\n\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
469 |
|
470 |
echo '<p><select id="ws-plugin--s2member-sp-additional-ids" multiple="multiple" style="height:100px;">' . "\n";
|
471 |
echo '<optgroup label="— Package Additional Posts/Pages that you\'ve protected —">' . "\n";
|
@@ -473,7 +473,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
473 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
474 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
475 |
|
476 |
-
echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page (they\\\'ll land on your Leading Post/Page after checkout), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically (i.e., only one Access Link is needed, and s2Member generates this automatically). However, you will STILL need to design your Leading Post/Page (which is what a Customer will actually land on), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* s2Member sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
477 |
|
478 |
echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-sp-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select></p>' . "\n";
|
479 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-sp-desc" value="Description and pricing details here." size="68" /></p>' . "\n";
|
@@ -527,7 +527,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
527 |
{
|
528 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_sp_links", get_defined_vars ());
|
529 |
|
530 |
-
echo '<div class="ws-menu-page-group" title="
|
531 |
|
532 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-links-section">' . "\n";
|
533 |
echo '<h3>Specific Post/Page Access Link Generator (for Customer Service)</h3>' . "\n";
|
@@ -549,7 +549,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
549 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
550 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
551 |
|
552 |
-
echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\n\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
553 |
|
554 |
echo '<p><select id="ws-plugin--s2member-sp-link-additional-ids" multiple="multiple" style="height:100px; min-width:450px;">' . "\n";
|
555 |
echo '<optgroup label="— Package Additional Posts/Pages that you\'ve protected —">' . "\n";
|
@@ -557,7 +557,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
557 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
558 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
559 |
|
560 |
-
echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page (they\\\'ll land on your Leading Post/Page after checkout), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically (i.e., only one Access Link is needed, and s2Member generates this automatically). However, you will STILL need to design your Leading Post/Page (which is what a Customer will actually land on), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* s2Member sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member
|
561 |
|
562 |
echo '<p><select id="ws-plugin--s2member-sp-link-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select> <input type="button" value="Generate Access Link" onclick="ws_plugin__s2member_paypalSpLinkGenerate();" /> <img id="ws-plugin--s2member-sp-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
|
563 |
echo '<p id="ws-plugin--s2member-sp-link" style="display:none;"></p>' . "\n";
|
@@ -582,7 +582,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
582 |
|
583 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shortcode-attrs-section">' . "\n";
|
584 |
echo '<h3>Shortcode Attributes (Explained In Full Detail)</h3>' . "\n";
|
585 |
-
echo '<p>When you generate a Button Code, s2Member will make a <a href="http://
|
586 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_shortcode_attrs", get_defined_vars ());
|
587 |
|
588 |
echo '<table class="form-table" style="margin-top:0;">' . "\n";
|
@@ -596,12 +596,12 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
596 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<li><code>ccaps="music,videos"</code> A comma-delimited list of Custom Capabilities. Only valid w/ Membership Level Access and/or Independent Custom Capabilities.</li>' . "\n" : '';
|
597 |
echo '<li><code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '"</code> must start with your domain. Additional values can be piped in (ex: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3|etc"</code>). Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
598 |
echo '<li><code>desc="Gold Membership"</code> A brief purchase Description. Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
599 |
-
echo '<li><code>dg="0"</code> The Digital Goods directive. s2Member will eventually be integrated with <a href="http://
|
600 |
echo '<li><code>exp="72"</code> Access Expires (in hours). Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
|
601 |
echo '<li><code>ids="14"</code> A Post/Page ID#, or a comma-delimited list of IDs. Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
|
602 |
echo '<li><code>image="default"</code> Button Image Location. Possible values: <code>default</code> = use the default PayPal Button, <code>http://...</code> = location of your custom Image.</li>' . "\n";
|
603 |
-
echo '<li><code>lang=""</code> Optional 5 character Button Language Code <em>(ake: Locale Code—ex: <code>en_US</code>)</em>. This controls the interface language of the PayPal Button itself. If unspecified, the language defaults to English (i.e., <code>en_US</code>; or to the value set by an optional MO translation file; which translates s2Member overall). See <a href="
|
604 |
-
echo '<li><code>lc=""</code> Optional 2 character Country/Locale Code <em>(i.e., Country Code—ex: <code>US</code>)</em>. This controls the interface language used at PayPal during checkout. If unspecified, the language is determined by PayPal when possible, defaulting to <code>US</code> <em>english</em> when not possible. See <a href="
|
605 |
echo '<li><code>level="1"</code> Membership Level [1-4] <em>(or, up to the number of configured Levels)</em>. Only valid for Buttons providing paid Membership Level Access.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' Or, with Independent Custom Capabilities this MUST be set to <code>level="*"</code>, and <code>ccaps=""</code> must NOT be empty <em>(i.e., <code>level="*" ccaps="music,videos"</code>)</em>.') . '</li>' . "\n";
|
606 |
echo '<li><code>modify="0"</code> Modification directive. Only valid w/ Membership Level Access. Possible values: <code>0</code> = allows Customers to only create a new Subscription, <code>1</code> = allows Customers to modify their current Subscription or sign up for a new one, <code>2</code> = allows Customers to only modify their current Subscription.</li>' . "\n";
|
607 |
echo '<li><code>ns="1"</code> The <em>no_shipping</em> directive. Possible values: <code>0</code> = prompt for an address, but do not require one, <code>1</code> = do not prompt for a shipping address, <code>2</code> = prompt for an address, and require one. Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
@@ -611,7 +611,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
611 |
echo '<li><code>rp="1"</code> Regular Period. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Must be >= <code>1</code> (ex: <code>1</code> Week, <code>2</code> Months, <code>1</code> Month, <code>3</code> Days).</li>' . "\n";
|
612 |
echo '<li><code>rt="M"</code> Regular Term. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>D</code> = Days, <code>W</code> = Weeks, <code>M</code> = Months, <code>Y</code> = Years, <code>L</code> = Lifetime.</li>' . "\n";
|
613 |
echo '<li><code>rr="1"</code> Recurring directive. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>0</code> = non-recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>1</code> = recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>BN</code> = non-recurring "Buy Now" functionality, no Trial Period possible.</li>' . "\n";
|
614 |
-
echo '<li><code>rrt=""</code> Recurring Times <em>(i.e., a fixed number of installments)</em>. Only valid w/ Membership Level Access. When unspecified, any recurring charges will remain ongoing until cancelled, or until payments start failing. If this is set to <code>1 or higher</code> the regular recurring charges will only continue for X billing cycles, depending on what you specify. This is only valid when <code>rr="1"</code> for recurring "Subscriptions". Please note that a fixed number of installments, also means a fixed period of access. If a Customer\'s billing is monthly, and you set <code>rrt="3"</code>, billing will continue for only 3 monthly installments. After that, billing would stop, and their access to the site would be revoked as well <em>(based on your EOT Behavior setting under: s2Member
|
615 |
echo '<li><code>rra="1"</code> Reattempt failed payments? Possible values: <code>0</code> = do NOT reattempt billing when/if a recurring payment fails; <code>1</code> = yes, DO reattempt billing when/if a recurring payment fails. With PayPal Standard integration, PayPal will retry a maximum of 2 times when you set <code>rra="1"</code>; after that, a Subscription would be terminated due to Max Failed Payments having been reached. PayPal Standard integration does NOT make it possible to configure Max Failed Payments, it simply defaults to a value of <code>2</code> whenever <code>rra="1"</code>, indicating that you DO want to retry failed payments.</li>' . "\n";
|
616 |
echo '<li><code>sp="0"</code> Specific Post/Page Button. Possible values: <code>0</code> = this is NOT a Specific Post/Page Access Button, <code>1</code> = this IS a Specific Post/Page Access Button.</li>' . "\n";
|
617 |
echo '<li><code>ta="0.00"</code> Trial Amount. Only valid w/ Membership Level Access. Must be <code>0</code> when <code>rt="L"</code> or when <code>rr="BN"</code>.</li>' . "\n";
|
@@ -649,4 +649,3 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
|
|
649 |
}
|
650 |
|
651 |
new c_ws_plugin__s2member_menu_page_paypal_buttons ();
|
652 |
-
?>
|
51 |
if (($ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_levelN_buttons = "ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_level" . $n . "_buttons"))
|
52 |
do_action($ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_levelN_buttons, get_defined_vars ());
|
53 |
|
54 |
+
echo '<div class="ws-menu-page-group" title="Buttons For Level #' . $n . ' Access">' . "\n";
|
55 |
|
56 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-level' . $n . '-buttons-section">' . "\n";
|
57 |
echo '<h3>Button Code Generator For Level #' . $n . ' Access</h3>' . "\n";
|
78 |
echo '<p><span id="ws-plugin--s2member-level' . $n . '-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-level' . $n . '-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
|
79 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-level' . $n . '-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'level' . $n . '\');" /></p>' . "\n";
|
80 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-desc" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"]) . ' / description and pricing details here." size="73" /></p>' . "\n";
|
81 |
+
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell s2Member to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-ccaps" size="40" /></p>' . "\n";
|
82 |
echo '</form>' . "\n";
|
83 |
echo '</td>' . "\n";
|
84 |
|
137 |
{
|
138 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_modification_buttons", get_defined_vars ());
|
139 |
|
140 |
+
echo '<div class="ws-menu-page-group" title="Subscr. Modification Buttons">' . "\n";
|
141 |
|
142 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-modification-buttons-section">' . "\n";
|
143 |
echo '<h3>Button Code Generator For Subscription Modifications</h3>' . "\n";
|
144 |
echo '<p>If you\'d like to give your Members <em>(and/or your Free Subscribers)</em> the ability to modify their billing plan, by switching to a more expensive option, or a less expensive option; generate a new PayPal Modification Button here. Configure the updated Level, pricing, terms, etc. Then, make that new Modification Button available to Members who are logged into their existing account with you. For example, you might want to insert a "Level #2" Upgrade Button into your Login Welcome Page, which would up-sell existing Level #1 Members to a more expensive plan that you offer.</p>' . "\n";
|
145 |
+
echo '<p><em><strong>Important Note:</strong> Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account (perhaps in your Login Welcome Page for s2Member), or in another location where you can be absolutely sure that a User/Member is logged in. s2Member\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <strong>s2Member → API Scripting → Simple Conditionals</strong>.</em></p>' . "\n";
|
146 |
echo '<p><em><strong>Modification Process:</strong> When you send a Member to PayPal using a Subscription Modification Button, PayPal will ask them to login. Once they\'re logged in, instead of being able to signup for a new Membership, PayPal will provide them with the ability to upgrade and/or downgrade their existing Membership with you, by allowing them to switch to the Membership Plan that was specified in the Subscription Modification Button. PayPal handles this nicely, and you\'ll be happy to know that s2Member has been pre-configured to deal with this scenario as well, so that everything remains automated. Their Membership Access Level will either be promoted, or demoted, based on the actions they took at PayPal during the modification process. Once an existing Member completes their Subscription Modification at PayPal, they\'ll be brought back to their Login Welcome Page, instead of to the registration screen.</em></p>' . "\n";
|
147 |
echo '<p><em><strong>Also Works For Free Subscribers:</strong> Although a Free Subscriber does not have an existing PayPal Subscription, s2Member is capable of adapting to this scenario gracefully. Just make sure that your existing Free Subscribers <em>(the ones who wish to upgrade)</em> pay for their Membership through a Modification Button generated by s2Member. That will allow them to continue using their existing account with you. In other words, they can keep their existing Username <em>(and anything already associated with that Username)</em>, rather than being forced to re-register after checkout.</em></p>' . "\n";
|
148 |
echo '<p><em><strong>Make It More User-Friendly:</strong> You can make the Subscription Modification Process, more user-friendly, by setting up a <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can tell s2Member to use that Page Style whenever you generate your Button Code.\'); return false;">Custom Page Style at PayPal</a>, specifically for Subscription Modification Buttons. Use a custom header image, with a brief explanation to the Customer. Something like, "Log into PayPal", "You can Modify your Subscription!".</em></p>' . "\n";
|
149 |
+
echo '<p><em><strong>Integrating Conditionals:</strong> Since each Modification Button is configured for a specific Level, you may want to create multiple Modification Buttons, one for each combination you intend to make available. s2Member\'s API Conditionals can help you display the proper Button to each Customer, based on the status of their existing account. For further details, see: <strong>s2Member → API Scripting</strong>.</em></p>' . "\n";
|
150 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><em><strong>Independent Custom Capabilities:</strong> If you just want to sell an existing Member new Custom Capabilities, without affecting their paid Subscription in any way, please see the next Button Generator: <code>Capability (Buy Now) Buttons</code>. Independent Capability Buttons facilitate Buy Now functionality, specifically for Custom Capabilities, without affecting the Customer\'s primary Subscription and Membership Level Access.</em></p>' . "\n" : '';
|
151 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_modification_buttons", get_defined_vars ());
|
152 |
|
182 |
echo '<p><span id="ws-plugin--s2member-modification-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-modification-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
|
183 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-modification-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'modification\');" /></p>' . "\n";
|
184 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
|
185 |
+
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell s2Member to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-modification-ccaps" size="40" /></p>' . "\n";
|
186 |
echo '</form>' . "\n";
|
187 |
echo '</td>' . "\n";
|
188 |
|
238 |
{
|
239 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_ccap_buttons", get_defined_vars ());
|
240 |
|
241 |
+
echo '<div class="ws-menu-page-group" title="Capability (Buy Now) Buttons">' . "\n";
|
242 |
|
243 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-ccap-buttons-section">' . "\n";
|
244 |
echo '<h3>Button Code Generator For Independent Custom Capabilities</h3>' . "\n";
|
245 |
+
echo '<p>This is VERY advanced. For further details, please check your Dashboard: <strong>s2Member → API Scripting → Custom Capabiities</strong>.</p>' . "\n";
|
246 |
echo '<p>With s2Member, you can sell one or more Custom Capabilities using Buy Now functionality, to "existing" Users/Members, regardless of which Membership Level they have on your site <em>(i.e., you could even sell Independent Custom Capabilities to Users at Membership Level #0, normally referred to as Free Subscribers, if you like)</em>. So this is quite flexible. Independent Custom Capabilities do NOT rely on any specific Membership Level. That\'s why s2Member refers to these as `Independent` Custom Capabilities, because you can sell Capabilities this way, through Buy Now functionality, and the Customer\'s Membership Level Access, along with any existing paid Subscription they may already have with you, will remain completely unaffected. That being said, if you intend to charge a recurring fee for Custom Capabilities, please use a <code>Subscr. Modification Button</code> instead; because Independent Custom Capabilities can only be sold through Buy Now functionality.</p>' . "\n";
|
247 |
echo '<p>Independent Custom Capabilities are added to a Customer\'s account immediately after checkout, and the Customer will have the Custom Capabilities for as long as their Membership lasts, based on their primary Subscription with your site, and/or forever, if they have a Lifetime account with you. In other words, Independent Custom Capabilities will exist on the Customer\'s account forever, or until an EOT <em>(End Of Term)</em> occurs on their primary Subscription with you; in which case s2Member would demote or delete the Customer\'s account <em>(based on your EOT configuration)</em>, and all Custom Capabilities are removed as well.</p>' . "\n";
|
248 |
echo '<p>Very simple. All you do is customize the form fields provided, for each set of Custom Capabilities that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with s2Member seamlessly. The Customer will be granted additional access to one or more Custom Capabilities that you specify; while the Customer\'s Membership Level Access and any existing paid Subscription they may already have with you, will remain completely unaffected.</p>' . "\n";
|
249 |
+
echo '<p><em><strong>Important Note:</strong> Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account (perhaps in your Login Welcome Page for s2Member), or in another location where you can be absolutely sure that a User/Member is logged in. s2Member\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <strong>s2Member → API Scripting → Simple Conditionals</strong>.</em></p>' . "\n";
|
250 |
echo '<p><em><strong>Please note:</strong> buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back & re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
|
251 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_ccap_buttons", get_defined_vars ());
|
252 |
|
266 |
echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-ccap-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-ccap-terms.php"))) . '</select></p>' . "\n";
|
267 |
echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by s2Member; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-ccap-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalCcapButtonGenerate();" /></p>' . "\n";
|
268 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
|
269 |
+
echo '<p>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell s2Member to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-ccap-ccaps" size="40" /></p>' . "\n";
|
270 |
echo '</form>' . "\n";
|
271 |
echo '</td>' . "\n";
|
272 |
|
316 |
{
|
317 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_cancellation_buttons", get_defined_vars ());
|
318 |
|
319 |
+
echo '<div class="ws-menu-page-group" title="Subscr. Cancellation Buttons">' . "\n";
|
320 |
|
321 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-cancellation-buttons-section">' . "\n";
|
322 |
echo '<h3>One Button Does It All For Cancellations (copy/paste)</h3>' . "\n";
|
393 |
{
|
394 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_reg_links", get_defined_vars ());
|
395 |
|
396 |
+
echo '<div class="ws-menu-page-group" title="Member Registration Access Links">' . "\n";
|
397 |
|
398 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-reg-links-section">' . "\n";
|
399 |
echo '<h3>Registration Access Link Generator (for Customer Service)</h3>' . "\n";
|
400 |
+
echo '<p>s2Member automatically generates Registration Access Links for your Customers after checkout, and also sends them a link in a Confirmation Email. However, if you ever need to deal with a Customer Service issue that requires a new Registration Access Link to be created manually, you can use this tool for that. Alternatively, you can create their account yourself/manually by going to <strong>Users → Add New</strong>. Either of these methods will work fine.</p>' . "\n";
|
401 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_reg_links", get_defined_vars ());
|
402 |
|
403 |
echo '<table class="form-table">' . "\n";
|
412 |
echo '</select></p>' . "\n";
|
413 |
echo '<p>Paid Subscr. ID: <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-subscr-id" value="" size="50" /> <a href="#" onclick="alert(\'The Customer\\\'s Paid Subscr. ID (aka: Recurring Profile ID, Transaction ID) must be unique. This value can be obtained from inside your PayPal account under the History tab. Each paying Customer MUST be associated with a unique Paid Subscr. ID. If the Customer is NOT associated with a Paid Subscr. ID, you will need to generate a unique value for this field on your own. But keep in mind, s2Member will be unable to maintain future communication with the PayPal IPN (i.e., Notification) service if this value does not reflect a real Paid Subscr. ID that exists in your PayPal History log.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
414 |
echo '<p>Custom String Value: <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-custom" value="' . esc_attr ($_SERVER["HTTP_HOST"]) . '" size="30" /> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\'' . c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"]), 3) . '\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\n' . c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"]), 3) . '|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a> <input type="button" value="Generate Access Link" onclick="ws_plugin__s2member_paypalRegLinkGenerate();" /> <img id="ws-plugin--s2member-reg-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
|
415 |
+
echo '<p' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member → API Scripting → Custom Capabilities.\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-reg-link-ccaps" size="40" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></p>' . "\n";
|
416 |
echo '<p>Fixed Term Length (for Buy Now transactions): <input type="text" autocomplete="off" id="ws-plugin--s2member-reg-link-fixed-term" value="" size="10" /> <a href="#" onclick="alert(\'If the Customer purchased Membership through a Buy Now transaction (i.e., there is no Initial/Trial Period and no recurring charges for ongoing access), you may configure a Fixed Term Length in this field. This way the Customer\\\'s Membership Access is automatically revoked by s2Member at the appropriate time. This will be a numeric value, followed by a space, then a single letter.\\n\\nHere are some examples:\\n\\n1 D (this means 1 Day)\\n1 W (this means 1 Week)\\n1 M (this means 1 Month)\\n1 Y (this means 1 Year)\\n1 L (this means 1 Lifetime)\'); return false;">[?]</a></p>' . "\n";
|
417 |
echo '<p id="ws-plugin--s2member-reg-link" style="display:none;"></p>' . "\n";
|
418 |
echo '</form>' . "\n";
|
432 |
{
|
433 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_sp_buttons", get_defined_vars ());
|
434 |
|
435 |
+
echo '<div class="ws-menu-page-group" title="Specific Post/Page (Buy Now) Buttons">' . "\n";
|
436 |
|
437 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-buttons-section">' . "\n";
|
438 |
echo '<h3>Button Code Generator For Specific Post/Page Buttons</h3>' . "\n";
|
439 |
echo '<p>s2Member now supports an additional layer of functionality (very powerful), which allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. Specific Post/Page Access works independently from Member Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons, and your Customers will NOT be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>' . "\n";
|
440 |
+
echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link (see: <strong>s2Member → PayPal Options → Specific Post/Page Email</strong>). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
|
441 |
+
echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by s2Member, might contain a download link for your eBook, access to file & music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created. To protect Specific Posts/Pages, please see: <strong>s2Member → Restriction Options → Specific Post/Page Access</strong>. Once you\'ve configured your Specific Post/Page Restrictions, those Posts/Pages will be available in the menus below.</p>' . "\n";
|
442 |
echo '<p>Very simple. All you do is customize the form fields provided, for each Post/Page that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with s2Member seamlessly. You can even Package Additional Posts/Pages together into one transaction.</p>' . "\n";
|
443 |
echo '<p><em><strong>Please note:</strong> buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back & re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
|
444 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_sp_buttons", get_defined_vars ());
|
465 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
466 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
467 |
|
468 |
+
echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\n\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
469 |
|
470 |
echo '<p><select id="ws-plugin--s2member-sp-additional-ids" multiple="multiple" style="height:100px;">' . "\n";
|
471 |
echo '<optgroup label="— Package Additional Posts/Pages that you\'ve protected —">' . "\n";
|
473 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
474 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
475 |
|
476 |
+
echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page (they\\\'ll land on your Leading Post/Page after checkout), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically (i.e., only one Access Link is needed, and s2Member generates this automatically). However, you will STILL need to design your Leading Post/Page (which is what a Customer will actually land on), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* s2Member sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
477 |
|
478 |
echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-sp-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select></p>' . "\n";
|
479 |
echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-sp-desc" value="Description and pricing details here." size="68" /></p>' . "\n";
|
527 |
{
|
528 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_before_sp_links", get_defined_vars ());
|
529 |
|
530 |
+
echo '<div class="ws-menu-page-group" title="Specific Post/Page Access Links">' . "\n";
|
531 |
|
532 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-links-section">' . "\n";
|
533 |
echo '<h3>Specific Post/Page Access Link Generator (for Customer Service)</h3>' . "\n";
|
549 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
550 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
551 |
|
552 |
+
echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\n\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
553 |
|
554 |
echo '<p><select id="ws-plugin--s2member-sp-link-additional-ids" multiple="multiple" style="height:100px; min-width:450px;">' . "\n";
|
555 |
echo '<optgroup label="— Package Additional Posts/Pages that you\'ve protected —">' . "\n";
|
557 |
foreach ($ws_plugin__s2member_temp_a_singulars as $ws_plugin__s2member_temp_o)
|
558 |
echo '<option value="' . esc_attr ($ws_plugin__s2member_temp_o->ID) . '">' . esc_html ($ws_plugin__s2member_temp_o->post_title) . '</option>' . "\n";
|
559 |
|
560 |
+
echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page (they\\\'ll land on your Leading Post/Page after checkout), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically (i.e., only one Access Link is needed, and s2Member generates this automatically). However, you will STILL need to design your Leading Post/Page (which is what a Customer will actually land on), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* s2Member sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured s2Member for Specific Post/Page Access yet. See: s2Member → Restriction Options → Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
|
561 |
|
562 |
echo '<p><select id="ws-plugin--s2member-sp-link-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select> <input type="button" value="Generate Access Link" onclick="ws_plugin__s2member_paypalSpLinkGenerate();" /> <img id="ws-plugin--s2member-sp-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
|
563 |
echo '<p id="ws-plugin--s2member-sp-link" style="display:none;"></p>' . "\n";
|
582 |
|
583 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shortcode-attrs-section">' . "\n";
|
584 |
echo '<h3>Shortcode Attributes (Explained In Full Detail)</h3>' . "\n";
|
585 |
+
echo '<p>When you generate a Button Code, s2Member will make a <a href="http://s2member.com/r/shortcode-reference/" target="_blank" rel="external">Shortcode</a> available to you. Like most Shortcodes for WordPress, s2Member reads Attributes in your Shortcode. These Attributes will be pre-configured by one of s2Member\'s Button Generators automatically; so there really is nothing more you need to do. However, many site owners like to know exactly how these Shortcode Attributes work. Below, is a brief overview of each possible Shortcode Attribute.</p>' . "\n";
|
586 |
do_action("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_shortcode_attrs", get_defined_vars ());
|
587 |
|
588 |
echo '<table class="form-table" style="margin-top:0;">' . "\n";
|
596 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<li><code>ccaps="music,videos"</code> A comma-delimited list of Custom Capabilities. Only valid w/ Membership Level Access and/or Independent Custom Capabilities.</li>' . "\n" : '';
|
597 |
echo '<li><code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '"</code> must start with your domain. Additional values can be piped in (ex: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3|etc"</code>). Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
598 |
echo '<li><code>desc="Gold Membership"</code> A brief purchase Description. Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
599 |
+
echo '<li><code>dg="0"</code> The Digital Goods directive. s2Member will eventually be integrated with <a href="http://s2member.com/r/paypal-express-checkout-digitals/" target="_blank" rel="external">Digital Goods</a> for inline Express Checkout. But for now, this should always be <code>0</code>.</li>' . "\n";
|
600 |
echo '<li><code>exp="72"</code> Access Expires (in hours). Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
|
601 |
echo '<li><code>ids="14"</code> A Post/Page ID#, or a comma-delimited list of IDs. Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
|
602 |
echo '<li><code>image="default"</code> Button Image Location. Possible values: <code>default</code> = use the default PayPal Button, <code>http://...</code> = location of your custom Image.</li>' . "\n";
|
603 |
+
echo '<li><code>lang=""</code> Optional 5 character Button Language Code <em>(ake: Locale Code—ex: <code>en_US</code>)</em>. This controls the interface language of the PayPal Button itself. If unspecified, the language defaults to English (i.e., <code>en_US</code>; or to the value set by an optional MO translation file; which translates s2Member overall). See <a href="http://s2member.com/r/paypal-locale-codes/" target="_blank" rel="external">this list of possible Locale Codes</a>.</li>' . "\n";
|
604 |
+
echo '<li><code>lc=""</code> Optional 2 character Country/Locale Code <em>(i.e., Country Code—ex: <code>US</code>)</em>. This controls the interface language used at PayPal during checkout. If unspecified, the language is determined by PayPal when possible, defaulting to <code>US</code> <em>english</em> when not possible. See <a href="http://s2member.com/r/paypal-locale-codes/" target="_blank" rel="external">this list of possible Country Codes</a>. Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
605 |
echo '<li><code>level="1"</code> Membership Level [1-4] <em>(or, up to the number of configured Levels)</em>. Only valid for Buttons providing paid Membership Level Access.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' Or, with Independent Custom Capabilities this MUST be set to <code>level="*"</code>, and <code>ccaps=""</code> must NOT be empty <em>(i.e., <code>level="*" ccaps="music,videos"</code>)</em>.') . '</li>' . "\n";
|
606 |
echo '<li><code>modify="0"</code> Modification directive. Only valid w/ Membership Level Access. Possible values: <code>0</code> = allows Customers to only create a new Subscription, <code>1</code> = allows Customers to modify their current Subscription or sign up for a new one, <code>2</code> = allows Customers to only modify their current Subscription.</li>' . "\n";
|
607 |
echo '<li><code>ns="1"</code> The <em>no_shipping</em> directive. Possible values: <code>0</code> = prompt for an address, but do not require one, <code>1</code> = do not prompt for a shipping address, <code>2</code> = prompt for an address, and require one. Not valid when <code>cancel="1"</code>.</li>' . "\n";
|
611 |
echo '<li><code>rp="1"</code> Regular Period. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Must be >= <code>1</code> (ex: <code>1</code> Week, <code>2</code> Months, <code>1</code> Month, <code>3</code> Days).</li>' . "\n";
|
612 |
echo '<li><code>rt="M"</code> Regular Term. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>D</code> = Days, <code>W</code> = Weeks, <code>M</code> = Months, <code>Y</code> = Years, <code>L</code> = Lifetime.</li>' . "\n";
|
613 |
echo '<li><code>rr="1"</code> Recurring directive. Only valid w/ Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>0</code> = non-recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>1</code> = recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>BN</code> = non-recurring "Buy Now" functionality, no Trial Period possible.</li>' . "\n";
|
614 |
+
echo '<li><code>rrt=""</code> Recurring Times <em>(i.e., a fixed number of installments)</em>. Only valid w/ Membership Level Access. When unspecified, any recurring charges will remain ongoing until cancelled, or until payments start failing. If this is set to <code>1 or higher</code> the regular recurring charges will only continue for X billing cycles, depending on what you specify. This is only valid when <code>rr="1"</code> for recurring "Subscriptions". Please note that a fixed number of installments, also means a fixed period of access. If a Customer\'s billing is monthly, and you set <code>rrt="3"</code>, billing will continue for only 3 monthly installments. After that, billing would stop, and their access to the site would be revoked as well <em>(based on your EOT Behavior setting under: s2Member → PayPal Options)</em>.</li>' . "\n";
|
615 |
echo '<li><code>rra="1"</code> Reattempt failed payments? Possible values: <code>0</code> = do NOT reattempt billing when/if a recurring payment fails; <code>1</code> = yes, DO reattempt billing when/if a recurring payment fails. With PayPal Standard integration, PayPal will retry a maximum of 2 times when you set <code>rra="1"</code>; after that, a Subscription would be terminated due to Max Failed Payments having been reached. PayPal Standard integration does NOT make it possible to configure Max Failed Payments, it simply defaults to a value of <code>2</code> whenever <code>rra="1"</code>, indicating that you DO want to retry failed payments.</li>' . "\n";
|
616 |
echo '<li><code>sp="0"</code> Specific Post/Page Button. Possible values: <code>0</code> = this is NOT a Specific Post/Page Access Button, <code>1</code> = this IS a Specific Post/Page Access Button.</li>' . "\n";
|
617 |
echo '<li><code>ta="0.00"</code> Trial Amount. Only valid w/ Membership Level Access. Must be <code>0</code> when <code>rt="L"</code> or when <code>rr="BN"</code>.</li>' . "\n";
|
649 |
}
|
650 |
|
651 |
new c_ws_plugin__s2member_menu_page_paypal_buttons ();
|
|
includes/menu-pages/paypal-ops.inc.php
CHANGED
@@ -57,8 +57,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
57 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
|
58 |
echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
59 |
echo '<h3>PayPal Account Details (required, if using PayPal)</h3>'."\n";
|
60 |
-
echo '<p>s2Member integrates with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal Payments Standard</a>—for businesses. You do not need a PayPal Pro account. You just need to upgrade your Personal PayPal account to a Business status, which is free. A PayPal account can be <a href="http://
|
61 |
-
echo '<p><em><strong>PayPal API Credentials:</strong> Once you have a PayPal Business account, you\'ll need access to your <a href="http://
|
62 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
|
63 |
|
64 |
echo '<table class="form-table">'."\n";
|
@@ -76,7 +76,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
76 |
|
77 |
echo '<td>'."\n";
|
78 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_merchant_id" id="ws-plugin--s2member-paypal-merchant-id" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"]).'" /><br />'."\n";
|
79 |
-
echo 'At PayPal, see: <strong>Profile
|
80 |
echo '</td>'."\n";
|
81 |
|
82 |
echo '</tr>'."\n";
|
@@ -93,7 +93,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
93 |
|
94 |
echo '<td>'."\n";
|
95 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_business" id="ws-plugin--s2member-paypal-business" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]).'" /><br />'."\n";
|
96 |
-
echo 'At PayPal, see: <strong>Profile
|
97 |
echo '</td>'."\n";
|
98 |
|
99 |
echo '</tr>'."\n";
|
@@ -117,7 +117,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
117 |
|
118 |
echo '<td>'."\n";
|
119 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_api_username" id="ws-plugin--s2member-paypal-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"]).'" /><br />'."\n";
|
120 |
-
echo 'At PayPal, see: <strong>Profile
|
121 |
echo '</td>'."\n";
|
122 |
|
123 |
echo '</tr>'."\n";
|
@@ -134,7 +134,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
134 |
|
135 |
echo '<td>'."\n";
|
136 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_password" id="ws-plugin--s2member-paypal-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"]).'" /><br />'."\n";
|
137 |
-
echo 'At PayPal, see: <strong>Profile
|
138 |
echo '</td>'."\n";
|
139 |
|
140 |
echo '</tr>'."\n";
|
@@ -151,7 +151,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
151 |
|
152 |
echo '<td>'."\n";
|
153 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_signature" id="ws-plugin--s2member-paypal-api-signature" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"]).'" /><br />'."\n";
|
154 |
-
echo 'At PayPal, see: <strong>Profile
|
155 |
echo '</td>'."\n";
|
156 |
|
157 |
echo '</tr>'."\n";
|
@@ -177,7 +177,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
177 |
|
178 |
echo '<td>'."\n";
|
179 |
echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />'."\n";
|
180 |
-
echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode.<br />See: <a href="http://
|
181 |
echo '</td>'."\n";
|
182 |
|
183 |
echo '</tr>'."\n";
|
@@ -194,7 +194,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
194 |
|
195 |
echo '<td>'."\n";
|
196 |
echo '<input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-0">No</label> <input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-1">Yes, enable PayPal Button encryption.</label><br />'."\n";
|
197 |
-
echo '<em>If enabled, all of your PayPal Button Shortcodes will produce <em>encrypted</em> PayPal Buttons. This improves security against fraudulent transactions. For extra security, you should update your PayPal account too, under: <strong>My Profile
|
198 |
echo '</td>'."\n";
|
199 |
|
200 |
echo '</tr>'."\n";
|
@@ -254,9 +254,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
254 |
echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
255 |
echo '<h3>Payflow Account Details (required, if using Payflow)</h3>'."\n";
|
256 |
echo '<p>Newer PayPal Pro accounts (i.e., PayPal Pro w/ Payflow Edition), come with the Payflow API for Recurring Billing service. If you have a newer PayPal Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member Pro-Forms, you will need to fill in the details here. Providing Payflow API Credentials below, will automatically put s2Member\'s Recurring Billing integration through Pro-Forms into Payflow mode. Just fill in the details below, and you\'re ready to generate Pro-Forms that charge customers on a recurring basis. s2Member will use the Payflow Edition API instead of the older PayPal Pro DPRP service; which is being slowly phased out in favor of Payflow Edition APIs.</p>'."\n";
|
257 |
-
echo '<p><em><strong>Payflow API Credentials:</strong> Once you have a PayPal Pro account, you\'ll need access to your <a href="http://
|
258 |
echo '<p><em><strong>Important Note:</strong> Supplying Payflow API Credentials here does not mean you can bypass other areas of s2Member\'s configuration; i.e., please supply s2Member with all of your PayPal account details. Your PayPal Pro (Payflow Edition) account is configured here, but up above you will need to configure other Account Details also.</em></p>'."\n";
|
259 |
-
echo '<p><strong>See also:</strong> This KB article: <a href="http://
|
260 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_details", get_defined_vars());
|
261 |
|
262 |
echo '<table class="form-table">'."\n";
|
@@ -274,7 +274,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
274 |
|
275 |
echo '<td>'."\n";
|
276 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_username" id="ws-plugin--s2member-paypal-payflow-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]).'" /><br />'."\n";
|
277 |
-
echo 'At PayPal, see: <strong>Profile
|
278 |
echo '</td>'."\n";
|
279 |
|
280 |
echo '</tr>'."\n";
|
@@ -291,7 +291,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
291 |
|
292 |
echo '<td>'."\n";
|
293 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_password" id="ws-plugin--s2member-paypal-payflow-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_password"]).'" /><br />'."\n";
|
294 |
-
echo 'At PayPal, see: <strong>Profile
|
295 |
echo '</td>'."\n";
|
296 |
|
297 |
echo '</tr>'."\n";
|
@@ -308,7 +308,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
308 |
|
309 |
echo '<td>'."\n";
|
310 |
echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_partner" id="ws-plugin--s2member-paypal-payflow-api-partner" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_partner"]).'" /><br />'."\n";
|
311 |
-
echo 'At PayPal, see: <strong>Profile
|
312 |
echo '</td>'."\n";
|
313 |
|
314 |
echo '</tr>'."\n";
|
@@ -325,7 +325,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
325 |
|
326 |
echo '<td>'."\n";
|
327 |
echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_vendor" id="ws-plugin--s2member-paypal-payflow-api-vendor" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_vendor"]).'" /><br />'."\n";
|
328 |
-
echo 'At PayPal, see: <strong>Profile
|
329 |
echo '</td>'."\n";
|
330 |
|
331 |
echo '</tr>'."\n";
|
@@ -347,16 +347,16 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
347 |
|
348 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">'."\n";
|
349 |
echo '<h3>PayPal IPN / Instant Payment Notifications (required, please enable)</h3>'."\n";
|
350 |
-
echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile
|
351 |
echo '<p>Edit your IPN settings & turn IPN Notifications: <strong><code>On</code></strong></p>'."\n";
|
352 |
echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
|
353 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
|
354 |
|
355 |
echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
|
356 |
echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="margin-top:10px; display:none;">'."\n";
|
357 |
-
echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://
|
358 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars());
|
359 |
-
echo '<p><em><strong>IPN Communications:</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations (e.g., refunds & chargebacks) for you automatically. If you log into your PayPal account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal IPN service that runs silently behind-the-scene. The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically (based on your configuration). The communication from PayPal
|
360 |
echo '</div>'."\n";
|
361 |
|
362 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -383,7 +383,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
383 |
|
384 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-pdt-section">'."\n";
|
385 |
echo '<h3>PayPal PDT Identity Token (required, please enable)</h3>'."\n";
|
386 |
-
echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile
|
387 |
echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>'."\n";
|
388 |
echo '<p>You\'ll need your <a href="'.esc_attr(home_url("/?s2member_paypal_return=1&s2member_paypal_proxy=paypal&s2member_paypal_proxy_use=x-preview")).'" target="_blank" rel="external">Auto-Return URL</a>, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_return=1")).'</code></p>'."\n";
|
389 |
echo '<p>You must also enable PDT (Payment Data Transfer): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you can enter below.</em></p>'."\n";
|
@@ -404,7 +404,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
404 |
|
405 |
echo '<td>'."\n";
|
406 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_identity_token" id="ws-plugin--s2member-paypal-identity-token" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"]).'" /><br />'."\n";
|
407 |
-
echo 'Your PDT Identity Token will appear under <strong>Profile
|
408 |
echo '</td>'."\n";
|
409 |
|
410 |
echo '</tr>'."\n";
|
@@ -415,7 +415,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
415 |
|
416 |
echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-pdt-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
|
417 |
echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="margin-top:10px; display:none;">'."\n";
|
418 |
-
echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://
|
419 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars());
|
420 |
echo '</div>'."\n";
|
421 |
|
@@ -643,7 +643,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
643 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
644 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
645 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
646 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
647 |
echo '</ul>'."\n";
|
648 |
|
649 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -679,7 +679,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
679 |
|
680 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-ccap-confirmation-email-section">'."\n";
|
681 |
echo '<h3>Capability Confirmation Email (required, but the default works fine)</h3>'."\n";
|
682 |
-
echo '<p>This email is sent to existing Users after they complete a Buy Now purchase for one or more Custom Capabilities (if and when you make this possible); see: <strong>Dashboard
|
683 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_ccap_confirmation_email", get_defined_vars());
|
684 |
|
685 |
echo '<table class="form-table">'."\n";
|
@@ -768,7 +768,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
768 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
769 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
770 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
771 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
772 |
echo '</ul>'."\n";
|
773 |
|
774 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -804,7 +804,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
804 |
|
805 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-confirmation-email-section">'."\n";
|
806 |
echo '<h3>Specific Post/Page Confirmation Email (required, but the default works fine)</h3>'."\n";
|
807 |
-
echo '<p>This email is sent to new Customers after they return from a successful purchase at PayPal, for Specific Post/Page Access. (see: <strong>s2Member
|
808 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_sp_confirmation_email", get_defined_vars());
|
809 |
|
810 |
echo '<table class="form-table">'."\n";
|
@@ -909,7 +909,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
909 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-eot-behavior-section">'."\n";
|
910 |
echo '<h3>PayPal EOT Behavior (required, please choose)</h3>'."\n";
|
911 |
echo '<p>EOT = End Of Term. By default, s2Member will demote a paid Member to a Free Subscriber whenever their Subscription term has ended (i.e., expired), been cancelled, refunded, charged back to you, etc. s2Member demotes them to a Free Subscriber, so they will no longer have Member Level Access to your site. However, in some cases, you may prefer to have Customer accounts deleted completely, instead of just being demoted. This is where you choose which method works best for your site. If you don\'t want s2Member to take ANY action at all, you can disable s2Member\'s EOT System temporarily, or even completely. There are also a few other configurable options here, so please read carefully. These options are all very important.</p>'."\n";
|
912 |
-
echo '<p><strong>PayPal IPNs:</strong> The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. For example, if you issue a refund to an unhappy Customer through PayPal, s2Member will eventually be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically (based on your configuration). The communication from PayPal
|
913 |
echo '<p><em><strong>Some Hairy Details:</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT (End Of Term) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>'."\n";
|
914 |
echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system (based on your configuration). s2Member also calculates one extra day (24 hours) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>'."\n";
|
915 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_eot_behavior", get_defined_vars());
|
@@ -1037,7 +1037,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
|
|
1037 |
echo '<option value="refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
|
1038 |
echo '<option value="refunds,partial_refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,partial_refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Partial Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
|
1039 |
echo '</select><br />'."\n";
|
1040 |
-
echo '<em><strong>Note:</strong> s2Member is not equipped to detect partial refunds against multi-payment Subscriptions reliably. Therefore, all refunds processed against Subscriptions (of any kind) are considered <strong>Partial</strong> Refunds. Full refunds (in the eyes of s2Member) occur only against Buy Now transactions where it is easy for s2Member to see that the refund amount is >= the original Buy Now purchase price (i.e., a Full Refund). <strong>Also Note:</strong> This setting (no matter what you choose) will NOT impact s2Member\'s internal API Notifications for Refund/Reversal events. <a href="#" onclick="alert(\'A Full or Partial Refund; and/or a Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member in accordance with your configuration here.\\n\\nIn this way, you\\\'ll have the full ability to listen for these events on your own (via API Notifications); if you prefer (optional). For more information, check your Dashboard under: `s2Member
|
1041 |
echo '</td>'."\n";
|
1042 |
|
1043 |
echo '</tr>'."\n";
|
57 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
|
58 |
echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
59 |
echo '<h3>PayPal Account Details (required, if using PayPal)</h3>'."\n";
|
60 |
+
echo '<p>s2Member integrates with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal Payments Standard</a>—for businesses. You do not need a PayPal Pro account. You just need to upgrade your Personal PayPal account to a Business status, which is free. A PayPal account can be <a href="http://s2member.com/r/paypal-business-upgrade/" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account by clicking the "Profile" link under your "My Account" tab, selecting "Personal Business Information", and then clicking the "Upgrade Your Account" button. <strong>See also:</strong> This KB article: <a href="http://s2member.com/kb-article/supported-paypal-account-types/" target="_blank" rel="external">PayPal Compatibility (Account Types)</a>.</p>'."\n";
|
61 |
+
echo '<p><em><strong>PayPal API Credentials:</strong> Once you have a PayPal Business account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">PayPal API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Request API Signature".</em></p>'."\n";
|
62 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
|
63 |
|
64 |
echo '<table class="form-table">'."\n";
|
76 |
|
77 |
echo '<td>'."\n";
|
78 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_merchant_id" id="ws-plugin--s2member-paypal-merchant-id" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"]).'" /><br />'."\n";
|
79 |
+
echo 'At PayPal, see: <strong>Profile → Secure Merchant ID</strong>'."\n";
|
80 |
echo '</td>'."\n";
|
81 |
|
82 |
echo '</tr>'."\n";
|
93 |
|
94 |
echo '<td>'."\n";
|
95 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_business" id="ws-plugin--s2member-paypal-business" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]).'" /><br />'."\n";
|
96 |
+
echo 'At PayPal, see: <strong>Profile → Email Accounts</strong>'."\n";
|
97 |
echo '</td>'."\n";
|
98 |
|
99 |
echo '</tr>'."\n";
|
117 |
|
118 |
echo '<td>'."\n";
|
119 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_api_username" id="ws-plugin--s2member-paypal-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"]).'" /><br />'."\n";
|
120 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials)</strong>'."\n";
|
121 |
echo '</td>'."\n";
|
122 |
|
123 |
echo '</tr>'."\n";
|
134 |
|
135 |
echo '<td>'."\n";
|
136 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_password" id="ws-plugin--s2member-paypal-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"]).'" /><br />'."\n";
|
137 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials)</strong>'."\n";
|
138 |
echo '</td>'."\n";
|
139 |
|
140 |
echo '</tr>'."\n";
|
151 |
|
152 |
echo '<td>'."\n";
|
153 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_signature" id="ws-plugin--s2member-paypal-api-signature" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"]).'" /><br />'."\n";
|
154 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → "Request API Credentials")</strong>'."\n";
|
155 |
echo '</td>'."\n";
|
156 |
|
157 |
echo '</tr>'."\n";
|
177 |
|
178 |
echo '<td>'."\n";
|
179 |
echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />'."\n";
|
180 |
+
echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode.<br />See: <a href="http://s2member.com/r/paypal-developers/" target="_blank" rel="external">PayPal Developers</a></em>'."\n";
|
181 |
echo '</td>'."\n";
|
182 |
|
183 |
echo '</tr>'."\n";
|
194 |
|
195 |
echo '<td>'."\n";
|
196 |
echo '<input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-0">No</label> <input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-1">Yes, enable PayPal Button encryption.</label><br />'."\n";
|
197 |
+
echo '<em>If enabled, all of your PayPal Button Shortcodes will produce <em>encrypted</em> PayPal Buttons. This improves security against fraudulent transactions. For extra security, you should update your PayPal account too, under: <strong>My Profile → Website Payment Preferences</strong>. You\'ll want to block all non-encrypted payments. <strong>Note:</strong> this will NOT work until you\'ve supplied s2Member with your PayPal Email Address, and also with your API Username/Password/Signature.</em>'."\n";
|
198 |
echo '</td>'."\n";
|
199 |
|
200 |
echo '</tr>'."\n";
|
254 |
echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
255 |
echo '<h3>Payflow Account Details (required, if using Payflow)</h3>'."\n";
|
256 |
echo '<p>Newer PayPal Pro accounts (i.e., PayPal Pro w/ Payflow Edition), come with the Payflow API for Recurring Billing service. If you have a newer PayPal Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member Pro-Forms, you will need to fill in the details here. Providing Payflow API Credentials below, will automatically put s2Member\'s Recurring Billing integration through Pro-Forms into Payflow mode. Just fill in the details below, and you\'re ready to generate Pro-Forms that charge customers on a recurring basis. s2Member will use the Payflow Edition API instead of the older PayPal Pro DPRP service; which is being slowly phased out in favor of Payflow Edition APIs.</p>'."\n";
|
257 |
+
echo '<p><em><strong>Payflow API Credentials:</strong> Once you have a PayPal Pro account, you\'ll need access to your <a href="http://s2member.com/r/paypal-profile-api-access/" target="_blank" rel="external">Payflow API Credentials</a>. Log into your PayPal account, and navigate to <strong>Profile → API Access (or → Request API Credentials)</strong>. From the available options, please choose "Payflow / API Access". You will need the following credentials: Username, Password, Partner, and Vendor.</em></p>'."\n";
|
258 |
echo '<p><em><strong>Important Note:</strong> Supplying Payflow API Credentials here does not mean you can bypass other areas of s2Member\'s configuration; i.e., please supply s2Member with all of your PayPal account details. Your PayPal Pro (Payflow Edition) account is configured here, but up above you will need to configure other Account Details also.</em></p>'."\n";
|
259 |
+
echo '<p><strong>See also:</strong> This KB article: <a href="http://s2member.com/kb-article/supported-paypal-account-types/" target="_blank" rel="external">PayPal Account Types</a>.</p>'."\n";
|
260 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_details", get_defined_vars());
|
261 |
|
262 |
echo '<table class="form-table">'."\n";
|
274 |
|
275 |
echo '<td>'."\n";
|
276 |
echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_username" id="ws-plugin--s2member-paypal-payflow-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]).'" /><br />'."\n";
|
277 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials) → Payflow API Access</strong>'."\n";
|
278 |
echo '</td>'."\n";
|
279 |
|
280 |
echo '</tr>'."\n";
|
291 |
|
292 |
echo '<td>'."\n";
|
293 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_password" id="ws-plugin--s2member-paypal-payflow-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_password"]).'" /><br />'."\n";
|
294 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials) → Payflow API Access</strong>'."\n";
|
295 |
echo '</td>'."\n";
|
296 |
|
297 |
echo '</tr>'."\n";
|
308 |
|
309 |
echo '<td>'."\n";
|
310 |
echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_partner" id="ws-plugin--s2member-paypal-payflow-api-partner" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_partner"]).'" /><br />'."\n";
|
311 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials) → Payflow API Access</strong>'."\n";
|
312 |
echo '</td>'."\n";
|
313 |
|
314 |
echo '</tr>'."\n";
|
325 |
|
326 |
echo '<td>'."\n";
|
327 |
echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_vendor" id="ws-plugin--s2member-paypal-payflow-api-vendor" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_vendor"]).'" /><br />'."\n";
|
328 |
+
echo 'At PayPal, see: <strong>Profile → API Access (or → Request API Credentials) → Payflow API Access</strong>'."\n";
|
329 |
echo '</td>'."\n";
|
330 |
|
331 |
echo '</tr>'."\n";
|
347 |
|
348 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">'."\n";
|
349 |
echo '<h3>PayPal IPN / Instant Payment Notifications (required, please enable)</h3>'."\n";
|
350 |
+
echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile → Instant Payment Notification Preferences</strong></p>'."\n";
|
351 |
echo '<p>Edit your IPN settings & turn IPN Notifications: <strong><code>On</code></strong></p>'."\n";
|
352 |
echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
|
353 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
|
354 |
|
355 |
echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
|
356 |
echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="margin-top:10px; display:none;">'."\n";
|
357 |
+
echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://s2member.com/r/paypal-ipn-setup/" target="_blank" rel="external">default IPN settings inside your PayPal account</a>, the IPN URL is also set on a per-transaction basis by the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal recently updated their system to support IPN URL preservation. One PayPal account can handle multiple sites, all using different IPN URLs.</em></p>'."\n";
|
358 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars());
|
359 |
+
echo '<p><em><strong>IPN Communications:</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations (e.g., refunds & chargebacks) for you automatically. If you log into your PayPal account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal IPN service that runs silently behind-the-scene. The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically (based on your configuration). The communication from PayPal → s2Member is seamless.</em></p>'."\n";
|
360 |
echo '</div>'."\n";
|
361 |
|
362 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
383 |
|
384 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-pdt-section">'."\n";
|
385 |
echo '<h3>PayPal PDT Identity Token (required, please enable)</h3>'."\n";
|
386 |
+
echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile → Website Payment Preferences</strong></p>'."\n";
|
387 |
echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>'."\n";
|
388 |
echo '<p>You\'ll need your <a href="'.esc_attr(home_url("/?s2member_paypal_return=1&s2member_paypal_proxy=paypal&s2member_paypal_proxy_use=x-preview")).'" target="_blank" rel="external">Auto-Return URL</a>, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_return=1")).'</code></p>'."\n";
|
389 |
echo '<p>You must also enable PDT (Payment Data Transfer): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you can enter below.</em></p>'."\n";
|
404 |
|
405 |
echo '<td>'."\n";
|
406 |
echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_identity_token" id="ws-plugin--s2member-paypal-identity-token" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"]).'" /><br />'."\n";
|
407 |
+
echo 'Your PDT Identity Token will appear under <strong>Profile → Website Payment Preferences</strong> in your PayPal account.'."\n";
|
408 |
echo '</td>'."\n";
|
409 |
|
410 |
echo '</tr>'."\n";
|
415 |
|
416 |
echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-pdt-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
|
417 |
echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="margin-top:10px; display:none;">'."\n";
|
418 |
+
echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://s2member.com/r/paypal-pdt-setup/" target="_blank" rel="external">default Auto-Return/PDT configuration inside your PayPal account</a>, the Auto-Return URL is also set on a per-transaction basis from within the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member sets the Auto-Return URL (dynamically) for each transaction. The result is that the Auto-Return URL configured from within your PayPal account becomes the default, which is then overwritten on a per-transaction basis by the s2Member software.</em></p>'."\n";
|
419 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars());
|
420 |
echo '</div>'."\n";
|
421 |
|
643 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
644 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
645 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
646 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
647 |
echo '</ul>'."\n";
|
648 |
|
649 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
679 |
|
680 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-ccap-confirmation-email-section">'."\n";
|
681 |
echo '<h3>Capability Confirmation Email (required, but the default works fine)</h3>'."\n";
|
682 |
+
echo '<p>This email is sent to existing Users after they complete a Buy Now purchase for one or more Custom Capabilities (if and when you make this possible); see: <strong>Dashboard → s2Member → PayPal Buttons/Forms → Capability (Buy Now)</strong>. The <strong>primary</strong> purpose of this email is to provide the Customer with a confirmation that their account was updated. You may also customize this further by providing details that are specifically geared to your site.</p>'."\n";
|
683 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_ccap_confirmation_email", get_defined_vars());
|
684 |
|
685 |
echo '<table class="form-table">'."\n";
|
768 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
769 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
770 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
771 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
772 |
echo '</ul>'."\n";
|
773 |
|
774 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
804 |
|
805 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-confirmation-email-section">'."\n";
|
806 |
echo '<h3>Specific Post/Page Confirmation Email (required, but the default works fine)</h3>'."\n";
|
807 |
+
echo '<p>This email is sent to new Customers after they return from a successful purchase at PayPal, for Specific Post/Page Access. (see: <strong>s2Member → Restriction Options → Specific Post/Page Access</strong>). This is NOT used for Membership sales, only for Specific Post/Page Access. The <strong>primary</strong> purpose of this email is to provide the Customer with instructions, along with a link to access the Specific Post/Page they\'ve purchased access to. If you\'ve created a Specific Post/Page Package (with multiple Posts/Pages bundled together into one transaction), this ONE link (<code>%%sp_access_url%%</code>) will automatically authenticate them for access to ALL of the Posts/Pages included in their transaction. You may customize this email further by providing details that are specifically geared to your site.</p>'."\n";
|
808 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_sp_confirmation_email", get_defined_vars());
|
809 |
|
810 |
echo '<table class="form-table">'."\n";
|
909 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-eot-behavior-section">'."\n";
|
910 |
echo '<h3>PayPal EOT Behavior (required, please choose)</h3>'."\n";
|
911 |
echo '<p>EOT = End Of Term. By default, s2Member will demote a paid Member to a Free Subscriber whenever their Subscription term has ended (i.e., expired), been cancelled, refunded, charged back to you, etc. s2Member demotes them to a Free Subscriber, so they will no longer have Member Level Access to your site. However, in some cases, you may prefer to have Customer accounts deleted completely, instead of just being demoted. This is where you choose which method works best for your site. If you don\'t want s2Member to take ANY action at all, you can disable s2Member\'s EOT System temporarily, or even completely. There are also a few other configurable options here, so please read carefully. These options are all very important.</p>'."\n";
|
912 |
+
echo '<p><strong>PayPal IPNs:</strong> The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. For example, if you issue a refund to an unhappy Customer through PayPal, s2Member will eventually be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically (based on your configuration). The communication from PayPal → s2Member is seamless.</p>'."\n";
|
913 |
echo '<p><em><strong>Some Hairy Details:</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT (End Of Term) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>'."\n";
|
914 |
echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system (based on your configuration). s2Member also calculates one extra day (24 hours) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>'."\n";
|
915 |
do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_eot_behavior", get_defined_vars());
|
1037 |
echo '<option value="refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
|
1038 |
echo '<option value="refunds,partial_refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,partial_refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Partial Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
|
1039 |
echo '</select><br />'."\n";
|
1040 |
+
echo '<em><strong>Note:</strong> s2Member is not equipped to detect partial refunds against multi-payment Subscriptions reliably. Therefore, all refunds processed against Subscriptions (of any kind) are considered <strong>Partial</strong> Refunds. Full refunds (in the eyes of s2Member) occur only against Buy Now transactions where it is easy for s2Member to see that the refund amount is >= the original Buy Now purchase price (i.e., a Full Refund). <strong>Also Note:</strong> This setting (no matter what you choose) will NOT impact s2Member\'s internal API Notifications for Refund/Reversal events. <a href="#" onclick="alert(\'A Full or Partial Refund; and/or a Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member in accordance with your configuration here.\\n\\nIn this way, you\\\'ll have the full ability to listen for these events on your own (via API Notifications); if you prefer (optional). For more information, check your Dashboard under: `s2Member → API Notifications → Refunds/Reversals`.\'); return false;">Click here for details</a>.</em>'."\n";
|
1041 |
echo '</td>'."\n";
|
1042 |
|
1043 |
echo '</tr>'."\n";
|
includes/menu-pages/res-ops.inc.php
CHANGED
@@ -322,7 +322,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
|
|
322 |
echo '<td>'."\n";
|
323 |
echo '<div class="ws-menu-page-scrollbox" style="height:105px;">'."\n";
|
324 |
echo '<input type="hidden" name="ws_plugin__s2member_filter_wp_query[]" value="update-signal" />'."\n";
|
325 |
-
foreach(array("all" => "<strong>Filter ALL WordPress queries</strong>; protecting all Alternative Views.", "searches" => "└─ Searches (hide protected content in search results)", "feeds" => "└─ Feeds (hide protected content in standard XML/RSS/ATOM feeds)", "comment-feeds" => "└─ Comment Feeds (hide comments associated with protected content, in comment feeds)", "nav-menus" => "└─ Nav Menus (hide protected content in menus generated with <em>WordPress
|
326 |
echo '<input type="checkbox" name="ws_plugin__s2member_filter_wp_query[]" id="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'" value="'.esc_attr($ws_plugin__s2member_temp_s_value).'"'.((in_array($ws_plugin__s2member_temp_s_value, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'">'.$ws_plugin__s2member_temp_s_label.'</label><br />'."\n";
|
327 |
echo '</div>'."\n";
|
328 |
echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically using this technique:<br />'."\n";
|
@@ -397,9 +397,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
|
|
397 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-access-section">'."\n";
|
398 |
echo '<h3>Specific Post/Page Access Restrictions (optional)</h3>'."\n";
|
399 |
echo '<p>s2Member now supports an additional layer of functionality that allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. s2Member\'s "Specific Post/Page Access" works independently from Membership Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons (or Pro-Forms; if you\'re running s2Member Pro)—your Customers will not be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>'."\n";
|
400 |
-
echo '<p>In other words, Customers will not need to log in (or even have an account) to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link (see: <strong>s2Member
|
401 |
echo '<p>Specific Post/Page Access is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by s2Member might contain a download link for your eBook, access to file & music downloads, access to additional support services, and the list goes on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created.</p>'."\n";
|
402 |
-
echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <strong>s2Member
|
403 |
echo '<p><strong>What do I enter?</strong> Post/Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. <strong>Note:</strong> the word <code>all</code> does not work here. You must supply a list of Specific Post/Page IDs.</p>'."\n";
|
404 |
echo '<p><em><strong>Avoid Conflicts!</strong> Please be careful not to create a conflict with any of your other Access Restrictions. If you are going to sell Specific Post/Page Access you should enter specific Post/Page IDs that have not already been protected by other Restrictions (either directly or indirectly). In short, <strong>make sure that you haven\'t protected any of your Specific Posts/Pages with Member Level Access Restrictions already</strong>. If you configure s2Member in such as a way, that a Post/Page requires both Membership Level Access and Specific Post/Page Access too, you will create a conflict. Customers that purchase Specific Post/Page Access would be unable to access the Post/Page without also having a Membership.</em></p>'."\n";
|
405 |
echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
|
@@ -440,7 +440,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
|
|
440 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-brute-force-restrictions-section">'."\n";
|
441 |
echo '<h3>Brute Force IP/Login Restrictions (prevents username/password guessing)</h3>'."\n";
|
442 |
echo '<input type="button" id="ws-plugin--s2member-brute-force-restrictions-reset-button" value="Reset Brute Force Logs" class="ws-menu-page-right" style="min-width:175px;" />'."\n";
|
443 |
-
echo '<p>As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a <a href="
|
444 |
echo '<p><em><strong>Note:</strong> an empty IP address (associated with someone browsing anonymously) is also considered a unique IP address. This way it cannot circumvent s2Member\'s security.</em></p>'."\n";
|
445 |
do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
|
446 |
|
@@ -661,4 +661,4 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
|
|
661 |
}
|
662 |
}
|
663 |
}
|
664 |
-
new c_ws_plugin__s2member_menu_page_res_ops ();
|
322 |
echo '<td>'."\n";
|
323 |
echo '<div class="ws-menu-page-scrollbox" style="height:105px;">'."\n";
|
324 |
echo '<input type="hidden" name="ws_plugin__s2member_filter_wp_query[]" value="update-signal" />'."\n";
|
325 |
+
foreach(array("all" => "<strong>Filter ALL WordPress queries</strong>; protecting all Alternative Views.", "searches" => "└─ Searches (hide protected content in search results)", "feeds" => "└─ Feeds (hide protected content in standard XML/RSS/ATOM feeds)", "comment-feeds" => "└─ Comment Feeds (hide comments associated with protected content, in comment feeds)", "nav-menus" => "└─ Nav Menus (hide protected content in menus generated with <em>WordPress → Appearance → Menus</em>)", "pages" => "└─ Pages (hide protected content in widgets that list Pages)") as $ws_plugin__s2member_temp_s_value => $ws_plugin__s2member_temp_s_label)
|
326 |
echo '<input type="checkbox" name="ws_plugin__s2member_filter_wp_query[]" id="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'" value="'.esc_attr($ws_plugin__s2member_temp_s_value).'"'.((in_array($ws_plugin__s2member_temp_s_value, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-filter-wp-query-'.esc_attr(preg_replace("/[^a-z0-9_\-]/", "-", $ws_plugin__s2member_temp_s_value)).'">'.$ws_plugin__s2member_temp_s_label.'</label><br />'."\n";
|
327 |
echo '</div>'."\n";
|
328 |
echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically using this technique:<br />'."\n";
|
397 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-access-section">'."\n";
|
398 |
echo '<h3>Specific Post/Page Access Restrictions (optional)</h3>'."\n";
|
399 |
echo '<p>s2Member now supports an additional layer of functionality that allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. s2Member\'s "Specific Post/Page Access" works independently from Membership Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons (or Pro-Forms; if you\'re running s2Member Pro)—your Customers will not be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>'."\n";
|
400 |
+
echo '<p>In other words, Customers will not need to log in (or even have an account) to receive access to the Specific Post/Page they purchased access to. s2Member will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link (see: <strong>s2Member → PayPal Options → Specific Post/Page Email</strong>). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>'."\n";
|
401 |
echo '<p>Specific Post/Page Access is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by s2Member might contain a download link for your eBook, access to file & music downloads, access to additional support services, and the list goes on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created.</p>'."\n";
|
402 |
+
echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <strong>s2Member → PayPal Buttons → Specific Post/Page</strong> to generate "Buy Now" Buttons that you can insert into your WordPress Editor and make available on your site. The Button Generator for s2Member will even let you Package Additional Posts/Pages together into one transaction.</p>'."\n";
|
403 |
echo '<p><strong>What do I enter?</strong> Post/Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code>. <strong>Note:</strong> the word <code>all</code> does not work here. You must supply a list of Specific Post/Page IDs.</p>'."\n";
|
404 |
echo '<p><em><strong>Avoid Conflicts!</strong> Please be careful not to create a conflict with any of your other Access Restrictions. If you are going to sell Specific Post/Page Access you should enter specific Post/Page IDs that have not already been protected by other Restrictions (either directly or indirectly). In short, <strong>make sure that you haven\'t protected any of your Specific Posts/Pages with Member Level Access Restrictions already</strong>. If you configure s2Member in such as a way, that a Post/Page requires both Membership Level Access and Specific Post/Page Access too, you will create a conflict. Customers that purchase Specific Post/Page Access would be unable to access the Post/Page without also having a Membership.</em></p>'."\n";
|
405 |
echo ((!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>Tip:</strong> Can\'t find your Post/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>'."\n" : '';
|
440 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-brute-force-restrictions-section">'."\n";
|
441 |
echo '<h3>Brute Force IP/Login Restrictions (prevents username/password guessing)</h3>'."\n";
|
442 |
echo '<input type="button" id="ws-plugin--s2member-brute-force-restrictions-reset-button" value="Reset Brute Force Logs" class="ws-menu-page-right" style="min-width:175px;" />'."\n";
|
443 |
+
echo '<p>As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a <a href="https://en.wikipedia.org/wiki/Brute-force_attack" target="_blank" rel="external">Brute Force Attack</a>; whereby multiple/repeated logins are strategically attempted with various Username/Password combinations until a correct guess is made. It is not likely that you\'ll be attacked in this way, but it\'s still a good idea to protect your system; just in case somebody tries this. s2Member thwarts this behavior by monitoring failed login attempts that occur within a short period of time. Whenever s2Member detects an IP address <em>(i.e., a remote user)</em> that is consistently failing to enter a valid Username/Password, a temporary ban is created; preventing additional attempts from taking place for 30 minutes. This temporary ban, will only affect the offending IP address.</p>'."\n";
|
444 |
echo '<p><em><strong>Note:</strong> an empty IP address (associated with someone browsing anonymously) is also considered a unique IP address. This way it cannot circumvent s2Member\'s security.</em></p>'."\n";
|
445 |
do_action("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
|
446 |
|
661 |
}
|
662 |
}
|
663 |
}
|
664 |
+
new c_ws_plugin__s2member_menu_page_res_ops ();
|
includes/menu-pages/scripting.inc.php
CHANGED
@@ -128,10 +128,10 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
128 |
|
129 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
130 |
|
131 |
-
echo '<p><em><strong>s2Member supports many <a href="http://
|
132 |
|
133 |
echo '<p><em><strong>Passing arguments into a Simple Conditional:</strong></em></p>' . "\n";
|
134 |
-
echo '<p><em>1. True/false
|
135 |
echo '<p><em>*Tip: do NOT use spaces inside Conditionals.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_page(My Membership Options Page)</code><br />- use slugs or IDs instead, no spaces.</em></p>' . "\n";
|
136 |
|
137 |
echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
|
@@ -159,7 +159,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
159 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
160 |
|
161 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
162 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
163 |
|
164 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
165 |
|
@@ -212,10 +212,10 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
212 |
|
213 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
214 |
|
215 |
-
echo '<p><em><strong>s2Member supports ALL <a href="http://
|
216 |
|
217 |
echo '<p><em><strong>Passing arguments into a Simple Conditional:</strong></em></p>' . "\n";
|
218 |
-
echo '<p><em>1. True/false
|
219 |
echo '<p><em>*Tip: do NOT use spaces inside Conditionals.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_page(My Membership Options Page)</code><br />- use slugs or IDs instead, no spaces.</em></p>' . "\n";
|
220 |
|
221 |
echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
|
@@ -241,14 +241,14 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
241 |
|
242 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-advanced-way-section">' . "\n";
|
243 |
echo '<h3>The Advanced Way (some PHP scripting required)</h3>' . "\n";
|
244 |
-
echo '<p>In an effort to give you even more control over access restrictions, s2Member makes some PHP functions, and also some PHP Constants, available to you from within WordPress. In this section, we\'ll demonstrate several functions: <strong><code>is_user_logged_in()</code></strong>, <strong><code>is_user_not_logged_in()</code></strong>, <strong><code>user_is(user_id, role)</code></strong>, <strong><code>user_is_not(user_id, role)</code></strong>, <strong><code>user_can(user_id, capability)</code></strong>, <strong><code>user_cannot(user_id, capability)</code></strong>, <strong><code>current_user_is("role")</code></strong>, <strong><code>current_user_is_not("role")</code></strong>, <strong><code>current_user_can("capability")</code></strong>, <strong><code>current_user_cannot("capability")</code></strong>, <strong><code>current_user_is_for_blog($blog_id,"role")</code></strong>, <strong><code>current_user_is_not_for_blog($blog_id,"role")</code></strong>, <strong><code>current_user_can_for_blog($blog_id,"capability")</code></strong>, & <strong><code>current_user_cannot_for_blog($blog_id,"capability")</code></strong>. To make use of these functions, please follow our PHP code samples below. Using PHP, is a very powerful way to build Advanced Conditionals within your content; based on a Member\'s Level, Custom Capabilities, and/or other factors. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://
|
245 |
echo '<p>See also this related KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">s2Member Simple Shortcode Conditionals</a></p>' . "\n";
|
246 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_advanced_way", get_defined_vars ());
|
247 |
|
248 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
249 |
|
250 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
251 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
252 |
|
253 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
254 |
|
@@ -317,7 +317,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
317 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
318 |
|
319 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
320 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
321 |
|
322 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
323 |
|
@@ -364,7 +364,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
364 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capabilities-section">' . "\n";
|
365 |
echo '<h3>Packaging Together Custom Capabilities w/ Membership</h3>' . "\n";
|
366 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/_F91xzrmq-Q" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>' . "\n";
|
367 |
-
echo '<p>Using one of s2Member\'s Payment Button and/or Form Generators, you can add Custom Capabilities in comma-delimited format. s2Member builds upon existing functionality offered by <a href="http://
|
368 |
echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button & Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
|
369 |
echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
|
370 |
echo '<p>Custom Capabilities are always prepended with <code>access_s2member_ccap_</code>. You fill in the last part, with ONLY lowercase alpha-numerics and/or underscores. For example, let\'s say you want to sell Membership Level #1, as is. But, you also want to sell a slight variation of Membership Level #1, that includes the ability to access the Music & Video sections of your site. So, instead of selling this additional access under a whole new Membership Level, you could just sell a modified version of Membership Level #1. Add the the Custom Capabilities: <code>music,videos</code>. Once a Member has these Capabilities, you can test for these Capabilities using <code>current_user_can("access_s2member_ccap_music")</code> and <code>current_user_can("access_s2member_ccap_videos")</code>.</p>' . "\n";
|
@@ -379,14 +379,14 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
379 |
|
380 |
echo '<p><strong>New:</strong> In the latest versions of s2Member, you can automatically require certain Custom Capabilities on a per Post/Page basis. So now, s2Member <em>(if you prefer)</em> CAN handle Custom Capabilities for you automatically! Whenever you edit a Post/Page <em>(i.e., there is a Meta Box for s2Member in your Post/Page editing station)</em>... you can tell s2Member to require certain Custom Capabilities that you type in, using comma-delimited format. In other words, you will need to type in some of the trigger words that you used whenever you created your Payment Buttons/Forms. This way paying Members will have the Custom Capabilities to view different kinds of content that you offer.</p>' . "\n";
|
381 |
echo '<p><strong>New:</strong> By default, a Checkout Button or Form generated by s2Member is designed to (Add) Custom Capabilities to any that may or may not already exist for a particular User/Member. However, starting with s2Member v110815+, you can tell s2Member to (Remove All) Custom Capabilities, and then (Add) only the new ones that you specify. This is accomplished on a per Form/Button basis by preceding your comma-delimited list of Custom Capabilities with `-all`. For further details on this topic, click the <a href="#" onclick="alert(\'*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell s2Member to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> icon next to the Custom Capabilities field in any Button/Form Generator supplied by s2Member.</p>' . "\n";
|
382 |
-
echo '<p><strong>New:</strong> Independent Custom Capabilities. You can now sell one or more Custom Capabilities using Buy Now functionality, to "existing" Users/Members, regardless of which Membership Level they have on your site <em>(i.e., you could even sell Independent Custom Capabilities to Users at Membership Level #0, normally referred to as Free Subscribers, if you like)</em>. So this is quite flexible. For further details, please check your Dashboard, under: <strong>s2Member
|
383 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_custom_capabilities", get_defined_vars ());
|
384 |
|
385 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
386 |
|
387 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
388 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
389 |
-
echo '<strong>See Also:</strong> <a href="http://
|
390 |
|
391 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
392 |
|
@@ -410,14 +410,14 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
410 |
|
411 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">' . "\n";
|
412 |
echo '<h3>Restricting Files, Based On Custom Capabilities</h3>' . "\n";
|
413 |
-
echo '<p>If you\'re NOT familiar with Custom Capabilities yet, please read the section above, titled: <code>Custom Capability Packages</code>, and also see: <strong>s2Member
|
414 |
echo '<p>You can create Custom Capability Sub-directories under: <code>' . esc_html (c_ws_plugin__s2member_utils_dirs::doc_root_path ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])) . '</code>. For instance, if you have a Custom Capability <code>music</code>, you can place protected files that should ONLY be accessible to Members with <code>access_s2member_ccap_music</code>, inside: <code>/' . esc_html (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])) . '/access-s2member-ccap-music/</code>. Some examples are provided below.</p>' . "\n";
|
415 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_custom_capability_files", get_defined_vars ());
|
416 |
|
417 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
418 |
|
419 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
420 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
421 |
|
422 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
423 |
|
@@ -451,13 +451,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
451 |
|
452 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-advanced-dripping-section">' . "\n";
|
453 |
echo '<h3>Dripping Content (some PHP scripting may be required)</h3>' . "\n";
|
454 |
-
echo '<p>Content Dripping is the gradual, pre-scheduled release of premium website content to paying Members. This has become increasingly popular, because it allows older Members; those who have paid you more, due to recurring charges; to acquire access to more content progressively; based on their original paid registration time. It also gives you (as the site owner), the ability to launch multiple membership site portals, operating on autopilot, without any direct day-to-day involvement in a content release process. <strong>The <a href="http://www.s2member.com/kb/s2drip-shortcode/" target="_blank" rel="external"><code>[s2Drip]</code> shortcode</a> is the easiest way to drip content.</strong> The other methods (shown below) require some PHP scripting. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://
|
455 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_advanced_dripping", get_defined_vars ());
|
456 |
|
457 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
458 |
|
459 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
460 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
461 |
|
462 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
463 |
|
@@ -630,7 +630,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
630 |
|
631 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
632 |
|
633 |
-
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_URL</strong><br />This is the full URL to the Login Welcome Page (the User\'s account page). * This could also be the full URL to a Special Redirection URL (if you configured one). See <strong>s2Member
|
634 |
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_ID</strong><br />This is the Page ID that was used to generate the full URL. * In the case of a Special Redirection URL, this ID is not really applicable.</p>' . "\n";
|
635 |
|
636 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
@@ -729,13 +729,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
729 |
|
730 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
731 |
|
732 |
-
echo '<p>Before you read any further, you should install this handy plugin: <a href="http://
|
733 |
echo 'You\'ll need to have this plugin installed to use PHP code in Posts/Pages.</p>' . "\n";
|
734 |
|
735 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
736 |
|
737 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
738 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
739 |
|
740 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
741 |
|
@@ -901,7 +901,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
901 |
|
902 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
903 |
|
904 |
-
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_URL</strong><br />This is the full URL to the Login Welcome Page (the User\'s account page). * This could also be the full URL to a Special Redirection URL (if you configured one). See <strong>s2Member
|
905 |
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_ID</strong><br />This is the Page ID that was used to generate the full URL. * In the case of a Special Redirection URL, this ID is not really applicable.</p>' . "\n";
|
906 |
echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/login-welcome-page-url.x-php")) . '</p>' . "\n";
|
907 |
|
@@ -1084,14 +1084,14 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
1084 |
|
1085 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
|
1086 |
echo '<h3>WP Hooks For Theme/Plugin Developers (scripting required)</h3>' . "\n";
|
1087 |
-
echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>(or even modify)</em> s2Member in lots of different ways. If you need to add custom processing routines, modify the behavior of existing processing routines, or tinker with things otherwise; you should use API Hooks/Filters. API Hooks & Filters, give you the ability to "hook into", and/or "filter" processing routines, with files/functions of your own; instead of editing the s2Member plugin files directly. If you don\'t use a Hook/Filter, and instead, you edit the plugin files for s2Member, you\'ll have to merge all of your changes every time a new version of s2Member is released. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://
|
1088 |
echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>(over 1000 total)</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="http://www.s2member.com/codex/#src_doc_overview_description" target="_blank" rel="external">this article</a> as a primer. The <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
|
1089 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
|
1090 |
|
1091 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
1092 |
|
1093 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
1094 |
-
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex
|
1095 |
echo '</div>' . "\n";
|
1096 |
|
1097 |
echo '</div>' . "\n";
|
@@ -1117,4 +1117,3 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
|
|
1117 |
}
|
1118 |
|
1119 |
new c_ws_plugin__s2member_menu_page_scripting ();
|
1120 |
-
?>
|
128 |
|
129 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
130 |
|
131 |
+
echo '<p><em><strong>s2Member supports many <a href="http://s2member.com/r/wordpress-conditional-tags/" target="_blank" rel="external">Conditional Tags</a> in WordPress.</strong> Including: <strong><code>is_user_logged_in()</code></strong>, <strong><code>is_user_not_logged_in()</code></strong>, <strong><code>user_is(user_id, role)</code></strong>, <strong><code>user_is_not(user_id, role)</code></strong>, <strong><code>user_can(user_id, capability)</code></strong>, <strong><code>user_cannot(user_id, capability)</code></strong>, <strong><code>current_user_is(role)</code></strong>, <strong><code>current_user_is_not(role)</code></strong>, <strong><code>current_user_can(capability)</code></strong>, <strong><code>current_user_cannot(capability)</code></strong>, <strong><code>is_admin()</code></strong>, <strong><code>is_blog_admin()</code></strong>, <strong><code>is_user_admin()</code></strong>, <strong><code>is_network_admin()</code></strong>, <strong><code>is_404()</code></strong>, <strong><code>is_home()</code></strong>, <strong><code>is_front_page()</code></strong>, <strong><code>is_singular(ID|slug|{slug,ID})"</code></strong>, <strong><code>is_single(ID|slug|{slug,ID})</code></strong>, <strong><code>is_page(ID|slug|{slug,ID})</code></strong>, <strong><code>is_page_template(file.php)</code></strong>, <strong><code>is_attachment()</code></strong>, <strong><code>is_feed()</code></strong>, <strong><code>is_archive()</code></strong>, <strong><code>is_search()</code></strong>, <strong><code>is_category(ID|slug|{slug,ID})</code></strong>, <strong><code>is_tax(taxonomy,term)</code></strong>, <strong><code>is_tag(slug|{slug,slug})"</code></strong>, <strong><code>has_tag(slug|{slug,slug})"</code></strong>, <strong><code>is_author(ID|slug|{slug,ID})</code></strong>, <strong><code>is_date()</code></strong>, <strong><code>is_day()</code></strong>, <strong><code>is_month()</code></strong>, <strong><code>is_time()</code></strong>, <strong><code>is_year()</code></strong>, <strong><code>is_sticky(ID)</code></strong>, <strong><code>is_paged()</code></strong>, <strong><code>is_preview()</code></strong>, <strong><code>is_comments_popup()</code></strong>, <strong><code>in_the_loop()</code></strong>, <strong><code>comments_open()</code></strong>, <strong><code>pings_open()</code></strong>, <strong><code>has_excerpt(ID)</code></strong>, <strong><code>has_post_thumbnail(ID)</code></strong>.</em></p>' . "\n";
|
132 |
|
133 |
echo '<p><em><strong>Passing arguments into a Simple Conditional:</strong></em></p>' . "\n";
|
134 |
+
echo '<p><em>1. True/false → ex: <code>current_user_can()</code> / <code>!current_user_can()</code><br />2. False explicitly → ex: <code>current_user_cannot()</code><br />3. Passing an ID → ex: <code>is_page(24)</code><br />4. Passing a Slug → ex: <code>is_page(my-cool-page)</code><br />5. Passing an Array → ex: <code>is_page({my-cool-page,24,about,contact-form})</code></em></p>' . "\n";
|
135 |
echo '<p><em>*Tip: do NOT use spaces inside Conditionals.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_page(My Membership Options Page)</code><br />- use slugs or IDs instead, no spaces.</em></p>' . "\n";
|
136 |
|
137 |
echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
|
159 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
160 |
|
161 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
162 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
163 |
|
164 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
165 |
|
212 |
|
213 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
214 |
|
215 |
+
echo '<p><em><strong>s2Member supports ALL <a href="http://s2member.com/r/wordpress-conditional-tags/" target="_blank" rel="external">Conditional Tags</a> in WordPress.</strong> Including, but not limited to: <strong><code>is_user_logged_in()</code></strong>, <strong><code>is_user_not_logged_in()</code></strong>, <strong><code>user_is(user_id, role)</code></strong>, <strong><code>user_is_not(user_id, role)</code></strong>, <strong><code>user_can(user_id, capability)</code></strong>, <strong><code>user_cannot(user_id, capability)</code></strong>, <strong><code>current_user_is(role)</code></strong>, <strong><code>current_user_is_not(role)</code></strong>, <strong><code>current_user_can(capability)</code></strong>, <strong><code>current_user_cannot(capability)</code></strong>, <strong><code>current_user_is_for_blog(blog_id,role)</code></strong>, <strong><code>current_user_is_not_for_blog(blog_id,role)</code></strong>, <strong><code>current_user_can_for_blog(blog_id,capability)</code></strong>, <strong><code>current_user_cannot_for_blog(blog_id,capability)</code></strong>, <strong><code>is_multisite()</code></strong>, <strong><code>is_main_site()</code></strong>, <strong><code>is_super_admin()</code></strong>, <strong><code>is_admin()</code></strong>, <strong><code>is_blog_admin()</code></strong>, <strong><code>is_user_admin()</code></strong>, <strong><code>is_network_admin()</code></strong>, <strong><code>is_404()</code></strong>, <strong><code>is_home()</code></strong>, <strong><code>is_front_page()</code></strong>, <strong><code>is_comments_popup()</code></strong>, <strong><code>is_singular(ID|slug|{slug,ID})"</code></strong>, <strong><code>is_single(ID|slug|{slug,ID})</code></strong>, <strong><code>is_page(ID|slug|{slug,ID})</code></strong>, <strong><code>is_page_template(file.php)</code></strong>, <strong><code>is_attachment()</code></strong>, <strong><code>is_feed()</code></strong>, <strong><code>is_trackback()</code></strong>, <strong><code>is_archive()</code></strong>, <strong><code>is_search()</code></strong>, <strong><code>is_category(ID|slug|{slug,ID})</code></strong>, <strong><code>is_tax(taxonomy,term)</code></strong>, <strong><code>is_tag(slug|{slug,slug})"</code></strong>, <strong><code>has_tag(slug|{slug,slug})"</code></strong>, <strong><code>is_author(ID|slug|{slug,ID})</code></strong>, <strong><code>is_date()</code></strong>, <strong><code>is_day()</code></strong>, <strong><code>is_month()</code></strong>, <strong><code>is_time()</code></strong>, <strong><code>is_year()</code></strong>, <strong><code>is_sticky(ID)</code></strong>, <strong><code>is_paged()</code></strong>, <strong><code>is_preview()</code></strong>, <strong><code>is_comments_popup()</code></strong>, <strong><code>in_the_loop()</code></strong>, <strong><code>comments_open()</code></strong>, <strong><code>pings_open()</code></strong>, <strong><code>has_excerpt(ID)</code></strong>, <strong><code>has_post_thumbnail(ID)</code></strong>, <strong><code>is_active_sidebar(ID|number)</code></strong>.</em></p>' . "\n";
|
216 |
|
217 |
echo '<p><em><strong>Passing arguments into a Simple Conditional:</strong></em></p>' . "\n";
|
218 |
+
echo '<p><em>1. True/false → ex: <code>current_user_can()</code> / <code>!current_user_can()</code><br />2. False explicitly → ex: <code>current_user_cannot()</code><br />3. Passing an ID → ex: <code>is_page(24)</code><br />4. Passing a Slug → ex: <code>is_page(my-cool-page)</code><br />5. Passing an Array → ex: <code>is_page({my-cool-page,24,about,contact-form})</code></em></p>' . "\n";
|
219 |
echo '<p><em>*Tip: do NOT use spaces inside Conditionals.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_page(My Membership Options Page)</code><br />- use slugs or IDs instead, no spaces.</em></p>' . "\n";
|
220 |
|
221 |
echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
|
241 |
|
242 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-advanced-way-section">' . "\n";
|
243 |
echo '<h3>The Advanced Way (some PHP scripting required)</h3>' . "\n";
|
244 |
+
echo '<p>In an effort to give you even more control over access restrictions, s2Member makes some PHP functions, and also some PHP Constants, available to you from within WordPress. In this section, we\'ll demonstrate several functions: <strong><code>is_user_logged_in()</code></strong>, <strong><code>is_user_not_logged_in()</code></strong>, <strong><code>user_is(user_id, role)</code></strong>, <strong><code>user_is_not(user_id, role)</code></strong>, <strong><code>user_can(user_id, capability)</code></strong>, <strong><code>user_cannot(user_id, capability)</code></strong>, <strong><code>current_user_is("role")</code></strong>, <strong><code>current_user_is_not("role")</code></strong>, <strong><code>current_user_can("capability")</code></strong>, <strong><code>current_user_cannot("capability")</code></strong>, <strong><code>current_user_is_for_blog($blog_id,"role")</code></strong>, <strong><code>current_user_is_not_for_blog($blog_id,"role")</code></strong>, <strong><code>current_user_can_for_blog($blog_id,"capability")</code></strong>, & <strong><code>current_user_cannot_for_blog($blog_id,"capability")</code></strong>. To make use of these functions, please follow our PHP code samples below. Using PHP, is a very powerful way to build Advanced Conditionals within your content; based on a Member\'s Level, Custom Capabilities, and/or other factors. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://s2member.com/r/ezphp/" target="_blank" rel="external">ezPHP</a>).</p>' . "\n";
|
245 |
echo '<p>See also this related KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">s2Member Simple Shortcode Conditionals</a></p>' . "\n";
|
246 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_advanced_way", get_defined_vars ());
|
247 |
|
248 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
249 |
|
250 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
251 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
252 |
|
253 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
254 |
|
317 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
318 |
|
319 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
320 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
321 |
|
322 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
323 |
|
364 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capabilities-section">' . "\n";
|
365 |
echo '<h3>Packaging Together Custom Capabilities w/ Membership</h3>' . "\n";
|
366 |
echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/_F91xzrmq-Q" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>' . "\n";
|
367 |
+
echo '<p>Using one of s2Member\'s Payment Button and/or Form Generators, you can add Custom Capabilities in comma-delimited format. s2Member builds upon existing functionality offered by <a href="http://s2member.com/r/wordpress-rolescaps/" target="_blank" rel="external">WordPress Roles/Capabilities</a>. s2Member supports Free Subscribers <em>(at Level #0)</em>, and several Primary Roles created by the s2Member plugin <em>(i.e., s2Member Levels 1-4, or up to the number of configured Levels)</em>. Each s2Member Level <em>(aka: s2Member Role)</em> provides the Capability <code>current_user_can("access_s2member_level0"), 1, 2, 3, 4</code>, where <code>access_s2member_level[0-4]</code> is the Capability associated with each Role; and Membership Levels provide incremental access <em>(i.e., Level #4 Members can also access content at Levels 0, 1, 2, and 3 beneath them)</em>. In short, these Level-based permissions are the default Capabilities that come with each Membership Level being sold on your site.</p>' . "\n";
|
368 |
echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button & Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
|
369 |
echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
|
370 |
echo '<p>Custom Capabilities are always prepended with <code>access_s2member_ccap_</code>. You fill in the last part, with ONLY lowercase alpha-numerics and/or underscores. For example, let\'s say you want to sell Membership Level #1, as is. But, you also want to sell a slight variation of Membership Level #1, that includes the ability to access the Music & Video sections of your site. So, instead of selling this additional access under a whole new Membership Level, you could just sell a modified version of Membership Level #1. Add the the Custom Capabilities: <code>music,videos</code>. Once a Member has these Capabilities, you can test for these Capabilities using <code>current_user_can("access_s2member_ccap_music")</code> and <code>current_user_can("access_s2member_ccap_videos")</code>.</p>' . "\n";
|
379 |
|
380 |
echo '<p><strong>New:</strong> In the latest versions of s2Member, you can automatically require certain Custom Capabilities on a per Post/Page basis. So now, s2Member <em>(if you prefer)</em> CAN handle Custom Capabilities for you automatically! Whenever you edit a Post/Page <em>(i.e., there is a Meta Box for s2Member in your Post/Page editing station)</em>... you can tell s2Member to require certain Custom Capabilities that you type in, using comma-delimited format. In other words, you will need to type in some of the trigger words that you used whenever you created your Payment Buttons/Forms. This way paying Members will have the Custom Capabilities to view different kinds of content that you offer.</p>' . "\n";
|
381 |
echo '<p><strong>New:</strong> By default, a Checkout Button or Form generated by s2Member is designed to (Add) Custom Capabilities to any that may or may not already exist for a particular User/Member. However, starting with s2Member v110815+, you can tell s2Member to (Remove All) Custom Capabilities, and then (Add) only the new ones that you specify. This is accomplished on a per Form/Button basis by preceding your comma-delimited list of Custom Capabilities with `-all`. For further details on this topic, click the <a href="#" onclick="alert(\'*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell s2Member to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> icon next to the Custom Capabilities field in any Button/Form Generator supplied by s2Member.</p>' . "\n";
|
382 |
+
echo '<p><strong>New:</strong> Independent Custom Capabilities. You can now sell one or more Custom Capabilities using Buy Now functionality, to "existing" Users/Members, regardless of which Membership Level they have on your site <em>(i.e., you could even sell Independent Custom Capabilities to Users at Membership Level #0, normally referred to as Free Subscribers, if you like)</em>. So this is quite flexible. For further details, please check your Dashboard, under: <strong>s2Member → PayPal Buttons → Capability (Buy Now) Buttons</strong>.</p>' . "\n";
|
383 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_custom_capabilities", get_defined_vars ());
|
384 |
|
385 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
386 |
|
387 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
388 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.<br />' . "\n";
|
389 |
+
echo '<strong>See Also:</strong> <a href="http://s2member.com/r/enhanced-capability-manager/" target="_blank" rel="external">Plugins → Enhanced Capability Manager</a> <em>(may come in handy for some)</em>.</p>' . "\n";
|
390 |
|
391 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
392 |
|
410 |
|
411 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">' . "\n";
|
412 |
echo '<h3>Restricting Files, Based On Custom Capabilities</h3>' . "\n";
|
413 |
+
echo '<p>If you\'re NOT familiar with Custom Capabilities yet, please read the section above, titled: <code>Custom Capability Packages</code>, and also see: <strong>s2Member → Download Options</strong>, both as primers; BEFORE you read this section. Once you understand the basic concept of Custom Capabilities & Protected File Downloads, you\'ll see that (by default) s2Member does NOT handle File Download Protection with respect to Custom Capabilities. That\'s where Custom Capability Sub-directories come in.</p>' . "\n";
|
414 |
echo '<p>You can create Custom Capability Sub-directories under: <code>' . esc_html (c_ws_plugin__s2member_utils_dirs::doc_root_path ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])) . '</code>. For instance, if you have a Custom Capability <code>music</code>, you can place protected files that should ONLY be accessible to Members with <code>access_s2member_ccap_music</code>, inside: <code>/' . esc_html (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])) . '/access-s2member-ccap-music/</code>. Some examples are provided below.</p>' . "\n";
|
415 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_custom_capability_files", get_defined_vars ());
|
416 |
|
417 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
418 |
|
419 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
420 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
421 |
|
422 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
423 |
|
451 |
|
452 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-advanced-dripping-section">' . "\n";
|
453 |
echo '<h3>Dripping Content (some PHP scripting may be required)</h3>' . "\n";
|
454 |
+
echo '<p>Content Dripping is the gradual, pre-scheduled release of premium website content to paying Members. This has become increasingly popular, because it allows older Members; those who have paid you more, due to recurring charges; to acquire access to more content progressively; based on their original paid registration time. It also gives you (as the site owner), the ability to launch multiple membership site portals, operating on autopilot, without any direct day-to-day involvement in a content release process. <strong>The <a href="http://www.s2member.com/kb/s2drip-shortcode/" target="_blank" rel="external"><code>[s2Drip]</code> shortcode</a> is the easiest way to drip content.</strong> The other methods (shown below) require some PHP scripting. In order to use PHP scripting inside your Posts/Pages, you\'ll need to install this handy plugin (<a href="http://s2member.com/r/ezphp/" target="_blank" rel="external">ezPHP</a>).</p>' . "\n";
|
455 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_advanced_dripping", get_defined_vars ());
|
456 |
|
457 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
458 |
|
459 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
460 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
461 |
|
462 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
463 |
|
630 |
|
631 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
632 |
|
633 |
+
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_URL</strong><br />This is the full URL to the Login Welcome Page (the User\'s account page). * This could also be the full URL to a Special Redirection URL (if you configured one). See <strong>s2Member → General Options → Login Welcome Page</strong>.</p>' . "\n";
|
634 |
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_ID</strong><br />This is the Page ID that was used to generate the full URL. * In the case of a Special Redirection URL, this ID is not really applicable.</p>' . "\n";
|
635 |
|
636 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
729 |
|
730 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
731 |
|
732 |
+
echo '<p>Before you read any further, you should install this handy plugin: <a href="http://s2member.com/r/ezphp/" target="_blank" rel="external">ezPHP</a>.<br />' . "\n";
|
733 |
echo 'You\'ll need to have this plugin installed to use PHP code in Posts/Pages.</p>' . "\n";
|
734 |
|
735 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
736 |
|
737 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
738 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
739 |
|
740 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
741 |
|
901 |
|
902 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
903 |
|
904 |
+
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_URL</strong><br />This is the full URL to the Login Welcome Page (the User\'s account page). * This could also be the full URL to a Special Redirection URL (if you configured one). See <strong>s2Member → General Options → Login Welcome Page</strong>.</p>' . "\n";
|
905 |
echo '<p><strong>S2MEMBER_LOGIN_WELCOME_PAGE_ID</strong><br />This is the Page ID that was used to generate the full URL. * In the case of a Special Redirection URL, this ID is not really applicable.</p>' . "\n";
|
906 |
echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/login-welcome-page-url.x-php")) . '</p>' . "\n";
|
907 |
|
1084 |
|
1085 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-api-hooks-section">' . "\n";
|
1086 |
echo '<h3>WP Hooks For Theme/Plugin Developers (scripting required)</h3>' . "\n";
|
1087 |
+
echo '<p>In addition to its API Constants, s2Member also makes several Hooks/Filters available throughout its framework. This makes it possible to build onto <em>(or even modify)</em> s2Member in lots of different ways. If you need to add custom processing routines, modify the behavior of existing processing routines, or tinker with things otherwise; you should use API Hooks/Filters. API Hooks & Filters, give you the ability to "hook into", and/or "filter" processing routines, with files/functions of your own; instead of editing the s2Member plugin files directly. If you don\'t use a Hook/Filter, and instead, you edit the plugin files for s2Member, you\'ll have to merge all of your changes every time a new version of s2Member is released. If you create custom processing routines, you could place those routines into a PHP file here: <code>/wp-content/mu-plugins/s2-hacks.php</code>. If you don\'t have an <code>/mu-plugins/</code> directory, please create one. These are <em>(mu)</em> <a href="http://s2member.com/r/mu-plugins/" target="_blank" rel="external">MUST USE plugins</a>, which are loaded into WordPress automatically; that\'s what you want!</p>' . "\n";
|
1088 |
echo '<p><strong>Attn Developers:</strong> There are simply too many Hooks/Filters spread throughout s2Member\'s framework <em>(over 1000 total)</em>. Rather than documenting each Hook/Filter, it is easier to browse through the files inside: <code>/s2member/includes/classes/</code>. Inspecting Hooks/Filters in this way, also leads you to a better understanding of how they work. One way to save time, is to run a search for <code>do_action</code> and/or <code>apply_filters</code>. If you\'re new to the concept of Hooks/Filters for WordPress/s2Member, we suggest <a href="http://www.s2member.com/codex/#src_doc_overview_description" target="_blank" rel="external">this article</a> as a primer. The <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a> also contains information about all Hooks/Filters that come with s2Member.</p>' . "\n";
|
1089 |
do_action("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_hooks", get_defined_vars ());
|
1090 |
|
1091 |
echo '<div class="ws-menu-page-hr"></div>' . "\n";
|
1092 |
|
1093 |
echo '<p><strong>TIP:</strong> In addition to this documentation, you may also want to have a look at the <a href="http://www.s2member.com/codex/" target="_blank" rel="external">s2Member Codex</a>.<br />' . "\n";
|
1094 |
+
echo '<strong>See Also:</strong> <a href="http://www.s2member.com/codex/stable/s2member/api_constants/package-summary/" target="_blank" rel="external">s2Member Codex → API Constants</a>, and <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex → API Functions</a>.</p>' . "\n";
|
1095 |
echo '</div>' . "\n";
|
1096 |
|
1097 |
echo '</div>' . "\n";
|
1117 |
}
|
1118 |
|
1119 |
new c_ws_plugin__s2member_menu_page_scripting ();
|
|
includes/menu-pages/start.inc.php
CHANGED
@@ -94,11 +94,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
94 |
|
95 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-login-reg-form-section">' . "\n";
|
96 |
echo '<h3>Your Login/Registration Form (already built-in)</h3>' . "\n";
|
97 |
-
echo '<p>s2Member uses the existing WordPress Login/Registration system. This is the same Login/Registration Form that you use to access your WP Dashboard. However, with s2Member installed, your Login/Registration Forms can be customized <em>(i.e., re-branded)</em>. <em>See: <strong>s2Member
|
98 |
echo '<p>Since s2Member uses the default Login/Registration system for WordPress, s2Member is also compatible with themes and other plugins <em>(such as BuddyPress)</em>. If your theme has a login form built-in already, chances are, it\'s perfectly compatible with s2Member. There are also many plugins available that are designed to place login forms into your Sidebar; and many of those are also compatible with s2Member\'s integration. If you have any trouble, please check the <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank" rel="external">s2Member Forums</a> for assistance.</p>' . "\n";
|
99 |
echo ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && is_main_site ()) || c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<div class="ws-menu-page-hr"></div>' . "\n" : '';
|
100 |
-
echo (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && is_main_site ()) ? '<p><em>The Main Site of a Multisite Blog Farm uses a different Registration Form. See: <strong>s2Member
|
101 |
-
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form. See: <strong>s2Member
|
102 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_log_reg_form", get_defined_vars ());
|
103 |
echo '</div>' . "\n";
|
104 |
|
@@ -117,7 +117,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
117 |
echo '<h3>Your Login Welcome Page (you create this in WordPress)</h3>' . "\n";
|
118 |
echo '<p>You create this special Page in WordPress. This is a "Page" not a Post. This is the first page Members will see after logging into your site.</p>' . "\n";
|
119 |
echo '<p>You should go ahead and create an empty Page now, before you start configuring everything. Title it: <code>My Login Welcome Page</code>, and click Publish.</p>' . "\n";
|
120 |
-
echo '<p>Once you have all of your <strong>s2Member
|
121 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/customizing-your-lwp/" target="_blank" rel="external">Customizing Your Login Welcome Page</a>.</p>'."\n" : '';
|
122 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_login_welcome_page", get_defined_vars ());
|
123 |
echo '</div>' . "\n";
|
@@ -137,7 +137,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
137 |
echo '<h3>Your Membership Options Page (you create this in WordPress)</h3>' . "\n";
|
138 |
echo '<p>You create this special Page in WordPress. This is a "Page" not a Post. s2Member comes with a PayPal Button Generator. You will generate PayPal Buttons with s2Member, for each Membership Level that you plan to offer. Those buttons will be inserted into your Membership Options Page. If a User in the general public attempts to access an area of your site that is being protected by s2Member <em>(based on your configuration)</em>, s2Member will redirect the User to your Membership Options Page, where they can signup through PayPal and become a Member.</p>' . "\n";
|
139 |
echo '<p>You should go ahead and create an empty Page now, before you start configuring everything. Title it: <code>My Membership Options Page</code>, and click Publish.</p>' . "\n";
|
140 |
-
echo '<p>Once you have all of your <strong>s2Member
|
141 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_membership_options_page", get_defined_vars ());
|
142 |
echo '</div>' . "\n";
|
143 |
|
@@ -150,11 +150,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
150 |
{
|
151 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_before_general_options", get_defined_vars ());
|
152 |
|
153 |
-
echo '<div class="ws-menu-page-group" title="Your s2Member
|
154 |
|
155 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-general-options-section">' . "\n";
|
156 |
-
echo '<h3>Your s2Member
|
157 |
-
echo '<p>Once you have a Login Welcome Page, and a Membership Options Page. Go to: <strong>s2Member
|
158 |
echo '<p>From your s2Member General Options Panel you can setup the basics of your Membership offering. Including the design of your Login/Registration Form, any Custom Registration/Profile Fields you\'d like to create, Labels for each Membership Level, Open Registration (on/off), a Profile Editing Panel for Members, and more.</p>' . "\n";
|
159 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_general_options", get_defined_vars ());
|
160 |
echo '</div>' . "\n";
|
@@ -168,13 +168,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
168 |
{
|
169 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_before_restriction_options", get_defined_vars ());
|
170 |
|
171 |
-
echo '<div class="ws-menu-page-group" title="Your s2Member
|
172 |
|
173 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-restriction-options-section">' . "\n";
|
174 |
-
echo '<h3>Your s2Member
|
175 |
-
echo '<p>Once you have a Login Welcome Page, and a Membership Options Page. Go to: <strong>s2Member
|
176 |
echo '<p>From your s2Member Restriction Options Panel you may restrict access to certain Posts, Pages, Tags, Categories, and/or URIs based on a Member\'s Level. The s2Member Options Panel makes it easy for you. All you do is type in the basics of what you want to restrict access to, and those sections of your site will be off limits to non-Members.</p>' . "\n";
|
177 |
-
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p>That being said, there are times when you might need to have greater control over which portions of your site can be viewed by non-Members, or Members at different Levels. This is where API Scripting with Conditionals comes in. <em>For more information, please check your Dashboard here: <strong>s2Member
|
178 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
179 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_restriction_options", get_defined_vars ());
|
180 |
echo '</div>' . "\n";
|
@@ -193,7 +193,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
193 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-automation-process-section">' . "\n";
|
194 |
echo '<h3>Subscription Cancellations / Expirations / Terminations</h3>' . "\n";
|
195 |
echo '<p>You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations <em>(e.g., refunds & chargebacks)</em> for you automatically. If you log into your PayPal account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal IPN service that runs silently behind-the-scene.</p>' . "\n";
|
196 |
-
echo '<p>The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal, s2Member will be notified; and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically <em>(based on your configuration)</em>. The communication from PayPal
|
197 |
echo '<p><em><strong>Some Hairy Details:</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT (End Of Term) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs; which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
|
198 |
echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system (based on your configuration). s2Member also calculates one extra day (24 hours) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
|
199 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_automation_process", get_defined_vars ());
|
@@ -243,8 +243,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
243 |
echo '<h3>Registration Before Checkout? (reversing the process)</h3>' . "\n";
|
244 |
echo '<p>By default, s2Member will send a Customer directly to PayPal, and only after checkout is completed does the Customer have the ability to register a Username/Password for access to your site. This process works very well in most cases, and it has the benefit of increasing conversion rates; because there are fewer obstacles for the Customer on their way to the actual checkout process at PayPal.</p>' . "\n";
|
245 |
echo '<p>That being said, we believe the <em>ideal</em> approach is a <em>combined Checkout/Registration process</em>; in just one simple step <em>(available with <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Add-on / Prices")) . '" target="_blank" rel="external">s2Member Pro</a> using Stripe™ (most popular), PayPal Pro integration, or through Authorize.Net integration)</em>. However, even with PayPal Standard Buttons, there is a way to accomplish Registration Before Checkout, thereby reversing the process—if you prefer it that way.</p>'."\n";
|
246 |
-
echo '<p>With PayPal Standard Buttons, Registration before Checkout is accomplished by turning Open Registration <code>(on)</code>, and then making a PayPal Button available to Free Subscribers at Level #0. In other words, you can let Visitors register for free at Level #0 <em>(where they have access to very little perhaps)</em>, and then charge them for access to higher Member Levels [1-4]. For further details, please check your WordPress Dashboard here: <strong>s2Member
|
247 |
-
echo '<p><em>s2Member\'s Simple Conditionals can help you further integrate this process, by allowing you to integrate a special PayPal Button on your Login Welcome Page; one that will be seen only by Free Subscribers at Level #0. Please check your WordPress Dashboard under: <strong>s2Member
|
248 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
249 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_reg_before_checkout", get_defined_vars ());
|
250 |
echo '</div>' . "\n";
|
@@ -341,4 +341,3 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
|
|
341 |
}
|
342 |
|
343 |
new c_ws_plugin__s2member_menu_page_start ();
|
344 |
-
?>
|
94 |
|
95 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-login-reg-form-section">' . "\n";
|
96 |
echo '<h3>Your Login/Registration Form (already built-in)</h3>' . "\n";
|
97 |
+
echo '<p>s2Member uses the existing WordPress Login/Registration system. This is the same Login/Registration Form that you use to access your WP Dashboard. However, with s2Member installed, your Login/Registration Forms can be customized <em>(i.e., re-branded)</em>. <em>See: <strong>s2Member → General Options → Login/Registration Design</strong>.</em> You can make the default Login/Registration Forms match your WordPress theme design; by changing the background color/image, your logo image, add Custom Fields, and more<em>!</em></p>' . "\n";
|
98 |
echo '<p>Since s2Member uses the default Login/Registration system for WordPress, s2Member is also compatible with themes and other plugins <em>(such as BuddyPress)</em>. If your theme has a login form built-in already, chances are, it\'s perfectly compatible with s2Member. There are also many plugins available that are designed to place login forms into your Sidebar; and many of those are also compatible with s2Member\'s integration. If you have any trouble, please check the <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank" rel="external">s2Member Forums</a> for assistance.</p>' . "\n";
|
99 |
echo ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && is_main_site ()) || c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<div class="ws-menu-page-hr"></div>' . "\n" : '';
|
100 |
+
echo (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && is_main_site ()) ? '<p><em>The Main Site of a Multisite Blog Farm uses a different Registration Form. See: <strong>s2Member → General Options → Registration/Profile Fields</strong>.</em></p>' . "\n" : '';
|
101 |
+
echo (c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form. See: <strong>s2Member → General Options → Registration/Profile Fields</strong>.</em></p>' . "\n" : '';
|
102 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_log_reg_form", get_defined_vars ());
|
103 |
echo '</div>' . "\n";
|
104 |
|
117 |
echo '<h3>Your Login Welcome Page (you create this in WordPress)</h3>' . "\n";
|
118 |
echo '<p>You create this special Page in WordPress. This is a "Page" not a Post. This is the first page Members will see after logging into your site.</p>' . "\n";
|
119 |
echo '<p>You should go ahead and create an empty Page now, before you start configuring everything. Title it: <code>My Login Welcome Page</code>, and click Publish.</p>' . "\n";
|
120 |
+
echo '<p>Once you have all of your <strong>s2Member → General Options</strong> configured, and once you have a basic understanding of how s2Member works, go back and customize the title and content for this Page. You\'ll want to be creative with your Login Welcome Page. However, you should configure your <strong>s2Member → General Options</strong> first, and test things out. That way you\'ll understand why this Page is important.</p>' . "\n";
|
121 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/customizing-your-lwp/" target="_blank" rel="external">Customizing Your Login Welcome Page</a>.</p>'."\n" : '';
|
122 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_login_welcome_page", get_defined_vars ());
|
123 |
echo '</div>' . "\n";
|
137 |
echo '<h3>Your Membership Options Page (you create this in WordPress)</h3>' . "\n";
|
138 |
echo '<p>You create this special Page in WordPress. This is a "Page" not a Post. s2Member comes with a PayPal Button Generator. You will generate PayPal Buttons with s2Member, for each Membership Level that you plan to offer. Those buttons will be inserted into your Membership Options Page. If a User in the general public attempts to access an area of your site that is being protected by s2Member <em>(based on your configuration)</em>, s2Member will redirect the User to your Membership Options Page, where they can signup through PayPal and become a Member.</p>' . "\n";
|
139 |
echo '<p>You should go ahead and create an empty Page now, before you start configuring everything. Title it: <code>My Membership Options Page</code>, and click Publish.</p>' . "\n";
|
140 |
+
echo '<p>Once you have all of your <strong>s2Member → General Options</strong> configured, and once you have a basic understanding of how s2Member works, go back and customize the title and content for this Page. You\'ll want to be creative with your Membership Options Page. However, you should configure your <strong>s2Member → General Options</strong> first, and test things out. That way you\'ll understand why this Page is important.</p>' . "\n";
|
141 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_membership_options_page", get_defined_vars ());
|
142 |
echo '</div>' . "\n";
|
143 |
|
150 |
{
|
151 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_before_general_options", get_defined_vars ());
|
152 |
|
153 |
+
echo '<div class="ws-menu-page-group" title="Your s2Member → General Options">' . "\n";
|
154 |
|
155 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-general-options-section">' . "\n";
|
156 |
+
echo '<h3>Your s2Member → General Options (Basic Configuration)</h3>' . "\n";
|
157 |
+
echo '<p>Once you have a Login Welcome Page, and a Membership Options Page. Go to: <strong>s2Member → General Options</strong>.</p>' . "\n";
|
158 |
echo '<p>From your s2Member General Options Panel you can setup the basics of your Membership offering. Including the design of your Login/Registration Form, any Custom Registration/Profile Fields you\'d like to create, Labels for each Membership Level, Open Registration (on/off), a Profile Editing Panel for Members, and more.</p>' . "\n";
|
159 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_general_options", get_defined_vars ());
|
160 |
echo '</div>' . "\n";
|
168 |
{
|
169 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_before_restriction_options", get_defined_vars ());
|
170 |
|
171 |
+
echo '<div class="ws-menu-page-group" title="Your s2Member → Restriction Options">' . "\n";
|
172 |
|
173 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-restriction-options-section">' . "\n";
|
174 |
+
echo '<h3>Your s2Member → Restriction Options (Basic Configuration)</h3>' . "\n";
|
175 |
+
echo '<p>Once you have a Login Welcome Page, and a Membership Options Page. Go to: <strong>s2Member → Restriction Options</strong>.</p>' . "\n";
|
176 |
echo '<p>From your s2Member Restriction Options Panel you may restrict access to certain Posts, Pages, Tags, Categories, and/or URIs based on a Member\'s Level. The s2Member Options Panel makes it easy for you. All you do is type in the basics of what you want to restrict access to, and those sections of your site will be off limits to non-Members.</p>' . "\n";
|
177 |
+
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p>That being said, there are times when you might need to have greater control over which portions of your site can be viewed by non-Members, or Members at different Levels. This is where API Scripting with Conditionals comes in. <em>For more information, please check your Dashboard here: <strong>s2Member → API Scripting</strong></em>.</p>' . "\n" : '';
|
178 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
179 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_restriction_options", get_defined_vars ());
|
180 |
echo '</div>' . "\n";
|
193 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-automation-process-section">' . "\n";
|
194 |
echo '<h3>Subscription Cancellations / Expirations / Terminations</h3>' . "\n";
|
195 |
echo '<p>You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations <em>(e.g., refunds & chargebacks)</em> for you automatically. If you log into your PayPal account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal IPN service that runs silently behind-the-scene.</p>' . "\n";
|
196 |
+
echo '<p>The PayPal IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds & chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal, s2Member will be notified; and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically <em>(based on your configuration)</em>. The communication from PayPal → s2Member is seamless.</p>' . "\n";
|
197 |
echo '<p><em><strong>Some Hairy Details:</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT (End Of Term) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs; which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
|
198 |
echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system (based on your configuration). s2Member also calculates one extra day (24 hours) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
|
199 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_automation_process", get_defined_vars ());
|
243 |
echo '<h3>Registration Before Checkout? (reversing the process)</h3>' . "\n";
|
244 |
echo '<p>By default, s2Member will send a Customer directly to PayPal, and only after checkout is completed does the Customer have the ability to register a Username/Password for access to your site. This process works very well in most cases, and it has the benefit of increasing conversion rates; because there are fewer obstacles for the Customer on their way to the actual checkout process at PayPal.</p>' . "\n";
|
245 |
echo '<p>That being said, we believe the <em>ideal</em> approach is a <em>combined Checkout/Registration process</em>; in just one simple step <em>(available with <a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Add-on / Prices")) . '" target="_blank" rel="external">s2Member Pro</a> using Stripe™ (most popular), PayPal Pro integration, or through Authorize.Net integration)</em>. However, even with PayPal Standard Buttons, there is a way to accomplish Registration Before Checkout, thereby reversing the process—if you prefer it that way.</p>'."\n";
|
246 |
+
echo '<p>With PayPal Standard Buttons, Registration before Checkout is accomplished by turning Open Registration <code>(on)</code>, and then making a PayPal Button available to Free Subscribers at Level #0. In other words, you can let Visitors register for free at Level #0 <em>(where they have access to very little perhaps)</em>, and then charge them for access to higher Member Levels [1-4]. For further details, please check your WordPress Dashboard here: <strong>s2Member → General Options → Open Registration</strong>.</p>' . "\n";
|
247 |
+
echo '<p><em>s2Member\'s Simple Conditionals can help you further integrate this process, by allowing you to integrate a special PayPal Button on your Login Welcome Page; one that will be seen only by Free Subscribers at Level #0. Please check your WordPress Dashboard under: <strong>s2Member → API Scripting → Simple Conditionals</strong>. We also suggest reading over the documentation on PayPal Modification Buttons. See: <strong>s2Member → PayPal Buttons → Subscription Modifications</strong>.</em></p>' . "\n";
|
248 |
echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/simple-shortcode-conditionals/" target="_blank" rel="external">Simple Shortcode Conditionals</a>.</p>'."\n" : '';
|
249 |
do_action("ws_plugin__s2member_during_start_page_during_left_sections_during_reg_before_checkout", get_defined_vars ());
|
250 |
echo '</div>' . "\n";
|
341 |
}
|
342 |
|
343 |
new c_ws_plugin__s2member_menu_page_start ();
|
|
includes/menu-pages/trk-ops.inc.php
CHANGED
@@ -61,7 +61,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
61 |
echo '<p>s2Member will display your Signup Tracking Codes in one of four possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Registration Form; after returning from your Payment Gateway. <em>Note. If you offer a 100% free Trial Period, Tracking Codes will be displayed in location #2 when using PayPal Standard Button integration.</em> <strong>3.</strong> Otherwise, if possible, on the Login Form after Registration is completed. <strong>4.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s very first login.</p>'."\n";
|
62 |
echo '<p>Signup Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Non-Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators.</p>'."\n";
|
63 |
echo '<p>Signup Tracking Codes will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all (i.e., they simply register on-site; and there is no checkout whatsoever). Signup Tracking Codes will NOT be processed when an "existing" User/Member pays for a new Subscription <em>(see: Modification Tracking Codes for that scenario)</em>.'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' And, Signup Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>(see: Capability Tracking Codes for that scenario)</em>.').'</p>'."\n";
|
64 |
-
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member
|
65 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_signup_tracking", get_defined_vars());
|
66 |
|
67 |
echo '<table class="form-table">'."\n";
|
@@ -127,7 +127,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
127 |
echo '</table>'."\n";
|
128 |
|
129 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
130 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
131 |
echo '</div>'."\n";
|
132 |
|
133 |
echo '</div>'."\n";
|
@@ -148,7 +148,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
148 |
echo '<p>s2Member will display your Modification Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>(i.e., when the Customer is asked to log back in)</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s next login.</p>'."\n";
|
149 |
echo '<p>Modification Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Non-Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators.</p>'."\n";
|
150 |
echo '<p>Modification Tracking Codes will NOT be processed when a "new" User/Member signs up <em>(see: Signup Tracking Codes for that scenario)</em>.'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' And, Modification Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>(see: Capability Tracking Codes for that scenario)</em>.').'</p>'."\n";
|
151 |
-
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member
|
152 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_modification_tracking", get_defined_vars());
|
153 |
|
154 |
echo '<table class="form-table">'."\n";
|
@@ -209,7 +209,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
209 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
210 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
211 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
212 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
213 |
echo '</ul>'."\n";
|
214 |
|
215 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -228,7 +228,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
228 |
echo '</table>'."\n";
|
229 |
|
230 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
231 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
232 |
echo '</div>'."\n";
|
233 |
|
234 |
echo '</div>'."\n";
|
@@ -246,7 +246,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
246 |
echo '<h3>Capability Tracking Codes (optional)</h3>'."\n";
|
247 |
echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' and/or PHP').' code that you enter below, will be loaded up in a web browser, each time Independent Custom Capabilities are purchased. This is marked `Capability`, because Capability Tracking Codes are displayed each time an "existing" User/Member <em>(even if they are/were a Free Subscriber)</em> pays you for Independent Custom Capabilities through a Buy Now transaction. This is the only circumstance in which your Capability Tracking Codes will be displayed.</p>'."\n";
|
248 |
echo '<p>s2Member will display your Capability Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>(i.e., when the Customer is asked to log back in)</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s next login.</p>'."\n";
|
249 |
-
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member
|
250 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_ccap_tracking", get_defined_vars());
|
251 |
|
252 |
echo '<table class="form-table">'."\n";
|
@@ -302,7 +302,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
302 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
303 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
304 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
305 |
-
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member
|
306 |
echo '</ul>'."\n";
|
307 |
|
308 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
@@ -321,7 +321,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
321 |
echo '</table>'."\n";
|
322 |
|
323 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
324 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
325 |
echo '</div>'."\n";
|
326 |
|
327 |
echo '</div>'."\n";
|
@@ -338,7 +338,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
338 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-tracking-section">'."\n";
|
339 |
echo '<h3>Tracking Codes For Specific Post/Page Access (optional)</h3>'."\n";
|
340 |
echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' and/or PHP').' code that you enter below, will be loaded up in a web browser, after a Customer completes a successful transaction through your Payment Gateway; specifically for Post/Page Access. These Codes are NOT injected for any type of Membership Level Access'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' or Independent Custom Capabilities').'. These are only for Specific Post/Page transactions. The Tracking Codes that you enter below, will be displayed in one of two possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>.</p>'."\n";
|
341 |
-
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member
|
342 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_sp_tracking", get_defined_vars());
|
343 |
|
344 |
echo '<table class="form-table">'."\n";
|
@@ -399,7 +399,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
399 |
echo '</table>'."\n";
|
400 |
|
401 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
402 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
403 |
echo '</div>'."\n";
|
404 |
|
405 |
echo '</div>'."\n";
|
@@ -422,9 +422,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
422 |
|
423 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-idev-section">'."\n";
|
424 |
echo '<h3>Integrating iDevAffiliate (affiliate program management)</h3>'."\n";
|
425 |
-
echo '<a href="http://www.s2member.com/
|
426 |
-
echo '<p>Adding affiliate tracking software to your site is one of the most effective ways to achieve more sales, more traffic, and more search engine ranking. <a href="http://www.s2member.com/
|
427 |
-
echo '<p>If you choose to <a href="http://www.s2member.com/
|
428 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_idev", get_defined_vars());
|
429 |
|
430 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -452,10 +452,10 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
452 |
|
453 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
454 |
echo '<p>Your <code>profile</code> ID will be assigned by iDevAffiliate. Be sure to replace <code>profile=123</code> with your own profile ID.</p>'."\n";
|
455 |
-
echo '<p><em><strong>Tip:</strong> iDevAffiliate also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member
|
456 |
|
457 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
458 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
459 |
echo '</div>'."\n";
|
460 |
|
461 |
echo '</div>'."\n";
|
@@ -471,9 +471,9 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
471 |
|
472 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shareasale-section">'."\n";
|
473 |
echo '<h3>Integrating ShareASale (affiliate program management)</h3>'."\n";
|
474 |
-
echo '<a href="http://www.s2member.com/shareasale" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/sas-logo.png" class="ws-menu-page-right ws-menu-page-bordered" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
475 |
-
echo '<p>Established in 2000, <a href="http://www.s2member.com/shareasale" target="_blank" rel="external">ShareASale</a> provides award winning technology and service; which will enable you to connect with a network of established affiliates, as well as recruit new ones. Joining ShareASale, maximizes your ability to reach the greatest number of affiliates, with the least amount of work. At ShareASale, you\'ll have access to an existing affiliate-base. You place your site on the market, and let their existing affiliates promote your products/services.</p>'."\n";
|
476 |
-
echo '<p>If you <a href="http://www.s2member.com/shareasale" target="_blank" rel="external">become a Merchant at ShareASale</a>, you will need to configure your <strong>ShareASale
|
477 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_shareasale", get_defined_vars());
|
478 |
|
479 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
@@ -501,10 +501,10 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
501 |
|
502 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
503 |
echo '<p>Your <code>merchantID</code> will be assigned by ShareASale. Be sure to replace <code>merchantID=123</code> with the one they assign you.</p>'."\n";
|
504 |
-
echo '<p><em><strong>Tip:</strong> ShareASale also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member
|
505 |
|
506 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
507 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with ShareASale. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
508 |
echo '</div>'."\n";
|
509 |
|
510 |
echo '</div>'."\n";
|
@@ -525,7 +525,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
|
|
525 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_other_methods", get_defined_vars());
|
526 |
|
527 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
528 |
-
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member
|
529 |
echo '</div>'."\n";
|
530 |
|
531 |
echo '</div>'."\n";
|
61 |
echo '<p>s2Member will display your Signup Tracking Codes in one of four possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Registration Form; after returning from your Payment Gateway. <em>Note. If you offer a 100% free Trial Period, Tracking Codes will be displayed in location #2 when using PayPal Standard Button integration.</em> <strong>3.</strong> Otherwise, if possible, on the Login Form after Registration is completed. <strong>4.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s very first login.</p>'."\n";
|
62 |
echo '<p>Signup Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Non-Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators.</p>'."\n";
|
63 |
echo '<p>Signup Tracking Codes will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all (i.e., they simply register on-site; and there is no checkout whatsoever). Signup Tracking Codes will NOT be processed when an "existing" User/Member pays for a new Subscription <em>(see: Modification Tracking Codes for that scenario)</em>.'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' And, Signup Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>(see: Capability Tracking Codes for that scenario)</em>.').'</p>'."\n";
|
64 |
+
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member → API / Notifications</strong>.</em></p>'."\n";
|
65 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_signup_tracking", get_defined_vars());
|
66 |
|
67 |
echo '<table class="form-table">'."\n";
|
127 |
echo '</table>'."\n";
|
128 |
|
129 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
130 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
131 |
echo '</div>'."\n";
|
132 |
|
133 |
echo '</div>'."\n";
|
148 |
echo '<p>s2Member will display your Modification Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>(i.e., when the Customer is asked to log back in)</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s next login.</p>'."\n";
|
149 |
echo '<p>Modification Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Non-Recurring Subscriptions <em>(with or without a Free Trial Period)</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators.</p>'."\n";
|
150 |
echo '<p>Modification Tracking Codes will NOT be processed when a "new" User/Member signs up <em>(see: Signup Tracking Codes for that scenario)</em>.'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' And, Modification Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>(see: Capability Tracking Codes for that scenario)</em>.').'</p>'."\n";
|
151 |
+
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member → API / Notifications</strong>.</em></p>'."\n";
|
152 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_modification_tracking", get_defined_vars());
|
153 |
|
154 |
echo '<table class="form-table">'."\n";
|
209 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
210 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
211 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
212 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
213 |
echo '</ul>'."\n";
|
214 |
|
215 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
228 |
echo '</table>'."\n";
|
229 |
|
230 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
231 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
232 |
echo '</div>'."\n";
|
233 |
|
234 |
echo '</div>'."\n";
|
246 |
echo '<h3>Capability Tracking Codes (optional)</h3>'."\n";
|
247 |
echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' and/or PHP').' code that you enter below, will be loaded up in a web browser, each time Independent Custom Capabilities are purchased. This is marked `Capability`, because Capability Tracking Codes are displayed each time an "existing" User/Member <em>(even if they are/were a Free Subscriber)</em> pays you for Independent Custom Capabilities through a Buy Now transaction. This is the only circumstance in which your Capability Tracking Codes will be displayed.</p>'."\n";
|
248 |
echo '<p>s2Member will display your Capability Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>(i.e., when the Customer is asked to log back in)</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>; or after the Customer\'s next login.</p>'."\n";
|
249 |
+
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member → API / Notifications</strong>.</em></p>'."\n";
|
250 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_ccap_tracking", get_defined_vars());
|
251 |
|
252 |
echo '<table class="form-table">'."\n";
|
302 |
echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>'."\n";
|
303 |
echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>'."\n";
|
304 |
echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>'."\n";
|
305 |
+
echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> s2Member → General Options → Registration/Profile Fields</em>.</li>'."\n";
|
306 |
echo '</ul>'."\n";
|
307 |
|
308 |
echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
|
321 |
echo '</table>'."\n";
|
322 |
|
323 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
324 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
325 |
echo '</div>'."\n";
|
326 |
|
327 |
echo '</div>'."\n";
|
338 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-tracking-section">'."\n";
|
339 |
echo '<h3>Tracking Codes For Specific Post/Page Access (optional)</h3>'."\n";
|
340 |
echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' and/or PHP').' code that you enter below, will be loaded up in a web browser, after a Customer completes a successful transaction through your Payment Gateway; specifically for Post/Page Access. These Codes are NOT injected for any type of Membership Level Access'.((is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) ? '' : ' or Independent Custom Capabilities').'. These are only for Specific Post/Page transactions. The Tracking Codes that you enter below, will be displayed in one of two possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>(immediately with s2Member Pro-Form integration)</em>.</p>'."\n";
|
341 |
+
echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e., the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with s2Member\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scenes (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <strong>s2Member → API / Notifications</strong>.</em></p>'."\n";
|
342 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_sp_tracking", get_defined_vars());
|
343 |
|
344 |
echo '<table class="form-table">'."\n";
|
399 |
echo '</table>'."\n";
|
400 |
|
401 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
402 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
403 |
echo '</div>'."\n";
|
404 |
|
405 |
echo '</div>'."\n";
|
422 |
|
423 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-idev-section">'."\n";
|
424 |
echo '<h3>Integrating iDevAffiliate (affiliate program management)</h3>'."\n";
|
425 |
+
echo '<a href="http://www.s2member.com/r/idevaffiliate/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/idev-logo.gif" class="ws-menu-page-right ws-menu-page-bordered" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
426 |
+
echo '<p>Adding affiliate tracking software to your site is one of the most effective ways to achieve more sales, more traffic, and more search engine ranking. <a href="http://www.s2member.com/r/idevaffiliate/" target="_blank" rel="external">iDevAffiliate</a> (an affiliate management portal), installs in just minutes, and can be integrated seamlessly with s2Member. We recommend <a href="http://www.s2member.com/r/idevaffiliate/" target="_blank" rel="external">iDevAffiliate Standard</a> ( $99 ) because of its proven track record, and its ability to integrate with s2Member using a variety of techniques. The most popular being a Hidden Image Tag.</p>'."\n";
|
427 |
+
echo '<p>If you choose to <a href="http://www.s2member.com/r/idevaffiliate/" target="_blank" rel="external">install iDevAffiliate</a>, you will need to configure your <strong>iDevAffiliate → Shopping Cart Integration</strong>. Please choose <code>Generic Tracking Pixel</code>. Then, grab your Hidden Image Tag, and pop the code provided by iDevAffiliate into one of the fields for Tracking Codes <em>(at the top of this page)</em>. You MUST also add Replacement Codes to your Hidden Image Tag. To save you some trouble, we\'ve provided some examples below, one for each of s2Member\'s Tracking Code integrations.</p>'."\n";
|
428 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_idev", get_defined_vars());
|
429 |
|
430 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
452 |
|
453 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
454 |
echo '<p>Your <code>profile</code> ID will be assigned by iDevAffiliate. Be sure to replace <code>profile=123</code> with your own profile ID.</p>'."\n";
|
455 |
+
echo '<p><em><strong>Tip:</strong> iDevAffiliate also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
|
456 |
|
457 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
458 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
459 |
echo '</div>'."\n";
|
460 |
|
461 |
echo '</div>'."\n";
|
471 |
|
472 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-shareasale-section">'."\n";
|
473 |
echo '<h3>Integrating ShareASale (affiliate program management)</h3>'."\n";
|
474 |
+
echo '<a href="http://www.s2member.com/r/shareasale/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/sas-logo.png" class="ws-menu-page-right ws-menu-page-bordered" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
|
475 |
+
echo '<p>Established in 2000, <a href="http://www.s2member.com/r/shareasale/" target="_blank" rel="external">ShareASale</a> provides award winning technology and service; which will enable you to connect with a network of established affiliates, as well as recruit new ones. Joining ShareASale, maximizes your ability to reach the greatest number of affiliates, with the least amount of work. At ShareASale, you\'ll have access to an existing affiliate-base. You place your site on the market, and let their existing affiliates promote your products/services.</p>'."\n";
|
476 |
+
echo '<p>If you <a href="http://www.s2member.com/r/shareasale/" target="_blank" rel="external">become a Merchant at ShareASale</a>, you will need to configure your <strong>ShareASale → Sale Tracking</strong>. Grab your Hidden Image Tag, and pop the code provided by ShareASale into one of the fields for Tracking Codes <em>(at the top of this page)</em>. You MUST also add Replacement Codes to your Hidden Image Tag. To save you some trouble, we\'ve provided some examples below, one for each of s2Member\'s Tracking Code integrations.</p>'."\n";
|
477 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_shareasale", get_defined_vars());
|
478 |
|
479 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
501 |
|
502 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
503 |
echo '<p>Your <code>merchantID</code> will be assigned by ShareASale. Be sure to replace <code>merchantID=123</code> with the one they assign you.</p>'."\n";
|
504 |
+
echo '<p><em><strong>Tip:</strong> ShareASale also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <strong>s2Member → API Notifications.</strong> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scenes, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>'."\n";
|
505 |
|
506 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
507 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with ShareASale. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
508 |
echo '</div>'."\n";
|
509 |
|
510 |
echo '</div>'."\n";
|
525 |
do_action("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_other_methods", get_defined_vars());
|
526 |
|
527 |
echo '<div class="ws-menu-page-hr"></div>'."\n";
|
528 |
+
echo '<p><em><strong>Tip:</strong> With <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Pro Add-on / Prices")).'" target="_blank" rel="external">s2Member Pro-Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with s2Member Pro. Please check your Dashboard here: <strong>s2Member → Pro Coupon Codes → Affiliate Coupon Codes</strong>. This is a VERY powerful feature.</em></p>'."\n";
|
529 |
echo '</div>'."\n";
|
530 |
|
531 |
echo '</div>'."\n";
|
includes/s2member-min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
jQuery(document).ready(function(d){window.ws_plugin__s2member_skip_all_file_confirmations=window.ws_plugin__s2member_skip_all_file_confirmations||false;var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed("query-active-plugins") ? "1" : ""; ?>',a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>',b=ws_plugin__s2member_skip_all_file_confirmations?true:false,e=[];if(!b&&S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i.test(this.href)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((/s2member[_\-]skip[_\-]confirmation/i.test(this.href)&&!/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i.test(this.href))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}return false}return true})}if(!/\/wp-admin([\/?#]|$)/i.test(location.href)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))});d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="",j=d("input#ws-plugin--s2member-profile-password1",h),i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(k);return true})}if(/\/wp-signup\.php/i.test(location.href)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="",i=d('p.submit input[type="submit"]',h);d("input#user_email",h).attr("data-expected","email");d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(/\/wp-login\.php/i.test(location.href)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))});d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="",k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h),i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h),j=d("input#wp-submit",h);d("input#user_email",h).attr("data-expected","email");d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(j);return true})}if(/\/wp-admin\/(?:user\/)?profile\.php/i.test(location.href)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}window.ws_plugin__s2member_passwordStrengthMeter=function(h,f){var g=0;if((h!=f)&&f.length>0){return"mismatch"}else{if(h.length<1){return"empty"}else{if(h.length<6){return"short"}}}if(h.match(/[0-9]/)){g+=10}if(h.match(/[a-z]/)){g+=10}if(h.match(/[A-Z]/)){g+=10}if(h.match(/[^0-9a-zA-Z]/)){g=(g===30)?g+20:g+10}if(g<30){return"bad"}if(g<50){return"good"}return"strong"};window.ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strength indicator", "s2member-front", "s2member")); ?>',"short":'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Very weak", "s2member-front", "s2member")); ?>',bad:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Weak", "s2member-front", "s2member")); ?>',good:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Medium", "s2member-front", "s2member")); ?>',strong:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strong", "s2member-front", "s2member")); ?>',mismatch:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Mismatch", "s2member-front", "s2member")); ?>'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-bad");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};window.ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&/^(input|textarea|select)$/i.test(q.tagName)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0);var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&/\[\]$/.test(f)){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&/^(text|password)$/i.test(o))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!/^[0-9\.,]+$/.test(s)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!/^[0-9\.]+$/.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!/^[0-9]+$/.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!/^[0-9]+$/.test(s)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&i.test(s)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!/^https?\:\/\/.+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!/^[0-9 ()\-]+$/.test(s)||s.replace(/[^0-9]+/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(/^alphabetics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(/^numerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/.test(l)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e");if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};window.ws_plugin__s2member_animateProcessing=function(g,f){if(f){d(g).removeClass("ws-plugin--s2member-animate-processing")}else{d(g).addClass("ws-plugin--s2member-animate-processing")}};window.ws_plugin__s2member_escAttr=window.ws_plugin__s2member_escHtml=function(f){if(/[&\<\>"']/.test(f=String(f))){f=f.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),f=f.replace(/"/g,""").replace(/'/g,"'")}return f};window.ws_plugin__s2member_escjQAttr=function(f){return String(f).replace(/([.:\[\]])/g,"\\$1")}});
|
1 |
+
jQuery(document).ready(function(d){window.ws_plugin__s2member_skip_all_file_confirmations=window.ws_plugin__s2member_skip_all_file_confirmations||false;var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed("query-active-plugins") ? "1" : ""; ?>',a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>',b=ws_plugin__s2member_skip_all_file_confirmations?true:false,e=[];window.ws_plugin__s2member_passwordMinLength=function(){return parseInt("<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_length()); ?>")};window.ws_plugin__s2member_passwordMinStrengthCode=function(){return"<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_code()); ?>"};window.ws_plugin__s2member_passwordMinStrengthLabel=function(){return"<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_label()); ?>"};window.ws_plugin__s2member_passwordMinStrengthScore=function(){return parseInt("<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_score()); ?>")};window.ws_plugin__s2member_passwordStrengthMeter=function(j,g,i){var h=0,f=ws_plugin__s2member_passwordMinLength();j=String(j);g=String(g);if(j!=g&&g.length>0){return"mismatch"}else{if(j.length<1){return"empty"}else{if(j.length<f){return"short"}}}if(j.match(/[0-9]/)){h+=10}if(j.match(/[a-z]/)){h+=10}if(j.match(/[A-Z]/)){h+=10}if(j.match(/[^0-9a-zA-Z]/)){h=h===30?h+20:h+10}if(i){return h}if(h<30){return"weak"}if(h<50){return"good"}return"strong"};window.ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strength indicator", "s2member-front", "s2member")); ?>',"short":'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Very weak", "s2member-front", "s2member")); ?>',weak:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Weak", "s2member-front", "s2member")); ?>',good:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Good", "s2member-front", "s2member")); ?>',strong:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strong", "s2member-front", "s2member")); ?>',mismatch:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Mismatch", "s2member-front", "s2member")); ?>'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-weak");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};window.ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&/^(input|textarea|select)$/i.test(q.tagName)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0);var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&/\[\]$/.test(f)){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&/^(text|password)$/i.test(o))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!/^[0-9\.,]+$/.test(s)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!/^[0-9\.]+$/.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!/^[0-9]+$/.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!/^[0-9]+$/.test(s)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&i.test(s)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!/^https?\:\/\/.+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!/^[0-9 ()\-]+$/.test(s)||s.replace(/[^0-9]+/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(/^alphanumerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(/^alphabetics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(/^numerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[0-9]+$/i.test(s)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/.test(l)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e");if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};window.ws_plugin__s2member_animateProcessing=function(g,f){if(f){d(g).removeClass("ws-plugin--s2member-animate-processing")}else{d(g).addClass("ws-plugin--s2member-animate-processing")}};window.ws_plugin__s2member_escAttr=window.ws_plugin__s2member_escHtml=function(f){if(/[&\<\>"']/.test(f=String(f))){f=f.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),f=f.replace(/"/g,""").replace(/'/g,"'")}return f};window.ws_plugin__s2member_escjQAttr=function(f){return String(f).replace(/([.:\[\]])/g,"\\$1")};if(!b&&S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i.test(this.href)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((/s2member[_\-]skip[_\-]confirmation/i.test(this.href)&&!/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i.test(this.href))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}return false}return true})}if(!/\/wp-admin([\/?#]|$)/i.test(location.href)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))}).trigger("initialize.s2");d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="",j=d("input#ws-plugin--s2member-profile-password1",h),i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<ws_plugin__s2member_passwordMinLength()){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password MUST be at least %s characters. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_length())); ?>');return false}else{if(d.trim(j.val())&&ws_plugin__s2member_passwordStrengthMeter(d.trim(j.val()),d.trim(i.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password strength MUST be %s. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_strength_label())); ?>');return false}}}}ws_plugin__s2member_animateProcessing(k);return true})}if(/\/wp-signup\.php/i.test(location.href)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="",i=d('p.submit input[type="submit"]',h);d("input#user_email",h).attr("data-expected","email");d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(/\/wp-login\.php/i.test(location.href)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))}).trigger("initialize.s2");d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="",k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h),i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h),j=d("input#wp-submit",h);d("input#user_email",h).attr("data-expected","email");d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<ws_plugin__s2member_passwordMinLength()){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password MUST be at least %s characters. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_length())); ?>');return false}else{if(k.length&&ws_plugin__s2member_passwordStrengthMeter(d.trim(k.val()),d.trim(i.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password strength MUST be %s. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_strength_label())); ?>');return false}}}}ws_plugin__s2member_animateProcessing(j);return true})}if(/\/wp-admin\/(?:user\/)?profile\.php/i.test(location.href)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}});
|
includes/s2member.css
CHANGED
@@ -112,7 +112,7 @@ div.ws-plugin--s2member-password-strength-short
|
|
112 |
{
|
113 |
background-color : #FFA0A0;
|
114 |
}
|
115 |
-
div.ws-plugin--s2member-password-strength-
|
116 |
{
|
117 |
background-color : #FFB78C;
|
118 |
}
|
@@ -475,4 +475,4 @@ body.logged-in.profile.profile-edit form div.ws-plugin--s2member-profile-field-4
|
|
475 |
margin : 10px 0 10px 0;
|
476 |
border-width : 0 0 1px 0;
|
477 |
padding : 0 0 7px 0;
|
478 |
-
}
|
112 |
{
|
113 |
background-color : #FFA0A0;
|
114 |
}
|
115 |
+
div.ws-plugin--s2member-password-strength-weak
|
116 |
{
|
117 |
background-color : #FFB78C;
|
118 |
}
|
475 |
margin : 10px 0 10px 0;
|
476 |
border-width : 0 0 1px 0;
|
477 |
padding : 0 0 7px 0;
|
478 |
+
}
|
includes/s2member.js
CHANGED
@@ -25,6 +25,233 @@ jQuery(document)
|
|
25 |
skipAllFileConfirmations = ws_plugin__s2member_skip_all_file_confirmations ? true : false,
|
26 |
uniqueFilesDownloadedInPage = [/* Real-time counts in a single page/instance. */];
|
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
if(!skipAllFileConfirmations && S2MEMBER_CURRENT_USER_IS_LOGGED_IN && S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY < S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED)
|
29 |
{
|
30 |
$('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/' + filesBaseDir.replace(/([\:\.\[\]])/g, '\\$1') + '/"], a[href^="' + filesBaseDir.replace(/([\:\.\[\]])/g, '\\$1') + '/"]')
|
@@ -50,7 +277,7 @@ jQuery(document)
|
|
50 |
if(!/\/wp-admin([\/?#]|$)/i.test(location.href))
|
51 |
{
|
52 |
$('input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2')
|
53 |
-
.keyup
|
54 |
{
|
55 |
ws_plugin__s2member_passwordStrength(
|
56 |
$('input#ws-plugin--s2member-profile-login'),
|
@@ -58,7 +285,7 @@ jQuery(document)
|
|
58 |
$('input#ws-plugin--s2member-profile-password2'),
|
59 |
$('div#ws-plugin--s2member-profile-password-strength')
|
60 |
);
|
61 |
-
});
|
62 |
$('form#ws-plugin--s2member-profile')
|
63 |
.submit(function(/* Validate Profile. */)
|
64 |
{
|
@@ -66,7 +293,7 @@ jQuery(document)
|
|
66 |
$password1 = $('input#ws-plugin--s2member-profile-password1', context),
|
67 |
$password2 = $('input#ws-plugin--s2member-profile-password2', context);
|
68 |
|
69 |
-
|
70 |
|
71 |
$(':input', context)
|
72 |
.each(function(/* Go through them all together. */)
|
@@ -89,9 +316,14 @@ jQuery(document)
|
|
89 |
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');
|
90 |
return false;
|
91 |
}
|
92 |
-
else if($.trim($password1.val()) &&
|
|
|
|
|
|
|
|
|
|
|
93 |
{
|
94 |
-
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Password MUST be
|
95 |
return false;
|
96 |
}
|
97 |
ws_plugin__s2member_animateProcessing($submissionButton);
|
@@ -136,7 +368,7 @@ jQuery(document)
|
|
136 |
$('div#login > form#registerform input#wp-submit').attr('tabindex', '1000');
|
137 |
|
138 |
$('input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2')
|
139 |
-
.keyup
|
140 |
{
|
141 |
ws_plugin__s2member_passwordStrength(
|
142 |
$('input#user_login'),
|
@@ -144,7 +376,7 @@ jQuery(document)
|
|
144 |
$('input#ws-plugin--s2member-custom-reg-field-user-pass2'),
|
145 |
$('div#ws-plugin--s2member-custom-reg-field-user-pass-strength')
|
146 |
);
|
147 |
-
});
|
148 |
$('div#login > form#registerform')
|
149 |
.submit(function()
|
150 |
{
|
@@ -185,9 +417,14 @@ jQuery(document)
|
|
185 |
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');
|
186 |
return false;
|
187 |
}
|
188 |
-
else if($pass1.length && $.trim($pass1.val()).length <
|
189 |
{
|
190 |
-
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Password MUST be at least
|
|
|
|
|
|
|
|
|
|
|
191 |
return false;
|
192 |
}
|
193 |
ws_plugin__s2member_animateProcessing($submissionButton);
|
@@ -276,210 +513,4 @@ jQuery(document)
|
|
276 |
return true;
|
277 |
});
|
278 |
}
|
279 |
-
|
280 |
-
{
|
281 |
-
var score = 0; // Initialize score.
|
282 |
-
|
283 |
-
if((password1 != password2) && password2.length > 0)
|
284 |
-
return 'mismatch';
|
285 |
-
|
286 |
-
else if(password1.length < 1)
|
287 |
-
return 'empty';
|
288 |
-
|
289 |
-
else if(password1.length < 6)
|
290 |
-
return 'short';
|
291 |
-
|
292 |
-
if(password1.match(/[0-9]/))
|
293 |
-
score += 10;
|
294 |
-
|
295 |
-
if(password1.match(/[a-z]/))
|
296 |
-
score += 10;
|
297 |
-
|
298 |
-
if(password1.match(/[A-Z]/))
|
299 |
-
score += 10;
|
300 |
-
|
301 |
-
if(password1.match(/[^0-9a-zA-Z]/))
|
302 |
-
score = (score === 30) ? score + 20 : score + 10;
|
303 |
-
|
304 |
-
if(score < 30) return 'bad';
|
305 |
-
if(score < 50) return 'good';
|
306 |
-
return 'strong'; // Default return value.
|
307 |
-
};
|
308 |
-
window.ws_plugin__s2member_passwordStrength = function($username, $pass1, $pass2, $result)
|
309 |
-
{
|
310 |
-
if($username instanceof jQuery && $pass1 instanceof jQuery && $pass2 instanceof jQuery && $result instanceof jQuery)
|
311 |
-
{
|
312 |
-
var pwsL10n = { // Password strength meter translations.
|
313 |
-
'empty' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strength indicator", "s2member-front", "s2member")); ?>',
|
314 |
-
'short' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Very weak", "s2member-front", "s2member")); ?>',
|
315 |
-
'bad' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Weak", "s2member-front", "s2member")); ?>',
|
316 |
-
'good' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Medium", "s2member-front", "s2member")); ?>',
|
317 |
-
'strong' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strong", "s2member-front", "s2member")); ?>',
|
318 |
-
'mismatch': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Mismatch", "s2member-front", "s2member")); ?>'
|
319 |
-
};
|
320 |
-
$result.removeClass('ws-plugin--s2member-password-strength-short');
|
321 |
-
$result.removeClass('ws-plugin--s2member-password-strength-bad');
|
322 |
-
$result.removeClass('ws-plugin--s2member-password-strength-good');
|
323 |
-
$result.removeClass('ws-plugin--s2member-password-strength-strong');
|
324 |
-
$result.removeClass('ws-plugin--s2member-password-strength-mismatch');
|
325 |
-
$result.removeClass('ws-plugin--s2member-password-strength-empty');
|
326 |
-
|
327 |
-
var meterSays = ws_plugin__s2member_passwordStrengthMeter($pass1.val(), $pass2.val());
|
328 |
-
$result.addClass('ws-plugin--s2member-password-strength-' + meterSays).html(pwsL10n[meterSays]);
|
329 |
-
}
|
330 |
-
};
|
331 |
-
window.ws_plugin__s2member_validationErrors = function(label, field, context, required, expected)
|
332 |
-
{
|
333 |
-
if(typeof label === 'string' && label && typeof field === 'object' && typeof context === 'object')
|
334 |
-
if(typeof field.tagName === 'string' && /^(input|textarea|select)$/i.test(field.tagName) && !field.disabled)
|
335 |
-
{
|
336 |
-
var tag = field.tagName.toLowerCase(), $field = $(field), type = $.trim($field.attr('type')).toLowerCase(), name = $.trim($field.attr('name')), value = $field.val();
|
337 |
-
required = ( typeof required === 'boolean') ? required : ($field.attr('aria-required') === 'true'), expected = ( typeof expected === 'string') ? expected : $.trim($field.attr('data-expected'));
|
338 |
-
|
339 |
-
var forcePersonalEmails = ('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>' > 0);
|
340 |
-
var nonPersonalEmailUsers = new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@', 'i');
|
341 |
-
|
342 |
-
if(tag === 'input' && type === 'checkbox' && /\[\]$/.test(name))
|
343 |
-
{
|
344 |
-
if(typeof field.id === 'string' && /-0$/.test(field.id))
|
345 |
-
if(required && !$('input[name="' + ws_plugin__s2member_escjQAttr(name) + '"]:checked', context).length)
|
346 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>';
|
347 |
-
}
|
348 |
-
else if(tag === 'input' && type === 'checkbox')
|
349 |
-
{
|
350 |
-
if(required && !field.checked)
|
351 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Required. This box must be checked.", "s2member-front", "s2member")); ?>';
|
352 |
-
}
|
353 |
-
else if(tag === 'input' && type === 'radio')
|
354 |
-
{
|
355 |
-
if(typeof field.id === 'string' && /-0$/.test(field.id))
|
356 |
-
if(required && !$('input[name="' + ws_plugin__s2member_escjQAttr(name) + '"]:checked', context).length)
|
357 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select one of the options.", "s2member-front", "s2member")); ?>';
|
358 |
-
}
|
359 |
-
else if(tag === 'select' && $field.attr('multiple'))
|
360 |
-
{
|
361 |
-
if(required && (!(value instanceof Array) || !value.length))
|
362 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select at least one of the options.", "s2member-front", "s2member")); ?>';
|
363 |
-
}
|
364 |
-
else if(typeof value !== 'string' || (required && !(value = $.trim(value)).length))
|
365 |
-
{
|
366 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("This is a required field, please try again.", "s2member-front", "s2member")); ?>';
|
367 |
-
}
|
368 |
-
else if((value = $.trim(value)).length && ((tag === 'input' && /^(text|password)$/i.test(type)) || tag === 'textarea') && typeof expected === 'string' && expected.length)
|
369 |
-
{
|
370 |
-
if(expected === 'numeric-wp-commas' && (!/^[0-9\.,]+$/.test(value) || isNaN(value.replace(/,/g, ''))))
|
371 |
-
{
|
372 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>';
|
373 |
-
}
|
374 |
-
else if(expected === 'numeric' && (!/^[0-9\.]+$/.test(value) || isNaN(value)))
|
375 |
-
{
|
376 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>';
|
377 |
-
}
|
378 |
-
else if(expected === 'integer' && (!/^[0-9]+$/.test(value) || isNaN(value)))
|
379 |
-
{
|
380 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>';
|
381 |
-
}
|
382 |
-
else if(expected === 'integer-gt-0' && (!/^[0-9]+$/.test(value) || isNaN(value) || value <= 0))
|
383 |
-
{
|
384 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>';
|
385 |
-
}
|
386 |
-
else if(expected === 'float' && (!/^[0-9\.]+$/.test(value) || !/[0-9]/.test(value) || !/\./.test(value) || isNaN(value)))
|
387 |
-
{
|
388 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>';
|
389 |
-
}
|
390 |
-
else if(expected === 'float-gt-0' && (!/^[0-9\.]+$/.test(value) || !/[0-9]/.test(value) || !/\./.test(value) || isNaN(value) || value <= 0))
|
391 |
-
{
|
392 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>';
|
393 |
-
}
|
394 |
-
else if(expected === 'date' && !/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(value))
|
395 |
-
{
|
396 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>';
|
397 |
-
}
|
398 |
-
else if(expected === 'email' && !/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(value))
|
399 |
-
{
|
400 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a valid email address.", "s2member-front", "s2member")); ?>';
|
401 |
-
}
|
402 |
-
else if(expected === 'email' && forcePersonalEmails && nonPersonalEmailUsers.test(value))
|
403 |
-
{
|
404 |
-
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>', value.split('@')[0]);
|
405 |
-
}
|
406 |
-
else if(expected === 'url' && !/^https?\:\/\/.+$/i.test(value))
|
407 |
-
{
|
408 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>';
|
409 |
-
}
|
410 |
-
else if(expected === 'domain' && !/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(value))
|
411 |
-
{
|
412 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>';
|
413 |
-
}
|
414 |
-
else if(expected === 'phone' && (!/^[0-9 ()\-]+$/.test(value) || value.replace(/[^0-9]+/g, '').length !== 10))
|
415 |
-
{
|
416 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>';
|
417 |
-
}
|
418 |
-
else if(expected === 'uszip' && !/^[0-9]{5}(?:\-[0-9]{4})?$/.test(value))
|
419 |
-
{
|
420 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>';
|
421 |
-
}
|
422 |
-
else if(expected === 'cazip' && !/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(value))
|
423 |
-
{
|
424 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>';
|
425 |
-
}
|
426 |
-
else if(expected === 'uczip' && !/^[0-9]{5}(?:\-[0-9]{4})?$/.test(value) && !/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(value))
|
427 |
-
{
|
428 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>';
|
429 |
-
}
|
430 |
-
else if(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(value))
|
431 |
-
{
|
432 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>';
|
433 |
-
}
|
434 |
-
else if(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z 0-9]+$/i.test(value))
|
435 |
-
{
|
436 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>';
|
437 |
-
}
|
438 |
-
else if(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(value))
|
439 |
-
{
|
440 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>';
|
441 |
-
}
|
442 |
-
else if(/^alphanumerics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z0-9]+$/i.test(value))
|
443 |
-
{
|
444 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>';
|
445 |
-
}
|
446 |
-
else if(/^alphabetics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z]+$/i.test(value))
|
447 |
-
{
|
448 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>';
|
449 |
-
}
|
450 |
-
else if(/^numerics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[0-9]+$/i.test(value))
|
451 |
-
{
|
452 |
-
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use numeric digits only.", "s2member-front", "s2member")); ?>';
|
453 |
-
}
|
454 |
-
else if(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/.test(expected))
|
455 |
-
{
|
456 |
-
var split = expected.split('-'), length = Number(split[1]), exactLength = (split.length > 2 && split[2] === 'e');
|
457 |
-
|
458 |
-
if(exactLength && value.length !== length/* An exact length is required? */)
|
459 |
-
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be exactly %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')));
|
460 |
-
|
461 |
-
else if(value.length < length/* Otherwise, we interpret as the minimum length. */)
|
462 |
-
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be at least %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')));
|
463 |
-
}
|
464 |
-
}
|
465 |
-
}
|
466 |
-
return ''; // No errors in this case.
|
467 |
-
};
|
468 |
-
window.ws_plugin__s2member_animateProcessing = function($obj, reset)
|
469 |
-
{
|
470 |
-
if(reset)
|
471 |
-
$($obj).removeClass('ws-plugin--s2member-animate-processing');
|
472 |
-
else $($obj).addClass('ws-plugin--s2member-animate-processing');
|
473 |
-
};
|
474 |
-
window.ws_plugin__s2member_escAttr = window.ws_plugin__s2member_escHtml = function(string)
|
475 |
-
{
|
476 |
-
if(/[&\<\>"']/.test(string = String(string)))
|
477 |
-
string = string.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'),
|
478 |
-
string = string.replace(/"/g, '"').replace(/'/g, ''');
|
479 |
-
return string;
|
480 |
-
};
|
481 |
-
window.ws_plugin__s2member_escjQAttr = function(string)
|
482 |
-
{
|
483 |
-
return String(string).replace(/([.:\[\]])/g, '\\$1');
|
484 |
-
};
|
485 |
-
});
|
25 |
skipAllFileConfirmations = ws_plugin__s2member_skip_all_file_confirmations ? true : false,
|
26 |
uniqueFilesDownloadedInPage = [/* Real-time counts in a single page/instance. */];
|
27 |
|
28 |
+
window.ws_plugin__s2member_passwordMinLength = function()
|
29 |
+
{
|
30 |
+
return parseInt('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_length()); ?>');
|
31 |
+
};
|
32 |
+
window.ws_plugin__s2member_passwordMinStrengthCode = function()
|
33 |
+
{
|
34 |
+
return '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_code()); ?>';
|
35 |
+
};
|
36 |
+
window.ws_plugin__s2member_passwordMinStrengthLabel = function()
|
37 |
+
{
|
38 |
+
return '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_label()); ?>';
|
39 |
+
};
|
40 |
+
window.ws_plugin__s2member_passwordMinStrengthScore = function()
|
41 |
+
{
|
42 |
+
return parseInt('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(c_ws_plugin__s2member_user_securities::min_password_strength_score()); ?>');
|
43 |
+
};
|
44 |
+
window.ws_plugin__s2member_passwordStrengthMeter = function(password1, password2, scoreOnly)
|
45 |
+
{
|
46 |
+
var score = 0, // Initialize score.
|
47 |
+
minLength = ws_plugin__s2member_passwordMinLength();
|
48 |
+
|
49 |
+
password1 = String(password1);
|
50 |
+
password2 = String(password2);
|
51 |
+
|
52 |
+
if(password1 != password2 && password2.length > 0)
|
53 |
+
return 'mismatch';
|
54 |
+
|
55 |
+
else if(password1.length < 1)
|
56 |
+
return 'empty';
|
57 |
+
|
58 |
+
else if(password1.length < minLength)
|
59 |
+
return 'short';
|
60 |
+
|
61 |
+
if(password1.match(/[0-9]/))
|
62 |
+
score += 10;
|
63 |
+
|
64 |
+
if(password1.match(/[a-z]/))
|
65 |
+
score += 10;
|
66 |
+
|
67 |
+
if(password1.match(/[A-Z]/))
|
68 |
+
score += 10;
|
69 |
+
|
70 |
+
if(password1.match(/[^0-9a-zA-Z]/))
|
71 |
+
score = score === 30 ? score + 20 : score + 10;
|
72 |
+
|
73 |
+
if(scoreOnly) return score;
|
74 |
+
if(score < 30) return 'weak';
|
75 |
+
if(score < 50) return 'good';
|
76 |
+
return 'strong'; // Default return value.
|
77 |
+
};
|
78 |
+
window.ws_plugin__s2member_passwordStrength = function($username, $pass1, $pass2, $result)
|
79 |
+
{
|
80 |
+
if($username instanceof jQuery && $pass1 instanceof jQuery && $pass2 instanceof jQuery && $result instanceof jQuery)
|
81 |
+
{
|
82 |
+
var pwsL10n = { // Password strength meter translations.
|
83 |
+
'empty' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strength indicator", "s2member-front", "s2member")); ?>',
|
84 |
+
'short' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Very weak", "s2member-front", "s2member")); ?>',
|
85 |
+
'weak' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Weak", "s2member-front", "s2member")); ?>',
|
86 |
+
'good' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Good", "s2member-front", "s2member")); ?>',
|
87 |
+
'strong' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Strong", "s2member-front", "s2member")); ?>',
|
88 |
+
'mismatch': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Mismatch", "s2member-front", "s2member")); ?>'
|
89 |
+
};
|
90 |
+
$result.removeClass('ws-plugin--s2member-password-strength-short');
|
91 |
+
$result.removeClass('ws-plugin--s2member-password-strength-weak');
|
92 |
+
$result.removeClass('ws-plugin--s2member-password-strength-good');
|
93 |
+
$result.removeClass('ws-plugin--s2member-password-strength-strong');
|
94 |
+
$result.removeClass('ws-plugin--s2member-password-strength-mismatch');
|
95 |
+
$result.removeClass('ws-plugin--s2member-password-strength-empty');
|
96 |
+
|
97 |
+
var meterSays = ws_plugin__s2member_passwordStrengthMeter($pass1.val(), $pass2.val());
|
98 |
+
$result.addClass('ws-plugin--s2member-password-strength-' + meterSays).html(pwsL10n[meterSays]);
|
99 |
+
}
|
100 |
+
};
|
101 |
+
window.ws_plugin__s2member_validationErrors = function(label, field, context, required, expected)
|
102 |
+
{
|
103 |
+
if(typeof label === 'string' && label && typeof field === 'object' && typeof context === 'object')
|
104 |
+
if(typeof field.tagName === 'string' && /^(input|textarea|select)$/i.test(field.tagName) && !field.disabled)
|
105 |
+
{
|
106 |
+
var tag = field.tagName.toLowerCase(), $field = $(field), type = $.trim($field.attr('type')).toLowerCase(), name = $.trim($field.attr('name')), value = $field.val();
|
107 |
+
required = ( typeof required === 'boolean') ? required : ($field.attr('aria-required') === 'true'), expected = ( typeof expected === 'string') ? expected : $.trim($field.attr('data-expected'));
|
108 |
+
|
109 |
+
var forcePersonalEmails = ('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>' > 0);
|
110 |
+
var nonPersonalEmailUsers = new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@', 'i');
|
111 |
+
|
112 |
+
if(tag === 'input' && type === 'checkbox' && /\[\]$/.test(name))
|
113 |
+
{
|
114 |
+
if(typeof field.id === 'string' && /-0$/.test(field.id))
|
115 |
+
if(required && !$('input[name="' + ws_plugin__s2member_escjQAttr(name) + '"]:checked', context).length)
|
116 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>';
|
117 |
+
}
|
118 |
+
else if(tag === 'input' && type === 'checkbox')
|
119 |
+
{
|
120 |
+
if(required && !field.checked)
|
121 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Required. This box must be checked.", "s2member-front", "s2member")); ?>';
|
122 |
+
}
|
123 |
+
else if(tag === 'input' && type === 'radio')
|
124 |
+
{
|
125 |
+
if(typeof field.id === 'string' && /-0$/.test(field.id))
|
126 |
+
if(required && !$('input[name="' + ws_plugin__s2member_escjQAttr(name) + '"]:checked', context).length)
|
127 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select one of the options.", "s2member-front", "s2member")); ?>';
|
128 |
+
}
|
129 |
+
else if(tag === 'select' && $field.attr('multiple'))
|
130 |
+
{
|
131 |
+
if(required && (!(value instanceof Array) || !value.length))
|
132 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please select at least one of the options.", "s2member-front", "s2member")); ?>';
|
133 |
+
}
|
134 |
+
else if(typeof value !== 'string' || (required && !(value = $.trim(value)).length))
|
135 |
+
{
|
136 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("This is a required field, please try again.", "s2member-front", "s2member")); ?>';
|
137 |
+
}
|
138 |
+
else if((value = $.trim(value)).length && ((tag === 'input' && /^(text|password)$/i.test(type)) || tag === 'textarea') && typeof expected === 'string' && expected.length)
|
139 |
+
{
|
140 |
+
if(expected === 'numeric-wp-commas' && (!/^[0-9\.,]+$/.test(value) || isNaN(value.replace(/,/g, ''))))
|
141 |
+
{
|
142 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>';
|
143 |
+
}
|
144 |
+
else if(expected === 'numeric' && (!/^[0-9\.]+$/.test(value) || isNaN(value)))
|
145 |
+
{
|
146 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>';
|
147 |
+
}
|
148 |
+
else if(expected === 'integer' && (!/^[0-9]+$/.test(value) || isNaN(value)))
|
149 |
+
{
|
150 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>';
|
151 |
+
}
|
152 |
+
else if(expected === 'integer-gt-0' && (!/^[0-9]+$/.test(value) || isNaN(value) || value <= 0))
|
153 |
+
{
|
154 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>';
|
155 |
+
}
|
156 |
+
else if(expected === 'float' && (!/^[0-9\.]+$/.test(value) || !/[0-9]/.test(value) || !/\./.test(value) || isNaN(value)))
|
157 |
+
{
|
158 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>';
|
159 |
+
}
|
160 |
+
else if(expected === 'float-gt-0' && (!/^[0-9\.]+$/.test(value) || !/[0-9]/.test(value) || !/\./.test(value) || isNaN(value) || value <= 0))
|
161 |
+
{
|
162 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>';
|
163 |
+
}
|
164 |
+
else if(expected === 'date' && !/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(value))
|
165 |
+
{
|
166 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>';
|
167 |
+
}
|
168 |
+
else if(expected === 'email' && !/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(value))
|
169 |
+
{
|
170 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a valid email address.", "s2member-front", "s2member")); ?>';
|
171 |
+
}
|
172 |
+
else if(expected === 'email' && forcePersonalEmails && nonPersonalEmailUsers.test(value))
|
173 |
+
{
|
174 |
+
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>', value.split('@')[0]);
|
175 |
+
}
|
176 |
+
else if(expected === 'url' && !/^https?\:\/\/.+$/i.test(value))
|
177 |
+
{
|
178 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>';
|
179 |
+
}
|
180 |
+
else if(expected === 'domain' && !/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(value))
|
181 |
+
{
|
182 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>';
|
183 |
+
}
|
184 |
+
else if(expected === 'phone' && (!/^[0-9 ()\-]+$/.test(value) || value.replace(/[^0-9]+/g, '').length !== 10))
|
185 |
+
{
|
186 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>';
|
187 |
+
}
|
188 |
+
else if(expected === 'uszip' && !/^[0-9]{5}(?:\-[0-9]{4})?$/.test(value))
|
189 |
+
{
|
190 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>';
|
191 |
+
}
|
192 |
+
else if(expected === 'cazip' && !/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(value))
|
193 |
+
{
|
194 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>';
|
195 |
+
}
|
196 |
+
else if(expected === 'uczip' && !/^[0-9]{5}(?:\-[0-9]{4})?$/.test(value) && !/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(value))
|
197 |
+
{
|
198 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>';
|
199 |
+
}
|
200 |
+
else if(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(value))
|
201 |
+
{
|
202 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>';
|
203 |
+
}
|
204 |
+
else if(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z 0-9]+$/i.test(value))
|
205 |
+
{
|
206 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>';
|
207 |
+
}
|
208 |
+
else if(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(value))
|
209 |
+
{
|
210 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>';
|
211 |
+
}
|
212 |
+
else if(/^alphanumerics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z0-9]+$/i.test(value))
|
213 |
+
{
|
214 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>';
|
215 |
+
}
|
216 |
+
else if(/^alphabetics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[a-z]+$/i.test(value))
|
217 |
+
{
|
218 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>';
|
219 |
+
}
|
220 |
+
else if(/^numerics\-[0-9]+(?:\-e)?$/.test(expected) && !/^[0-9]+$/i.test(value))
|
221 |
+
{
|
222 |
+
return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Please use numeric digits only.", "s2member-front", "s2member")); ?>';
|
223 |
+
}
|
224 |
+
else if(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/.test(expected))
|
225 |
+
{
|
226 |
+
var split = expected.split('-'), length = Number(split[1]), exactLength = (split.length > 2 && split[2] === 'e');
|
227 |
+
|
228 |
+
if(exactLength && value.length !== length/* An exact length is required? */)
|
229 |
+
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be exactly %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')));
|
230 |
+
|
231 |
+
else if(value.length < length/* Otherwise, we interpret as the minimum length. */)
|
232 |
+
return label + '\n' + $.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Must be at least %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("characters", "s2member-front", "s2member")); ?>')));
|
233 |
+
}
|
234 |
+
}
|
235 |
+
}
|
236 |
+
return ''; // No errors in this case.
|
237 |
+
};
|
238 |
+
window.ws_plugin__s2member_animateProcessing = function($obj, reset)
|
239 |
+
{
|
240 |
+
if(reset)
|
241 |
+
$($obj).removeClass('ws-plugin--s2member-animate-processing');
|
242 |
+
else $($obj).addClass('ws-plugin--s2member-animate-processing');
|
243 |
+
};
|
244 |
+
window.ws_plugin__s2member_escAttr = window.ws_plugin__s2member_escHtml = function(string)
|
245 |
+
{
|
246 |
+
if(/[&\<\>"']/.test(string = String(string)))
|
247 |
+
string = string.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'),
|
248 |
+
string = string.replace(/"/g, '"').replace(/'/g, ''');
|
249 |
+
return string;
|
250 |
+
};
|
251 |
+
window.ws_plugin__s2member_escjQAttr = function(string)
|
252 |
+
{
|
253 |
+
return String(string).replace(/([.:\[\]])/g, '\\$1');
|
254 |
+
};
|
255 |
if(!skipAllFileConfirmations && S2MEMBER_CURRENT_USER_IS_LOGGED_IN && S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY < S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED)
|
256 |
{
|
257 |
$('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/' + filesBaseDir.replace(/([\:\.\[\]])/g, '\\$1') + '/"], a[href^="' + filesBaseDir.replace(/([\:\.\[\]])/g, '\\$1') + '/"]')
|
277 |
if(!/\/wp-admin([\/?#]|$)/i.test(location.href))
|
278 |
{
|
279 |
$('input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2')
|
280 |
+
.on('keyup initialize.s2', function()
|
281 |
{
|
282 |
ws_plugin__s2member_passwordStrength(
|
283 |
$('input#ws-plugin--s2member-profile-login'),
|
285 |
$('input#ws-plugin--s2member-profile-password2'),
|
286 |
$('div#ws-plugin--s2member-profile-password-strength')
|
287 |
);
|
288 |
+
}).trigger('initialize.s2');
|
289 |
$('form#ws-plugin--s2member-profile')
|
290 |
.submit(function(/* Validate Profile. */)
|
291 |
{
|
293 |
$password1 = $('input#ws-plugin--s2member-profile-password1', context),
|
294 |
$password2 = $('input#ws-plugin--s2member-profile-password2', context);
|
295 |
|
296 |
+
var $submissionButton = $('input#ws-plugin--s2member-profile-submit', context);
|
297 |
|
298 |
$(':input', context)
|
299 |
.each(function(/* Go through them all together. */)
|
316 |
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');
|
317 |
return false;
|
318 |
}
|
319 |
+
else if($.trim($password1.val()) && $.trim($password1.val()).length < ws_plugin__s2member_passwordMinLength())
|
320 |
+
{
|
321 |
+
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password MUST be at least %s characters. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_length())); ?>');
|
322 |
+
return false;
|
323 |
+
}
|
324 |
+
else if($.trim($password1.val()) && ws_plugin__s2member_passwordStrengthMeter($.trim($password1.val()), $.trim($password2.val()), true) < ws_plugin__s2member_passwordMinStrengthScore())
|
325 |
{
|
326 |
+
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password strength MUST be %s. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_strength_label())); ?>');
|
327 |
return false;
|
328 |
}
|
329 |
ws_plugin__s2member_animateProcessing($submissionButton);
|
368 |
$('div#login > form#registerform input#wp-submit').attr('tabindex', '1000');
|
369 |
|
370 |
$('input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2')
|
371 |
+
.on('keyup initialize.s2', function()
|
372 |
{
|
373 |
ws_plugin__s2member_passwordStrength(
|
374 |
$('input#user_login'),
|
376 |
$('input#ws-plugin--s2member-custom-reg-field-user-pass2'),
|
377 |
$('div#ws-plugin--s2member-custom-reg-field-user-pass-strength')
|
378 |
);
|
379 |
+
}).trigger('initialize.s2');
|
380 |
$('div#login > form#registerform')
|
381 |
.submit(function()
|
382 |
{
|
417 |
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');
|
418 |
return false;
|
419 |
}
|
420 |
+
else if($pass1.length && $.trim($pass1.val()).length < ws_plugin__s2member_passwordMinLength())
|
421 |
{
|
422 |
+
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password MUST be at least %s characters. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_length())); ?>');
|
423 |
+
return false;
|
424 |
+
}
|
425 |
+
else if($pass1.length && ws_plugin__s2member_passwordStrengthMeter($.trim($pass1.val()), $.trim($pass2.val()), true) < ws_plugin__s2member_passwordMinStrengthScore())
|
426 |
+
{
|
427 |
+
alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(_x("— Oops, you missed something: —", "s2member-front", "s2member")); ?>' + '\n\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq(sprintf(_x("Password strength MUST be %s. Please try again.", "s2member-front", "s2member"), c_ws_plugin__s2member_user_securities::min_password_strength_label())); ?>');
|
428 |
return false;
|
429 |
}
|
430 |
ws_plugin__s2member_animateProcessing($submissionButton);
|
513 |
return true;
|
514 |
});
|
515 |
}
|
516 |
+
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/syscon.inc.php
CHANGED
@@ -81,7 +81,7 @@ $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir_htaccess'] = dirname(__FILE__
|
|
81 |
/*
|
82 |
Configure the global reCaptcha (www.websharks-inc.net / or any domain). These public/private keys work on any installation.
|
83 |
*/
|
84 |
-
$GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']
|
85 |
/*
|
86 |
Configure the right menu options panel for s2Member.
|
87 |
*/
|
@@ -145,10 +145,12 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
145 |
|
146 |
$default_options['run_uninstall_routines'] = '0';
|
147 |
|
148 |
-
$default_options['custom_reg_fields']
|
149 |
-
$default_options['custom_reg_names']
|
150 |
-
$default_options['custom_reg_display_name']
|
151 |
-
$default_options['custom_reg_password']
|
|
|
|
|
152 |
|
153 |
$default_options['custom_reg_opt_in'] = '1';
|
154 |
$default_options['custom_reg_opt_in_label'] = _x('Yes, I want to receive updates via email.', 's2member-front', 's2member');
|
@@ -163,7 +165,8 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
163 |
$default_options['force_admin_lockouts'] = '0';
|
164 |
$default_options['filter_wp_query'] = array('all');
|
165 |
|
166 |
-
$default_options['default_url_shortener']
|
|
|
167 |
$default_options['default_custom_str_url_shortener'] = '';
|
168 |
|
169 |
$default_options['mms_auto_patch'] = '1';
|
@@ -177,6 +180,7 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
177 |
$default_options['login_redirection_always_http'] = '1';
|
178 |
$default_options['membership_options_page'] = '';
|
179 |
$default_options['membership_options_page_vars_enable'] = '1';
|
|
|
180 |
|
181 |
$default_options['login_reg_design_enabled'] = '1';
|
182 |
|
@@ -290,9 +294,11 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
290 |
|
291 |
$default_options['apply_label_translations'] = '0';
|
292 |
|
293 |
-
for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
|
|
|
294 |
|
295 |
-
for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
|
|
|
296 |
|
297 |
$default_options['file_download_limit_exceeded_page'] = '';
|
298 |
$default_options['file_download_inline_extensions'] = '';
|
@@ -410,7 +416,10 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
410 |
else if($key === 'custom_reg_fields' && (!is_string($value) || !strlen($value)))
|
411 |
$value = $default_options[$key];
|
412 |
|
413 |
-
else if(preg_match('/^custom_reg_(?:names|password|opt_in|auto_opt_out_transitions)$/', $key) && (!is_string($value) || !is_numeric($value)))
|
|
|
|
|
|
|
414 |
$value = $default_options[$key];
|
415 |
|
416 |
else if($key === 'custom_reg_display_name' && (!is_string($value) || !preg_match('/^(?:full|first|last|login|0)$/', $value)))
|
@@ -467,6 +476,9 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
467 |
else if($key === 'membership_options_page_vars_enable' && (!is_string($value) || !is_numeric($value)))
|
468 |
$value = $default_options[$key];
|
469 |
|
|
|
|
|
|
|
470 |
else if($key === 'login_reg_design_enabled' && (!is_string($value) || !is_numeric($value)))
|
471 |
$value = $default_options[$key];
|
472 |
|
@@ -607,4 +619,4 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
|
|
607 |
|
608 |
return apply_filters_ref_array('ws_plugin__s2member_options', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
|
609 |
}
|
610 |
-
}
|
81 |
/*
|
82 |
Configure the global reCaptcha (www.websharks-inc.net / or any domain). These public/private keys work on any installation.
|
83 |
*/
|
84 |
+
$GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha'] = array('public_key' => '6LeCANsSAAAAAIIrlB3FrXe42mr0OSSZpT0pkpFK', 'private_key' => '6LeCANsSAAAAAGBXMIKAirv6G4PmaGa-ORxdD-oZ', 'lang' => _x('en', 's2member-front recaptcha-lang-code', 's2member'));
|
85 |
/*
|
86 |
Configure the right menu options panel for s2Member.
|
87 |
*/
|
145 |
|
146 |
$default_options['run_uninstall_routines'] = '0';
|
147 |
|
148 |
+
$default_options['custom_reg_fields'] = '';
|
149 |
+
$default_options['custom_reg_names'] = '1';
|
150 |
+
$default_options['custom_reg_display_name'] = 'full';
|
151 |
+
$default_options['custom_reg_password'] = '0';
|
152 |
+
$default_options['custom_reg_password_min_length'] = '8'; // Minimum characters.
|
153 |
+
$default_options['custom_reg_password_min_strength'] = 'good'; // `weak`, `good` or `strong`.
|
154 |
|
155 |
$default_options['custom_reg_opt_in'] = '1';
|
156 |
$default_options['custom_reg_opt_in_label'] = _x('Yes, I want to receive updates via email.', 's2member-front', 's2member');
|
165 |
$default_options['force_admin_lockouts'] = '0';
|
166 |
$default_options['filter_wp_query'] = array('all');
|
167 |
|
168 |
+
$default_options['default_url_shortener'] = 'tiny_url';
|
169 |
+
$default_options['default_url_shortener_key'] = '';
|
170 |
$default_options['default_custom_str_url_shortener'] = '';
|
171 |
|
172 |
$default_options['mms_auto_patch'] = '1';
|
180 |
$default_options['login_redirection_always_http'] = '1';
|
181 |
$default_options['membership_options_page'] = '';
|
182 |
$default_options['membership_options_page_vars_enable'] = '1';
|
183 |
+
$default_options['membership_options_page_ga_vars_enable'] = '1';
|
184 |
|
185 |
$default_options['login_reg_design_enabled'] = '1';
|
186 |
|
294 |
|
295 |
$default_options['apply_label_translations'] = '0';
|
296 |
|
297 |
+
for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
|
298 |
+
$default_options['level'.$n.'_file_downloads_allowed'] = '';
|
299 |
|
300 |
+
for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
|
301 |
+
$default_options['level'.$n.'_file_downloads_allowed_days'] = '';
|
302 |
|
303 |
$default_options['file_download_limit_exceeded_page'] = '';
|
304 |
$default_options['file_download_inline_extensions'] = '';
|
416 |
else if($key === 'custom_reg_fields' && (!is_string($value) || !strlen($value)))
|
417 |
$value = $default_options[$key];
|
418 |
|
419 |
+
else if(preg_match('/^custom_reg_(?:names|password|password_min_length|opt_in|auto_opt_out_transitions)$/', $key) && (!is_string($value) || !is_numeric($value)))
|
420 |
+
$value = $default_options[$key];
|
421 |
+
|
422 |
+
else if($key === 'custom_reg_password_min_strength' && (!is_string($value) || !strlen($value)))
|
423 |
$value = $default_options[$key];
|
424 |
|
425 |
else if($key === 'custom_reg_display_name' && (!is_string($value) || !preg_match('/^(?:full|first|last|login|0)$/', $value)))
|
476 |
else if($key === 'membership_options_page_vars_enable' && (!is_string($value) || !is_numeric($value)))
|
477 |
$value = $default_options[$key];
|
478 |
|
479 |
+
else if($key === 'membership_options_page_ga_vars_enable' && (!is_string($value) || !is_numeric($value)))
|
480 |
+
$value = $default_options[$key];
|
481 |
+
|
482 |
else if($key === 'login_reg_design_enabled' && (!is_string($value) || !is_numeric($value)))
|
483 |
$value = $default_options[$key];
|
484 |
|
619 |
|
620 |
return apply_filters_ref_array('ws_plugin__s2member_options', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o']));
|
621 |
}
|
622 |
+
}
|
includes/templates/badges/s-badge.php
CHANGED
@@ -1,25 +1,7 @@
|
|
1 |
<?php
|
2 |
if(!defined('WPINC')) // MUST have WordPress.
|
3 |
exit("Do not access this file directly.");
|
4 |
-
|
5 |
-
switch('%%v%%')
|
6 |
-
{
|
7 |
-
case 'v2':
|
8 |
-
case '2':
|
9 |
-
$width_height_attr = 'width="180" height="58"';
|
10 |
-
$width_height_styles = 'width:180px; height:58px;';
|
11 |
-
break;
|
12 |
-
case 'v3':
|
13 |
-
case '3':
|
14 |
-
$width_height_attr = 'width="80" height="15"';
|
15 |
-
$width_height_styles = 'width:80px; height:15px;';
|
16 |
-
break;
|
17 |
-
default:
|
18 |
-
$width_height_attr = 'width="200" height="55"';
|
19 |
-
$width_height_styles = 'width:200px; height:55px;';
|
20 |
-
break;
|
21 |
-
}
|
22 |
?>
|
23 |
<div class="ws-plugin--s2member-s-badge">
|
24 |
-
<a href="http://www.s2member.com/" onclick="window.open('http://www.s2member.com/s-badges/s-details.php?v=%%v%%&site_url=%%site_url%%%%no_cache%%%%display_on_failure%%', '_popup', 'width=770,height=720,left='+((screen.width/2)-(770/2))+',screenX='+((screen.width/2)-(770/2))+',top='+((screen.height/2)-(720/2))+',screenY='+((screen.height/2)-(720/2))+',location=0,menubar=0,toolbar=0,scrollbars=0,resizable=1'); return false;" title="s2Member®"><img src="//www.s2member.com/s-badges/s-badge.php?v=%%v%%&site_url=%%site_url%%%%no_cache%%%%display_on_failure%%"
|
25 |
</div>
|
1 |
<?php
|
2 |
if(!defined('WPINC')) // MUST have WordPress.
|
3 |
exit("Do not access this file directly.");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
?>
|
5 |
<div class="ws-plugin--s2member-s-badge">
|
6 |
+
<a href="http://www.s2member.com/" onclick="window.open('http://www.s2member.com/s-badges/s-details.php?v=%%v%%&site_url=%%site_url%%%%no_cache%%%%display_on_failure%%', '_popup', 'width=770,height=720,left='+((screen.width/2)-(770/2))+',screenX='+((screen.width/2)-(770/2))+',top='+((screen.height/2)-(720/2))+',screenY='+((screen.height/2)-(720/2))+',location=0,menubar=0,toolbar=0,scrollbars=0,resizable=1'); return false;" title="s2Member®"><img src="//www.s2member.com/s-badges/s-badge.php?v=%%v%%&site_url=%%site_url%%%%no_cache%%%%display_on_failure%%" %%width_height_attrs%% style="border:0; %%width_height_styles%%" alt="s2Member®" title="<?php echo esc_attr(_x("s2Member® (Security for WordPress®)", "s2member-front", "s2member")); ?>" /></a>
|
7 |
</div>
|
includes/templates/buttons/paypal-cancellation-button.php
CHANGED
@@ -5,4 +5,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
5 |
|
6 |
<a href="https://%%endpoint%%/cgi-bin/webscr?cmd=_subscr-find&alias=%%paypal_merchant_id%%" style="outline:none;">
|
7 |
<img src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_unsubscribe_LG.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
8 |
-
</a>
|
5 |
|
6 |
<a href="https://%%endpoint%%/cgi-bin/webscr?cmd=_subscr-find&alias=%%paypal_merchant_id%%" style="outline:none;">
|
7 |
<img src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_unsubscribe_LG.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
8 |
+
</a>
|
includes/templates/buttons/paypal-ccaps-checkout-button.php
CHANGED
@@ -32,4 +32,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
32 |
<input type="hidden" name="os1" value="<?php echo "<?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1; ?>"; ?>" />
|
33 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
34 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
35 |
-
</form>
|
32 |
<input type="hidden" name="os1" value="<?php echo "<?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1; ?>"; ?>" />
|
33 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
34 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
35 |
+
</form>
|
includes/templates/buttons/paypal-checkout-button.php
CHANGED
@@ -44,4 +44,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
44 |
<input type="hidden" name="t3" value="M" />
|
45 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
46 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
47 |
-
</form>
|
44 |
<input type="hidden" name="t3" value="M" />
|
45 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
46 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
47 |
+
</form>
|
includes/templates/buttons/paypal-sp-checkout-button.php
CHANGED
@@ -32,4 +32,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
32 |
<input type="hidden" name="os1" value="<?php echo "<?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1; ?>"; ?>" />
|
33 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
34 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
35 |
-
</form>
|
32 |
<input type="hidden" name="os1" value="<?php echo "<?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS1; ?>"; ?>" />
|
33 |
<!-- <?php echo _x ("Displays The PayPal Image Button", "s2member-admin", "s2member"); ?> -->
|
34 |
<input type="image" src="https://www.paypal.com/<?php echo esc_attr (_x ("en_US", "s2member-front paypal-button-lang-code", "s2member")); ?>/i/btn/btn_xpressCheckout.gif" style="width:auto; height:auto; border:0;" alt="PayPal" />
|
35 |
+
</form>
|
includes/templates/cfg-files/s2-cross-xml.php
CHANGED
@@ -7,4 +7,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
7 |
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
|
8 |
<cross-domain-policy>
|
9 |
<allow-access-from domain="*" />
|
10 |
-
</cross-domain-policy>
|
7 |
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
|
8 |
<cross-domain-policy>
|
9 |
<allow-access-from domain="*" />
|
10 |
+
</cross-domain-policy>
|
includes/templates/cfg-files/s2member-files-no-gzip.php
CHANGED
@@ -16,4 +16,4 @@ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2memb
|
|
16 |
RewriteRule .* - [E=no-gzip:1]
|
17 |
</IfModule>
|
18 |
|
19 |
-
<?php unset($ws_plugin__s2member_temp_s_base); ?>
|
16 |
RewriteRule .* - [E=no-gzip:1]
|
17 |
</IfModule>
|
18 |
|
19 |
+
<?php unset($ws_plugin__s2member_temp_s_base); ?>
|
includes/templates/cfg-files/s2member-files.php
CHANGED
@@ -111,4 +111,4 @@ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2memb
|
|
111 |
</IfModule>
|
112 |
</IfModule>
|
113 |
|
114 |
-
<?php unset($ws_plugin__s2member_temp_s_base); ?>
|
111 |
</IfModule>
|
112 |
</IfModule>
|
113 |
|
114 |
+
<?php unset($ws_plugin__s2member_temp_s_base); ?>
|
includes/templates/cfg-files/s2member-logs.php
CHANGED
@@ -8,4 +8,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
8 |
</IfModule>
|
9 |
<IfModule !authz_core_module>
|
10 |
deny from all
|
11 |
-
</IfModule>
|
8 |
</IfModule>
|
9 |
<IfModule !authz_core_module>
|
10 |
deny from all
|
11 |
+
</IfModule>
|
includes/templates/cfg-files/s2o-mu-plugins.php
CHANGED
@@ -33,4 +33,4 @@ if(is_file(WPMU_PLUGIN_DIR.'/s2member-a.php'))
|
|
33 |
include_once WPMU_PLUGIN_DIR.'/s2member-a.php';
|
34 |
|
35 |
else if(is_file(WPMU_PLUGIN_DIR.'/s2-a.php'))
|
36 |
-
include_once WPMU_PLUGIN_DIR.'/s2-a.php';
|
33 |
include_once WPMU_PLUGIN_DIR.'/s2member-a.php';
|
34 |
|
35 |
else if(is_file(WPMU_PLUGIN_DIR.'/s2-a.php'))
|
36 |
+
include_once WPMU_PLUGIN_DIR.'/s2-a.php';
|
includes/templates/cfg-files/s2o-nw-plugins.php
CHANGED
@@ -18,4 +18,4 @@ else if(in_array($o_ws_plugin__plugins_s2member, wp_get_active_network_plugins()
|
|
18 |
else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
|
19 |
include_once $o_ws_plugin__s2member;
|
20 |
|
21 |
-
unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
|
18 |
else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
|
19 |
include_once $o_ws_plugin__s2member;
|
20 |
|
21 |
+
unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
|
includes/templates/cfg-files/s2o-st-plugins.php
CHANGED
@@ -18,4 +18,4 @@ else if(in_array($o_ws_plugin__plugins_s2member, wp_get_active_and_valid_plugins
|
|
18 |
else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
|
19 |
include_once $o_ws_plugin__s2member;
|
20 |
|
21 |
-
unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
|
18 |
else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
|
19 |
include_once $o_ws_plugin__s2member;
|
20 |
|
21 |
+
unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
|
includes/templates/cfg-files/s2o-th-funcs.php
CHANGED
@@ -3,4 +3,4 @@ if(!defined('_WS_PLUGIN__S2MEMBER_ONLY'))
|
|
3 |
exit('Do not access this file directly.');
|
4 |
?>
|
5 |
|
6 |
-
// s2Member-only mode. Do NOT load theme functions, exclude all themes.
|
3 |
exit('Do not access this file directly.');
|
4 |
?>
|
5 |
|
6 |
+
// s2Member-only mode. Do NOT load theme functions, exclude all themes.
|
includes/templates/errors/ip-restrictions.php
CHANGED
@@ -12,4 +12,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
12 |
<body>
|
13 |
<?php echo _x('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member"); ?>
|
14 |
</body>
|
15 |
-
</html>
|
12 |
<body>
|
13 |
<?php echo _x('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member"); ?>
|
14 |
</body>
|
15 |
+
</html>
|
includes/templates/options/paypal-currencies.php
CHANGED
@@ -191,4 +191,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
191 |
<option value="ZAR">ZAR</option>
|
192 |
<option value="ZMK">ZMK</option>
|
193 |
<option value="ZWD">ZWD</option>
|
194 |
-
</optgroup>
|
191 |
<option value="ZAR">ZAR</option>
|
192 |
<option value="ZMK">ZMK</option>
|
193 |
<option value="ZWD">ZWD</option>
|
194 |
+
</optgroup>
|
includes/templates/options/paypal-membership-ccap-terms.php
CHANGED
@@ -5,4 +5,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
5 |
|
6 |
<optgroup label="<?php echo esc_attr (_x ("PayPal (Buy Now)", "s2member-admin", "s2member")); ?>">
|
7 |
<option value="1-L-BN" selected="selected"><?php echo esc_html (_x ("One Time (for lifetime access, non-recurring)", "s2member-admin", "s2member")); ?></option>
|
8 |
-
</optgroup>
|
5 |
|
6 |
<optgroup label="<?php echo esc_attr (_x ("PayPal (Buy Now)", "s2member-admin", "s2member")); ?>">
|
7 |
<option value="1-L-BN" selected="selected"><?php echo esc_html (_x ("One Time (for lifetime access, non-recurring)", "s2member-admin", "s2member")); ?></option>
|
8 |
+
</optgroup>
|
includes/templates/options/paypal-membership-regular-terms.php
CHANGED
@@ -66,4 +66,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
66 |
<option value="5-Y-BN"><?php echo esc_html (_x ("One Time (for 5 year access, non-recurring, no trial)", "s2member-admin", "s2member")); ?></option>
|
67 |
|
68 |
<option value="1-L-BN"><?php echo esc_html (_x ("One Time (for lifetime access, non-recurring, no trial)", "s2member-admin", "s2member")); ?></option>
|
69 |
-
</optgroup>
|
66 |
<option value="5-Y-BN"><?php echo esc_html (_x ("One Time (for 5 year access, non-recurring, no trial)", "s2member-admin", "s2member")); ?></option>
|
67 |
|
68 |
<option value="1-L-BN"><?php echo esc_html (_x ("One Time (for lifetime access, non-recurring, no trial)", "s2member-admin", "s2member")); ?></option>
|
69 |
+
</optgroup>
|
includes/templates/options/paypal-membership-trial-terms.php
CHANGED
@@ -6,4 +6,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
6 |
<option value="D" selected="selected"><?php echo esc_html (_x ("Days", "s2member-admin", "s2member")); ?></option>
|
7 |
<option value="W"><?php echo esc_html (_x ("Weeks", "s2member-admin", "s2member")); ?></option>
|
8 |
<option value="M"><?php echo esc_html (_x ("Months", "s2member-admin", "s2member")); ?></option>
|
9 |
-
<option value="Y"><?php echo esc_html (_x ("Years", "s2member-admin", "s2member")); ?></option>
|
6 |
<option value="D" selected="selected"><?php echo esc_html (_x ("Days", "s2member-admin", "s2member")); ?></option>
|
7 |
<option value="W"><?php echo esc_html (_x ("Weeks", "s2member-admin", "s2member")); ?></option>
|
8 |
<option value="M"><?php echo esc_html (_x ("Months", "s2member-admin", "s2member")); ?></option>
|
9 |
+
<option value="Y"><?php echo esc_html (_x ("Years", "s2member-admin", "s2member")); ?></option>
|
includes/templates/options/paypal-sp-hours.php
CHANGED
@@ -49,4 +49,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
49 |
<option value="35040"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 4 years)", "s2member-admin", "s2member")); ?></option>
|
50 |
<option value="43800"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 5 years)", "s2member-admin", "s2member")); ?></option>
|
51 |
<option value="438291"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 50 years)", "s2member-admin", "s2member")); ?></option>
|
52 |
-
</optgroup>
|
49 |
<option value="35040"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 4 years)", "s2member-admin", "s2member")); ?></option>
|
50 |
<option value="43800"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 5 years)", "s2member-admin", "s2member")); ?></option>
|
51 |
<option value="438291"><?php echo esc_html (_x ("Buy Now (Specific Post/Page, link valid for 50 years)", "s2member-admin", "s2member")); ?></option>
|
52 |
+
</optgroup>
|
includes/templates/players/jwplayer-v6-rtmp-only.php
CHANGED
@@ -40,4 +40,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
-
</script>
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
+
</script>
|
includes/templates/players/jwplayer-v6-rtmp.php
CHANGED
@@ -40,4 +40,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
-
</script>
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
+
</script>
|
includes/templates/players/jwplayer-v6.php
CHANGED
@@ -40,4 +40,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
-
</script>
|
40 |
|
41 |
%%player_option_blocks%%
|
42 |
});
|
43 |
+
</script>
|
includes/templates/returns/default-return.php
CHANGED
@@ -40,4 +40,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
40 |
%%tracking%% <!-- (this is auto-filled, supports tracking codes integrated w/ s2Member). -->
|
41 |
|
42 |
</body>
|
43 |
-
</html>
|
40 |
%%tracking%% <!-- (this is auto-filled, supports tracking codes integrated w/ s2Member). -->
|
41 |
|
42 |
</body>
|
43 |
+
</html>
|
includes/templates/shortcodes/paypal-cancellation-button-shortcode.php
CHANGED
@@ -3,4 +3,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
-
[s2Member-PayPal-Button cancel="1" image="default" output="anchor" /]
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
+
[s2Member-PayPal-Button cancel="1" image="default" output="anchor" /]
|
includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php
CHANGED
@@ -3,4 +3,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
-
[s2Member-PayPal-Button level="*" ccaps="music,videos" desc="<?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ra="0.01" rp="1" rt="L" rr="BN" image="default" output="button" /]
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
+
[s2Member-PayPal-Button level="*" ccaps="music,videos" desc="<?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ra="0.01" rp="1" rt="L" rr="BN" image="default" output="button" /]
|
includes/templates/shortcodes/paypal-checkout-button-shortcode.php
CHANGED
@@ -3,4 +3,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
-
[s2Member-PayPal-Button level="%%level%%" ccaps="" desc="%%level_label%% / <?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ta="0" tp="0" tt="D" ra="0.01" rp="1" rt="M" rr="1" rrt="" rra="1" image="default" output="button" /]
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
+
[s2Member-PayPal-Button level="%%level%%" ccaps="" desc="%%level_label%% / <?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ta="0" tp="0" tt="D" ra="0.01" rp="1" rt="M" rr="1" rrt="" rra="1" image="default" output="button" /]
|
includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php
CHANGED
@@ -3,4 +3,4 @@ if(!defined('WPINC')) // MUST have WordPress.
|
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
-
[s2Member-PayPal-Button sp="1" ids="0" exp="72" desc="<?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ra="0.01" image="default" output="button" /]
|
3 |
exit("Do not access this file directly.");
|
4 |
?>
|
5 |
|
6 |
+
[s2Member-PayPal-Button sp="1" ids="0" exp="72" desc="<?php echo esc_attr (_x ("Description and pricing details here.", "s2member-admin", "s2member")); ?>" ps="paypal" lc="" cc="USD" dg="0" ns="1" custom="%%custom%%" ra="0.01" image="default" output="button" /]
|
includes/translations/s2member.pot
CHANGED
@@ -2,9 +2,9 @@
|
|
2 |
# This file is distributed under the same license as the package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version:
|
6 |
"Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
|
7 |
-
"POT-Creation-Date: 2015-
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -92,50 +92,50 @@ msgstr ""
|
|
92 |
|
93 |
#: s2member/includes/classes/custom-reg-fields.inc.php:616
|
94 |
#: s2member/includes/classes/custom-reg-fields.inc.php:647
|
95 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
96 |
msgctxt "s2member-front"
|
97 |
msgid "This is a required field, please try again."
|
98 |
msgstr ""
|
99 |
|
100 |
#: s2member/includes/classes/custom-reg-fields.inc.php:622
|
101 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
102 |
msgctxt "s2member-front"
|
103 |
msgid "Required. This box must be checked."
|
104 |
msgstr ""
|
105 |
|
106 |
#: s2member/includes/classes/custom-reg-fields.inc.php:627
|
107 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
108 |
msgctxt "s2member-front"
|
109 |
msgid "Please check at least one of the boxes."
|
110 |
msgstr ""
|
111 |
|
112 |
#: s2member/includes/classes/custom-reg-fields.inc.php:632
|
113 |
#: s2member/includes/classes/custom-reg-fields.inc.php:637
|
114 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
115 |
msgctxt "s2member-front"
|
116 |
msgid "Please select one of the options."
|
117 |
msgstr ""
|
118 |
|
119 |
#: s2member/includes/classes/custom-reg-fields.inc.php:642
|
120 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
121 |
msgctxt "s2member-front"
|
122 |
msgid "Please select at least one of the options."
|
123 |
msgstr ""
|
124 |
|
125 |
#: s2member/includes/classes/custom-reg-fields.inc.php:658
|
126 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
127 |
msgctxt "s2member-front"
|
128 |
msgid "Must be numeric (with or without decimals, commas allowed)."
|
129 |
msgstr ""
|
130 |
|
131 |
#: s2member/includes/classes/custom-reg-fields.inc.php:663
|
132 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
133 |
msgctxt "s2member-front"
|
134 |
msgid "Must be numeric (with or without decimals, no commas)."
|
135 |
msgstr ""
|
136 |
|
137 |
#: s2member/includes/classes/custom-reg-fields.inc.php:668
|
138 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
139 |
msgctxt "s2member-front"
|
140 |
msgid "Must be an integer (a whole number, without any decimals)."
|
141 |
msgstr ""
|
@@ -146,7 +146,7 @@ msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
|
|
146 |
msgstr ""
|
147 |
|
148 |
#: s2member/includes/classes/custom-reg-fields.inc.php:678
|
149 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
150 |
msgctxt "s2member-front"
|
151 |
msgid "Must be a float (floating point number, decimals required)."
|
152 |
msgstr ""
|
@@ -157,13 +157,13 @@ msgid "Must be a float > 0 (floating point number, decimals required, greater
|
|
157 |
msgstr ""
|
158 |
|
159 |
#: s2member/includes/classes/custom-reg-fields.inc.php:688
|
160 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
161 |
msgctxt "s2member-front"
|
162 |
msgid "Must be a date (required date format: dd/mm/yyyy)."
|
163 |
msgstr ""
|
164 |
|
165 |
#: s2member/includes/classes/custom-reg-fields.inc.php:693
|
166 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
167 |
msgctxt "s2member-front"
|
168 |
msgid "Must be a valid email address."
|
169 |
msgstr ""
|
@@ -174,25 +174,25 @@ msgid "Please use a personal email address. Addresses like <%s@> are probl
|
|
174 |
msgstr ""
|
175 |
|
176 |
#: s2member/includes/classes/custom-reg-fields.inc.php:701
|
177 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
178 |
msgctxt "s2member-front"
|
179 |
msgid "Must be a full URL (starting with http or https)."
|
180 |
msgstr ""
|
181 |
|
182 |
#: s2member/includes/classes/custom-reg-fields.inc.php:706
|
183 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
184 |
msgctxt "s2member-front"
|
185 |
msgid "Must be a domain name (domain name only, without http)."
|
186 |
msgstr ""
|
187 |
|
188 |
#: s2member/includes/classes/custom-reg-fields.inc.php:711
|
189 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
190 |
msgctxt "s2member-front"
|
191 |
msgid "Must be a phone # (10 digits w/possible hyphens, spaces, brackets)."
|
192 |
msgstr ""
|
193 |
|
194 |
#: s2member/includes/classes/custom-reg-fields.inc.php:716
|
195 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
196 |
msgctxt "s2member-front"
|
197 |
msgid "Must be a US zipcode (5-9 digits w/ possible hyphen)."
|
198 |
msgstr ""
|
@@ -203,7 +203,7 @@ msgid "Must be a Canadian zipcode (6 alpha-numerics w/ possible space)."
|
|
203 |
msgstr ""
|
204 |
|
205 |
#: s2member/includes/classes/custom-reg-fields.inc.php:726
|
206 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
207 |
msgctxt "s2member-front"
|
208 |
msgid "Must be a zipcode (either a US or Canadian zipcode)."
|
209 |
msgstr ""
|
@@ -224,63 +224,63 @@ msgid "Please use alphanumerics & punctuation only (no spaces)."
|
|
224 |
msgstr ""
|
225 |
|
226 |
#: s2member/includes/classes/custom-reg-fields.inc.php:741
|
227 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
228 |
msgctxt "s2member-front"
|
229 |
msgid "Please use alphanumerics only (no spaces/punctuation)."
|
230 |
msgstr ""
|
231 |
|
232 |
#: s2member/includes/classes/custom-reg-fields.inc.php:744
|
233 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
234 |
msgctxt "s2member-front"
|
235 |
msgid "Please use alphabetics only (no digits/spaces/punctuation)."
|
236 |
msgstr ""
|
237 |
|
238 |
#: s2member/includes/classes/custom-reg-fields.inc.php:747
|
239 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
240 |
msgctxt "s2member-front"
|
241 |
msgid "Please use numeric digits only."
|
242 |
msgstr ""
|
243 |
|
244 |
#: s2member/includes/classes/custom-reg-fields.inc.php:760
|
245 |
#: s2member/includes/classes/custom-reg-fields.inc.php:774
|
246 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
247 |
-
#: s2member/includes/s2member.js:
|
248 |
msgctxt "s2member-front"
|
249 |
msgid "digit"
|
250 |
msgstr ""
|
251 |
|
252 |
#: s2member/includes/classes/custom-reg-fields.inc.php:761
|
253 |
#: s2member/includes/classes/custom-reg-fields.inc.php:775
|
254 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
255 |
-
#: s2member/includes/s2member.js:
|
256 |
msgctxt "s2member-front"
|
257 |
msgid "digits"
|
258 |
msgstr ""
|
259 |
|
260 |
#: s2member/includes/classes/custom-reg-fields.inc.php:764
|
261 |
#: s2member/includes/classes/custom-reg-fields.inc.php:778
|
262 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
263 |
-
#: s2member/includes/s2member.js:
|
264 |
msgctxt "s2member-front"
|
265 |
msgid "character"
|
266 |
msgstr ""
|
267 |
|
268 |
#: s2member/includes/classes/custom-reg-fields.inc.php:765
|
269 |
#: s2member/includes/classes/custom-reg-fields.inc.php:779
|
270 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
271 |
-
#: s2member/includes/s2member.js:
|
272 |
msgctxt "s2member-front"
|
273 |
msgid "characters"
|
274 |
msgstr ""
|
275 |
|
276 |
#: s2member/includes/classes/custom-reg-fields.inc.php:767
|
277 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
278 |
msgctxt "s2member-front"
|
279 |
msgid "Must be exactly %s %s."
|
280 |
msgstr ""
|
281 |
|
282 |
#: s2member/includes/classes/custom-reg-fields.inc.php:781
|
283 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
284 |
msgctxt "s2member-front"
|
285 |
msgid "Must be at least %s %s."
|
286 |
msgstr ""
|
@@ -303,12 +303,12 @@ msgstr ""
|
|
303 |
|
304 |
#: s2member/includes/classes/files-in.inc.php:144
|
305 |
msgctxt "s2member-front"
|
306 |
-
msgid "<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
|
307 |
msgstr ""
|
308 |
|
309 |
#: s2member/includes/classes/files-in.inc.php:155
|
310 |
msgctxt "s2member-front"
|
311 |
-
msgid "<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
|
312 |
msgstr ""
|
313 |
|
314 |
#: s2member/includes/classes/files-in.inc.php:496
|
@@ -852,8 +852,8 @@ msgstr ""
|
|
852 |
#: s2member/includes/classes/paypal-utilities.inc.php:188
|
853 |
#: s2member/includes/classes/paypal-utilities.inc.php:316
|
854 |
#: s2member/includes/classes/paypal-utilities.inc.php:324
|
855 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:
|
856 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:
|
857 |
msgctxt "s2member-front"
|
858 |
msgid "Error. Please contact Support for assistance."
|
859 |
msgstr ""
|
@@ -885,8 +885,8 @@ msgstr ""
|
|
885 |
#. `ws_plugin__s2member_pro_authnet_arb_response`.
|
886 |
#: s2member/includes/classes/paypal-utilities.inc.php:314
|
887 |
#: s2member/includes/classes/paypal-utilities.inc.php:322
|
888 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:
|
889 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:
|
890 |
msgctxt "s2member-front"
|
891 |
msgid "Error #%1$s. %2$s."
|
892 |
msgstr ""
|
@@ -995,6 +995,31 @@ msgctxt "s2member-front"
|
|
995 |
msgid "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact support</a>."
|
996 |
msgstr ""
|
997 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
998 |
#: s2member/includes/classes/sc-paypal-button-e.inc.php:77
|
999 |
#: s2member/includes/classes/sc-paypal-button-in.inc.php:73
|
1000 |
#: s2member/includes/classes/sc-paypal-button-in.inc.php:97
|
@@ -1005,8 +1030,8 @@ msgstr ""
|
|
1005 |
#: s2member/includes/templates/buttons/paypal-checkout-button.php:46
|
1006 |
#: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
|
1007 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1008 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1009 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1010 |
msgctxt "s2member-front paypal-button-lang-code"
|
1011 |
msgid "en_US"
|
1012 |
msgstr ""
|
@@ -1075,6 +1100,21 @@ msgid_plural "You may create up to <strong>%s</strong> sites."
|
|
1075 |
msgstr[0] ""
|
1076 |
msgstr[1] ""
|
1077 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1078 |
#: s2member/includes/classes/users-list-in.inc.php:349
|
1079 |
msgctxt "s2member-front"
|
1080 |
msgid "Additional Profile Fields"
|
@@ -1187,115 +1227,115 @@ msgid_plural "%s years"
|
|
1187 |
msgstr[0] ""
|
1188 |
msgstr[1] ""
|
1189 |
|
1190 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1191 |
msgctxt "s2member-front"
|
1192 |
msgid "Daily"
|
1193 |
msgstr ""
|
1194 |
|
1195 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1196 |
msgctxt "s2member-front"
|
1197 |
msgid "Weekly"
|
1198 |
msgstr ""
|
1199 |
|
1200 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1201 |
msgctxt "s2member-front"
|
1202 |
msgid "Monthly"
|
1203 |
msgstr ""
|
1204 |
|
1205 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1206 |
msgctxt "s2member-front"
|
1207 |
msgid "Yearly"
|
1208 |
msgstr ""
|
1209 |
|
1210 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1211 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1212 |
msgctxt "s2member-front"
|
1213 |
msgid "Lifetime"
|
1214 |
msgstr ""
|
1215 |
|
1216 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1217 |
msgctxt "s2member-front"
|
1218 |
msgid "Bi-Weekly"
|
1219 |
msgstr ""
|
1220 |
|
1221 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1222 |
msgctxt "s2member-front"
|
1223 |
msgid "Bi-Monthly"
|
1224 |
msgstr ""
|
1225 |
|
1226 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1227 |
msgctxt "s2member-front"
|
1228 |
msgid "Quarterly"
|
1229 |
msgstr ""
|
1230 |
|
1231 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1232 |
msgctxt "s2member-front"
|
1233 |
msgid "Semi-Yearly"
|
1234 |
msgstr ""
|
1235 |
|
1236 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1237 |
msgctxt "s2member-front"
|
1238 |
msgid "Day"
|
1239 |
msgstr ""
|
1240 |
|
1241 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1242 |
msgctxt "s2member-front"
|
1243 |
msgid "Week"
|
1244 |
msgstr ""
|
1245 |
|
1246 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1247 |
msgctxt "s2member-front"
|
1248 |
msgid "Month"
|
1249 |
msgstr ""
|
1250 |
|
1251 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1252 |
msgctxt "s2member-front"
|
1253 |
msgid "Year"
|
1254 |
msgstr ""
|
1255 |
|
1256 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1257 |
msgctxt "s2member-front"
|
1258 |
msgid "Days"
|
1259 |
msgstr ""
|
1260 |
|
1261 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1262 |
msgctxt "s2member-front"
|
1263 |
msgid "Weeks"
|
1264 |
msgstr ""
|
1265 |
|
1266 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1267 |
msgctxt "s2member-front"
|
1268 |
msgid "Months"
|
1269 |
msgstr ""
|
1270 |
|
1271 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1272 |
msgctxt "s2member-front"
|
1273 |
msgid "Years"
|
1274 |
msgstr ""
|
1275 |
|
1276 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1277 |
msgctxt "s2member-front"
|
1278 |
msgid "Lifetimes"
|
1279 |
msgstr ""
|
1280 |
|
1281 |
#. translators: Each cycle ( i.e., `each day/week/month` or `every 2
|
1282 |
#. days/weeks/months`, etc. ). Cycles are translated elsewhere.
|
1283 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1284 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1285 |
msgctxt "s2member-front"
|
1286 |
msgid "each %2$s"
|
1287 |
msgid_plural "every %1$s %3$s"
|
1288 |
msgstr[0] ""
|
1289 |
msgstr[1] ""
|
1290 |
|
1291 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1292 |
msgctxt "s2member-front"
|
1293 |
msgid "lifetime"
|
1294 |
msgstr ""
|
1295 |
|
1296 |
#. translators: Membership cycle ( i.e., `1 day/week/month` or `2
|
1297 |
#. days/weeks/months`, etc. ). Most of this is translated elsewhere.
|
1298 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1299 |
msgctxt "s2member-front"
|
1300 |
msgid "%1$s %2$s"
|
1301 |
msgid_plural "%1$s %3$s"
|
@@ -1304,79 +1344,147 @@ msgstr[1] ""
|
|
1304 |
|
1305 |
#. translators: Cycle ( i.e., `for 1 day/week/month` or `for 2
|
1306 |
#. days/weeks/months`, etc. ). Most of this is translated elsewhere.
|
1307 |
-
#: s2member/includes/classes/utils-time.inc.php:
|
1308 |
msgctxt "s2member-front"
|
1309 |
msgid "for %1$s %2$s"
|
1310 |
msgid_plural "for %1$s %3$s"
|
1311 |
msgstr[0] ""
|
1312 |
msgstr[1] ""
|
1313 |
|
1314 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1315 |
msgctxt "s2member-front"
|
1316 |
msgid "— Confirm File Download —"
|
1317 |
msgstr ""
|
1318 |
|
1319 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1320 |
msgctxt "s2member-front"
|
1321 |
msgid "You`ve downloaded %s protected %s in the last %s."
|
1322 |
msgstr ""
|
1323 |
|
1324 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1325 |
msgctxt "s2member-front"
|
1326 |
msgid "file"
|
1327 |
msgstr ""
|
1328 |
|
1329 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1330 |
msgctxt "s2member-front"
|
1331 |
msgid "files"
|
1332 |
msgstr ""
|
1333 |
|
1334 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1335 |
msgctxt "s2member-front"
|
1336 |
msgid "24 hours"
|
1337 |
msgstr ""
|
1338 |
|
1339 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1340 |
msgctxt "s2member-front"
|
1341 |
msgid "%s days"
|
1342 |
msgstr ""
|
1343 |
|
1344 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1345 |
msgctxt "s2member-front"
|
1346 |
msgid "You`re entitled to UNLIMITED downloads though (so, no worries)."
|
1347 |
msgstr ""
|
1348 |
|
1349 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1350 |
msgctxt "s2member-front"
|
1351 |
msgid "You`re entitled to %s unique %s %s."
|
1352 |
msgstr ""
|
1353 |
|
1354 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1355 |
msgctxt "s2member-front"
|
1356 |
msgid "download"
|
1357 |
msgstr ""
|
1358 |
|
1359 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1360 |
msgctxt "s2member-front"
|
1361 |
msgid "downloads"
|
1362 |
msgstr ""
|
1363 |
|
1364 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1365 |
msgctxt "s2member-front"
|
1366 |
msgid "each day"
|
1367 |
msgstr ""
|
1368 |
|
1369 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1370 |
msgctxt "s2member-front"
|
1371 |
msgid "every %s-day period"
|
1372 |
msgstr ""
|
1373 |
|
1374 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1375 |
-
#: s2member/includes/s2member.js:
|
1376 |
-
#: s2member/includes/s2member.js:
|
1377 |
-
#: s2member/includes/s2member.js:
|
1378 |
-
#: s2member/includes/s2member.js:
|
1379 |
-
#: s2member/includes/s2member.js:
|
|
|
1380 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1381 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:66
|
1382 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:73
|
@@ -1385,13 +1493,15 @@ msgstr ""
|
|
1385 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:255
|
1386 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
|
1387 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
|
1388 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1389 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1390 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1391 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1392 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1393 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1394 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
|
|
|
|
1395 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1396 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:66
|
1397 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:73
|
@@ -1400,13 +1510,15 @@ msgstr ""
|
|
1400 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:255
|
1401 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
|
1402 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
|
1403 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1404 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1405 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1406 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1407 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1408 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1409 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
|
|
|
|
1410 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1411 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:101
|
1412 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
|
@@ -1414,111 +1526,61 @@ msgstr ""
|
|
1414 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
|
1415 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
|
1416 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
|
1417 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1418 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1419 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1420 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1421 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1422 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
|
|
|
|
1423 |
msgctxt "s2member-front"
|
1424 |
msgid "— Oops, you missed something: —"
|
1425 |
msgstr ""
|
1426 |
|
1427 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1428 |
-
#: s2member/includes/s2member.js:
|
1429 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1430 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
|
1431 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1432 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1433 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
|
1434 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1435 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1436 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
|
1437 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1438 |
msgctxt "s2member-front"
|
1439 |
msgid "Passwords do not match up. Please try again."
|
1440 |
msgstr ""
|
1441 |
|
1442 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1443 |
-
#: s2member/includes/s2member.js:
|
1444 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1445 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
|
1446 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:
|
1447 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1448 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
|
1449 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:
|
1450 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1451 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
|
1452 |
-
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:
|
1453 |
-
msgctxt "s2member-front"
|
1454 |
-
msgid "Password MUST be at least 6 characters. Please try again."
|
1455 |
-
msgstr ""
|
1456 |
-
|
1457 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:313
|
1458 |
-
msgctxt "s2member-front"
|
1459 |
-
msgid "Strength indicator"
|
1460 |
-
msgstr ""
|
1461 |
-
|
1462 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:314
|
1463 |
-
msgctxt "s2member-front"
|
1464 |
-
msgid "Very weak"
|
1465 |
-
msgstr ""
|
1466 |
-
|
1467 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:315
|
1468 |
-
msgctxt "s2member-front"
|
1469 |
-
msgid "Weak"
|
1470 |
-
msgstr ""
|
1471 |
-
|
1472 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:316
|
1473 |
msgctxt "s2member-front"
|
1474 |
-
msgid "
|
1475 |
-
msgstr ""
|
1476 |
-
|
1477 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:317
|
1478 |
-
msgctxt "s2member-front"
|
1479 |
-
msgid "Strong"
|
1480 |
-
msgstr ""
|
1481 |
-
|
1482 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:318
|
1483 |
-
msgctxt "s2member-front"
|
1484 |
-
msgid "Mismatch"
|
1485 |
-
msgstr ""
|
1486 |
-
|
1487 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
|
1488 |
-
msgctxt "s2member-front"
|
1489 |
-
msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
|
1490 |
-
msgstr ""
|
1491 |
-
|
1492 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:392
|
1493 |
-
msgctxt "s2member-front"
|
1494 |
-
msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
|
1495 |
-
msgstr ""
|
1496 |
-
|
1497 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:404
|
1498 |
-
msgctxt "s2member-front"
|
1499 |
-
msgid ""
|
1500 |
-
"Please use a personal email address.\n"
|
1501 |
-
"Addresses like <%s@> are problematic."
|
1502 |
msgstr ""
|
1503 |
|
1504 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:
|
1505 |
-
|
1506 |
-
|
1507 |
-
|
1508 |
-
|
1509 |
-
#: s2member/includes/
|
1510 |
-
|
1511 |
-
|
1512 |
-
|
1513 |
-
|
1514 |
-
#: s2member/
|
1515 |
-
msgctxt "s2member-front"
|
1516 |
-
msgid "Please use alphanumerics & spaces only."
|
1517 |
-
msgstr ""
|
1518 |
-
|
1519 |
-
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:440
|
1520 |
msgctxt "s2member-front"
|
1521 |
-
msgid "
|
1522 |
msgstr ""
|
1523 |
|
1524 |
#: s2member/includes/syscon.inc.php:84
|
@@ -1526,17 +1588,17 @@ msgctxt "s2member-front recaptcha-lang-code"
|
|
1526 |
msgid "en"
|
1527 |
msgstr ""
|
1528 |
|
1529 |
-
#: s2member/includes/syscon.inc.php:
|
1530 |
msgctxt "s2member-front"
|
1531 |
msgid "Yes, I want to receive updates via email."
|
1532 |
msgstr ""
|
1533 |
|
1534 |
-
#: s2member/includes/syscon.inc.php:
|
1535 |
msgctxt "s2member-front"
|
1536 |
msgid "[%s] Username/Password"
|
1537 |
msgstr ""
|
1538 |
|
1539 |
-
#: s2member/includes/syscon.inc.php:
|
1540 |
msgctxt "s2member-front"
|
1541 |
msgid ""
|
1542 |
"Your Username/Password for:\n"
|
@@ -1547,12 +1609,12 @@ msgid ""
|
|
1547 |
"%%%%wp_login_url%%%%"
|
1548 |
msgstr ""
|
1549 |
|
1550 |
-
#: s2member/includes/syscon.inc.php:
|
1551 |
msgctxt "s2member-front"
|
1552 |
msgid "[%s] New User Registration"
|
1553 |
msgstr ""
|
1554 |
|
1555 |
-
#: s2member/includes/syscon.inc.php:
|
1556 |
msgctxt "s2member-front"
|
1557 |
msgid ""
|
1558 |
"New User Registration on your site:\n"
|
@@ -1564,13 +1626,13 @@ msgid ""
|
|
1564 |
"IP Address: %%%%user_ip%%%%"
|
1565 |
msgstr ""
|
1566 |
|
1567 |
-
#: s2member/includes/syscon.inc.php:
|
1568 |
-
#: s2member-pro/s2member-pro/includes/syscon.inc.php:
|
1569 |
msgctxt "s2member-front"
|
1570 |
msgid "Congratulations! (your membership has been approved)"
|
1571 |
msgstr ""
|
1572 |
|
1573 |
-
#: s2member/includes/syscon.inc.php:
|
1574 |
msgctxt "s2member-front"
|
1575 |
msgid ""
|
1576 |
"Thanks %%%%first_name%%%%! Your membership has been approved.\n"
|
@@ -1586,12 +1648,12 @@ msgid ""
|
|
1586 |
"%s"
|
1587 |
msgstr ""
|
1588 |
|
1589 |
-
#: s2member/includes/syscon.inc.php:
|
1590 |
msgctxt "s2member-front"
|
1591 |
msgid "Thank you! Your account has been updated."
|
1592 |
msgstr ""
|
1593 |
|
1594 |
-
#: s2member/includes/syscon.inc.php:
|
1595 |
msgctxt "s2member-front"
|
1596 |
msgid ""
|
1597 |
"Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n"
|
@@ -1602,13 +1664,13 @@ msgid ""
|
|
1602 |
"%s"
|
1603 |
msgstr ""
|
1604 |
|
1605 |
-
#: s2member/includes/syscon.inc.php:
|
1606 |
-
#: s2member-pro/s2member-pro/includes/syscon.inc.php:
|
1607 |
msgctxt "s2member-front"
|
1608 |
msgid "Thank You! (instructions for access)"
|
1609 |
msgstr ""
|
1610 |
|
1611 |
-
#: s2member/includes/syscon.inc.php:
|
1612 |
msgctxt "s2member-front"
|
1613 |
msgid ""
|
1614 |
"Thanks %%%%first_name%%%%!\n"
|
@@ -1625,39 +1687,39 @@ msgid ""
|
|
1625 |
"%s"
|
1626 |
msgstr ""
|
1627 |
|
1628 |
-
#: s2member/includes/syscon.inc.php:
|
1629 |
msgctxt "s2member-front"
|
1630 |
msgid "Free Subscriber"
|
1631 |
msgstr ""
|
1632 |
|
1633 |
-
#: s2member/includes/syscon.inc.php:
|
1634 |
msgctxt "s2member-front"
|
1635 |
msgid "Bronze Member"
|
1636 |
msgstr ""
|
1637 |
|
1638 |
-
#: s2member/includes/syscon.inc.php:
|
1639 |
msgctxt "s2member-front"
|
1640 |
msgid "Silver Member"
|
1641 |
msgstr ""
|
1642 |
|
1643 |
-
#: s2member/includes/syscon.inc.php:
|
1644 |
msgctxt "s2member-front"
|
1645 |
msgid "Gold Member"
|
1646 |
msgstr ""
|
1647 |
|
1648 |
-
#: s2member/includes/syscon.inc.php:
|
1649 |
msgctxt "s2member-front"
|
1650 |
msgid "Platinum Member"
|
1651 |
msgstr ""
|
1652 |
|
1653 |
-
#: s2member/includes/syscon.inc.php:
|
1654 |
msgctxt "s2member-front"
|
1655 |
msgid "Level %s Member"
|
1656 |
msgstr ""
|
1657 |
|
1658 |
-
#: s2member/includes/templates/badges/s-badge.php:
|
1659 |
msgctxt "s2member-front"
|
1660 |
-
msgid "s2Member® (
|
1661 |
msgstr ""
|
1662 |
|
1663 |
#: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:9
|
@@ -2613,76 +2675,76 @@ msgctxt "s2member-admin"
|
|
2613 |
msgid "Buy Now (Specific Post/Page, link valid for 50 years)"
|
2614 |
msgstr ""
|
2615 |
|
2616 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2617 |
msgctxt "s2member-front"
|
2618 |
msgid "+ tax"
|
2619 |
msgstr ""
|
2620 |
|
2621 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2622 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:
|
2623 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:311
|
2624 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:
|
2625 |
msgctxt "s2member-front percentage-symbol"
|
2626 |
msgid "%"
|
2627 |
msgstr ""
|
2628 |
|
2629 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2630 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2631 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2632 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2633 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2634 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2635 |
msgctxt "s2member-front"
|
2636 |
msgid "Discount: %s off. (Now: %s)"
|
2637 |
msgstr ""
|
2638 |
|
2639 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2640 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2641 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2642 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2643 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2644 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2645 |
msgctxt "s2member-front"
|
2646 |
msgid "<div>Discount: <strong>%s off</strong>. (Now: <strong>%s</strong>)</div>"
|
2647 |
msgstr ""
|
2648 |
|
2649 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2650 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2651 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2652 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2653 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2654 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2655 |
msgctxt "s2member-front"
|
2656 |
msgid "Discount: %s off. (Now: %s, then %s)"
|
2657 |
msgstr ""
|
2658 |
|
2659 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2660 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2661 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2662 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2663 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2664 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2665 |
msgctxt "s2member-front"
|
2666 |
msgid "<div>Discount: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
|
2667 |
msgstr ""
|
2668 |
|
2669 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2670 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2671 |
msgctxt "s2member-front"
|
2672 |
msgid "<div>Sorry, your discount code is not applicable.</div>"
|
2673 |
msgstr ""
|
2674 |
|
2675 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2676 |
msgctxt "s2member-front"
|
2677 |
msgid "<div>Discount: <strong>%s0.00 off</strong>.</div>"
|
2678 |
msgstr ""
|
2679 |
|
2680 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2681 |
msgctxt "s2member-front"
|
2682 |
msgid "%1$s ~ ORIGINALLY: %2$s"
|
2683 |
msgstr ""
|
2684 |
|
2685 |
-
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:
|
2686 |
msgctxt "s2member-front"
|
2687 |
msgid "<div>Sorry, your discount code is N/A, invalid or expired.</div>"
|
2688 |
msgstr ""
|
@@ -2700,118 +2762,118 @@ msgctxt "s2member-front"
|
|
2700 |
msgid ""
|
2701 |
"ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
|
2702 |
"\n"
|
2703 |
-
"This is most likely related to an invalid AliPay configuration. If you are the site owner, please check: s2Member
|
2704 |
msgstr ""
|
2705 |
|
2706 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:
|
2707 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:
|
2708 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:
|
2709 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:
|
2710 |
msgctxt "s2member-front"
|
2711 |
msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
|
2712 |
msgstr ""
|
2713 |
|
2714 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:
|
2715 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:
|
2716 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:
|
2717 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:
|
2718 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:
|
2719 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:
|
2720 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:
|
2721 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:
|
2722 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:
|
2723 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:
|
2724 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:
|
2725 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:
|
2726 |
msgctxt "s2member-front"
|
2727 |
msgid "<strong>Billing terminated.</strong> Your account has been cancelled."
|
2728 |
msgstr ""
|
2729 |
|
2730 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:
|
2731 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:
|
2732 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:
|
2733 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:
|
2734 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:
|
2735 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:
|
2736 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:
|
2737 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:
|
2738 |
msgctxt "s2member-front"
|
2739 |
msgid "You're <strong>NOT</strong> logged in."
|
2740 |
msgstr ""
|
2741 |
|
2742 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:
|
2743 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:
|
2744 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:
|
2745 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:
|
2746 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:
|
2747 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:
|
2748 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:
|
2749 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2750 |
msgctxt "s2member-front"
|
2751 |
-
msgid "<strong>
|
2752 |
msgstr ""
|
2753 |
|
2754 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:
|
2755 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:
|
2756 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:
|
2757 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:
|
2758 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:
|
2759 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:
|
2760 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:
|
2761 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:
|
2762 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:408
|
2763 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:603
|
2764 |
msgctxt "s2member-front"
|
2765 |
-
msgid "<strong>Thank you.</strong> Your account has been approved.<br />— Please <a href=\"%s\" rel=\"nofollow\">login</a>."
|
2766 |
-
msgstr ""
|
2767 |
-
|
2768 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:505
|
2769 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:531
|
2770 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:760
|
2771 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:781
|
2772 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:124
|
2773 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:141
|
2774 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:512
|
2775 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:533
|
2776 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:830
|
2777 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:851
|
2778 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:597
|
2779 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:618
|
2780 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:911
|
2781 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:932
|
2782 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:755
|
2783 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:776
|
2784 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1080
|
2785 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1101
|
2786 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:124
|
2787 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:141
|
2788 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:420
|
2789 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:615
|
2790 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:126
|
2791 |
-
msgctxt "s2member-front"
|
2792 |
-
msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
|
2793 |
-
msgstr ""
|
2794 |
-
|
2795 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:520
|
2796 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:772
|
2797 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:524
|
2798 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:842
|
2799 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:609
|
2800 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:923
|
2801 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:767
|
2802 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1092
|
2803 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:409
|
2804 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:604
|
2805 |
-
msgctxt "s2member-front"
|
2806 |
msgid "<strong>Thank you.</strong> Your account has been approved.<br />— You'll receive an email momentarily."
|
2807 |
msgstr ""
|
2808 |
|
2809 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:
|
2810 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:
|
2811 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:
|
2812 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:
|
2813 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:
|
2814 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:
|
2815 |
msgctxt "s2member-front"
|
2816 |
msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
|
2817 |
msgstr ""
|
@@ -2832,7 +2894,7 @@ msgstr ""
|
|
2832 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:402
|
2833 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:556
|
2834 |
msgctxt "s2member-front"
|
2835 |
-
msgid "Security
|
2836 |
msgstr ""
|
2837 |
|
2838 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:240
|
@@ -3005,16 +3067,16 @@ msgctxt "s2member-front"
|
|
3005 |
msgid "12 December"
|
3006 |
msgstr ""
|
3007 |
|
3008 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:
|
3009 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:
|
3010 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:
|
3011 |
msgctxt "s2member-front"
|
3012 |
-
msgid "<strong>Thank you.</strong> Please <a href=\"%s\" rel=\"nofollow\">
|
3013 |
msgstr ""
|
3014 |
|
3015 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:
|
3016 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:
|
3017 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:
|
3018 |
msgctxt "s2member-front"
|
3019 |
msgid "<strong>Thank you.</strong> You'll receive an email momentarily."
|
3020 |
msgstr ""
|
@@ -3039,7 +3101,7 @@ msgstr ""
|
|
3039 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:236
|
3040 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:595
|
3041 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:243
|
3042 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3043 |
msgctxt "s2member-front"
|
3044 |
msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
|
3045 |
msgstr ""
|
@@ -3068,7 +3130,7 @@ msgstr ""
|
|
3068 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:271
|
3069 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:606
|
3070 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:257
|
3071 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3072 |
msgctxt "s2member-front"
|
3073 |
msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
|
3074 |
msgstr ""
|
@@ -3552,13 +3614,13 @@ msgstr ""
|
|
3552 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:695
|
3553 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:751
|
3554 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:846
|
3555 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3556 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3557 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3558 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3559 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3560 |
msgctxt "s2member-front"
|
3561 |
-
msgid "Missing or invalid Security
|
3562 |
msgstr ""
|
3563 |
|
3564 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:523
|
@@ -3567,9 +3629,9 @@ msgstr ""
|
|
3567 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:601
|
3568 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:609
|
3569 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:762
|
3570 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3571 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3572 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3573 |
msgctxt "s2member-admin"
|
3574 |
msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
|
3575 |
msgstr ""
|
@@ -3674,8 +3736,8 @@ msgstr ""
|
|
3674 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:639
|
3675 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:742
|
3676 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:837
|
3677 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3678 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3679 |
msgctxt "s2member-front"
|
3680 |
msgid "Missing State/Province. Please try again."
|
3681 |
msgstr ""
|
@@ -3686,8 +3748,8 @@ msgstr ""
|
|
3686 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:642
|
3687 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:745
|
3688 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:840
|
3689 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3690 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3691 |
msgctxt "s2member-front"
|
3692 |
msgid "Missing Country. Please try again."
|
3693 |
msgstr ""
|
@@ -3698,8 +3760,8 @@ msgstr ""
|
|
3698 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:645
|
3699 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:748
|
3700 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:843
|
3701 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3702 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3703 |
msgctxt "s2member-front"
|
3704 |
msgid "Missing Postal/Zip Code. Please try again."
|
3705 |
msgstr ""
|
@@ -3710,9 +3772,9 @@ msgstr ""
|
|
3710 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
|
3711 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:700
|
3712 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:765
|
3713 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3714 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3715 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3716 |
msgctxt "s2member-front"
|
3717 |
msgid "Missing First Name. Please try again."
|
3718 |
msgstr ""
|
@@ -3723,9 +3785,9 @@ msgstr ""
|
|
3723 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
|
3724 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:703
|
3725 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:768
|
3726 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3727 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3728 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3729 |
msgctxt "s2member-front"
|
3730 |
msgid "Missing Last Name. Please try again."
|
3731 |
msgstr ""
|
@@ -3736,9 +3798,9 @@ msgstr ""
|
|
3736 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
|
3737 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:706
|
3738 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:771
|
3739 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3740 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3741 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3742 |
msgctxt "s2member-front"
|
3743 |
msgid "Missing or invalid Email Address. Please try again."
|
3744 |
msgstr ""
|
@@ -3749,9 +3811,9 @@ msgstr ""
|
|
3749 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
|
3750 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:709
|
3751 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:774
|
3752 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3753 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3754 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3755 |
msgctxt "s2member-front"
|
3756 |
msgid "Invalid Email Address. Please try again."
|
3757 |
msgstr ""
|
@@ -3760,8 +3822,8 @@ msgstr ""
|
|
3760 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:699
|
3761 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
|
3762 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:777
|
3763 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3764 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3765 |
msgctxt "s2member-front"
|
3766 |
msgid "That Email Address is already in use. Please try again."
|
3767 |
msgstr ""
|
@@ -3770,8 +3832,8 @@ msgstr ""
|
|
3770 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:702
|
3771 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
|
3772 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:780
|
3773 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3774 |
-
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:
|
3775 |
msgctxt "s2member-front"
|
3776 |
msgid "Missing or invalid Username. Please try again."
|
3777 |
msgstr ""
|
@@ -3780,8 +3842,8 @@ msgstr ""
|
|
3780 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:705
|
3781 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:6
|
2 |
# This file is distributed under the same license as the package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: 150722\n"
|
6 |
"Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
|
7 |
+
"POT-Creation-Date: 2015-07-22 22:47:02+00:00\n"
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
92 |
|
93 |
#: s2member/includes/classes/custom-reg-fields.inc.php:616
|
94 |
#: s2member/includes/classes/custom-reg-fields.inc.php:647
|
95 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:136
|
96 |
msgctxt "s2member-front"
|
97 |
msgid "This is a required field, please try again."
|
98 |
msgstr ""
|
99 |
|
100 |
#: s2member/includes/classes/custom-reg-fields.inc.php:622
|
101 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:121
|
102 |
msgctxt "s2member-front"
|
103 |
msgid "Required. This box must be checked."
|
104 |
msgstr ""
|
105 |
|
106 |
#: s2member/includes/classes/custom-reg-fields.inc.php:627
|
107 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:116
|
108 |
msgctxt "s2member-front"
|
109 |
msgid "Please check at least one of the boxes."
|
110 |
msgstr ""
|
111 |
|
112 |
#: s2member/includes/classes/custom-reg-fields.inc.php:632
|
113 |
#: s2member/includes/classes/custom-reg-fields.inc.php:637
|
114 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:127
|
115 |
msgctxt "s2member-front"
|
116 |
msgid "Please select one of the options."
|
117 |
msgstr ""
|
118 |
|
119 |
#: s2member/includes/classes/custom-reg-fields.inc.php:642
|
120 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:132
|
121 |
msgctxt "s2member-front"
|
122 |
msgid "Please select at least one of the options."
|
123 |
msgstr ""
|
124 |
|
125 |
#: s2member/includes/classes/custom-reg-fields.inc.php:658
|
126 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:142
|
127 |
msgctxt "s2member-front"
|
128 |
msgid "Must be numeric (with or without decimals, commas allowed)."
|
129 |
msgstr ""
|
130 |
|
131 |
#: s2member/includes/classes/custom-reg-fields.inc.php:663
|
132 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:146
|
133 |
msgctxt "s2member-front"
|
134 |
msgid "Must be numeric (with or without decimals, no commas)."
|
135 |
msgstr ""
|
136 |
|
137 |
#: s2member/includes/classes/custom-reg-fields.inc.php:668
|
138 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:150
|
139 |
msgctxt "s2member-front"
|
140 |
msgid "Must be an integer (a whole number, without any decimals)."
|
141 |
msgstr ""
|
146 |
msgstr ""
|
147 |
|
148 |
#: s2member/includes/classes/custom-reg-fields.inc.php:678
|
149 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:158
|
150 |
msgctxt "s2member-front"
|
151 |
msgid "Must be a float (floating point number, decimals required)."
|
152 |
msgstr ""
|
157 |
msgstr ""
|
158 |
|
159 |
#: s2member/includes/classes/custom-reg-fields.inc.php:688
|
160 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:166
|
161 |
msgctxt "s2member-front"
|
162 |
msgid "Must be a date (required date format: dd/mm/yyyy)."
|
163 |
msgstr ""
|
164 |
|
165 |
#: s2member/includes/classes/custom-reg-fields.inc.php:693
|
166 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:170
|
167 |
msgctxt "s2member-front"
|
168 |
msgid "Must be a valid email address."
|
169 |
msgstr ""
|
174 |
msgstr ""
|
175 |
|
176 |
#: s2member/includes/classes/custom-reg-fields.inc.php:701
|
177 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:178
|
178 |
msgctxt "s2member-front"
|
179 |
msgid "Must be a full URL (starting with http or https)."
|
180 |
msgstr ""
|
181 |
|
182 |
#: s2member/includes/classes/custom-reg-fields.inc.php:706
|
183 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:182
|
184 |
msgctxt "s2member-front"
|
185 |
msgid "Must be a domain name (domain name only, without http)."
|
186 |
msgstr ""
|
187 |
|
188 |
#: s2member/includes/classes/custom-reg-fields.inc.php:711
|
189 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:186
|
190 |
msgctxt "s2member-front"
|
191 |
msgid "Must be a phone # (10 digits w/possible hyphens, spaces, brackets)."
|
192 |
msgstr ""
|
193 |
|
194 |
#: s2member/includes/classes/custom-reg-fields.inc.php:716
|
195 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:190
|
196 |
msgctxt "s2member-front"
|
197 |
msgid "Must be a US zipcode (5-9 digits w/ possible hyphen)."
|
198 |
msgstr ""
|
203 |
msgstr ""
|
204 |
|
205 |
#: s2member/includes/classes/custom-reg-fields.inc.php:726
|
206 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:198
|
207 |
msgctxt "s2member-front"
|
208 |
msgid "Must be a zipcode (either a US or Canadian zipcode)."
|
209 |
msgstr ""
|
224 |
msgstr ""
|
225 |
|
226 |
#: s2member/includes/classes/custom-reg-fields.inc.php:741
|
227 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:214
|
228 |
msgctxt "s2member-front"
|
229 |
msgid "Please use alphanumerics only (no spaces/punctuation)."
|
230 |
msgstr ""
|
231 |
|
232 |
#: s2member/includes/classes/custom-reg-fields.inc.php:744
|
233 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:218
|
234 |
msgctxt "s2member-front"
|
235 |
msgid "Please use alphabetics only (no digits/spaces/punctuation)."
|
236 |
msgstr ""
|
237 |
|
238 |
#: s2member/includes/classes/custom-reg-fields.inc.php:747
|
239 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:222
|
240 |
msgctxt "s2member-front"
|
241 |
msgid "Please use numeric digits only."
|
242 |
msgstr ""
|
243 |
|
244 |
#: s2member/includes/classes/custom-reg-fields.inc.php:760
|
245 |
#: s2member/includes/classes/custom-reg-fields.inc.php:774
|
246 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:229
|
247 |
+
#: s2member/includes/s2member.js:232
|
248 |
msgctxt "s2member-front"
|
249 |
msgid "digit"
|
250 |
msgstr ""
|
251 |
|
252 |
#: s2member/includes/classes/custom-reg-fields.inc.php:761
|
253 |
#: s2member/includes/classes/custom-reg-fields.inc.php:775
|
254 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:229
|
255 |
+
#: s2member/includes/s2member.js:232
|
256 |
msgctxt "s2member-front"
|
257 |
msgid "digits"
|
258 |
msgstr ""
|
259 |
|
260 |
#: s2member/includes/classes/custom-reg-fields.inc.php:764
|
261 |
#: s2member/includes/classes/custom-reg-fields.inc.php:778
|
262 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:229
|
263 |
+
#: s2member/includes/s2member.js:232
|
264 |
msgctxt "s2member-front"
|
265 |
msgid "character"
|
266 |
msgstr ""
|
267 |
|
268 |
#: s2member/includes/classes/custom-reg-fields.inc.php:765
|
269 |
#: s2member/includes/classes/custom-reg-fields.inc.php:779
|
270 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:229
|
271 |
+
#: s2member/includes/s2member.js:232
|
272 |
msgctxt "s2member-front"
|
273 |
msgid "characters"
|
274 |
msgstr ""
|
275 |
|
276 |
#: s2member/includes/classes/custom-reg-fields.inc.php:767
|
277 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:229
|
278 |
msgctxt "s2member-front"
|
279 |
msgid "Must be exactly %s %s."
|
280 |
msgstr ""
|
281 |
|
282 |
#: s2member/includes/classes/custom-reg-fields.inc.php:781
|
283 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:232
|
284 |
msgctxt "s2member-front"
|
285 |
msgid "Must be at least %s %s."
|
286 |
msgstr ""
|
303 |
|
304 |
#: s2member/includes/classes/files-in.inc.php:144
|
305 |
msgctxt "s2member-front"
|
306 |
+
msgid "<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>."
|
307 |
msgstr ""
|
308 |
|
309 |
#: s2member/includes/classes/files-in.inc.php:155
|
310 |
msgctxt "s2member-front"
|
311 |
+
msgid "<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>."
|
312 |
msgstr ""
|
313 |
|
314 |
#: s2member/includes/classes/files-in.inc.php:496
|
852 |
#: s2member/includes/classes/paypal-utilities.inc.php:188
|
853 |
#: s2member/includes/classes/paypal-utilities.inc.php:316
|
854 |
#: s2member/includes/classes/paypal-utilities.inc.php:324
|
855 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:98
|
856 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:327
|
857 |
msgctxt "s2member-front"
|
858 |
msgid "Error. Please contact Support for assistance."
|
859 |
msgstr ""
|
885 |
#. `ws_plugin__s2member_pro_authnet_arb_response`.
|
886 |
#: s2member/includes/classes/paypal-utilities.inc.php:314
|
887 |
#: s2member/includes/classes/paypal-utilities.inc.php:322
|
888 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:95
|
889 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:324
|
890 |
msgctxt "s2member-front"
|
891 |
msgid "Error #%1$s. %2$s."
|
892 |
msgstr ""
|
995 |
msgid "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact support</a>."
|
996 |
msgstr ""
|
997 |
|
998 |
+
#: s2member/includes/classes/sc-eots-in.inc.php:73
|
999 |
+
msgctxt "s2member-front"
|
1000 |
+
msgid "Access Expires:"
|
1001 |
+
msgstr ""
|
1002 |
+
|
1003 |
+
#: s2member/includes/classes/sc-eots-in.inc.php:74
|
1004 |
+
msgctxt "s2member-front"
|
1005 |
+
msgid "Access Expired:"
|
1006 |
+
msgstr ""
|
1007 |
+
|
1008 |
+
#: s2member/includes/classes/sc-eots-in.inc.php:75
|
1009 |
+
msgctxt "s2member-front"
|
1010 |
+
msgid "Next Payment:"
|
1011 |
+
msgstr ""
|
1012 |
+
|
1013 |
+
#: s2member/includes/classes/sc-eots-in.inc.php:76
|
1014 |
+
msgctxt "s2member-front"
|
1015 |
+
msgid "N/A"
|
1016 |
+
msgstr ""
|
1017 |
+
|
1018 |
+
#: s2member/includes/classes/sc-eots-in.inc.php:76
|
1019 |
+
msgctxt "s2member-front"
|
1020 |
+
msgid "—"
|
1021 |
+
msgstr ""
|
1022 |
+
|
1023 |
#: s2member/includes/classes/sc-paypal-button-e.inc.php:77
|
1024 |
#: s2member/includes/classes/sc-paypal-button-in.inc.php:73
|
1025 |
#: s2member/includes/classes/sc-paypal-button-in.inc.php:97
|
1030 |
#: s2member/includes/templates/buttons/paypal-checkout-button.php:46
|
1031 |
#: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
|
1032 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1033 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:297
|
1034 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:597
|
1035 |
msgctxt "s2member-front paypal-button-lang-code"
|
1036 |
msgid "en_US"
|
1037 |
msgstr ""
|
1100 |
msgstr[0] ""
|
1101 |
msgstr[1] ""
|
1102 |
|
1103 |
+
#: s2member/includes/classes/user-securities.inc.php:203
|
1104 |
+
msgctxt "s2member-front"
|
1105 |
+
msgid "`weak`, `good`, or `strong`"
|
1106 |
+
msgstr ""
|
1107 |
+
|
1108 |
+
#: s2member/includes/classes/user-securities.inc.php:204
|
1109 |
+
msgctxt "s2member-front"
|
1110 |
+
msgid "`good` or `strong` (i.e., use numbers, letters, and mixed caSe)"
|
1111 |
+
msgstr ""
|
1112 |
+
|
1113 |
+
#: s2member/includes/classes/user-securities.inc.php:205
|
1114 |
+
msgctxt "s2member-front"
|
1115 |
+
msgid "`strong` (i.e., use numbers, letters, mixed caSe, and punctuation)"
|
1116 |
+
msgstr ""
|
1117 |
+
|
1118 |
#: s2member/includes/classes/users-list-in.inc.php:349
|
1119 |
msgctxt "s2member-front"
|
1120 |
msgid "Additional Profile Fields"
|
1227 |
msgstr[0] ""
|
1228 |
msgstr[1] ""
|
1229 |
|
1230 |
+
#: s2member/includes/classes/utils-time.inc.php:245
|
1231 |
msgctxt "s2member-front"
|
1232 |
msgid "Daily"
|
1233 |
msgstr ""
|
1234 |
|
1235 |
+
#: s2member/includes/classes/utils-time.inc.php:245
|
1236 |
msgctxt "s2member-front"
|
1237 |
msgid "Weekly"
|
1238 |
msgstr ""
|
1239 |
|
1240 |
+
#: s2member/includes/classes/utils-time.inc.php:245
|
1241 |
msgctxt "s2member-front"
|
1242 |
msgid "Monthly"
|
1243 |
msgstr ""
|
1244 |
|
1245 |
+
#: s2member/includes/classes/utils-time.inc.php:245
|
1246 |
msgctxt "s2member-front"
|
1247 |
msgid "Yearly"
|
1248 |
msgstr ""
|
1249 |
|
1250 |
+
#: s2member/includes/classes/utils-time.inc.php:245
|
1251 |
+
#: s2member/includes/classes/utils-time.inc.php:256
|
1252 |
msgctxt "s2member-front"
|
1253 |
msgid "Lifetime"
|
1254 |
msgstr ""
|
1255 |
|
1256 |
+
#: s2member/includes/classes/utils-time.inc.php:249
|
1257 |
msgctxt "s2member-front"
|
1258 |
msgid "Bi-Weekly"
|
1259 |
msgstr ""
|
1260 |
|
1261 |
+
#: s2member/includes/classes/utils-time.inc.php:250
|
1262 |
msgctxt "s2member-front"
|
1263 |
msgid "Bi-Monthly"
|
1264 |
msgstr ""
|
1265 |
|
1266 |
+
#: s2member/includes/classes/utils-time.inc.php:251
|
1267 |
msgctxt "s2member-front"
|
1268 |
msgid "Quarterly"
|
1269 |
msgstr ""
|
1270 |
|
1271 |
+
#: s2member/includes/classes/utils-time.inc.php:252
|
1272 |
msgctxt "s2member-front"
|
1273 |
msgid "Semi-Yearly"
|
1274 |
msgstr ""
|
1275 |
|
1276 |
+
#: s2member/includes/classes/utils-time.inc.php:256
|
1277 |
msgctxt "s2member-front"
|
1278 |
msgid "Day"
|
1279 |
msgstr ""
|
1280 |
|
1281 |
+
#: s2member/includes/classes/utils-time.inc.php:256
|
1282 |
msgctxt "s2member-front"
|
1283 |
msgid "Week"
|
1284 |
msgstr ""
|
1285 |
|
1286 |
+
#: s2member/includes/classes/utils-time.inc.php:256
|
1287 |
msgctxt "s2member-front"
|
1288 |
msgid "Month"
|
1289 |
msgstr ""
|
1290 |
|
1291 |
+
#: s2member/includes/classes/utils-time.inc.php:256
|
1292 |
msgctxt "s2member-front"
|
1293 |
msgid "Year"
|
1294 |
msgstr ""
|
1295 |
|
1296 |
+
#: s2member/includes/classes/utils-time.inc.php:262
|
1297 |
msgctxt "s2member-front"
|
1298 |
msgid "Days"
|
1299 |
msgstr ""
|
1300 |
|
1301 |
+
#: s2member/includes/classes/utils-time.inc.php:262
|
1302 |
msgctxt "s2member-front"
|
1303 |
msgid "Weeks"
|
1304 |
msgstr ""
|
1305 |
|
1306 |
+
#: s2member/includes/classes/utils-time.inc.php:262
|
1307 |
msgctxt "s2member-front"
|
1308 |
msgid "Months"
|
1309 |
msgstr ""
|
1310 |
|
1311 |
+
#: s2member/includes/classes/utils-time.inc.php:262
|
1312 |
msgctxt "s2member-front"
|
1313 |
msgid "Years"
|
1314 |
msgstr ""
|
1315 |
|
1316 |
+
#: s2member/includes/classes/utils-time.inc.php:262
|
1317 |
msgctxt "s2member-front"
|
1318 |
msgid "Lifetimes"
|
1319 |
msgstr ""
|
1320 |
|
1321 |
#. translators: Each cycle ( i.e., `each day/week/month` or `every 2
|
1322 |
#. days/weeks/months`, etc. ). Cycles are translated elsewhere.
|
1323 |
+
#: s2member/includes/classes/utils-time.inc.php:299
|
1324 |
+
#: s2member/includes/classes/utils-time.inc.php:342
|
1325 |
msgctxt "s2member-front"
|
1326 |
msgid "each %2$s"
|
1327 |
msgid_plural "every %1$s %3$s"
|
1328 |
msgstr[0] ""
|
1329 |
msgstr[1] ""
|
1330 |
|
1331 |
+
#: s2member/includes/classes/utils-time.inc.php:302
|
1332 |
msgctxt "s2member-front"
|
1333 |
msgid "lifetime"
|
1334 |
msgstr ""
|
1335 |
|
1336 |
#. translators: Membership cycle ( i.e., `1 day/week/month` or `2
|
1337 |
#. days/weeks/months`, etc. ). Most of this is translated elsewhere.
|
1338 |
+
#: s2member/includes/classes/utils-time.inc.php:306
|
1339 |
msgctxt "s2member-front"
|
1340 |
msgid "%1$s %2$s"
|
1341 |
msgid_plural "%1$s %3$s"
|
1344 |
|
1345 |
#. translators: Cycle ( i.e., `for 1 day/week/month` or `for 2
|
1346 |
#. days/weeks/months`, etc. ). Most of this is translated elsewhere.
|
1347 |
+
#: s2member/includes/classes/utils-time.inc.php:349
|
1348 |
msgctxt "s2member-front"
|
1349 |
msgid "for %1$s %2$s"
|
1350 |
msgid_plural "for %1$s %3$s"
|
1351 |
msgstr[0] ""
|
1352 |
msgstr[1] ""
|
1353 |
|
1354 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:83
|
1355 |
+
msgctxt "s2member-front"
|
1356 |
+
msgid "Strength indicator"
|
1357 |
+
msgstr ""
|
1358 |
+
|
1359 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:84
|
1360 |
+
msgctxt "s2member-front"
|
1361 |
+
msgid "Very weak"
|
1362 |
+
msgstr ""
|
1363 |
+
|
1364 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:85
|
1365 |
+
msgctxt "s2member-front"
|
1366 |
+
msgid "Weak"
|
1367 |
+
msgstr ""
|
1368 |
+
|
1369 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:86
|
1370 |
+
msgctxt "s2member-front"
|
1371 |
+
msgid "Good"
|
1372 |
+
msgstr ""
|
1373 |
+
|
1374 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:87
|
1375 |
+
msgctxt "s2member-front"
|
1376 |
+
msgid "Strong"
|
1377 |
+
msgstr ""
|
1378 |
+
|
1379 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:88
|
1380 |
+
msgctxt "s2member-front"
|
1381 |
+
msgid "Mismatch"
|
1382 |
+
msgstr ""
|
1383 |
+
|
1384 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:154
|
1385 |
+
msgctxt "s2member-front"
|
1386 |
+
msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
|
1387 |
+
msgstr ""
|
1388 |
+
|
1389 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:162
|
1390 |
+
msgctxt "s2member-front"
|
1391 |
+
msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
|
1392 |
+
msgstr ""
|
1393 |
+
|
1394 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:174
|
1395 |
+
msgctxt "s2member-front"
|
1396 |
+
msgid ""
|
1397 |
+
"Please use a personal email address.\n"
|
1398 |
+
"Addresses like <%s@> are problematic."
|
1399 |
+
msgstr ""
|
1400 |
+
|
1401 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:194
|
1402 |
+
msgctxt "s2member-front"
|
1403 |
+
msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
|
1404 |
+
msgstr ""
|
1405 |
+
|
1406 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:202
|
1407 |
+
msgctxt "s2member-front"
|
1408 |
+
msgid "Please use alphanumerics, spaces & punctuation only."
|
1409 |
+
msgstr ""
|
1410 |
+
|
1411 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:206
|
1412 |
+
msgctxt "s2member-front"
|
1413 |
+
msgid "Please use alphanumerics & spaces only."
|
1414 |
+
msgstr ""
|
1415 |
+
|
1416 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:210
|
1417 |
+
msgctxt "s2member-front"
|
1418 |
+
msgid "Please use alphanumerics & punctuation only (no spaces)."
|
1419 |
+
msgstr ""
|
1420 |
+
|
1421 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:262
|
1422 |
msgctxt "s2member-front"
|
1423 |
msgid "— Confirm File Download —"
|
1424 |
msgstr ""
|
1425 |
|
1426 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:263
|
1427 |
msgctxt "s2member-front"
|
1428 |
msgid "You`ve downloaded %s protected %s in the last %s."
|
1429 |
msgstr ""
|
1430 |
|
1431 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:263
|
1432 |
msgctxt "s2member-front"
|
1433 |
msgid "file"
|
1434 |
msgstr ""
|
1435 |
|
1436 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:263
|
1437 |
msgctxt "s2member-front"
|
1438 |
msgid "files"
|
1439 |
msgstr ""
|
1440 |
|
1441 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:263
|
1442 |
msgctxt "s2member-front"
|
1443 |
msgid "24 hours"
|
1444 |
msgstr ""
|
1445 |
|
1446 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:263
|
1447 |
msgctxt "s2member-front"
|
1448 |
msgid "%s days"
|
1449 |
msgstr ""
|
1450 |
|
1451 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1452 |
msgctxt "s2member-front"
|
1453 |
msgid "You`re entitled to UNLIMITED downloads though (so, no worries)."
|
1454 |
msgstr ""
|
1455 |
|
1456 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1457 |
msgctxt "s2member-front"
|
1458 |
msgid "You`re entitled to %s unique %s %s."
|
1459 |
msgstr ""
|
1460 |
|
1461 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1462 |
msgctxt "s2member-front"
|
1463 |
msgid "download"
|
1464 |
msgstr ""
|
1465 |
|
1466 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1467 |
msgctxt "s2member-front"
|
1468 |
msgid "downloads"
|
1469 |
msgstr ""
|
1470 |
|
1471 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1472 |
msgctxt "s2member-front"
|
1473 |
msgid "each day"
|
1474 |
msgstr ""
|
1475 |
|
1476 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:264
|
1477 |
msgctxt "s2member-front"
|
1478 |
msgid "every %s-day period"
|
1479 |
msgstr ""
|
1480 |
|
1481 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:311
|
1482 |
+
#: s2member/includes/s2member.js:316 s2member/includes/s2member.js:321
|
1483 |
+
#: s2member/includes/s2member.js:326 s2member/includes/s2member.js:357
|
1484 |
+
#: s2member/includes/s2member.js:412 s2member/includes/s2member.js:417
|
1485 |
+
#: s2member/includes/s2member.js:422 s2member/includes/s2member.js:427
|
1486 |
+
#: s2member/includes/s2member.js:456 s2member/includes/s2member.js:485
|
1487 |
+
#: s2member/includes/s2member.js:510
|
1488 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1489 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:66
|
1490 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:73
|
1493 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:255
|
1494 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
|
1495 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
|
1496 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:274
|
1497 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:280
|
1498 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:524
|
1499 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:531
|
1500 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:796
|
1501 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:803
|
1502 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:810
|
1503 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:815
|
1504 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:821
|
1505 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1506 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:66
|
1507 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:73
|
1510 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:255
|
1511 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
|
1512 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
|
1513 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:274
|
1514 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:280
|
1515 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:572
|
1516 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:579
|
1517 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:892
|
1518 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:899
|
1519 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:906
|
1520 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:911
|
1521 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:917
|
1522 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1523 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:101
|
1524 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
|
1526 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
|
1527 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
|
1528 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
|
1529 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:207
|
1530 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:321
|
1531 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:326
|
1532 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:622
|
1533 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:627
|
1534 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:632
|
1535 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:637
|
1536 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:642
|
1537 |
msgctxt "s2member-front"
|
1538 |
msgid "— Oops, you missed something: —"
|
1539 |
msgstr ""
|
1540 |
|
1541 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:316
|
1542 |
+
#: s2member/includes/s2member.js:417
|
1543 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1544 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
|
1545 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:803
|
1546 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1547 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
|
1548 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:899
|
1549 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1550 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
|
1551 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:627
|
1552 |
msgctxt "s2member-front"
|
1553 |
msgid "Passwords do not match up. Please try again."
|
1554 |
msgstr ""
|
1555 |
|
1556 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:321
|
1557 |
+
#: s2member/includes/s2member.js:422
|
1558 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1559 |
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
|
1560 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:810
|
1561 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1562 |
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
|
1563 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:906
|
1564 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1565 |
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
|
1566 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:632
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1567 |
msgctxt "s2member-front"
|
1568 |
+
msgid "Password MUST be at least %s characters. Please try again."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1569 |
msgstr ""
|
1570 |
|
1571 |
+
#: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:326
|
1572 |
+
#: s2member/includes/s2member.js:427
|
1573 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
|
1574 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:274
|
1575 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:815
|
1576 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
|
1577 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:274
|
1578 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:911
|
1579 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
|
1580 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
|
1581 |
+
#: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:637
|
|
|
|
|
|
|
|
|
|
|
1582 |
msgctxt "s2member-front"
|
1583 |
+
msgid "Password strength MUST be %s. Please try again."
|
1584 |
msgstr ""
|
1585 |
|
1586 |
#: s2member/includes/syscon.inc.php:84
|
1588 |
msgid "en"
|
1589 |
msgstr ""
|
1590 |
|
1591 |
+
#: s2member/includes/syscon.inc.php:156
|
1592 |
msgctxt "s2member-front"
|
1593 |
msgid "Yes, I want to receive updates via email."
|
1594 |
msgstr ""
|
1595 |
|
1596 |
+
#: s2member/includes/syscon.inc.php:214
|
1597 |
msgctxt "s2member-front"
|
1598 |
msgid "[%s] Username/Password"
|
1599 |
msgstr ""
|
1600 |
|
1601 |
+
#: s2member/includes/syscon.inc.php:215
|
1602 |
msgctxt "s2member-front"
|
1603 |
msgid ""
|
1604 |
"Your Username/Password for:\n"
|
1609 |
"%%%%wp_login_url%%%%"
|
1610 |
msgstr ""
|
1611 |
|
1612 |
+
#: s2member/includes/syscon.inc.php:218
|
1613 |
msgctxt "s2member-front"
|
1614 |
msgid "[%s] New User Registration"
|
1615 |
msgstr ""
|
1616 |
|
1617 |
+
#: s2member/includes/syscon.inc.php:219
|
1618 |
msgctxt "s2member-front"
|
1619 |
msgid ""
|
1620 |
"New User Registration on your site:\n"
|
1626 |
"IP Address: %%%%user_ip%%%%"
|
1627 |
msgstr ""
|
1628 |
|
1629 |
+
#: s2member/includes/syscon.inc.php:241
|
1630 |
+
#: s2member-pro/s2member-pro/includes/syscon.inc.php:94
|
1631 |
msgctxt "s2member-front"
|
1632 |
msgid "Congratulations! (your membership has been approved)"
|
1633 |
msgstr ""
|
1634 |
|
1635 |
+
#: s2member/includes/syscon.inc.php:242
|
1636 |
msgctxt "s2member-front"
|
1637 |
msgid ""
|
1638 |
"Thanks %%%%first_name%%%%! Your membership has been approved.\n"
|
1648 |
"%s"
|
1649 |
msgstr ""
|
1650 |
|
1651 |
+
#: s2member/includes/syscon.inc.php:245 s2member/includes/syscon.inc.php:249
|
1652 |
msgctxt "s2member-front"
|
1653 |
msgid "Thank you! Your account has been updated."
|
1654 |
msgstr ""
|
1655 |
|
1656 |
+
#: s2member/includes/syscon.inc.php:246 s2member/includes/syscon.inc.php:250
|
1657 |
msgctxt "s2member-front"
|
1658 |
msgid ""
|
1659 |
"Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n"
|
1664 |
"%s"
|
1665 |
msgstr ""
|
1666 |
|
1667 |
+
#: s2member/includes/syscon.inc.php:253
|
1668 |
+
#: s2member-pro/s2member-pro/includes/syscon.inc.php:98
|
1669 |
msgctxt "s2member-front"
|
1670 |
msgid "Thank You! (instructions for access)"
|
1671 |
msgstr ""
|
1672 |
|
1673 |
+
#: s2member/includes/syscon.inc.php:254
|
1674 |
msgctxt "s2member-front"
|
1675 |
msgid ""
|
1676 |
"Thanks %%%%first_name%%%%!\n"
|
1687 |
"%s"
|
1688 |
msgstr ""
|
1689 |
|
1690 |
+
#: s2member/includes/syscon.inc.php:293
|
1691 |
msgctxt "s2member-front"
|
1692 |
msgid "Free Subscriber"
|
1693 |
msgstr ""
|
1694 |
|
1695 |
+
#: s2member/includes/syscon.inc.php:293
|
1696 |
msgctxt "s2member-front"
|
1697 |
msgid "Bronze Member"
|
1698 |
msgstr ""
|
1699 |
|
1700 |
+
#: s2member/includes/syscon.inc.php:293
|
1701 |
msgctxt "s2member-front"
|
1702 |
msgid "Silver Member"
|
1703 |
msgstr ""
|
1704 |
|
1705 |
+
#: s2member/includes/syscon.inc.php:293
|
1706 |
msgctxt "s2member-front"
|
1707 |
msgid "Gold Member"
|
1708 |
msgstr ""
|
1709 |
|
1710 |
+
#: s2member/includes/syscon.inc.php:293
|
1711 |
msgctxt "s2member-front"
|
1712 |
msgid "Platinum Member"
|
1713 |
msgstr ""
|
1714 |
|
1715 |
+
#: s2member/includes/syscon.inc.php:293
|
1716 |
msgctxt "s2member-front"
|
1717 |
msgid "Level %s Member"
|
1718 |
msgstr ""
|
1719 |
|
1720 |
+
#: s2member/includes/templates/badges/s-badge.php:6
|
1721 |
msgctxt "s2member-front"
|
1722 |
+
msgid "s2Member® (Security for WordPress®)"
|
1723 |
msgstr ""
|
1724 |
|
1725 |
#: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:9
|
2675 |
msgid "Buy Now (Specific Post/Page, link valid for 50 years)"
|
2676 |
msgstr ""
|
2677 |
|
2678 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:239
|
2679 |
msgctxt "s2member-front"
|
2680 |
msgid "+ tax"
|
2681 |
msgstr ""
|
2682 |
|
2683 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:240
|
2684 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:669
|
2685 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:311
|
2686 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:890
|
2687 |
msgctxt "s2member-front percentage-symbol"
|
2688 |
msgid "%"
|
2689 |
msgstr ""
|
2690 |
|
2691 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:261
|
2692 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:313
|
2693 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:326
|
2694 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:346
|
2695 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:406
|
2696 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:421
|
2697 |
msgctxt "s2member-front"
|
2698 |
msgid "Discount: %s off. (Now: %s)"
|
2699 |
msgstr ""
|
2700 |
|
2701 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:262
|
2702 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:314
|
2703 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:327
|
2704 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:347
|
2705 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:407
|
2706 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:422
|
2707 |
msgctxt "s2member-front"
|
2708 |
msgid "<div>Discount: <strong>%s off</strong>. (Now: <strong>%s</strong>)</div>"
|
2709 |
msgstr ""
|
2710 |
|
2711 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:274
|
2712 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:287
|
2713 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:300
|
2714 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:361
|
2715 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:376
|
2716 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:391
|
2717 |
msgctxt "s2member-front"
|
2718 |
msgid "Discount: %s off. (Now: %s, then %s)"
|
2719 |
msgstr ""
|
2720 |
|
2721 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:275
|
2722 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:288
|
2723 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:301
|
2724 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:362
|
2725 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:377
|
2726 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:392
|
2727 |
msgctxt "s2member-front"
|
2728 |
msgid "<div>Discount: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
|
2729 |
msgstr ""
|
2730 |
|
2731 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:330
|
2732 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:425
|
2733 |
msgctxt "s2member-front"
|
2734 |
msgid "<div>Sorry, your discount code is not applicable.</div>"
|
2735 |
msgstr ""
|
2736 |
|
2737 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:428
|
2738 |
msgctxt "s2member-front"
|
2739 |
msgid "<div>Discount: <strong>%s0.00 off</strong>.</div>"
|
2740 |
msgstr ""
|
2741 |
|
2742 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:434
|
2743 |
msgctxt "s2member-front"
|
2744 |
msgid "%1$s ~ ORIGINALLY: %2$s"
|
2745 |
msgstr ""
|
2746 |
|
2747 |
+
#: s2member-pro/s2member-pro/includes/classes/coupons.inc.php:456
|
2748 |
msgctxt "s2member-front"
|
2749 |
msgid "<div>Sorry, your discount code is N/A, invalid or expired.</div>"
|
2750 |
msgstr ""
|
2762 |
msgid ""
|
2763 |
"ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
|
2764 |
"\n"
|
2765 |
+
"This is most likely related to an invalid AliPay configuration. If you are the site owner, please check: s2Member → AliPay Options."
|
2766 |
msgstr ""
|
2767 |
|
2768 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:113
|
2769 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:114
|
2770 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:114
|
2771 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:115
|
2772 |
msgctxt "s2member-front"
|
2773 |
msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
|
2774 |
msgstr ""
|
2775 |
|
2776 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:121
|
2777 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:129
|
2778 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:137
|
2779 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:126
|
2780 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:138
|
2781 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:146
|
2782 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:126
|
2783 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:143
|
2784 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:156
|
2785 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:126
|
2786 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:136
|
2787 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:146
|
2788 |
msgctxt "s2member-front"
|
2789 |
msgid "<strong>Billing terminated.</strong> Your account has been cancelled."
|
2790 |
msgstr ""
|
2791 |
|
2792 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:144
|
2793 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:135
|
2794 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:155
|
2795 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:168
|
2796 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:152
|
2797 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:144
|
2798 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:155
|
2799 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:100
|
2800 |
msgctxt "s2member-front"
|
2801 |
msgid "You're <strong>NOT</strong> logged in."
|
2802 |
msgstr ""
|
2803 |
|
2804 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:289
|
2805 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:633
|
2806 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:342
|
2807 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:667
|
2808 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:410
|
2809 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:750
|
2810 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:477
|
2811 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:916
|
2812 |
+
msgctxt "s2member-front"
|
2813 |
+
msgid "<strong>Thank you.</strong> Your account has been updated."
|
2814 |
+
msgstr ""
|
2815 |
+
|
2816 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:493
|
2817 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:750
|
2818 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:502
|
2819 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:820
|
2820 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:587
|
2821 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:901
|
2822 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:745
|
2823 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1070
|
2824 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:407
|
2825 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:602
|
2826 |
+
msgctxt "s2member-front"
|
2827 |
+
msgid "<strong>Thank you.</strong> Your account has been approved.<br />— Please <a href=\"%s\" rel=\"nofollow\">log in</a>."
|
2828 |
+
msgstr ""
|
2829 |
+
|
2830 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:504
|
2831 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:530
|
2832 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:759
|
2833 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:780
|
2834 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:123
|
2835 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:140
|
2836 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:511
|
2837 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:532
|
2838 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:829
|
2839 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:850
|
2840 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:596
|
2841 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:617
|
2842 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:910
|
2843 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:931
|
2844 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:754
|
2845 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:775
|
2846 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1079
|
2847 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1100
|
2848 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:123
|
2849 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:140
|
2850 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:419
|
2851 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:614
|
2852 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:125
|
2853 |
msgctxt "s2member-front"
|
2854 |
+
msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
|
2855 |
msgstr ""
|
2856 |
|
2857 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:519
|
2858 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:771
|
2859 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:523
|
2860 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:841
|
2861 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:608
|
2862 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:922
|
2863 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:766
|
2864 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1091
|
2865 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:408
|
2866 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:603
|
2867 |
msgctxt "s2member-front"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2868 |
msgid "<strong>Thank you.</strong> Your account has been approved.<br />— You'll receive an email momentarily."
|
2869 |
msgstr ""
|
2870 |
|
2871 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:791
|
2872 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:861
|
2873 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:942
|
2874 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1111
|
2875 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:135
|
2876 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:618
|
2877 |
msgctxt "s2member-front"
|
2878 |
msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
|
2879 |
msgstr ""
|
2894 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:402
|
2895 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:556
|
2896 |
msgctxt "s2member-front"
|
2897 |
+
msgid "Security Verification"
|
2898 |
msgstr ""
|
2899 |
|
2900 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:240
|
3067 |
msgid "12 December"
|
3068 |
msgstr ""
|
3069 |
|
3070 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:116
|
3071 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:116
|
3072 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:117
|
3073 |
msgctxt "s2member-front"
|
3074 |
+
msgid "<strong>Thank you.</strong> Please <a href=\"%s\" rel=\"nofollow\">log in</a>."
|
3075 |
msgstr ""
|
3076 |
|
3077 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:133
|
3078 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:133
|
3079 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:118
|
3080 |
msgctxt "s2member-front"
|
3081 |
msgid "<strong>Thank you.</strong> You'll receive an email momentarily."
|
3082 |
msgstr ""
|
3101 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:236
|
3102 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:595
|
3103 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:243
|
3104 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:530
|
3105 |
msgctxt "s2member-front"
|
3106 |
msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
|
3107 |
msgstr ""
|
3130 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:271
|
3131 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:606
|
3132 |
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:257
|
3133 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:541
|
3134 |
msgctxt "s2member-front"
|
3135 |
msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
|
3136 |
msgstr ""
|
3614 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:695
|
3615 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:751
|
3616 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:846
|
3617 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:533
|
3618 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:550
|
3619 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:599
|
3620 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:628
|
3621 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:698
|
3622 |
msgctxt "s2member-front"
|
3623 |
+
msgid "Missing or invalid Security Verification. Please try again."
|
3624 |
msgstr ""
|
3625 |
|
3626 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:523
|
3629 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:601
|
3630 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:609
|
3631 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:762
|
3632 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:536
|
3633 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:544
|
3634 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:641
|
3635 |
msgctxt "s2member-admin"
|
3636 |
msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
|
3637 |
msgstr ""
|
3736 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:639
|
3737 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:742
|
3738 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:837
|
3739 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:619
|
3740 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:689
|
3741 |
msgctxt "s2member-front"
|
3742 |
msgid "Missing State/Province. Please try again."
|
3743 |
msgstr ""
|
3748 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:642
|
3749 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:745
|
3750 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:840
|
3751 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:622
|
3752 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:692
|
3753 |
msgctxt "s2member-front"
|
3754 |
msgid "Missing Country. Please try again."
|
3755 |
msgstr ""
|
3760 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:645
|
3761 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:748
|
3762 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:843
|
3763 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:625
|
3764 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:695
|
3765 |
msgctxt "s2member-front"
|
3766 |
msgid "Missing Postal/Zip Code. Please try again."
|
3767 |
msgstr ""
|
3772 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
|
3773 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:700
|
3774 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:765
|
3775 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:557
|
3776 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:604
|
3777 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:644
|
3778 |
msgctxt "s2member-front"
|
3779 |
msgid "Missing First Name. Please try again."
|
3780 |
msgstr ""
|
3785 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
|
3786 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:703
|
3787 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:768
|
3788 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:560
|
3789 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:607
|
3790 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:647
|
3791 |
msgctxt "s2member-front"
|
3792 |
msgid "Missing Last Name. Please try again."
|
3793 |
msgstr ""
|
3798 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
|
3799 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:706
|
3800 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:771
|
3801 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:563
|
3802 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:610
|
3803 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:650
|
3804 |
msgctxt "s2member-front"
|
3805 |
msgid "Missing or invalid Email Address. Please try again."
|
3806 |
msgstr ""
|
3811 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
|
3812 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:709
|
3813 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:774
|
3814 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:566
|
3815 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:613
|
3816 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:653
|
3817 |
msgctxt "s2member-front"
|
3818 |
msgid "Invalid Email Address. Please try again."
|
3819 |
msgstr ""
|
3822 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:699
|
3823 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
|
3824 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:777
|
3825 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:569
|
3826 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:656
|
3827 |
msgctxt "s2member-front"
|
3828 |
msgid "That Email Address is already in use. Please try again."
|
3829 |
msgstr ""
|
3832 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:702
|
3833 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
|
3834 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:780
|
3835 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:572
|
3836 |
+
#: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:659
|
3837 |
msgctxt "s2member-front"
|
3838 |
msgid "Missing or invalid Username. Please try again."
|
3839 |
msgstr ""
|
3842 |
#: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:705
|
3843 |
#: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:6
|