=== Paid Memberships Pro ===
Contributors: strangerstudios, kimannwall, andrewza, dlparker1005, paidmembershipspro
Tags: memberships, member, community, user profile, user registration
Requires at least: 5.2
Tested up to: 6.8
Requires PHP: 5.6
Stable tag: 3.5
License: GPLv2
License URI: https://www.gnu.org/licenses/gpl-2.0.html

The Trusted Membership Platform That Grows with You

== Description ==

### The Trusted Membership Platform That Grows with You

Paid Memberships Pro is a complete solution to secure your content and create a seamless membership experience.

With over 28 ways to protect content, advanced membership management, and built-in recurring payment gateways, we provide you with everything you need to create an efficient and user-friendly membership site.

Read about all of the plugin’s features at [Paid Memberships Pro](https://www.paidmembershipspro.com/) or [launch a personal demo site now](https://try.pmproplugin.com) to test drive the full plugin and premium Add Ons for free.

### Built For Your Unique Type of Membership Site
PMPro supports any kind of member-focused business or organization. With over 12 years of experience working with creators like you, this plugin delivers on what you need today and in the future. Select a use case to learn more about how we specialize in supporting your unique business:

* [Associations & NPOs](https://www.paidmembershipspro.com/associations/)
* [Blog & News](https://www.paidmembershipspro.com/blog-news/)
* [Communities](https://www.paidmembershipspro.com/communities/)
* [Courses & Coaching](https://www.paidmembershipspro.com/courses/)
* [Directory & Listings](https://www.paidmembershipspro.com/add-ons/member-directory/)
* [Paid Newsletters](https://www.paidmembershipspro.com/paid-newsletters/)
* [Podcasting](https://www.paidmembershipspro.com/membership-site-podcasting-benefits/)
* [Private Video](https://www.paidmembershipspro.com/private-videos/)

You can also browse [Case Studies for successful membership sites that are using PMPro](https://www.paidmembershipspro.com/category/case-study/) to get paid for their content and reach their personal or business goals with 100% open source software.

> _"PMPro is very user-friendly, affordable and scalable. It has all the features you would need to run a fully-functioning membership site."_
> _**Katie Prescott**, Founder, Abridge Academy_

### 28 Types of Content Restrictions

* **Restrict Default Content:** Show sneak peaks or completely hide restricted content
* **Restrict Other Content:** Secure content like courses, videos, forums, products, events, podcasts, and more
* **Limit or "Meter" Access:** Limit access to a specific number of views before hitting the paywall
* **Content Dripping:** Drip feed access based on membership start dates
* **Personalized Content:** Unique pages and navigation menus for each membership level
* **Directories & Profiles:** Browse public or members-only directories for a robust community
* **WordPress Multisite:** Secure content across your network with a single login

### Membership Management Features

* **Unlimited Levels:** Create distinct pricing and content access for each level
* **Multiple Memberships Per User:** Increase LTV by selling multiple membership types, allowing members to hold more than one active subscription simultaneously (now built into core PMPro v3.0+).
* **Group Memberships:** Offer child accounts linked to a paying parent account for umbrella or corporate memberships
* **User Fields by Level:** Capture custom profile info by membership level
* **Email Communications:** Customize content and design of every message
* **Sync Roles and Levels:** Define custom capabilities based on your membership features

### Built-in Ecommerce & Recurring Payments Features

All of our payment gateways are included in the plugin. Choose from [Stripe](https://www.paidmembershipspro.com/gateway/stripe/) or [PayPal](https://www.paidmembershipspro.com/gateway/paypal/). You can offer multiple gateway options at checkout including [PayPal Express](https://www.paidmembershipspro.com/add-ons/pmpro-add-paypal-express-option-checkout/) or [manual and offline payments, like Bank Transfer, Check, and Venmo](https://www.paidmembershipspro.com/add-ons/pmpro-pay-by-check-add-on/).

* **Flexible Pricing:** Configure free, one-time payment, or recurring subscription levels
* **Multiple Gateways:** Integrate with Stripe, PayPal, and more
* **Multiple Payment Methods** From credit card, Apple Pay, bank transfer, and "buy now pay later"
* **Customizable Trials:** Offer different trial periods from your recurring billing
* **Proration and Pausing:** Offer custom proration rules and pausing options
* **Discount & Gift Codes:** Offer discounts, run sitewide sales, and track success

### Seamless Member Experience Features

* Front-end user profiles and editing
* Front-end user registration
* Front-end user login and password recovery
* Custom form fields
* Conditional logic for form fields
* Membership account dashboard
* Membership orders and billing information pages
* Custom member emails
* Restrict WP dashboard access
* Hide the WP toolbar
* Conditional nav menus

### Admin Tools and Reports
Add members manually, import/export members, require membership approval, and manage membership roles.

Track sales & revenue, signups, member activity, and more in detailed reports.

Install a web app on your mobile device or table for real-time updates on membership site reporting.

### Site Enhancements
Extend functionality with affiliates, page builders, themes, and landing pages.

* **Page Builder Compatibility:** Gutenberg Block Editor, Full Site Editing, Elementor, Divi, Beaver Builder, Oxygen Builder, SiteOrigin
* **Integrate With Popular Platforms:** WooCommerce, BuddyPress/BuddyBoss, Mailchimp, Zapier
* **Use With Your Favorite LMS:** LifterLMS, LearnDash, and Tutor LMS

> _"Recommended to anyone from beginner to experienced coders. I tried MemberMouse and MemberPress and they both lacked critical features that I wanted for my member site. PMPro has all the features I need (Social Login, ability to gift, multiple membership levels, works with BuddyPress) and more. I can easily customize to make it look great too. If I have questions, which is often since I am a beginner in WordPress and know nothing about coding, they are quick to respond and always find a way for me to do exactly what I want. Super happy. Would recommend to anyone from beginner to experienced coders!"_
> _**@efsluys** 5-star Review_

### Documentation, Support, Localization

Reach out on our [contact form](https://www.paidmembershipspro.com/contact/) for sales inquiries. Refer to our information on [other ways to get support](https://www.paidmembershipspro.com/support/) if you would like more help.

Our website has extensive [documentation](https://www.paidmembershipspro.com/documentation/) to assist you in building your membership site.

We also offer unique content hubs, which explore the 8 most popular membership site use cases and how to build a successful membership site on WordPress.

### Developer Friendly
Open source, REST API support, extensive hooks, and tools for easy customization.

Our website offers over 310 examples on how to use our action and filter hooks to customize your membership site.

### Free WordPress Theme
Our official theme, [Memberlite](https://www.paidmembershipspro.com/themes/memberlite), is built specifically for membership sites. Memberlite has deep integration with Paid Memberships Pro to offer advanced features for logged-in/out users and works alongside your favorite page builders, like the Block Editor and Elementor.

### Popular Add Ons

Extend the features of your membership site or integrate with third-party services through our library of over 65 Add Ons. Some of the most popular features include:

* Integrate memberships with [email marketing](https://www.paidmembershipspro.com/email-marketing-integrations-paid-memberships-pro/) platforms including [Mailchimp](https://www.paidmembershipspro.com/add-ons/pmpro-mailchimp-integration/)
* [Manage Affiliates](https://www.paidmembershipspro.com/managing-affiliates-with-paid-memberships-pro/) with Add Ons or use a popular third-party systems like [AffiliateWP](https://www.paidmembershipspro.com/using-affiliatewp-with-paid-memberships-pro/)
* Let members [log in or join with their social media profiles](https://www.paidmembershipspro.com/add-ons/social-login-add-on/)
* Design your site [using popular Page Builders](https://www.paidmembershipspro.com/using-page-builders-for-membership-site/) like Elementor, Page Builder by SiteOrigin, Beaver Builder, and Divi. We offer 15 core membership blocks for the WordPress Block Editor (Gutenberg)
* Create a [sales landing page with banners to run a sitewide or flash sale](https://sitewidesales.com)
* [Offer members-only events](https://www.paidmembershipspro.com/add-ons/events-for-members-only/) with Events Manager, The Events Calendar, and Sugar Calendar

[View all Add Ons](https://www.paidmembershipspro.com/add-ons/)

### Paid Memberships Pro is a free membership plugin for WordPress

Our plugin is 100% GPL and can be downloaded at [www.paidmembershipspro.com/documentation/download/](https://www.paidmembershipspro.com/documentation/download/).

The full version of the plugin is offered with no restrictions or additional licenses required.

Developers should get involved at [our GitHub page](https://github.com/strangerstudios/paid-memberships-pro/).

### Compare PMPro to Other Membership Plugins and Platforms
Are you comparing Paid Memberships Pro with another membership plugin or third-party platform? We have a series of [product comparison guides](https://www.paidmembershipspro.com/category/product-comparison/) that will help you see the distinct features of PMPro as compared to other options, including:

* [MemberPress](https://www.paidmembershipspro.com/pmpro-vs-memberpress/)
* [Ultimate Member](https://www.paidmembershipspro.com/paid-memberships-pro-vs-ultimate-member/)
* [Restrict Content Pro](https://www.paidmembershipspro.com/pmpro-vs-restrict-content-pro/)
* [Woo Memberships](https://www.paidmembershipspro.com/pmpro-vs-woocommerce-memberships/)
* [Patreon](https://www.paidmembershipspro.com/paid-memberships-pro-vs-patreon/)
* [Substack](https://www.paidmembershipspro.com/paid-memberships-pro-vs-substack/)

...and more. You can [read all of these comparison guides here](https://www.paidmembershipspro.com/category/product-comparison/).

== Installation ==

= Download, Install and Activate! =
Visit [https://www.paidmembershipspro.com/documentation/download/](https://www.paidmembershipspro.com/documentation/download/) for the full plugin download and instructions on how to install Paid Memberships Pro in your WordPress site.

= Use the Setup Wizard to Complete Initial Setup =
After activation, you will be taken through a brief setup wizard to configure the plugin.

Refer to our [Initial Setup Tutorial](https://www.paidmembershipspro.com/documentation/initial-plugin-setup/) guide for additional help getting started.

= More Installation and Setup Documentation =
* [Installation Video](https://www.paidmembershipspro.com/documentation/initial-plugin-setup/tutorial-video/)
* [Installation Docs](https://www.paidmembershipspro.com/documentation/initial-plugin-setup/)
* [Membership Levels](https://www.paidmembershipspro.com/documentation/membership-levels/)
* [Payment Gateways](https://www.paidmembershipspro.com/gateway/)
* [Add Ons](https://www.paidmembershipspro.com/add-ons/)

== Frequently Asked Questions ==

= Should I use WordPress or a hosted SaaS platform for memberships? =
Both WordPress and SaaS (Software as a Service) platforms, like Kajabi or Podia, have their strengths, but they represent two very different approaches. Read our guide to determine which is best for you: [WordPress vs SaaS For Membership Sites: Real Costs, Pros & Cons, and Who Actually Wins](https://www.paidmembershipspro.com/wordpress-vs-saas/).

= What is the best WordPress membership plugin? = 
We published a guide on the [4 best WordPress membership plugins](https://www.paidmembershipspro.com/best-wordpress-membership-plugins-compared/). You can read this guide to help you decide if Paid Memberships Pro is the right solution for you.

= Do I need to know any coding to use this plugin? =
No, Paid Memberships Pro does not require any coding knowledge. The plugin is designed to meet all levels of WordPress experience. At the same time, our plugin is very developer-friendly and extendible.

= Does the Paid Memberships Pro work with any WordPress theme? =
Yes. PMPro will work with any properly coded theme. However, some themes may cause conflicts with the plugin. If you find a styling issue with your theme please create a post in the community forum.

= Does the plugin work with caching plugins? =
Absolutely. We have a [complete guide on using a caching plugin](https://www.paidmembershipspro.com/documentation/advanced/caching/) or your host's caching methods with Paid Memberships Pro on our website if you want to explore this topic more.

= Does PMPro restrict access to wp-login.php when the plugin is active? =
PMPro does not restrict access to the wp-login.php page when active. This allows your administrator users to leverage advanced security plugins, like Two-Factor and more, so that you can keep your membership site secure. We do include a frontend login page for your members to use for logging in and resetting their password.

= Is Paid Memberships Pro Multisite or Network Compatible? =
"Supporting multisite" means different things to different people. [This guide covers the three primary ways](https://www.paidmembershipspro.com/membership-website-wordpress-multisite/) you can use Paid Memberships Pro in a network.

Out of the box PMPro will basically act as a stand alone plugin for each site. Each site has its own list of membership levels, members, payment settings, etc.

Our [Member Network Sites Add On](https://www.paidmembershipspro.com/add-ons/pmpro-network-multisite-membership/) allows members to choose a site name and title at checkout and will set up a network site at checkout.

Our [Multisite Membership Add On](https://www.paidmembershipspro.com/add-ons/pmpro-network-membership/) allows you to manage memberships at the 'Main' Network site and provide or restrict access on other Network Subsites.

If you would like more help using PMPro on a network install, [reach our via our contact page](https://www.paidmembershipspro.com/contact/).

= I need help installing, configuring, or customizing Paid Memberships Pro. =
Please visit [our support site](https://www.paidmembershipspro.com/support/) for more documentation and ways to get support.

= I found a bug in Paid Memberships Pro. =
Please reach out using our [contact form](https://www.paidmembershipspro.com/contact/) and we'll fix it right away. Thanks for helping.

= Does PMPro Support X? =
Not sure? You can find out by doing a bit a research.

1. [Check our compatibility page](https://www.paidmembershipspro.com/documentation/compatibility/).
2. [Check our Add Ons](https://www.paidmembershipspro.com/add-ons/).
3. [Do a search on our site](https://www.paidmembershipspro.com/).
4. [Ask using our contact form](https://www.paidmembershipspro.com/contact/)

== Changelog ==
= 3.5 - 2025-07-07 =
* FEATURE: Now using Action Scheduler to handle scheduled tasks. #3393 (@dalemugford)
* FEATURE: Now allowing files to be restricted using the new `pmpro_can_access_restricted_file` filter. This is currently used to ensure that log files generated during gateway webhook handlers can only be viewed by administrators. #3308 (@dparker1005)
* FEATURE: Added content restriction settings when using Bricks Builder. #3342 (@MaximilianoRicoTabo)
* ENHANCEMENT: Added additional widgets to the Memberships > Dashboard page and updated the layout to be more customizable. #3412 (@dalemugford)
* ENHANCEMENT: Updated the Memberships > Settings > Payments settings page UI to have a separate page for each gateway. #3398 (@dparker1005, @kimcoleman)
* ENHANCEMENT: Updated orders search to support searching by specific properties using [property]:[value]. #3382 (@kimcoleman)
* ENHANCEMENT: Now adding the option to automatically install the Update Manager during the setup wizard. #3411 (@dalemugford)
* ENHANCEMENT: Updated the content restrictions in Elementor to match how restrictions are set in the block editor. #3144 (@MaximilianoRicoTabo)
* ENHANCEMENT: Now encoding the `pmpro_last_known_url` option to improve compatibility between "pause mode" and site migrations. #3400 (@mircobabini)
* ENHANCEMENT: Now allowing linking to a filtered result via URL parameters on the Memberships > Add Ons page. #3377 (@kimcoleman)
* ENHANCEMENT: Now supporting showing information from level meta when using the `[pmpro_member]` shortcode. #3276 (@kimcoleman)
* ENHANCEMENT: Added new functions `pmpro_get_countries()` and `pmpro_get_default_country()` to avoid relying on global variables. #3353 (@dparker1005)
* ENHANCEMENT: Added new hooks `pmpro_added_subscription` and `pmpro_updated_subscription`. #3357 (@mircobabini)
* ENHANCEMENT: Added a new filter `pmpro_deprecated_gateways` to allow developers to filter the list of deprecated gateways. #3404 (@dparker1005)
* ENHANCEMENT: Updated the PMPro_Email_Template class to streamline the process of sending test emails for each email template. #3340 (@MaximilianoRicoTabo)
* ENHANCEMENT: Updated Wisdom data sharing to be an opt-out system. This will not change the selected option for existing sites. #3411 (@dalemugford)
* ENHANCEMENT: Added a new `pmpro_no_download` parameter to CSV exports to prevent downloading the CSV file during Toolkit tests. #3417 (@dalemugford)
* BUG FIX/ENHANCEMENT: Now syncing application fees with Stripe before recurring payments are charged to ensure that fees reflect whether the site has an active license key. #3403 (@dparker1005)
* BUG FIX/ENHANCEMENT: Improved accessibility for the hidden honeypot field on the checkout page. #3416 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Now using a MutationObserver instead of the deprecated `DOMSubtreeModified` event to detect changes to the checkout message container. #3386 (@getjohn)
* BUG FIX/ENHANCEMENT: Improved the error message wording for subscriptions with the level ID set to `0`. #3359 (@mircobabini)
* BUG FIX/ENHANCEMENT: Now trimming whitespace for user field options where only the value is provided. #3379 (@mircobabini)
* BUG FIX/ENHANCEMENT: Now avoiding extra whitespace in the payment description sent to PayPal Express. #3414 (@JarrydLong)
* BUG FIX: Fixed an issue where membership expiration emails may show the incorrect level name for users who have multiple levels. #3347 (@MaximilianoRicoTabo)
* BUG FIX: Fixed a PHP error on the sales reports page and fixed some closing HTML tags that did not match. #3406 (@mircobabini)
* BUG FIX: Fixed an issue where application fees were not set correctly when setting up Stripe subscriptions. #3358 (@mircobabini)
* REFACTOR: Now using the Gocodebox_Banner_Notifier class to display banner notifications. #3399 (@brianhogg)
* DEPRECATED: No longer using crons for scheduled tasks and removed the `/scheduled/` directory. #3393 (@dalemugford)
* DEPRECATED: Marked the `pmpro_set_application_fee_percentage` filter and the reduced Stripe application fee as deprecated. #3403 (@dparker1005)

= 3.4.7 - 2025-06-12 =
* BUG FIX/ENHANCEMENT: Now explicitly setting the Stripe API version when processing Stripe webhook events. #3409 (@dparker1005)
* BUG FIX: Fixed an issue where recurring Stripe orders may not be recorded on sites connecting with API keys if the Stripe account was created or its API version was updated after 2025-03-31 (Stripe API version 2025-03-31.basil or later). #3409 (@dparker1005)
* BUG FIX: Fixed an issue where membership levels could be moved to the first level group when using the search function on the Membership Levels settings page. #3407 (@dparker1005)
* BUG FIX: Fixed an issue where users may not receive cancellation emails after a PayPal subscription is cancelled due to failed payments. #3395 (@dparker1005)

= 3.4.6 - 2025-04-21 =
* BUG FIX: Fixed fatal error related to redefining `pmpro_getAddonBySlug` when activating PMPro Core with the PMPro Update Manager active. (@ideadude)

= 3.4.5 - 2025-04-21 =
* ENHANCEMENT: Now including First Name and Last Name in Zapier trigger data. #3356 (@dwanjuki)
* ENHANCEMENT: Adjusting categories for the Add Ons page and fixing hub links. #3371 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now supporting a fixed layout table (even width columns) on frontend tables. Also adjusted the responsive layout so table rows look more defined. #3370 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Basic styling for password visibility toggle when a site is using the minimal global style setting. #3369 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed a warning message that was encoding the > on output as well make the message more clear where the settings are to add a license key to PMPro. #3368 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Update "delete level" confirmation text to match behavior. Associated subscriptions ARE deleted. #3354 (@dparker1005)
* BUG FIX/ENHANCEMENT: Avoiding a warning when saving the header or footer email template. #3348 (@MaximilianoRicoTabo)
* BUG FIX: Fixes a race condition when activating Paid Memberships Pro after the Update Manager is already activated. #3372 (@andrewlimaza)
* BUG FIX: BUG FIX: Fixed an issue where admin confirmation emails was not sending the "Free" template and was defaulting to "Paid". #3367 (@andrewlimaza)
* BUG FIX: Fixed an issue where depends was not working with radio buttons. #3366 (@andrewlimaza, @salihkulangara)
* BUG FIX: Prevents a fatal error when accessing a non-existent report in the admin area. #3361 (@kimcoleman)
* BUG FIX: BUG FIX: Updated the localization file location structure. Now it looks for it under wp-content/languages/plugins/<<file-name>>. #3360 (@andrewlimaza)
* REFACTOR: Applied WPCS to the method sendCheckoutAdminEmail. #3367 (@andrewlimaza)

= 3.4.4 - 2025-03-19 =
* ENHANCEMENT: Improved accessibility and styling for pagination HTML generated by the `pmpro_getPaginationString()` function. #3343 (@kimcoleman)
* ENHANCEMENT: Updated the `pmpro_int_compare()` function to allow passing '!=' as the comparison operator. #3344 (@andrewlimaza)
* BUG FIX: Fixed an issue where `date` user fields would not output the correct value when using the `displayValue()` method. #3336 (@kimcoleman)
* BUG FIX: Fixed an issue where order totals would not be formatted correctly in refund emails. #3341 (@MaximilianoRicoTabo)
* BUG FIX: Fixed a PHP warning that would occur when using the `[pmpro_member]` shortcode to view information about a member that does not exist. #3337 (@andrewlimaza)
* BUG FIX: Fixed a PHP warning that would occur when rendering the "single level description" block in the editor for a level without a description set. #3335 (@kimcoleman)

= 3.4.3 - 2025-03-06 =
* ENHANCEMENT: Now hiding the "Members Only" access plan in LifterLMS when the Lifter Streamline is enabled.
* BUG FIX/ENHANCEMENT: Now showing the correct email template variables for the header and footer templates. #3314 (@dparker1005)
* BUG FIX/ENHANCEMENT: Updated the styling and content of the admin activity email. #3318 (@kimcoleman)
* BUG FIX/ENHANCEMENT: No longer adding `<p>` tags to the "pay by check" instructions when the textarea is saved. #3295 (@derekashauer)
* BUG FIX/ENHANCEMENT: Updated the PayPal Standard gateway message to recommend PayPal Express as an alternative. #3319 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now setting the line height of PMPro font sizes. #3324 (@kimcoleman)
* BUG FIX: Fixed a PHP fatal error when viewing a subscription in the Subscriptions List whose gateway does not exist. #3325 (@dparker1005)
* BUG FIX: Fixed a PHP fatal error that could occur when using the Update Manager Add On and sending the admin activity email or telemetry data. #3321 (@dparker1005)
* BUG FIX: Fixed an issue where duplicate members may be shown in the Members List CSV export. #3291 (@MaximilianoRicoTabo)
* BUG FIX: Fixed email template variables missing '!!' from the start of the variable name on the edit email template page. #3315 (@dparker1005)
* BUG FIX: Fixed an issue where user creation fields may incorrectly be shown as required when they are not needed. #3326 (@dparker1005)
* BUG FIX: Fixed an issue where level descriptions would not show correctly in the block editor. #3328 (@kimcoleman)
* BUG FIX: Fixed an issue where custom coded columns with a value of '0' would not be displayed. #3311 (@dparker1005)
* BUG FIX: Fixed a PHP warning when processing a Stripe completed checkout webhook for a one-time payment. #3317 (@dparker1005)
* BUG FIX: Fixed a PHP warning when deleting a Stripe webhook. #3310 (@mircobabini)
* DEPRECATED: Marked the `pmpro_member_shortcode_access` filter as deprecated. Use `pmpro_has_membership_level` instead. #3322 (@MaximilianoRicoTabo)
* DEPRECATED: Removed the `!!subject!!` email template variable from the list of documented email template variables. #3316 (@dparker1005)

= 3.4.2 - 2025-02-18 =
* ENHANCEMENT: Added the Albanian Leke to the list of supported currencies. #3305 (@MaryOJob)
* BUG FIX: Fixed an issue where sites using the Payflow gateway would no longer be able to use that gateway after it was marked as deprecated. #3306 (@dparker1005)

= 3.4.1 - 2025-02-14 =
* ENHANCEMENT: Added a `!!refund_date!!` email template variable to the refund email template. #3301 (@kimcoleman)
* ENHANCEMENT: Added a `!!check_gateway_label!!` email template variable to the checkout check email template to show the set gateway label. #3301 (@kimcoleman)
* BUG FIX: Fixed an issue where sending test emails would always show an error message. #3301 (@kimcoleman, @derekashauer)
* BUG FIX: Fixed an issue where checkout emails may show the expiration date for the wrong level. #3300, #3303 (@dparker1005)
* BUG FIX: Fixed an issue where the admin's name may be mistakenly shown instead of the user's name in some admin email template variables. #3298 (@dparker1005)
* BUG FIX: Added missing email template variables for the membership recurring email. #3296 (@dparker1005)
* BUG FIX: Fixed an issue that may cause incorrect data to be sent in test emails. #3294 (@derekashauer)
* BUG FIX: Fixed localization and spacing for the default bodies of email templates. #3301 (@kimcoleman)
* REFACTOR: Updating some email template class names to match the email template slug. #3304 (@dparker1005)

= 3.4 - 2025-02-11 =
* FEATURE: Now pulling localization files from https://translate.strangerstudios.com. #3211 (@andrewlimaza)
* FEATURE: Added a new Membership Account Message level setting to show a level-specific message to members on the Membership Account page. #3271 (@andrewlimaza, @kimcoleman)
* ENHANCEMENT: Email template variables shown when editing an email template will now be specific to the email template being edited. #3234 (@MaximilianoRicoTabo, @dparker1005)
* ENHANCEMENT: Now allowing filtering the Sales and Revenue report by multiple levels and discount codes. #3258 (@dparker1005)
* ENHANCEMENT: Now allowing custom date ranges for the Sales and Revenue report. #3257 (@dparker1005)
* ENHANCEMENT: Now showing the raw Sales and Revenue report data in a table under the chart. #3256 (@dparker1005)
* ENHANCEMENT: Now showing the raw Membership Stats report data in a table under the chart. #3260 (@dparker1005)
* ENHANCEMENT: Improved how user field values are displayed. #3223 (@dparker1005, @kimcoleman)
* ENHANCEMENT: Improved the accessibility of the Memberships > Add Ons page. #3268 (@kimcoleman)
* ENHANCEMENT: Now localizing formatted dates in the PMPro_Subscription class. #3195 (@andrewlimaza)
* ENHANCEMENT: Now supporting setting a `profile_start_date` directly on a checkout level. #3233 (@dparker1005)
* ENHANCEMENT: Added a new function `pmpro_get_membership_levels_for_user_in_group()`. #3267 (@dparker1005)
* ENHANCEMENT: Now supporting subscription transaction IDs up to 64 characters. #3274 (@dparker1005)
* ENHANCEMENT: Added a new filter `pmpro_membership_account_after_level_card_content` to allow additional content to be added to level cards on the Membership Account page. #3271 (@andrewlimaza, @kimcoleman)
* BUG FIX/ENHANCEMENT: Now pulling the discount code from the checkout level object at checkout instead of the globals which may not be set. #3247 (@dparker1005)
* BUG FIX: Fixed an issue where required user fields may not be highlighted when submitted with an empty value. #3251 (@kimcoleman)
* BUG FIX: Fixed an issue where the "Signups vs. Cancellations" and "Signups vs. Expirations" reports would not display. #3260 (@dparker1005)
* BUG FIX: Fixed an issue where the last day of each month for daily Memberships reports would show 0 signups. #3280 (@dparker1005, @kimcoleman)
* BUG FIX: Fixed an issue where reset password errors would not be handled correctly. #3262 (@mircobabini)
* BUG FIX: Fixed an issue where the "Activate" button may not show immediately after installing an Add On on the Memberships > Add Ons page. #3255 (@MaximilianoRicoTabo, @dparker1005)
* BUG FIX: Fixed an issue where courses would not be assigned correctly when users have multiple membership levels while using the LifterLMS streamline option. #3286 (@dparker1005)
* BUG FIX: Fixed a PHP fatal error if `pmpro_getAddons()` fails to retrieve the list of Add Ons. #3249 (@dparker1005)
* BUG FIX: Fixed an issue where notifications may be incorrectly shown when a callback does not exist. #3279 (@andrewlimaza)
* BUG FIX: Fixed a PHP 5.6 fatal error in the admin activity email class. #3253 (@andrewlimaza)
* BUG FIX: Fixed a styling issue when there are multiple paragraphs in a contextual message. #3250 (@kimcoleman)
* BUG FIX: Fixed a styling issue where there may be a gap when Turnstile is enabled but not visible. #3273 (@kimcoleman)
* BUG FIX: Fixed an incorrect path when loading the paid-memberships-pro text domain. #3282 (@andrewlimaza)
* BUG FIX: Fixed a PHP warning when loading the checkout page template without the preheader (e.g., when loading the checkout block in the editor). #3287 (@MaximilianoRicoTabo)
* BUG FIX: Fixed a potential PHP warning when building plugin action links. #3264 (@mircobabini)
* BUG FIX: Fixed a potential PHP error when attempting to display a subscription that does not exist in the Subscriptions table. #2383 (@dparker1005)
* BUG FIX: Corrected the refund policy on the license page to reflect recent changes. #3272 (@kimcoleman)
* REFACTOR: Created an abstract PMPro_Email_Template class and child classes for each email template. #3234 (@MaximilianoRicoTabo, @dparker1005)
* REFACTOR: Cleaned up user fields code throughout the plugin. #3223 (@dparker1005, @kimcoleman)
* REFACTOR: Removed potentially problematic caching from the `pmpro_getLevelAtCheckout()` function and began passing the checkout level to all relevant hooks instead. #3246 (@dparker1005)
* DEPRECATED: Marking PayFlow, PayPal Standard, and Braintree as deprecated. Websites that are already using these gateways can continue using them, but they will not be shown as an option on new websites. #3184 (@dparker1005)
* DEPRECATED: Removed references to PayPal from the Membership Billing page which has not been supported for some time. #3252 (@kimcoleman)

= 3.3.3 - 2025-01-08 =
* ENHANCEMENT: Added a "Recheck Payment" option for token orders on the Edit Order page to allow admins to check whether the payment has been completed and, if so, complete the corresponding checkout. This currently only works for Stripe Checkout orders. #3226 (@dparker1005)
* ENHANCEMENT: Added the Bangladeshi Taka to the list of supported currencies. #3239 (@kimwhite)
* ENHANCEMENT: Updated the `fr_FR` language files to include translations from the base `fr` language files. #3231 (@andrewlimaza)
* ENHANCEMENT: Updated the `es_ES` language files to include translations from the base `es` language files. #3216 (@MaximilianoRicoTabo)
* ENHANCEMENT: Added an icon for the Abandoned Cart Recovery Add On and the upcoming Testimonials Add On. (@kimcoleman)
* ENHANCEMENT: Simplified the `composer.json` file to remove unnecessary dependencies. #3237 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Updated the `post_restrictions` API endpoint to check whether the user has access to edit the specific post. #3243 (@dparker1005, @MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where checkout might fail for new users when using PayPal Express. #3225 (@JarrydLong, @dparker1005)
* BUG FIX: Fixed an issue where CloudFlare Turnstile validation would fail for PayPal Express checkouts. #3232 (@andrewlimaza)
* BUG FIX: Fixed an issue where some REST API endpoints would mistakenly require the `pmpro_edit_members` capability. #3243 (@dparker1005, @MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where Stripe Checkout would always overwrite the tax value set on an order even if tax isn't being calculated by Stripe Checkout. #3242 (@dparker1005)
* BUG FIX: Fixed an issue where formatted billing addresses without a state omitted the city and postal code. #3240 (@dparker1005)
* BUG FIX: Fixed a broken link to gateway settings documentation on the Payment Gateway settings page. #3244 (@kimcoleman)
* BUG FIX: Fixed a PHP notice when editing a post in Elementor that did not have a "require membership" setting saved. #3235 (@dparker1005)

= 3.3.2 - 2024-11-21 =
* ENHANCEMENT: Updated the "Checkout Spam Protection" security setting to also check for spam when trying to apply invalid discount codes. #3208 (@ideadude, @dparker1005)
* ENHANCEMENT: Added a new filter `pmpro_registered_reports` for registering reports. #3200 (@mircobabini)
* ENHANCEMENT: Now showing the Stripe API version being used by PMPro in site health instead of on the Payment Gateways settings page. #3204 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed an issue where Stripe error messages at checkout would not show at the bottom of the checkout page. #3194 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Now setting the discount code for an order during the `saveOrder()` method at checkout and when updating an order in the WP admin. #3190 (@dparker1005)
* BUG FIX/ENHANCEMENT: Improved the logic to get random order codes to help prevent duplicate order codes. #3191 (@dparker1005)
* BUG FIX: Fixed `doing_it_wrong` notices for strings that are localized before the `init` hook which started showing after sites updated to WordPress version 6.7. #3200 (@mircobabini)
* BUG FIX: Fixed an issue where the value '0' for a user field would be overwritten with the field's default value when displayed in the checkout form. #3189 (@dparker1005)
* BUG FIX: Fixed an issue where IP addresses may not be detected correctly when using the `pmpro_get_ip()` function. #3192 (@andrewlimaza)
* BUG FIX: Now ensuring that the `SITENAME` constant is not already defined before defining it. #3196 (@dparker1005)
* BUG FIX: Fixed a fatal error that would occur on the confirmation page if an invalid user ID is set on the order object being shown. #3207 (@dparker1005)

= 3.3.1 - 2024-10-24 =
* ENHANCEMENT: Added a Subscriptions List Table to allow admins to view, manage, and link subscriptions from the WordPress admin. #2828 (@dparker1005, @kimcoleman)
* ENHANCEMENT: Discount codes can now be set to only allow one use per user. #3175 (@dparker1005)
* BUG FIX: Fixed an issue where billing address information would be cleared when a checkout attempt failed causing Stripe 3DS checks to break. #3172 (@dparker1005, @mircobabini)

= 3.3 - 2024-10-16 =
* FEATURE: Now updating the plugin from paidmembershipspro.com. #3167 (@dparker1005)
* ENHANCEMENT: Updated translation files bundled with the plugin. #3168 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Improved the padding around list tables on large screens. #3169 (@kimcoleman)
* BUG FIX: Fixed a PHP warning in the `pmpro_use_default_login_for_confirm_admin_email()` function. #3162 (@MaximilianoRicoTabo)

= 3.2.2 - 2024-10-12 =
* ENHANCEMENT: Added screen reader text to identify an empty header row on levels table output. #3161 (@kimcoleman)
* BUG FIX: Fixed issue where some third party gateways were no longer cancelling subscriptions at the gateway when cancelled locally in WP/PMPro. If you were using a gateway that is not included with the core PMPro plugin, please double check all recent cancellations to make sure they were sync'd to your gateway. If not, you will have to cancel those subscriptions at the gateway manually. #3164 (@ideadude)

= 3.2.1 - 2024-10-08 =
* ENHANCEMENT: Improved the print styles for frontend pages. #3158 (@kimcoleman)
* BUG FIX: Fixed an issue where payments would not complete when Stripe 3DS was triggered. #3157 (@dparker1005)
* BUG FIX: Fixed an issue where "file" user fields would not allow uploads if the file restrictions setting was empty. #3156 (@andrewlimaza)
* BUG FIX: Fixed a deprecation warning when using Stripe Checkout. #3160 (@dparker1005)
* BUG FIX: Fixed an issue where the "street2" billing address field may not be saved for Stripe payments. (@dparker1005)

= 3.2 - 2024-10-02 =
* FEATURE: Users will now receive a notification email when they have an upcoming subscription payment. #3109 (@dparker1005)
* FEATURE: Added integration with Cloudflare Turnstile. #3123 (@andrewlimaza)
* ENHANCEMENT: The business address for the website can now be set on the Advanced Settings page and will be shown on invoices. #3134 (@MaximilianoRicoTabo)
* ENHANCEMENT: Added a table view on the Email Templates settings page. #3128 (@kimcoleman)
* ENHANCEMENT: Added the Checkbox Group user field type. #3126 (@andrewlimaza)
* ENHANCEMENT: A default value can now be set for user fields that do not allow multiselect or file uploads. #3132 (@andrewlimaza)
* ENHANCEMENT: Allowed file types and maximum file sizes can now be set for "File" user fields. #3133 (@andrewlimaza)
* ENHANCEMENT: Added three new filters at checkout to allow checks at different parts of the checkout process: `pmpro_checkout_checks`, `pmpro_checkout_user_creation_checks`, and `pmpro_checkout_order_creation_checks`. #3137 (@dparker1005)
* ENHANCEMENT: Now creating a user at checkout even when order creation checks fail. #3137 (@dparker1005)
* ENHANCEMENT: Memberships on the Membership Account page will now be shown in the order set on the Membership Levels settings page. #3112 (@kimcoleman)
* ENHANCEMENT: Updated the wording around "legacy keys" and "restricted keys" for the Stripe gateway. #3151 (@dparker1005)
* BUG FIX/ENHANCEMENT: Street2 billing address lines are now stored separately in the MemberOrder object. #3122 (@dparker1005)
* BUG FIX: Fixed an issue where payment fields on the update billing page might be wrapped in nested cards. #3143 (@kimcoleman)
* REFACTOR: Abstracted all "Terms of Service" logic into a single file. #3119 (@dparker1005)
* REFACTOR: Abstracted all reCAPTCHA logic into a single file. #3105 (@dparker1005)
* REFACTOR: Cleaned up the checkout preheader flow including deprecating the `pmpro_build_order_for_checkout()` function in favor of inline logic. #3129 (@dparker1005)
* REFACTOR: Updated the PayPal Express integration to run checkout logic in its `process()` method instead of on actions that are being deprecated. #3116 (@dparker1005)
* REFACTOR: Updated the Stripe  integration to send users to Stripe Checkout in the `process()` method instead of during the `pmpro_checkout_before_change_membership_level` hook. #3104 (@dparker1005)
* DEPRECATED: Marking the Authorize.net gateway integration as deprecated. Websites that are already using Authorize.net can continue using that gateway, but new sites will not be shown Authorize.net as a gateway option. #3150 (@dparker1005)
* DEPRECATED: PayPal Express will no longer automatically be enabled as a second payment option when using the deprecated Website Payments Pro gateway. This functionality can be restored by using the Add PayPal Express Add On. #3114 (@dparker1005)
* DEPRECATED: Marked the following filters at checkout as deprecated: `pmpro_checkout_oldemail`, `pmpro_new_user`, `pmpro_require_billing`, and `pmpro_checkout_confirmed`. #3137 (@dparker1005)
* DEPRECATED: Now throwing deprecation warnings for dynamic order properties that were previously used at by gateways at checkout. #3122 (@dparker1005)
* DEPRECATED: Marked the `getGatewaySubscriptionStatus()`, `getGatewayTransactionStatus()`, and `confirm()` MemberOrder methods as deprecated. #3129, #3116 (@dparker1005)
* DEPRECATED: Removed sample code from methods in the `PMProGateway` class and marked sample helper methods as deprecated. #3129 (@dparker1005)

== Upgrade Notice ==
= 3.0 =
The PMPro v3.0 release will make irreversible changes to the structure of your membership site data. Please back up your database and ensure that all PMPro Add Ons are up to date before upgrading. For more information, please visit https://www.paidmembershipspro.com/pmpro-update-3-0/.
