New: Add limiting on failed payment reminder emails. This protects against issues we've seen where PayPal sends an excessive number of failed payment IPNs. These emails are now limited to a maximum of one email per membership per 20 hour period; and a total of 5 emails per membership. The counters reset once a successful payment has been made.
Tweak: Update Stripe integration to use billing_cycle_anchor parameter instead of trial_end where possible. This fixes MRR reporting inconsistencies in Stripe.
Tweak: Removed "RCP:" prefix from Stripe one-time payment description.
Tweak: Change log in form username label to "Username or Email".
Tweak: Update Italian translation.
Tweak: Update Spanish translation.
Fix: Stripe renewals have unexpected results when manually renewing an expired membership that still has a "past due" (not cancelled) subscription inside Stripe.
Fix: Password resets not working with object caching.
Fix: Curly quotes in Spanish translation file breaking links.
Fix: Potential Heuristics.Phishing.Email.SpoofedDomain false positive in certain language files due to poorly formatted developer.paypal.com link.
Fix: Incorrect query parameter in expiration reminder query arguments, which may result in some people not receiving reminder emails if their expiration time is not 23:59:59.
Fix: Ensure all URL query arguments are URL encoded.
Fix: Trialling users not receiving expiration reminders when they qualify.
Fix: If "Disable Global Stripe.js" is enabled, then Stripe card update page no longer works.
Fix: Add checks to prevent rcp_check_member_counts() cron job from running more than once per day.
Fix: Memberships that never expire incorrectly getting picked up in rcp_check_for_expired_users() query. Note: this did not result in people incorrectly receiving expiration emails, it just meant the query was larger than it needed to be, which could have performance impacts on extremely large sites.
Fix: Unable to save null values to database, which could impact the customer has_trialed flag value.
Fix: Admin email notifications may contain the incorrect membership level name if multiple memberships is enabled.
New: Added support for using saved Stripe cards for new purchases.
New: Updated the Braintree SDK, added support for the drop-in UI, and added support for 3D secure.
New: Added support for reCAPTCHA v3. This can be enabled in Restrict → Settings → Misc by changing the version number. You will also need to generate v3 keys.
New: When in test mode, test credit card numbers are now displayed in the registration form for supported gateways. This allows for easier and faster testing. This can optionally be disabled with this filter: add_filter( 'rcp_show_test_card_on_registration', '__return_false' );
New: Added RCP_GATEWAY_SANDBOX_MODE constant. This allows you to force sandbox mode to always be enabled. Recommended on staging sites.
New: The membership next renewal date is now displayed in the registration form.
Improvement: Attempt to auto-style the Stripe Elements field, using styles on existing on-site checkout fields.
Improvement: Our discounts database code has been rewritten to use our new custom table engine. This resulted in a number of discount classes being deprecated and new classes/functions being introduced. All changes should be fully backwards compatible.
Improvement: Code changes that allow for payment gateways to override the card update form.
Fix: If someone applies a one-time 100% off discount code and does not sign up with auto renew, their expiration date is incorrectly set to “never expires”.
Fix: Always set the type attribute on all admin text input fields. This fixes a display inconsistency in WordPress 5.3+.
New: Added the ability to recover pending and failed payments. A "Complete Payment" link has been added to the list of payments on the [subscription_details] shortcode.
Tweak: Added terms/privacy checkboxes to [register_form_stripe] shortcode if enabled. This also fixed an issue where the shortcode was validating for these checkboxes but not displaying them.
Tweak: CSV Importer: improve CSV mime type detection.
Tweak: CSV Importer: if incorrect file type is detected, include the detected file type in the error message.
Tweak: Localize Stripe error messages that occur via JavaScript. Also add a new filter rcp_stripe_error_messages to allow these error messages to be modified.
Tweak: Include original Stripe error message if we don't have our own localized version.
Tweak: Show admin notice if manual membership cancellation fails.
Fix: Sign up fees not being applied if someone attempts a payment, doesn't complete it, then tries a second type. This typically only occurred with the PayPal gateway, which allows you to not complete a payment in progress.
Fix: Heuristics.Phishing.Email.SpoofedDomain false positive from virus scanners, due to us making a link to developer.paypal.com, which actually led to our documentation on how to use that site to get API credentials.
Fix: Add missing try/catch block during certain Stripe operations.
Fix: Correct formatting on sprintf() functions.
Fix: Undefined property errors while updating pending payments via cron job.
Fix: Under certain circumstances, RCP was incorrectly creating a second Stripe customer record.
Fix: Stripe webhook conflicts when RCP is installed on two separate sites but both use the same Stripe account.
Fix: Remove admin_url() base from rcp_get_invoice_url() function. In certain edge cases this was resulting in admin_url() being included in email notifications.
Fix: Update WP_User display name when editing Customer first/last name via Customer Details page.
Fix: Email verification link not working when using plain text emails.
Fix: CSV Importer - use email as the username if username is omitted from the CSV file.
Fix: Recurring fees not being properly passed to payment gateway during registration.
Fix: Do not apply prorated credits when multiple memberships are enabled and registering via [register_form_stripe].
Fix: "Renews automatically" incorrectly displaying on [subscription_details] shortcode for inactive memberships.
Fix: rcp_get_user_payments() was returning all user payments if the current user was logged out. It now returns an empty array.
Fix: Display issues on admin payments table on mobile devices.