a:2:{s:7:"timeout";i:1610497215;s:5:"value";s:69195:"{"new_version":"3.4.4","stable_version":"3.4.4","name":"Restrict Content Pro","slug":"restrict-content-pro","url":"https:\/\/restrictcontentpro.com\/downloads\/restrict-content-pro\/?changelog=1","last_updated":"2020-10-19 12:59:38","homepage":"https:\/\/restrictcontentpro.com\/downloads\/restrict-content-pro\/","package":"https:\/\/restrictcontentpro.com\/edd-sl\/package_download\/MTYxMDc1MjgxNTpkNmM5NWJkZDM2NDhmNjk3NjcwODkxMTYzOGZhNDk2ZDo0Nzk6NzViYzVlZDFmNzkzZmRmOTBjYjk4NzAyNjMxOTE1YWM6aHR0cHNALy91c3dvcmt3b3JsZC5jb206MA==","download_link":"https:\/\/restrictcontentpro.com\/edd-sl\/package_download\/MTYxMDc1MjgxNTpkNmM5NWJkZDM2NDhmNjk3NjcwODkxMTYzOGZhNDk2ZDo0Nzk6NzViYzVlZDFmNzkzZmRmOTBjYjk4NzAyNjMxOTE1YWM6aHR0cHNALy91c3dvcmt3b3JsZC5jb206MA==","sections":{"description":"","changelog":"<p>Version 3.4.4, October 13, 2020<\/p>\n<ul>\n<li>Update: Updating the minified js for includes\/js\/registration.js<\/li>\n<\/ul>\n<p>Version 3.4.3, September 30, 2020<\/p>\n<ul>\n<li>Major Change: Set session cookies instead of using wp_signon during registration. The wp_login hook will no longer fire after a user is registered.<\/li>\n<li>Tweak: Add action to perform custom validation for Password Resets.<\/li>\n<li>Tweak: Add filter to conditionally disable login hijacking.<\/li>\n<li>Tweak: Add API to allow for asynchronous Promise-based registration validation.<\/li>\n<li>Refactor: Remove old updater API calls.<\/li>\n<li>Log: Adding License Logging<\/li>\n<\/ul>\n<p>Version 3.4.2, September 30, 2020<\/p>\n<ul>\n<li>Fix: French Translation update<\/li>\n<li>Fix: Spanish Translation update<\/li>\n<li>Fix: Membership Levels fix for both sorting the levels and the number that can be displayed.<\/li>\n<li>Update: Removing old License key field, label, and notification.<\/li>\n<li>Fix: Braintree and Stripe had dates being formatted with the incorrect format.<\/li>\n<li>Fix: RCP settings page was not defaulting to the selected tab after saving form.<\/li>\n<\/ul>\n<p>Version 3.4, September 8, 2020<\/p>\n<ul>\n<li>Fix: WooCommerce Products can be incorrectly restricted if a user hasn't verified their email address.<\/li>\n<li>New: Added new actions hooks to Membership page before and after payments table. 'rcp_membership_details_before_payments' and 'rcp_membership_details_after_payments'<\/li>\n<li>Fix: Able to save invalid configuration with 0 duration and payment plan.<\/li>\n<li>New: Introduced action hook that runs after membership is updated via admin. 'rpc_after_membership_admin_update'<\/li>\n<li>New: Created new filter on price for RCP Group Accounts User Specified Count Quantity<\/li>\n<li>Fix: Removed 'ba-bbq' library to fix Javascript error in WordPress 5.5<\/li>\n<li>Fix: Some columns were missing from Membership Levels after updating from 2.x to 3.4.<\/li>\n<li>Improvement: Update to Danish Translation.<\/li>\n<li>Fix: Polish Currency Code formatting<\/li>\n<li>Fix: Bulk actions don't work when using non-English languages.<\/li>\n<li>Improvement: Option to apply discounts to signup fees<\/li>\n<li>Improvement: Move Membership Level to BerlinDB<\/li>\n<li>Fix: Incorrect expiration date when renewing an existing membership.<\/li>\n<li>Improvement: Update to French Translation<\/li>\n<li>Improvement: Update some BerlinDB bas classes<\/li>\n<li>New: Add ability to toggle auto renew off\/on [Stripe]<\/li>\n<li>Improvement: Add ability to export all members at once.<\/li>\n<li>Fix: Unable to save backslashes in the databases<\/li>\n<li>New: Logs Table<\/li>\n<li>New: Add payments importer tool<\/li>\n<li>Improvement: Stop using '000-00-00 00:00:00' as default date values<\/li>\n<li>Improvement: Add database table version numbers to system info file<\/li>\n<li>New: Add Component Registry<\/li>\n<li>Fix: CSS was removed in order to remove the breaking style from admin pages.<\/li>\n<li>Fix: use \"jQuery\" instead of \"$\".<\/li>\n<li>Improvement: %member_id% template tag description change<\/li>\n<li>Improvement: Capitalize first letter in card brand on the update card form page.<\/li>\n<li>Improvement: [rcp_update_card] shortcode did not work with editing multiple memberships.<\/li>\n<\/ul>\n<p><strong>Version 3.3.13, September 1, 2020<\/strong><\/p>\n<ul>\n<li>New: Added new updater.<\/li>\n<\/ul>\n<p><strong>Version 3.3.12, June 22, 2020<\/strong><\/p>\n<ul>\n<li>Security Fix: Improve customer IP address validation &amp; escaping.<\/li>\n<li>Fix: Include\u00a0$membership\u00a0argument in renewal payment failed email filters. This fixes some problems with Per-Level Emails not working with this email template.<\/li>\n<\/ul>\n<p><strong>Version 3.3.11, May 4, 2020<\/strong><\/p>\n<ul>\n<li>Fix: reCAPTCHA now works with\u00a0[register_form_stripe]. This also fixed a problem where the\u00a0[register_form_stripe]\u00a0form wasn't able to be submitted at all if reCAPTCHA was enabled.<\/li>\n<li>Fix: Two strings missing the\u00a0rcp\u00a0text domain, which prevented them from being translated.<\/li>\n<li>Fix: Adjust how base object class is set up to prevent unnecessary unserializing.<\/li>\n<li>Fix: Add whitelists to queries in RCP_Levels\u00a0database class to prevent ordering by columns that don't exist.<\/li>\n<li>Translations: All translation files have been synced with the source code. This will add any missing strings.<\/li>\n<\/ul>\n<p><strong>Version 3.3.10, April 6, 2020<\/strong><\/p>\n<ul>\n<li>Fix: Memberships still shown as trialing if a customer renews their membership before the trial expires. Now the trialling flag is removed as soon as the first payment comes in, even if it's done early.<\/li>\n<li>Fix: Braintree class fatal error when using RCP's Braintree gateway alongside other plugins using the same Braintree library.<\/li>\n<li>Fix: The\u00a0administrator\u00a0user role is now never removed, even if the administrator role was granted by the membership level.<\/li>\n<li>Tweak: Added version number to composer.json file.<\/li>\n<\/ul>\n<p><strong>Version 3.3.9, March 23, 2020<\/strong><\/p>\n<ul>\n<li>Modified template files: subscription.php<\/li>\n<li>New: Add filters on admin Payment Received email message and subject.\u00a0rcp_payment_received_admin_email\u00a0and\u00a0rcp_email_payment_received_admin_subject.<\/li>\n<li>New: Add\u00a0user_id\u00a0column to memberships table. This helps provide a more direct connection between a membership record and the corresponding user account. This data will be automatically backfilled when accessed.<\/li>\n<li>New: Add\u00a0get_payment_id()\u00a0public method to\u00a0RCP_Emails\u00a0class.<\/li>\n<li>Improvement: Add JavaScript confirmation to \"Cancel\" link on admin memberships table.<\/li>\n<li>Improvement: Automatically retry failed payment after Stripe billing card is updated.<\/li>\n<li>Improvement: Add more detail to \"can cancel\" debug log message to explain why it might be \"false\".<\/li>\n<li>Improvement: Include all method parameters in\u00a0rcp_registration_get_recurring_total\u00a0filter.<\/li>\n<li>Improvement: Rework handling in 3.0 migration for people who attempt the migration multiple times. This helps better ensure all migrated data is brand new and not \"stale\" from the previous attempt.<\/li>\n<li>Improvement: Adjust membership level \"Status\" description to clarify the difference between active and inactive membership levels.<\/li>\n<li>Improvement: Introduce\u00a0rcp_transition_customer_email_verification\u00a0hook. This hook is now used for triggering email verification emails.<\/li>\n<li>Improvement: Add\u00a0$payment_event\u00a0parameter to\u00a0rcp_stripe_webhook_membership\u00a0filter.<\/li>\n<li>Improvement:\u00a0subscription.php\u00a0template - Give upgrade link a new class (rcp_sub_details_change_membership) so it's not the same as the renew link.<\/li>\n<li>Fix: \"Complete Payment\" feature not working - form gets stuck on \"Please Wait...\"<\/li>\n<li>Fix: RCP duplicating Google Authenticator plugin's admin settings.<\/li>\n<li>Fix: Invalid integer error while processing failed payment emails.<\/li>\n<li>Fix: Ensure RCP's new membership expiration date is always at least 2 hours after Stripe's reported\u00a0current_period_end\u00a0on automatic renewals. This allows time for Stripe's 1-hour window between invoice generation and payment.<\/li>\n<li>Fix: Rework old discounts database table upgrades from the 3.0.0 update to ensure they all run correctly and in order. This protects against a possible error about the\u00a0subscription_id\u00a0column not existing.<\/li>\n<li>Fix: Unable to update Stripe billing card if the subscription wasn't originally created by RCP.<\/li>\n<li>Fix: CSV importer reporting incorrect row numbers after the first batch.<\/li>\n<\/ul>\n<p><strong>Version 3.3.8, February 12, 2020<\/strong><\/p>\n<ul>\n<li>Fix: PHP 5.6 error due to use of type hinting.<\/li>\n<li>Fix: Check if\u00a0wp_is_site_initialized()\u00a0exists before using to prevent errors in WordPress versions below 5.1.<\/li>\n<\/ul>\n<p><strong>Version 3.3.7, February 11, 2020<\/strong><\/p>\n<ul>\n<li>New: Introduced new filter\u00a0rcp_is_rcp_admin_page. RCP scripts and styles are enqueued when this returns\u00a0true\u00a0so third party plugins can use this filter to load RCP scripts and styles on their own pages.<\/li>\n<li>Improvement:\u00a0$_POST\u00a0data is now available during\u00a0rcp_validate_registration_state\u00a0ajax action.<\/li>\n<li>Fix: MySQL errors on multisite when\u00a0switch_blog\u00a0action runs for the first time after new sites are created but before the database tables are created.<\/li>\n<li>Fix: If a customers database table upgrade runs a second time it throws an error.<\/li>\n<li>Fix: Improve logic on Stripe subscription creation dates to better protect against failures with non-standard billing cycles.<\/li>\n<li>Fix: Add checks in case the\u00a0one_time\u00a0column is missing from the discounts database table, and add it in if so. This error could occur when upgrading from a very old version.<\/li>\n<\/ul>\n<p><strong>Version 3.3.6, January 30, 2020<\/strong><\/p>\n<ul>\n<li>Fix: Subscription creation failed with monthly memberships if next month has fewer days than this month.<\/li>\n<\/ul>\n<p><strong>Version 3.3.5, January 29, 2020<\/strong><\/p>\n<ul>\n<li>New: Added\u00a0rcp_registration_page_url\u00a0filter.<\/li>\n<li>Improvement: Customers can now update their Stripe cards if they do not have a recurring membership. Note: if a non-recurring customer does this, updating their billing card does not actually create a recurring subscription.<\/li>\n<li>Fix:\u00a0rcp_is_active() can incorrectly return false when multiple memberships are enabled and the user has one membership that is not active, but another one that is.<\/li>\n<li>Fix: Correct plugin header to use\u00a0Plugin URI\u00a0instead of\u00a0Plugin URL.<\/li>\n<li>Fix: Date calculation error with \"walking expiration dates\". This caused incorrect dates being calculated for yearly memberships that began on the 29th, 30th, or 31st of any month.<\/li>\n<li>Fix: Membership counts cron job not running due to incorrect query argument.<\/li>\n<li>Fix: reCAPTCHA v3 could fail if the registration form was submitted multiple times by the same user. (Example: first attempt their card payment failed, so they tried again within the same page load.)<\/li>\n<li>Fix: Adjust how RCP matches Stripe webhook to a membership to ensure that RCP doesn't process webhooks for any plugins.<\/li>\n<li>Tweak: Add membership note whenever a membership is manually edited.<\/li>\n<\/ul>\n<p><strong>Version 3.3.4, January 23, 2020<\/strong><\/p>\n<ul>\n<li>Improvement: Update Stripe and Braintree gateways to \"soft fail\" after all <em>essential<\/em>\u00a0actions have been taken. For example: if initial payment is successful but setting up the subscription fails, then registration is still deemed \"successful\" (whereas previously it would have been marked as a failure). In this case, membership is still activated but auto renew is disabled and a note is added to indicate the subscription creation failure.<\/li>\n<li>Improvement: Add help next next to email reminders to clarify the difference between Expiration &amp; Renewal reminders.<\/li>\n<li>Fix: Convert\u00a0stripe_checkout\u00a0gateway to\u00a0stripe\u00a0in membership records.<\/li>\n<li>Fix:\u00a0RCP_Membership::enable()\u00a0not enabling the membership. This caused a problem where memberships were not getting assigned when someone attempted to register, had their card declined, then tried again successfully.<\/li>\n<\/ul>\n<p><strong>Version 3.3.3, January 15, 2020<\/strong><\/p>\n<ul>\n<li>Improvement: Add\u00a0$discounts\u00a0and\u00a0$fees\u00a0method arguments to\u00a0rcp_registration_get_total\u00a0filter.<\/li>\n<li>Fix: Incorrect calculation in expiration date when accounting for walking dates used by PayPal. This could have caused some memberships in RCP to expire a day or two before the PayPal renewal charge went through.<\/li>\n<li>Fix: Ensure we never pass a\u00a00\u00a0user_id to our\u00a0rcp_user_has_{status}_membership\u00a0filters. Instead a\u00a00 user_id is converted to the current user ID, which was the intention.<\/li>\n<li>Fix: Protect against fatal errors in Memberships admin UI if you somehow have a membership record associated with a since-deleted customer \/ user.<\/li>\n<li>Fix: Adjust parameters on email reminder query to set\u00a0inclusive\u00a0to\u00a0true. This fixes a problem where memberships that expired at certain times may not have been included.<\/li>\n<li>Fix: Use existing hidden field for registration payment ID instead of appending a new field to the form.<\/li>\n<li>Fix: Braintree - do not send\u00a0threeDSecure.amount\u00a0parameter if 3D secure is not enabled on the account. This fixes registration issues with Braintree accounts that do not have 3D secure enabled.<\/li>\n<li>Fix: Payment subtotal incorrectly set to\u00a00\u00a0when adding a payment via Restrict &gt; Payments &gt; Add New.<\/li>\n<li>Fix: Check for required fields in\u00a0rcp_add_customer()\u00a0function to prevent PHP notices when those fields are not included.<\/li>\n<li>Fix: Enabling payment plans on a level that already has memberships that were created without a payment plan causes those memberships to complete the payment plan earlier than they should. With this fix, existing memberships will continue to be treated as if they do not have a payment plan at all.<\/li>\n<\/ul>\n<p><strong>Version 3.3.2, January 8, 2020<\/strong><\/p>\n<ul>\n<li>Modified template files: login.php<\/li>\n<li>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.<\/li>\n<li>Tweak: Update Stripe integration to use\u00a0billing_cycle_anchor\u00a0parameter instead of\u00a0trial_end\u00a0where possible. This fixes MRR reporting inconsistencies in Stripe.<\/li>\n<li>Tweak: Removed \"RCP:\" prefix from Stripe one-time payment description.<\/li>\n<li>Tweak: Change log in form username label to \"Username or Email\".<\/li>\n<li>Tweak: Update Italian translation.<\/li>\n<li>Tweak: Update Spanish translation.<\/li>\n<li>Fix: Stripe renewals have unexpected results when manually renewing an expired membership that still has a \"past due\" (not cancelled) subscription inside Stripe.<\/li>\n<li>Fix: Password resets not working with object caching.<\/li>\n<li>Fix: Curly quotes in Spanish translation file breaking links.<\/li>\n<li>Fix: Potential Heuristics.Phishing.Email.SpoofedDomain false positive in certain language files due to poorly formatted developer.paypal.com link.<\/li>\n<li>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.<\/li>\n<li>Fix: Ensure all URL query arguments are URL encoded.<\/li>\n<li>Fix: Trialling users not receiving expiration reminders when they qualify.<\/li>\n<li>Fix: If \"Disable Global Stripe.js\" is enabled, then Stripe card update page no longer works.<\/li>\n<li>Fix: Add checks to prevent\u00a0rcp_check_member_counts()\u00a0cron job from running more than once per day.<\/li>\n<li>Fix: Memberships that never expire incorrectly getting picked up in\u00a0rcp_check_for_expired_users()\u00a0query. 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.<\/li>\n<li>Fix: Unable to save null values to database, which could impact the customer\u00a0has_trialed\u00a0flag value.<\/li>\n<li>Fix: Admin email notifications may contain the incorrect membership level name if multiple memberships is enabled.<\/li>\n<\/ul>\n<p><strong>Version 3.3.1, December 16, 2019<\/strong><\/p>\n<ul>\n<li>New: Added new email template tags for %membership_renew_url%\u00a0and\u00a0%membership_change_url%.<\/li>\n<li>New: Add a date filter to the admin Payments page.<\/li>\n<li>Improvement: Added new membership column for activated_date. This gets set when a membership is activated.<\/li>\n<li>Improvement: Updated Spanish translation.<\/li>\n<li>Improvement: On install, the default pages are now assigned to the currently logged in user.<\/li>\n<li>Improvement: Reject discount code if it's one-time and attempted to be applied to a free trial. Previously, the discount was still not applied, but the user was not actually informed of this. Now we show a clear error message informing the user that the discount didn't work.<\/li>\n<li>Improvement: Adjust one-time discounts setting to clarify it doesn't work with free trials.<\/li>\n<li>Improvement: Change \"Upgraded From\" label on Membership Details to \"Changed From\".<\/li>\n<li>Improvement: Add subscription key to admin Membership Details page.<\/li>\n<li>Improvement: Move rcp_process_member_cancellation\u00a0hook down a couple lines to ensure our note gets added prior to that hook running.<\/li>\n<li>Fix: Stripe modal not working in IE11.<\/li>\n<li>Fix: Inelegant Stripe error when no cardholder name is supplied while updating billing card. We now show a nicer looking error if the field is empty.<\/li>\n<li>Fix: test_calculate_expiration()\u00a0unit test failing due to setting expiration date to one in the past.<\/li>\n<li>Fix: Admin unable to manually change a membership's level if the other levels are deactivated.<\/li>\n<li>Fix: Unable to manually renew a free trial level prior to its expiration.<\/li>\n<li>Fix: Database table version numbers were not being removed from wp_options on uninstall.<\/li>\n<li>Fix: \"Hide Premium Posts\" query modification was overriding existing post__not_in\u00a0value. Now they get merged.<\/li>\n<li>Fix: Under certain circumstances, admin payments table was incorrectly showing \"User #123\u00a0(deleted)\" as the customer name when the user hadn't actually been deleted.<\/li>\n<\/ul>\n<p><strong>Version 3.3, December 10, 2019<\/strong><\/p>\n<ul>\n<li>New template file: card-update-form-fields.php<\/li>\n<li>Modified template files: card-update-form.php, register-total-details.php<\/li>\n<li>New: Added support for using saved Stripe cards for new purchases.<\/li>\n<li>New: Updated the Braintree SDK, added support for the drop-in UI, and added support for 3D secure.<\/li>\n<li>New: Added support for reCAPTCHA v3. This can be enabled in Restrict \u2192 Settings \u2192 Misc by changing the version number. You will also need to generate v3 keys.<\/li>\n<li>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' );<\/li>\n<li>New: Added RCP_GATEWAY_SANDBOX_MODE constant. This allows you to force sandbox mode to always be enabled. Recommended on staging sites.<\/li>\n<li>New: The membership next renewal date is now displayed in the registration form.<\/li>\n<li>Improvement: Attempt to auto-style the Stripe Elements field, using styles on existing on-site checkout fields.<\/li>\n<li>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.<\/li>\n<li>Improvement: Code changes that allow for payment gateways to override the card update form.<\/li>\n<li>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 \u201cnever expires\u201d.<\/li>\n<li>Fix: Always set the type attribute on all admin text input fields. This fixes a display inconsistency in WordPress 5.3+.<\/li>\n<li>Fix: Invalid HTML markup with Stripe Elements.<\/li>\n<\/ul>\n<p><strong>Version 3.2.3, October 7, 2019<\/strong><\/p>\n<ul>\n<li>Modified templates: subscription.php<\/li>\n<li>New: Added the ability to recover pending and failed payments. A \"Complete Payment\" link has been added to the list of payments on the\u00a0[subscription_details]\u00a0shortcode.<\/li>\n<li>Tweak: Added terms\/privacy checkboxes to\u00a0[register_form_stripe]\u00a0shortcode if enabled. This also fixed an issue where the shortcode was validating for these checkboxes but not displaying them.<\/li>\n<li>Tweak: CSV Importer: improve CSV mime type detection.<\/li>\n<li>Tweak: CSV Importer: if incorrect file type is detected, include the detected file type in the error message.<\/li>\n<li>Tweak: Localize Stripe error messages that occur via JavaScript. Also add a new filter\u00a0rcp_stripe_error_messages\u00a0to allow these error messages to be modified.<\/li>\n<li>Tweak: Include original Stripe error message if we don't have our own localized version.<\/li>\n<li>Tweak: Show admin notice if manual membership cancellation fails.<\/li>\n<li>Fix: Sign up fees not being applied if someone attempts a payment, doesn't complete it, then tries a second time. This typically only occurred with the PayPal gateway, which allows you to not complete a payment in progress.<\/li>\n<li>Fix:\u00a0Heuristics.Phishing.Email.SpoofedDomain\u00a0false positive from virus scanners, due to us making a link to\u00a0developer.paypal.com, which actually led to our documentation on how to use that site to get API credentials.<\/li>\n<li>Fix: Add missing try\/catch block during certain Stripe operations.<\/li>\n<li>Fix: Correct formatting on\u00a0sprintf()\u00a0functions.<\/li>\n<li>Fix: Undefined property errors while updating pending payments via cron job.<\/li>\n<li>Fix: Under certain circumstances, RCP was incorrectly creating a second Stripe customer record.<\/li>\n<li>Fix: Stripe webhook conflicts when RCP is installed on two separate sites but both use the same Stripe account.<\/li>\n<li>Fix: Remove\u00a0admin_url()\u00a0base from\u00a0rcp_get_invoice_url()\u00a0function. In certain edge cases this was resulting in\u00a0admin_url()\u00a0being included in email notifications.<\/li>\n<li>Fix: Update WP_User display name when editing Customer first\/last name via Customer Details page.<\/li>\n<li>Fix: Email verification link not working when using plain text emails.<\/li>\n<li>Fix: CSV Importer - use email as the username if username is omitted from the CSV file.<\/li>\n<li>Fix: Recurring fees not being properly passed to payment gateway during registration.<\/li>\n<li>Fix: Do not apply prorated credits when multiple memberships are enabled and registering via\u00a0[register_form_stripe].<\/li>\n<li>Fix: \"Renews automatically\" incorrectly displaying on\u00a0[subscription_details]\u00a0shortcode for inactive memberships.<\/li>\n<li>Fix:\u00a0rcp_get_user_payments()\u00a0was returning all user payments if the current user was logged out. It now returns an empty array.<\/li>\n<li>Fix: Display issues on admin payments table on mobile devices.<\/li>\n<\/ul>\n<p><strong>Version 3.2.2, September 17, 2019<\/strong><\/p>\n<ul>\n<li>Improvement: Updated French translation.<\/li>\n<li>Improvement: Display clearer error messages when there's a problem adding a discount code.<\/li>\n<li>Fix: Registration type changing mid-registration, which could impact signup fees with some gateways.<\/li>\n<li>Fix: Stripe invalid request error when someone with a non-recurring Stripe membership visits the page containing the\u00a0[rcp_update_card]\u00a0shortcode.<\/li>\n<li>Fix: Incorrect use of\u00a0date_i18n()\u00a0instead of\u00a0date()\u00a0when saving payment dates via webhooks.<\/li>\n<li>Fix: Filter the password reset URL to use the designated RCP login form when \"Redirect Default Login URL\" is enabled.<\/li>\n<\/ul>\n<p><strong>Version 3.2.1, September 12, 2019<\/strong><\/p>\n<ul>\n<li>Fix: Incorrect Stripe subscription start date if a member manually renews a membership prior to expiration and the initial payment hasn't yet been fully captured at the time the subscription is created.<\/li>\n<li>Fix: Unable to process free membership if Stripe is the selected payment gateway.<\/li>\n<li>Fix: Registration errors when a customer has a membership for a level that has been deleted.<\/li>\n<li>Fix: Missing\u00a0rcp_stripe_signup_payment_failed\u00a0action when initial Stripe payment fails.<\/li>\n<li>Tweak: Update\u00a0rcp_is_trialing()\u00a0function to remove use of deprecated class.<\/li>\n<li>Tweak: Include RCP upgrade date and \"upgraded from\" version in system info report.<\/li>\n<\/ul>\n<p><strong>Version 3.2, September 10, 2019<\/strong><\/p>\n<ul>\n<li>Important: Stripe Checkout gateway has been removed. If you\u2019re using it, you will automatically be changed over to our normal Stripe gateway, which uses Stripe Elements. The [register_form_stripe] shortcode still functions, but it may look different.<\/li>\n<li>New: Updated the Stripe gateway to use Payment Intents API. This complies with SCA regulations.<\/li>\n<li>New: Stripe card declined notices now appear inline and no longer require a page refresh.<\/li>\n<li>New: Added\u00a0%update_billing_card_url%\u00a0template tag, which serves as a direct link to the \u201cupdate billing card\u201d page for the membership associated with the user\u2019s most recent payment. Recommended for use in the Renewal Payment Failed email.<\/li>\n<li>Tweak: Changes to registration form JavaScript. Initial membership processing is now handled via ajax. Testing is recommended if you have custom code that interacts with the registration JavaScript.<\/li>\n<li>Tweak: The first payment in a Stripe subscription is now always a one-time charge. The subscription is created with a delayed start date (until the next billing cycle).<\/li>\n<li>Tweak: Stripe gateway no longer uses Stripe Coupon codes. Instead, new plans are created for each duration\/amount combination.<\/li>\n<li>Tweak: Stripe gateway no longer handles signup fees via customer account balance. They are incorporated into an initial one-time charge that handles the first payment.<\/li>\n<li>Tweak: The\u00a0rcp_stripe_charge_create_args\u00a0filter is now deprecated and replaced with\u00a0rcp_stripe_create_payment_intent_args. This is due to replacing the Charges API with the Payment Intents API. Some arguments may now differ.<\/li>\n<li>Tweak: Stripe error messages are now able to be translated.<\/li>\n<li>Fix: Stripe gateway doesn\u2019t use the \u201crecurring_price\u201d that\u2019s passed into the gateway class.<\/li>\n<li>Fix: Stripe incorrectly applying one-time discounts after a free trial.<\/li>\n<\/ul>\n<p><strong>Version 3.1.2, August 22, 2019<\/strong><\/p>\n<ul>\n<li>New: An admin notice will be displayed if you have the Stripe Checkout gateway enabled, explaining that the gateway will be removed in RCP version 3.2 due to SCA regulations. Read more here:\u00a0<a href=\"https:\/\/docs.restrictcontentpro.com\/article\/1552-stripe-checkout\" rel=\"nofollow\">https:\/\/docs.restrictcontentpro.com\/article\/1552-stripe-checkout<\/a><\/li>\n<li>New: Added a\u00a0date_completed\u00a0column to the\u00a0wp_rcp_queue\u00a0table.<\/li>\n<li>New: Unauthorized users are now redirected away from category archive pages if the category is restricted. (Requires that Hide Restricted Posts be checked on.)<\/li>\n<li>New: Allow filtering by both level and status on Restrict &gt; Memberships page. Note: you must choose a status filter first, then you can change the membership level.<\/li>\n<li>New: Add support for a\u00a0redirect\u00a0query arg when generating a\u00a0resend_verification\u00a0link.<\/li>\n<li>New: Add \"Status\" dropdown to the \"add payment\" form on the admin Membership Details page.<\/li>\n<li>Tweak: Moved\u00a0_rcp_reminder_sent_*\u00a0user meta to membership meta.<\/li>\n<li>Tweak: Adjust Redirect Default Login URL setting description to convey that the\u00a0[login_form]\u00a0shortcode is required on the page and not optional.<\/li>\n<li>Fix: Free trial incorrectly granted again under certain circumstances.<\/li>\n<li>Fix: If a customer signs up for a one-time payment membership and does not complete payment, they are unable to try again. (Usually only seen with the PayPal payment gateway.)<\/li>\n<li>Fix: CSV import not setting correct password for new users.<\/li>\n<li>Fix: CSV import missing old\u00a0rcp_user_import_user_added\u00a0action hook.<\/li>\n<li>Fix: Incorrect ajax parameter used for error message when uploading a CSV import file fails.<\/li>\n<li>Fix: Don't show an error message on\u00a0[rcp_update_card]\u00a0shortcode if the current user does not have a membership at all.<\/li>\n<li>Fix: Ensure that\u00a0free\u00a0membership status is always converted to\u00a0active\u00a0(backwards compatibility with pre-3.0).<\/li>\n<\/ul>\n<p><strong>Version 3.1.1, July 31, 2019<\/strong><\/p>\n<ul>\n<li>New: Add message to\u00a0[rcp_update_card]\u00a0shortcode when a user is unable to update their card details.<\/li>\n<li>New: Add action\u00a0rcp_edit_customer_after_memberships_section\u00a0to Customer Details page, allowing third party plugins to add a whole new customer section.<\/li>\n<li>New: On Customer Details page, display whether or not the customer has trialled before.<\/li>\n<li>Tweak: Add a space between the Norwegian Krone currency symbol and the price (previous:\u00a010kr\u00a0new:\u00a010 kr).<\/li>\n<li>Tweak: Removed the 2-day grace period on the expiration cron job. Use this custom code if you want to add it back in:\u00a0<a href=\"https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-add-expiration-grace-period.php\">https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-add-expiration-grace-period.php<\/a><\/li>\n<li>Tweak: Include RCP payment ID in Stripe one-time charge metadata.<\/li>\n<li>Fix: Generate a new subscription key on renewals if existing one is blank. This fixes a problem with renewals not activating via PayPal if the existing membership didn't have a subscription key (which might be the case if the membership was imported).<\/li>\n<li>Fix: EDD Downloads not showing excerpts to users without access if excerpts are globally enabled.<\/li>\n<li>Fix: Under certain circumstances, deactivated membership levels can be renewed when they shouldn't be able to. If you want to allow deactivated levels to be renewed, use the\u00a0rcp_can_renew_deactivated_membership_levels\u00a0filter. Example:\u00a0<a href=\"https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-renew-deactivated-levels.php\">https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-renew-deactivated-levels.php<\/a><\/li>\n<li>Fix: Expiration emails being sent when creating a new membership with the \"expired\" status.<\/li>\n<li>Fix: reCAPTCHA errors when using [register_form_stripe].<\/li>\n<li>Fix: Registration not working in Internet Explorer due to JavaScript\u00a0assign()\u00a0error.<\/li>\n<li>Fix: Stop using\u00a0date_i18n()\u00a0in database datetime validation.<\/li>\n<li>Fix: Pending payment ID can be incorrect if someone attempts a payment multiple times for the same membership.<\/li>\n<li>Fix: 3.0 migration - check for and show clear error if the user being migrated doesn't exist (due to orphaned user meta).<\/li>\n<\/ul>\n<p><strong>Version 3.1, July 17, 2019<\/strong><\/p>\n<ul>\n<li>Modified template files: card-update-form.php, paypal-express-confirm.php, register-single.php, register.php, subscription.php.<\/li>\n<li>New: Add support for multiple active memberships per customer.<\/li>\n<li>New (WARNING): Authorize.net has been removed from core and moved to a separate add-on. The new add-on can be installed here: <a href=\"https:\/\/wordpress.org\/plugins\/rcp-authorize-net\/\" target=\"_blank\" rel=\"noopener\">https:\/\/wordpress.org\/plugins\/rcp-authorize-net\/<\/a><\/li>\n<li>New: One-time discounts can now be configured on a per-discount basis rather than globally.<\/li>\n<li>New: Stripe gateway has been updated to use Stripe Elements.<\/li>\n<li>New: CSV user import tool now available in Restrict &gt; Tools &gt; Import.<\/li>\n<li>New: Added WP-CLI integration.<\/li>\n<li>New: Expiration and renewal notices can now be limited to certain membership levels only.<\/li>\n<li>New: Added support for bulk adding memberships to existing users from the Users table.<\/li>\n<li>New: Added \"payment received\" email template for admins.<\/li>\n<li>New: Use WP_List_Table for all admin table pages.<\/li>\n<li>New: Add default email template content on new installs.<\/li>\n<li>New: Log all payment events in the customer notes.<\/li>\n<li>New: Send customer name in Stripe API request.<\/li>\n<li>New: Add payment meta and membership level meta functions.<\/li>\n<li>New: Signup fees are no longer applied when manually renewing an existing membership.<\/li>\n<li>New: Stripe gateway tested with API version\u00a02019-05-16.<\/li>\n<li>Tweak: Stop unchecking \"auto renew\" when a membership expires.<\/li>\n<li>Tweak: All translation files have been updated from plugin source code.<\/li>\n<li>Tweak: Updated plugin author name and URL.<\/li>\n<li>Fix: RCP datepicker styles affecting other plugin datepickers.<\/li>\n<li>Fix: Reduce the three RCP membership columns on the Users table to one single \"Membership\" column. This reduces database queries and improves loading time on this page.<\/li>\n<li>Fix: Payments are now only recorded via webhooks\/IPNs if we can match the payment to a very specific RCP membership. This resolves issues if the same PayPal account is used for multiple different products and one customer is involved in both products.<\/li>\n<\/ul>\n<p>https:\/\/restrictcontentpro.com\/downloads\/restrict-content-pro\/changelog<\/p>\n"},"banners":{"high":"","low":""},"icons":"a:0:{}","description":[""],"changelog":["<p>Version 3.4.4, October 13, 2020<\/p>\n<ul>\n<li>Update: Updating the minified js for includes\/js\/registration.js<\/li>\n<\/ul>\n<p>Version 3.4.3, September 30, 2020<\/p>\n<ul>\n<li>Major Change: Set session cookies instead of using wp_signon during registration. The wp_login hook will no longer fire after a user is registered.<\/li>\n<li>Tweak: Add action to perform custom validation for Password Resets.<\/li>\n<li>Tweak: Add filter to conditionally disable login hijacking.<\/li>\n<li>Tweak: Add API to allow for asynchronous Promise-based registration validation.<\/li>\n<li>Refactor: Remove old updater API calls.<\/li>\n<li>Log: Adding License Logging<\/li>\n<\/ul>\n<p>Version 3.4.2, September 30, 2020<\/p>\n<ul>\n<li>Fix: French Translation update<\/li>\n<li>Fix: Spanish Translation update<\/li>\n<li>Fix: Membership Levels fix for both sorting the levels and the number that can be displayed.<\/li>\n<li>Update: Removing old License key field, label, and notification.<\/li>\n<li>Fix: Braintree and Stripe had dates being formatted with the incorrect format.<\/li>\n<li>Fix: RCP settings page was not defaulting to the selected tab after saving form.<\/li>\n<\/ul>\n<p>Version 3.4, September 8, 2020<\/p>\n<ul>\n<li>Fix: WooCommerce Products can be incorrectly restricted if a user hasn't verified their email address.<\/li>\n<li>New: Added new actions hooks to Membership page before and after payments table. 'rcp_membership_details_before_payments' and 'rcp_membership_details_after_payments'<\/li>\n<li>Fix: Able to save invalid configuration with 0 duration and payment plan.<\/li>\n<li>New: Introduced action hook that runs after membership is updated via admin. 'rpc_after_membership_admin_update'<\/li>\n<li>New: Created new filter on price for RCP Group Accounts User Specified Count Quantity<\/li>\n<li>Fix: Removed 'ba-bbq' library to fix Javascript error in WordPress 5.5<\/li>\n<li>Fix: Some columns were missing from Membership Levels after updating from 2.x to 3.4.<\/li>\n<li>Improvement: Update to Danish Translation.<\/li>\n<li>Fix: Polish Currency Code formatting<\/li>\n<li>Fix: Bulk actions don't work when using non-English languages.<\/li>\n<li>Improvement: Option to apply discounts to signup fees<\/li>\n<li>Improvement: Move Membership Level to BerlinDB<\/li>\n<li>Fix: Incorrect expiration date when renewing an existing membership.<\/li>\n<li>Improvement: Update to French Translation<\/li>\n<li>Improvement: Update some BerlinDB bas classes<\/li>\n<li>New: Add ability to toggle auto renew off\/on [Stripe]<\/li>\n<li>Improvement: Add ability to export all members at once.<\/li>\n<li>Fix: Unable to save backslashes in the databases<\/li>\n<li>New: Logs Table<\/li>\n<li>New: Add payments importer tool<\/li>\n<li>Improvement: Stop using '000-00-00 00:00:00' as default date values<\/li>\n<li>Improvement: Add database table version numbers to system info file<\/li>\n<li>New: Add Component Registry<\/li>\n<li>Fix: CSS was removed in order to remove the breaking style from admin pages.<\/li>\n<li>Fix: use \"jQuery\" instead of \"$\".<\/li>\n<li>Improvement: %member_id% template tag description change<\/li>\n<li>Improvement: Capitalize first letter in card brand on the update card form page.<\/li>\n<li>Improvement: [rcp_update_card] shortcode did not work with editing multiple memberships.<\/li>\n<\/ul>\n<p><strong>Version 3.3.13, September 1, 2020<\/strong><\/p>\n<ul>\n<li>New: Added new updater.<\/li>\n<\/ul>\n<p><strong>Version 3.3.12, June 22, 2020<\/strong><\/p>\n<ul>\n<li>Security Fix: Improve customer IP address validation &amp; escaping.<\/li>\n<li>Fix: Include\u00a0$membership\u00a0argument in renewal payment failed email filters. This fixes some problems with Per-Level Emails not working with this email template.<\/li>\n<\/ul>\n<p><strong>Version 3.3.11, May 4, 2020<\/strong><\/p>\n<ul>\n<li>Fix: reCAPTCHA now works with\u00a0[register_form_stripe]. This also fixed a problem where the\u00a0[register_form_stripe]\u00a0form wasn't able to be submitted at all if reCAPTCHA was enabled.<\/li>\n<li>Fix: Two strings missing the\u00a0rcp\u00a0text domain, which prevented them from being translated.<\/li>\n<li>Fix: Adjust how base object class is set up to prevent unnecessary unserializing.<\/li>\n<li>Fix: Add whitelists to queries in RCP_Levels\u00a0database class to prevent ordering by columns that don't exist.<\/li>\n<li>Translations: All translation files have been synced with the source code. This will add any missing strings.<\/li>\n<\/ul>\n<p><strong>Version 3.3.10, April 6, 2020<\/strong><\/p>\n<ul>\n<li>Fix: Memberships still shown as trialing if a customer renews their membership before the trial expires. Now the trialling flag is removed as soon as the first payment comes in, even if it's done early.<\/li>\n<li>Fix: Braintree class fatal error when using RCP's Braintree gateway alongside other plugins using the same Braintree library.<\/li>\n<li>Fix: The\u00a0administrator\u00a0user role is now never removed, even if the administrator role was granted by the membership level.<\/li>\n<li>Tweak: Added version number to composer.json file.<\/li>\n<\/ul>\n<p><strong>Version 3.3.9, March 23, 2020<\/strong><\/p>\n<ul>\n<li>Modified template files: subscription.php<\/li>\n<li>New: Add filters on admin Payment Received email message and subject.\u00a0rcp_payment_received_admin_email\u00a0and\u00a0rcp_email_payment_received_admin_subject.<\/li>\n<li>New: Add\u00a0user_id\u00a0column to memberships table. This helps provide a more direct connection between a membership record and the corresponding user account. This data will be automatically backfilled when accessed.<\/li>\n<li>New: Add\u00a0get_payment_id()\u00a0public method to\u00a0RCP_Emails\u00a0class.<\/li>\n<li>Improvement: Add JavaScript confirmation to \"Cancel\" link on admin memberships table.<\/li>\n<li>Improvement: Automatically retry failed payment after Stripe billing card is updated.<\/li>\n<li>Improvement: Add more detail to \"can cancel\" debug log message to explain why it might be \"false\".<\/li>\n<li>Improvement: Include all method parameters in\u00a0rcp_registration_get_recurring_total\u00a0filter.<\/li>\n<li>Improvement: Rework handling in 3.0 migration for people who attempt the migration multiple times. This helps better ensure all migrated data is brand new and not \"stale\" from the previous attempt.<\/li>\n<li>Improvement: Adjust membership level \"Status\" description to clarify the difference between active and inactive membership levels.<\/li>\n<li>Improvement: Introduce\u00a0rcp_transition_customer_email_verification\u00a0hook. This hook is now used for triggering email verification emails.<\/li>\n<li>Improvement: Add\u00a0$payment_event\u00a0parameter to\u00a0rcp_stripe_webhook_membership\u00a0filter.<\/li>\n<li>Improvement:\u00a0subscription.php\u00a0template - Give upgrade link a new class (rcp_sub_details_change_membership) so it's not the same as the renew link.<\/li>\n<li>Fix: \"Complete Payment\" feature not working - form gets stuck on \"Please Wait...\"<\/li>\n<li>Fix: RCP duplicating Google Authenticator plugin's admin settings.<\/li>\n<li>Fix: Invalid integer error while processing failed payment emails.<\/li>\n<li>Fix: Ensure RCP's new membership expiration date is always at least 2 hours after Stripe's reported\u00a0current_period_end\u00a0on automatic renewals. This allows time for Stripe's 1-hour window between invoice generation and payment.<\/li>\n<li>Fix: Rework old discounts database table upgrades from the 3.0.0 update to ensure they all run correctly and in order. This protects against a possible error about the\u00a0subscription_id\u00a0column not existing.<\/li>\n<li>Fix: Unable to update Stripe billing card if the subscription wasn't originally created by RCP.<\/li>\n<li>Fix: CSV importer reporting incorrect row numbers after the first batch.<\/li>\n<\/ul>\n<p><strong>Version 3.3.8, February 12, 2020<\/strong><\/p>\n<ul>\n<li>Fix: PHP 5.6 error due to use of type hinting.<\/li>\n<li>Fix: Check if\u00a0wp_is_site_initialized()\u00a0exists before using to prevent errors in WordPress versions below 5.1.<\/li>\n<\/ul>\n<p><strong>Version 3.3.7, February 11, 2020<\/strong><\/p>\n<ul>\n<li>New: Introduced new filter\u00a0rcp_is_rcp_admin_page. RCP scripts and styles are enqueued when this returns\u00a0true\u00a0so third party plugins can use this filter to load RCP scripts and styles on their own pages.<\/li>\n<li>Improvement:\u00a0$_POST\u00a0data is now available during\u00a0rcp_validate_registration_state\u00a0ajax action.<\/li>\n<li>Fix: MySQL errors on multisite when\u00a0switch_blog\u00a0action runs for the first time after new sites are created but before the database tables are created.<\/li>\n<li>Fix: If a customers database table upgrade runs a second time it throws an error.<\/li>\n<li>Fix: Improve logic on Stripe subscription creation dates to better protect against failures with non-standard billing cycles.<\/li>\n<li>Fix: Add checks in case the\u00a0one_time\u00a0column is missing from the discounts database table, and add it in if so. This error could occur when upgrading from a very old version.<\/li>\n<\/ul>\n<p><strong>Version 3.3.6, January 30, 2020<\/strong><\/p>\n<ul>\n<li>Fix: Subscription creation failed with monthly memberships if next month has fewer days than this month.<\/li>\n<\/ul>\n<p><strong>Version 3.3.5, January 29, 2020<\/strong><\/p>\n<ul>\n<li>New: Added\u00a0rcp_registration_page_url\u00a0filter.<\/li>\n<li>Improvement: Customers can now update their Stripe cards if they do not have a recurring membership. Note: if a non-recurring customer does this, updating their billing card does not actually create a recurring subscription.<\/li>\n<li>Fix:\u00a0rcp_is_active() can incorrectly return false when multiple memberships are enabled and the user has one membership that is not active, but another one that is.<\/li>\n<li>Fix: Correct plugin header to use\u00a0Plugin URI\u00a0instead of\u00a0Plugin URL.<\/li>\n<li>Fix: Date calculation error with \"walking expiration dates\". This caused incorrect dates being calculated for yearly memberships that began on the 29th, 30th, or 31st of any month.<\/li>\n<li>Fix: Membership counts cron job not running due to incorrect query argument.<\/li>\n<li>Fix: reCAPTCHA v3 could fail if the registration form was submitted multiple times by the same user. (Example: first attempt their card payment failed, so they tried again within the same page load.)<\/li>\n<li>Fix: Adjust how RCP matches Stripe webhook to a membership to ensure that RCP doesn't process webhooks for any plugins.<\/li>\n<li>Tweak: Add membership note whenever a membership is manually edited.<\/li>\n<\/ul>\n<p><strong>Version 3.3.4, January 23, 2020<\/strong><\/p>\n<ul>\n<li>Improvement: Update Stripe and Braintree gateways to \"soft fail\" after all <em>essential<\/em>\u00a0actions have been taken. For example: if initial payment is successful but setting up the subscription fails, then registration is still deemed \"successful\" (whereas previously it would have been marked as a failure). In this case, membership is still activated but auto renew is disabled and a note is added to indicate the subscription creation failure.<\/li>\n<li>Improvement: Add help next next to email reminders to clarify the difference between Expiration &amp; Renewal reminders.<\/li>\n<li>Fix: Convert\u00a0stripe_checkout\u00a0gateway to\u00a0stripe\u00a0in membership records.<\/li>\n<li>Fix:\u00a0RCP_Membership::enable()\u00a0not enabling the membership. This caused a problem where memberships were not getting assigned when someone attempted to register, had their card declined, then tried again successfully.<\/li>\n<\/ul>\n<p><strong>Version 3.3.3, January 15, 2020<\/strong><\/p>\n<ul>\n<li>Improvement: Add\u00a0$discounts\u00a0and\u00a0$fees\u00a0method arguments to\u00a0rcp_registration_get_total\u00a0filter.<\/li>\n<li>Fix: Incorrect calculation in expiration date when accounting for walking dates used by PayPal. This could have caused some memberships in RCP to expire a day or two before the PayPal renewal charge went through.<\/li>\n<li>Fix: Ensure we never pass a\u00a00\u00a0user_id to our\u00a0rcp_user_has_{status}_membership\u00a0filters. Instead a\u00a00 user_id is converted to the current user ID, which was the intention.<\/li>\n<li>Fix: Protect against fatal errors in Memberships admin UI if you somehow have a membership record associated with a since-deleted customer \/ user.<\/li>\n<li>Fix: Adjust parameters on email reminder query to set\u00a0inclusive\u00a0to\u00a0true. This fixes a problem where memberships that expired at certain times may not have been included.<\/li>\n<li>Fix: Use existing hidden field for registration payment ID instead of appending a new field to the form.<\/li>\n<li>Fix: Braintree - do not send\u00a0threeDSecure.amount\u00a0parameter if 3D secure is not enabled on the account. This fixes registration issues with Braintree accounts that do not have 3D secure enabled.<\/li>\n<li>Fix: Payment subtotal incorrectly set to\u00a00\u00a0when adding a payment via Restrict &gt; Payments &gt; Add New.<\/li>\n<li>Fix: Check for required fields in\u00a0rcp_add_customer()\u00a0function to prevent PHP notices when those fields are not included.<\/li>\n<li>Fix: Enabling payment plans on a level that already has memberships that were created without a payment plan causes those memberships to complete the payment plan earlier than they should. With this fix, existing memberships will continue to be treated as if they do not have a payment plan at all.<\/li>\n<\/ul>\n<p><strong>Version 3.3.2, January 8, 2020<\/strong><\/p>\n<ul>\n<li>Modified template files: login.php<\/li>\n<li>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.<\/li>\n<li>Tweak: Update Stripe integration to use\u00a0billing_cycle_anchor\u00a0parameter instead of\u00a0trial_end\u00a0where possible. This fixes MRR reporting inconsistencies in Stripe.<\/li>\n<li>Tweak: Removed \"RCP:\" prefix from Stripe one-time payment description.<\/li>\n<li>Tweak: Change log in form username label to \"Username or Email\".<\/li>\n<li>Tweak: Update Italian translation.<\/li>\n<li>Tweak: Update Spanish translation.<\/li>\n<li>Fix: Stripe renewals have unexpected results when manually renewing an expired membership that still has a \"past due\" (not cancelled) subscription inside Stripe.<\/li>\n<li>Fix: Password resets not working with object caching.<\/li>\n<li>Fix: Curly quotes in Spanish translation file breaking links.<\/li>\n<li>Fix: Potential Heuristics.Phishing.Email.SpoofedDomain false positive in certain language files due to poorly formatted developer.paypal.com link.<\/li>\n<li>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.<\/li>\n<li>Fix: Ensure all URL query arguments are URL encoded.<\/li>\n<li>Fix: Trialling users not receiving expiration reminders when they qualify.<\/li>\n<li>Fix: If \"Disable Global Stripe.js\" is enabled, then Stripe card update page no longer works.<\/li>\n<li>Fix: Add checks to prevent\u00a0rcp_check_member_counts()\u00a0cron job from running more than once per day.<\/li>\n<li>Fix: Memberships that never expire incorrectly getting picked up in\u00a0rcp_check_for_expired_users()\u00a0query. 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.<\/li>\n<li>Fix: Unable to save null values to database, which could impact the customer\u00a0has_trialed\u00a0flag value.<\/li>\n<li>Fix: Admin email notifications may contain the incorrect membership level name if multiple memberships is enabled.<\/li>\n<\/ul>\n<p><strong>Version 3.3.1, December 16, 2019<\/strong><\/p>\n<ul>\n<li>New: Added new email template tags for %membership_renew_url%\u00a0and\u00a0%membership_change_url%.<\/li>\n<li>New: Add a date filter to the admin Payments page.<\/li>\n<li>Improvement: Added new membership column for activated_date. This gets set when a membership is activated.<\/li>\n<li>Improvement: Updated Spanish translation.<\/li>\n<li>Improvement: On install, the default pages are now assigned to the currently logged in user.<\/li>\n<li>Improvement: Reject discount code if it's one-time and attempted to be applied to a free trial. Previously, the discount was still not applied, but the user was not actually informed of this. Now we show a clear error message informing the user that the discount didn't work.<\/li>\n<li>Improvement: Adjust one-time discounts setting to clarify it doesn't work with free trials.<\/li>\n<li>Improvement: Change \"Upgraded From\" label on Membership Details to \"Changed From\".<\/li>\n<li>Improvement: Add subscription key to admin Membership Details page.<\/li>\n<li>Improvement: Move rcp_process_member_cancellation\u00a0hook down a couple lines to ensure our note gets added prior to that hook running.<\/li>\n<li>Fix: Stripe modal not working in IE11.<\/li>\n<li>Fix: Inelegant Stripe error when no cardholder name is supplied while updating billing card. We now show a nicer looking error if the field is empty.<\/li>\n<li>Fix: test_calculate_expiration()\u00a0unit test failing due to setting expiration date to one in the past.<\/li>\n<li>Fix: Admin unable to manually change a membership's level if the other levels are deactivated.<\/li>\n<li>Fix: Unable to manually renew a free trial level prior to its expiration.<\/li>\n<li>Fix: Database table version numbers were not being removed from wp_options on uninstall.<\/li>\n<li>Fix: \"Hide Premium Posts\" query modification was overriding existing post__not_in\u00a0value. Now they get merged.<\/li>\n<li>Fix: Under certain circumstances, admin payments table was incorrectly showing \"User #123\u00a0(deleted)\" as the customer name when the user hadn't actually been deleted.<\/li>\n<\/ul>\n<p><strong>Version 3.3, December 10, 2019<\/strong><\/p>\n<ul>\n<li>New template file: card-update-form-fields.php<\/li>\n<li>Modified template files: card-update-form.php, register-total-details.php<\/li>\n<li>New: Added support for using saved Stripe cards for new purchases.<\/li>\n<li>New: Updated the Braintree SDK, added support for the drop-in UI, and added support for 3D secure.<\/li>\n<li>New: Added support for reCAPTCHA v3. This can be enabled in Restrict \u2192 Settings \u2192 Misc by changing the version number. You will also need to generate v3 keys.<\/li>\n<li>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' );<\/li>\n<li>New: Added RCP_GATEWAY_SANDBOX_MODE constant. This allows you to force sandbox mode to always be enabled. Recommended on staging sites.<\/li>\n<li>New: The membership next renewal date is now displayed in the registration form.<\/li>\n<li>Improvement: Attempt to auto-style the Stripe Elements field, using styles on existing on-site checkout fields.<\/li>\n<li>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.<\/li>\n<li>Improvement: Code changes that allow for payment gateways to override the card update form.<\/li>\n<li>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 \u201cnever expires\u201d.<\/li>\n<li>Fix: Always set the type attribute on all admin text input fields. This fixes a display inconsistency in WordPress 5.3+.<\/li>\n<li>Fix: Invalid HTML markup with Stripe Elements.<\/li>\n<\/ul>\n<p><strong>Version 3.2.3, October 7, 2019<\/strong><\/p>\n<ul>\n<li>Modified templates: subscription.php<\/li>\n<li>New: Added the ability to recover pending and failed payments. A \"Complete Payment\" link has been added to the list of payments on the\u00a0[subscription_details]\u00a0shortcode.<\/li>\n<li>Tweak: Added terms\/privacy checkboxes to\u00a0[register_form_stripe]\u00a0shortcode if enabled. This also fixed an issue where the shortcode was validating for these checkboxes but not displaying them.<\/li>\n<li>Tweak: CSV Importer: improve CSV mime type detection.<\/li>\n<li>Tweak: CSV Importer: if incorrect file type is detected, include the detected file type in the error message.<\/li>\n<li>Tweak: Localize Stripe error messages that occur via JavaScript. Also add a new filter\u00a0rcp_stripe_error_messages\u00a0to allow these error messages to be modified.<\/li>\n<li>Tweak: Include original Stripe error message if we don't have our own localized version.<\/li>\n<li>Tweak: Show admin notice if manual membership cancellation fails.<\/li>\n<li>Fix: Sign up fees not being applied if someone attempts a payment, doesn't complete it, then tries a second time. This typically only occurred with the PayPal gateway, which allows you to not complete a payment in progress.<\/li>\n<li>Fix:\u00a0Heuristics.Phishing.Email.SpoofedDomain\u00a0false positive from virus scanners, due to us making a link to\u00a0developer.paypal.com, which actually led to our documentation on how to use that site to get API credentials.<\/li>\n<li>Fix: Add missing try\/catch block during certain Stripe operations.<\/li>\n<li>Fix: Correct formatting on\u00a0sprintf()\u00a0functions.<\/li>\n<li>Fix: Undefined property errors while updating pending payments via cron job.<\/li>\n<li>Fix: Under certain circumstances, RCP was incorrectly creating a second Stripe customer record.<\/li>\n<li>Fix: Stripe webhook conflicts when RCP is installed on two separate sites but both use the same Stripe account.<\/li>\n<li>Fix: Remove\u00a0admin_url()\u00a0base from\u00a0rcp_get_invoice_url()\u00a0function. In certain edge cases this was resulting in\u00a0admin_url()\u00a0being included in email notifications.<\/li>\n<li>Fix: Update WP_User display name when editing Customer first\/last name via Customer Details page.<\/li>\n<li>Fix: Email verification link not working when using plain text emails.<\/li>\n<li>Fix: CSV Importer - use email as the username if username is omitted from the CSV file.<\/li>\n<li>Fix: Recurring fees not being properly passed to payment gateway during registration.<\/li>\n<li>Fix: Do not apply prorated credits when multiple memberships are enabled and registering via\u00a0[register_form_stripe].<\/li>\n<li>Fix: \"Renews automatically\" incorrectly displaying on\u00a0[subscription_details]\u00a0shortcode for inactive memberships.<\/li>\n<li>Fix:\u00a0rcp_get_user_payments()\u00a0was returning all user payments if the current user was logged out. It now returns an empty array.<\/li>\n<li>Fix: Display issues on admin payments table on mobile devices.<\/li>\n<\/ul>\n<p><strong>Version 3.2.2, September 17, 2019<\/strong><\/p>\n<ul>\n<li>Improvement: Updated French translation.<\/li>\n<li>Improvement: Display clearer error messages when there's a problem adding a discount code.<\/li>\n<li>Fix: Registration type changing mid-registration, which could impact signup fees with some gateways.<\/li>\n<li>Fix: Stripe invalid request error when someone with a non-recurring Stripe membership visits the page containing the\u00a0[rcp_update_card]\u00a0shortcode.<\/li>\n<li>Fix: Incorrect use of\u00a0date_i18n()\u00a0instead of\u00a0date()\u00a0when saving payment dates via webhooks.<\/li>\n<li>Fix: Filter the password reset URL to use the designated RCP login form when \"Redirect Default Login URL\" is enabled.<\/li>\n<\/ul>\n<p><strong>Version 3.2.1, September 12, 2019<\/strong><\/p>\n<ul>\n<li>Fix: Incorrect Stripe subscription start date if a member manually renews a membership prior to expiration and the initial payment hasn't yet been fully captured at the time the subscription is created.<\/li>\n<li>Fix: Unable to process free membership if Stripe is the selected payment gateway.<\/li>\n<li>Fix: Registration errors when a customer has a membership for a level that has been deleted.<\/li>\n<li>Fix: Missing\u00a0rcp_stripe_signup_payment_failed\u00a0action when initial Stripe payment fails.<\/li>\n<li>Tweak: Update\u00a0rcp_is_trialing()\u00a0function to remove use of deprecated class.<\/li>\n<li>Tweak: Include RCP upgrade date and \"upgraded from\" version in system info report.<\/li>\n<\/ul>\n<p><strong>Version 3.2, September 10, 2019<\/strong><\/p>\n<ul>\n<li>Important: Stripe Checkout gateway has been removed. If you\u2019re using it, you will automatically be changed over to our normal Stripe gateway, which uses Stripe Elements. The [register_form_stripe] shortcode still functions, but it may look different.<\/li>\n<li>New: Updated the Stripe gateway to use Payment Intents API. This complies with SCA regulations.<\/li>\n<li>New: Stripe card declined notices now appear inline and no longer require a page refresh.<\/li>\n<li>New: Added\u00a0%update_billing_card_url%\u00a0template tag, which serves as a direct link to the \u201cupdate billing card\u201d page for the membership associated with the user\u2019s most recent payment. Recommended for use in the Renewal Payment Failed email.<\/li>\n<li>Tweak: Changes to registration form JavaScript. Initial membership processing is now handled via ajax. Testing is recommended if you have custom code that interacts with the registration JavaScript.<\/li>\n<li>Tweak: The first payment in a Stripe subscription is now always a one-time charge. The subscription is created with a delayed start date (until the next billing cycle).<\/li>\n<li>Tweak: Stripe gateway no longer uses Stripe Coupon codes. Instead, new plans are created for each duration\/amount combination.<\/li>\n<li>Tweak: Stripe gateway no longer handles signup fees via customer account balance. They are incorporated into an initial one-time charge that handles the first payment.<\/li>\n<li>Tweak: The\u00a0rcp_stripe_charge_create_args\u00a0filter is now deprecated and replaced with\u00a0rcp_stripe_create_payment_intent_args. This is due to replacing the Charges API with the Payment Intents API. Some arguments may now differ.<\/li>\n<li>Tweak: Stripe error messages are now able to be translated.<\/li>\n<li>Fix: Stripe gateway doesn\u2019t use the \u201crecurring_price\u201d that\u2019s passed into the gateway class.<\/li>\n<li>Fix: Stripe incorrectly applying one-time discounts after a free trial.<\/li>\n<\/ul>\n<p><strong>Version 3.1.2, August 22, 2019<\/strong><\/p>\n<ul>\n<li>New: An admin notice will be displayed if you have the Stripe Checkout gateway enabled, explaining that the gateway will be removed in RCP version 3.2 due to SCA regulations. Read more here:\u00a0<a href=\"https:\/\/docs.restrictcontentpro.com\/article\/1552-stripe-checkout\" rel=\"nofollow\">https:\/\/docs.restrictcontentpro.com\/article\/1552-stripe-checkout<\/a><\/li>\n<li>New: Added a\u00a0date_completed\u00a0column to the\u00a0wp_rcp_queue\u00a0table.<\/li>\n<li>New: Unauthorized users are now redirected away from category archive pages if the category is restricted. (Requires that Hide Restricted Posts be checked on.)<\/li>\n<li>New: Allow filtering by both level and status on Restrict &gt; Memberships page. Note: you must choose a status filter first, then you can change the membership level.<\/li>\n<li>New: Add support for a\u00a0redirect\u00a0query arg when generating a\u00a0resend_verification\u00a0link.<\/li>\n<li>New: Add \"Status\" dropdown to the \"add payment\" form on the admin Membership Details page.<\/li>\n<li>Tweak: Moved\u00a0_rcp_reminder_sent_*\u00a0user meta to membership meta.<\/li>\n<li>Tweak: Adjust Redirect Default Login URL setting description to convey that the\u00a0[login_form]\u00a0shortcode is required on the page and not optional.<\/li>\n<li>Fix: Free trial incorrectly granted again under certain circumstances.<\/li>\n<li>Fix: If a customer signs up for a one-time payment membership and does not complete payment, they are unable to try again. (Usually only seen with the PayPal payment gateway.)<\/li>\n<li>Fix: CSV import not setting correct password for new users.<\/li>\n<li>Fix: CSV import missing old\u00a0rcp_user_import_user_added\u00a0action hook.<\/li>\n<li>Fix: Incorrect ajax parameter used for error message when uploading a CSV import file fails.<\/li>\n<li>Fix: Don't show an error message on\u00a0[rcp_update_card]\u00a0shortcode if the current user does not have a membership at all.<\/li>\n<li>Fix: Ensure that\u00a0free\u00a0membership status is always converted to\u00a0active\u00a0(backwards compatibility with pre-3.0).<\/li>\n<\/ul>\n<p><strong>Version 3.1.1, July 31, 2019<\/strong><\/p>\n<ul>\n<li>New: Add message to\u00a0[rcp_update_card]\u00a0shortcode when a user is unable to update their card details.<\/li>\n<li>New: Add action\u00a0rcp_edit_customer_after_memberships_section\u00a0to Customer Details page, allowing third party plugins to add a whole new customer section.<\/li>\n<li>New: On Customer Details page, display whether or not the customer has trialled before.<\/li>\n<li>Tweak: Add a space between the Norwegian Krone currency symbol and the price (previous:\u00a010kr\u00a0new:\u00a010 kr).<\/li>\n<li>Tweak: Removed the 2-day grace period on the expiration cron job. Use this custom code if you want to add it back in:\u00a0<a href=\"https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-add-expiration-grace-period.php\">https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-add-expiration-grace-period.php<\/a><\/li>\n<li>Tweak: Include RCP payment ID in Stripe one-time charge metadata.<\/li>\n<li>Fix: Generate a new subscription key on renewals if existing one is blank. This fixes a problem with renewals not activating via PayPal if the existing membership didn't have a subscription key (which might be the case if the membership was imported).<\/li>\n<li>Fix: EDD Downloads not showing excerpts to users without access if excerpts are globally enabled.<\/li>\n<li>Fix: Under certain circumstances, deactivated membership levels can be renewed when they shouldn't be able to. If you want to allow deactivated levels to be renewed, use the\u00a0rcp_can_renew_deactivated_membership_levels\u00a0filter. Example:\u00a0<a href=\"https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-renew-deactivated-levels.php\">https:\/\/github.com\/restrictcontentpro\/library\/blob\/master\/rcp-renew-deactivated-levels.php<\/a><\/li>\n<li>Fix: Expiration emails being sent when creating a new membership with the \"expired\" status.<\/li>\n<li>Fix: reCAPTCHA errors when using [register_form_stripe].<\/li>\n<li>Fix: Registration not working in Internet Explorer due to JavaScript\u00a0assign()\u00a0error.<\/li>\n<li>Fix: Stop using\u00a0date_i18n()\u00a0in database datetime validation.<\/li>\n<li>Fix: Pending payment ID can be incorrect if someone attempts a payment multiple times for the same membership.<\/li>\n<li>Fix: 3.0 migration - check for and show clear error if the user being migrated doesn't exist (due to orphaned user meta).<\/li>\n<\/ul>\n<p><strong>Version 3.1, July 17, 2019<\/strong><\/p>\n<ul>\n<li>Modified template files: card-update-form.php, paypal-express-confirm.php, register-single.php, register.php, subscription.php.<\/li>\n<li>New: Add support for multiple active memberships per customer.<\/li>\n<li>New (WARNING): Authorize.net has been removed from core and moved to a separate add-on. The new add-on can be installed here: <a href=\"https:\/\/wordpress.org\/plugins\/rcp-authorize-net\/\" target=\"_blank\" rel=\"noopener\">https:\/\/wordpress.org\/plugins\/rcp-authorize-net\/<\/a><\/li>\n<li>New: One-time discounts can now be configured on a per-discount basis rather than globally.<\/li>\n<li>New: Stripe gateway has been updated to use Stripe Elements.<\/li>\n<li>New: CSV user import tool now available in Restrict &gt; Tools &gt; Import.<\/li>\n<li>New: Added WP-CLI integration.<\/li>\n<li>New: Expiration and renewal notices can now be limited to certain membership levels only.<\/li>\n<li>New: Added support for bulk adding memberships to existing users from the Users table.<\/li>\n<li>New: Added \"payment received\" email template for admins.<\/li>\n<li>New: Use WP_List_Table for all admin table pages.<\/li>\n<li>New: Add default email template content on new installs.<\/li>\n<li>New: Log all payment events in the customer notes.<\/li>\n<li>New: Send customer name in Stripe API request.<\/li>\n<li>New: Add payment meta and membership level meta functions.<\/li>\n<li>New: Signup fees are no longer applied when manually renewing an existing membership.<\/li>\n<li>New: Stripe gateway tested with API version\u00a02019-05-16.<\/li>\n<li>Tweak: Stop unchecking \"auto renew\" when a membership expires.<\/li>\n<li>Tweak: All translation files have been updated from plugin source code.<\/li>\n<li>Tweak: Updated plugin author name and URL.<\/li>\n<li>Fix: RCP datepicker styles affecting other plugin datepickers.<\/li>\n<li>Fix: Reduce the three RCP membership columns on the Users table to one single \"Membership\" column. This reduces database queries and improves loading time on this page.<\/li>\n<li>Fix: Payments are now only recorded via webhooks\/IPNs if we can match the payment to a very specific RCP membership. This resolves issues if the same PayPal account is used for multiple different products and one customer is involved in both products.<\/li>\n<\/ul>\n<p>https:\/\/restrictcontentpro.com\/downloads\/restrict-content-pro\/changelog<\/p>\n"]}";}