Search Over 30,000 FREE Plugins from the Official WordPress Plugin Directory Repository

Paid Memberships Pro

A revenue-generating machine for membership sites. Unlimited levels with recurring payment, protected content and member management.

Set up unlimited membership levels and provide restricted access to members-only content (including pages, posts, categories, videos, forums, downloads, support, single "a la carte" page access, and more).

Paid Memberships Pro is flexible enough to fit the needs of almost all online and offline businesses. It works great out of the box, but is easy for developers to customize to fit your needs.

Paid Memberships Pro is 100% GPL and available for free from the WordPress repository or on our site at The full version of the plugin is offered with no restrictions or additional licenses required. Developers should get involved at our GitHub page.

Integrate with The Most Popular Payment Gateways.

Stripe,, PayPal (Standard, Express, Website Payments Pro, and PayPal Payments Pro/Payflow), Braintree, 2Checkout, and Cybersource. View Gateways

Works with Any Theme You Want.

Use your Existing Theme, the fully-integrated Memberlite Theme or a Popular Free or Premium Third-Party Theme.

Infinitely Configurable, Unlimited Membership Levels.

Set up the membership levels that best fit your business, whether they are Free, Paid, or Recurring Subscriptions (Annual, Monthly, Weekly, Daily). Offer Custom Trial Periods (Free Trial, Custom-length Trial, 'Introductory' Pricing).

Easy-to-Use Admin Pages and Settings.

  1. Membership access by Page/Post/Category
  2. Members list with CSV export
  3. Easy payment gateway setup
  4. Ever expanding list of membership reports
  5. Membership discounts with customizable price rules

Control the User-Experience from Start to Finish.

Your members can update their billing information or cancel their account directly on your site. Any active subscription will be cancelled at the payment gateway for you.

Integrate with Top Third Party Tools.

PMPro integrates with Mailchimp, Constant Contact, AWeber, GetResponse, Social Login, KISSMetrics, Infusionsoft, WP Courseware, LearnDash, Post Affiliate Pro, bbPress, WooCommerce, and many more popular third party tools.

Add-ons to Customize and Extend Paid Memberships Pro.

Our growing library of Add ons allow you to extend Paid Memberships Pro to your needs. These extensions, sister plugins, and recipes customize your membership site and help you integrate with 3rd party services or other plugins.

View the Add-Ons

Author Stranger Studios
Contributors strangerstudios
Tags, braintree, directory site, ecommerce, Membership, memberships, payflow, paypal, restrict access, Restrict content, stripe
  1. paid-memberships-pro screenshot 1

    Set up the membership levels that best fit your business, whether they are Free, Paid, or Subscriptions (Annual, Monthly, Weekly, Daily). Offer Custom Trial Periods (Free Trial, Custom-length Trial, 'Introductory' Pricing)

  2. paid-memberships-pro screenshot 2

    Easy to use Membership Access Settings by Page, Post, or Category. Shortcodes to display restricted content inline. Developer-friendly hooks to restrict access any way you need.

  3. paid-memberships-pro screenshot 3

    Members are WordPress Users. PMPro provides a unique interface to view, filter and search Members or export your Members List.

  4. paid-memberships-pro screenshot 4

    Offer Membership Discounts with specific price rules (restricted by level, unique pricing for each level, # of uses, expiration date.)

  5. paid-memberships-pro screenshot 5

    Filterable Sales Revenue Reports (reports also included for Visits, Views, Logins, Signups, Cancellations, and other Membership Stats).

  6. paid-memberships-pro screenshot 6

    Advanced settings for updating non-member messages, optionally show excerpts or filter content, use reCAPTCHA, and a Terms of Service checkbox.

  7. paid-memberships-pro screenshot 7

    Membership levels selection page, filter the shortcode with additional attributes using add ons or the Memberlite theme.

  8. paid-memberships-pro screenshot 8

    Membership Account page, display all sections or show specific sections using shortcode attributes.

Download, Install and Activate!

In your WordPress admin, go to Plugins > Add New to install Paid Memberships Pro, or:

  1. Download the latest version of the plugin.
  2. Unzip the downloaded file to your computer.
  3. Upload the /paid-memberships-pro/ directory to the /wp-content/plugins/ directory of your site.
  4. Activate the plugin through the 'Plugins' menu in WordPress.

Complete the Initial Plugin Setup

Go to Memberships in the WordPress admin for a step-by-step initial setup. The basic steps are:

  1. Membership Levels: Add one or more Membership Levels
  2. Page Settings: Generate or assign the Pages
  3. Payment Gateway: Select and configure your Gateway and SSL
  4. Email: Customize Email Settings
  5. Advanced Settings: Update non-member messages, optionally show excerpts or filter content.

Installation Video | Installation Docs

  • BUG: Fixed bug where credit card expiration emails would be sent to users with PayPal Express orders.
  • BUG: Fixed bug when updating billing with Stripe.
  • BUG: Fixed bug where the archive/search filter was not running for logged out users.
  • ENHANCEMENT: Updated Finnish translations. (Thanks, JP Jakonen)
  • ENHANCEMENT: Added filter for modifying the order description in Stripe. (Thanks, Rafe Colton)

  • BUG: Fixed notifications.php to make sure it really only checks once per day. Also updated the URL checked to, which runs on its own server.

  • BUG/ENHANCEMENT: Changed the pmpro_button shortcode to pmpro_checkout_button. (The old pmpro_button will also still work. checkout_button works if you have Register Helper installed.)

  • BUG: Fixed bug when using a secondary gateway (e.g. PayPal Express) with Stripe as your primary gateway.

  • BUG: Fixed bug with updating credit cards through Braintree.
  • BUG: Fixed bug with updating credit cards through Stripe.
  • BUG: Fixed SQL warnings when generating the pmpro_membership_levelmeta table. (Thanks, itibet on GitHub)
  • BUG/ENHANCEMENT: Moved some update billing and checkout related code from the preheaders and page templates into the Braintree and Stripe classes.
  • ENHANCEMENT: Added pmpro_billing_order filter that functions similar to pmpro_checkout_order.
  • ENHANCEMENT: Added pmpro_billing_before_submit_button hook that functions similar to the pmpro_checkout_before_submit_button hook.
  • ENHANCEMENT: Clicking on a report widget no longer takes you to the details page. You have to click the details button. This allows us to add additional functionality to the widgets.
  • ENHANCEMENT: Updated reports widgets so the "details" button only shows if a page function is defined for that report. You can now have report widgets without details pages.
  • ENHANCEMENT: You can now click on a heading in the Membership Stats report widget to see data for up to 3 of your levels. The first 3 levels per the level ordering are shown.

  • BUG: Fixed issue where end dates were being set/saved incorrectly from the edit user/profile page in the dashboard.
  • BUG: Fixed warnings in the Braintree PHP library. (Thanks, Travis Shivers)
  • BUG: Fixed issue where the filtered $mypost object was not being used in the content filter if the post type was "page". (Thanks, James)
  • BUG: Removed the extra class="input" attribute on the CVV field when the Stripe gateway is used. (Thanks, Rafe Colton)
  • BUG/ENHANCEMENT: Changed the number of X placeholders for masked credit cards to 12 (+ the last 4 stored) instead of 13. (Thanks, Rafe Colton)


  • FEATURE: The Stripe Webhook has been updated to process subscriptions cancelled from Stripe. PMPro will now cancel memberships for these users instead of sending an email to the admin.
  • BUG: Fixed various bugs in the PayPal IPN handler.
  • BUG: Fixed search on discount codes page in dashboard. (Thanks, Debjit Saha)
  • BUG: Fixed bug in Cancellations report where all-time cancellations were always 0.
  • BUG: Fixed link to payment settings on checkout notice. (Thanks, Coen Jacobs)
  • BUG: Timezone magic on edit user page in the dashboard to make sure the expiration date you select is the one set.
  • BUG: Swapped out deprecated uses of eregi_replace and split.
  • BUG/ENHANCEMENT: Now using add_query_arg in the pmpro_url() function. (Thanks, Debjit Saha)
  • ENHANCEMENT: Updating stylesheet for WordPress 4.7 and new Twenty Seventeen theme support.
  • ENHANCEMENT: Now longer warning of membership levels with cycle numbers > 1 when using the Payflow Pro gateway since Payflow now supports cycle numbers (frequencies) > 1.
  • ENHANCEMENT: Updated da_DK translation. (Thanks, bopdoq on GitHub)
  • ENHANCEMENT: Added pmpro_include_payment_option_for_paypal filter, which can be set to false to use PayPal WPP without the PayPal Express option.
  • ENHANCEMENT: Better dependency checking for Stripe and Braintree gateways.
  • ENHANCEMENT: Updated IPN handler and Stripe Webhook handler to use pmpro_cancelMembershipLevel instead of pmpro_changeMembershipLevele. This improves support for the MMPU addon.

  • BUG: Fixed bug when using the testing gateway.
  • BUG: Avoiding issues where is_user_logged in is not yet available for the pmpro_search_filter() function. (Thanks, d_enajetic)
  • ENHANCEMENT: Updated Italian translation. (Thanks again, Angelo)
  • ENHANCEMENT: You can now define('PMPRO_USE_SESSIONS', false); in your wp-config.php to force PMPro to skip the call to session_start. Note that PayPal Express and some addons require sessions to function.


  • BUG: Fixed issue where "expiring soon" emails were sometimes sent more than needed.
  • BUG: Fixed issue where PayPal Standard IPN requests were being rejected if a tax amount was set in PayPal.
  • BUG: Fixed issue with Stripe subscription "updates" that were set to fire on "next payment", e.g. if you used Stripe with levels with a non-zero trial amount. When the update processed and created a new subscription, the old subscription was not being deleted and the new subscription ID was not being saved as a new order for future tracking purposes. If you use this feature, please check in Stripe to make sure your users don't have extra subscriptions.
  • BUG: Fixed setting in PayPal/PayPal Express API calls from AUTOBILLAMT to AUTOBILLOUTAMT. This setting is set to AddToNextBilling, meaning that failed payment amounts are added to the next billing cycle's amount if left unpaid. In most cases, a retry of the original billed amount goes through or the user's subscription is cancelled. But just in case, this makes sure that outstanding balances are paid. (Thanks, jubstuff on GitHub)
  • BUG: Fixed warnings in the setGateway method of the MemberOrder class for cases where the gateway is missing or the class file is not found.
  • BUG/ENHANCEMENT: Moved the pmpro_before_change_membership_level hook to fire a little bit earlier to make it easier to determine the old level status/end date/etc before it gets updated. (Thanks, MrVibe on GitHub)
  • ENHANCEMENT: Replaced the Force SSL option with an explanation if the entire site is over HTTPS. We are already ignoring the option in these cases.

  • BUG: Fixed a bug introduced in 1.8.11 that kept PMPro from tracking coupon code uses. Any checkout with a discount code while running 1.8.11 won't have properly tracked the discount code use. You may want to adjust your "uses" numbers for your codes, and hand check any reporting/etc that relied on discount codes. Users of the Sponsored Members addon will have been affected too. Discount codes will need to be made manually for any sponsor who checked out.
  • BUG: Fix to the expiration warnings code. Making sure it finds all members who are expiring soon while also keeping track of when emails are sent so users don't get too many emails.
  • BUG: Fixed issue where pmpro_before_change_membership_level was running after levels had been changed.
  • BUG: Fixed some warnings.
  • ENHANCEMENT: Updated Italian translations. (Thanks, Angelo)

  • BUG: Fixed issue introduced in 1.8.11 where the pmpro_default_level custom field was being ignored at checkout.
  • BUG: Fixed bugs in DB calls made for the compatibility checks for various gateways.
  • BUG: Now sending a FREQUENCY parameter for PayPal Payflow orders.


  • BUG: Fixed URL used when checking for addon updates.
  • BUG: Now enqueueing the jquery.creditCardValidator.js file in Billing preheader.
  • BUG: Fixed issues where PayPal IPN updates would sometimes log $0 instead of the actual billing amount.
  • BUG: Fixed warnings in the PayPal IPN handler.
  • BUG/ENHANCEMENT: Added pmpro_checkout_level filter and now using that filter to apply the_content filters to the level description at checkout. This allows you to turn off the the_content filters (e.g. processing shortcodes) by using remove_filter('pmpro_checkout_level', 'pmpro_pmpro_checkout_level'); in a custom plugin.
  • BUG/ENHANCEMENT: Using the pmpro_confirmation_message filter on the confirmation page whether there is an invoice or not. Now also adding the the_content filters to the confirmation message. You can disable this by using remove_filter('pmpro_confirmation_message', 'pmpro_pmpro_confirmation_message'); in a custom plugin.
  • ENHANCEMENT: Now tracking IPN event ids in order notes for recurring orders.
  • ENHANCEMENT: Added pmpro_subscription_ipn_event_processed hook to IPN handler.
  • ENHANCEMENT: Added pmpro_set_message filter to edit PMPro error messages. Passes the message and type.
  • ENHANCEMENT: Now listing categories in hierarchical format in the Content Settings section of Membership Levels.
  • ENHANCEMENT: Added pmpro_areLevelsFree() function to check if all levels in an array of levels are free.
  • ENHANCEMENT: Added pmpro_getLevelsCost() - with an s - function to get the combined cost of multiple levels in an array.
  • ENHANCEMENT: Added pmpro_getLevelsExpiration() - with an s - function to get the combined expiration text for multiple levels in array.
  • ENHANCEMENT: Created the pmpro_getLevelAtCheckout function that modularizes some of the logic of creating the pmpro_level global at checkout.
  • ENHANCEMENT: Added pmpro_members_list_user filter used on the admin members list and members list CSV export.
  • ENHANCEMENT: Added a 4th parameter $cancel_level to pmpro_changeMembershipLevel(). If set, that level will definitely be cancelled locally and at the gateway. This parameter is also passed to the pmpro_before_change_membership_level and pmpro_after_change_membership_level hook.
  • ENHANCEMENT: Added a new function pmpro_cancelMembershipLevel($level_id, $user_id, $old_level_status) that acts as a wrapper to pass the $cancel_level param to pmpro_changeMembershipLevel().
  • ENHANCEMENT: Updated the cancel page on the frontend to support the Multiple Memberships per User addon. All memberships are shown. You can cancel individual memberships separately. The language of the confirm button mentions memberships vs account.
  • ENHANCEMENT: Added pmpro_getMemberOrdersByCheckoutID($checkout_id) function to support Multiple Memberships per User and others using the checkout_id.
  • ENHANCEMENT: Added a refund($order, $transaction_id) method to the PMPro_stripe class. This will be used by the Multiple Memberships per User addon and eventually used in other areas by the core pluginn.

  • BUG: Fixed issue where non-decimal currencies (e.g. Japanese Yen) were sending invalid amounts to the Stripe gateway.
  • BUG/ENHANCEMENT: If an invalid discount code is applied at checkout, we now set the code_level JS var to false. Along with updates to the Pay by Check addon, this fixes issues with the Pay by Check addon where users could not checkout when using a discount code that reduced the price to free.
  • BUG/ENHANCEMENT: Fixed HTML validation issue in CVV field of the checkout page.
  • BUG/ENHANCEMENT: Now using the current_time function in profile.php to avoid off-by-one errors when changing members' expiration dates.

  • BUG: Fixed bug where users could not confirm PayPal Express payments if the main gateway was Stripe or Braintree.
  • BUG: Fixed issue where the billing address and/or credit card fields were not showing up on the Update Billing page.

  • BUG: Fixed bug in invoices query in the pmpro_account shortcode.
  • BUG: Fixed issue where the orders table was not being created on brand new installs.
  • BUG: Fixed responsive styling of ReCaptcha.
  • ENHANCEMENT: Added Hebrew language support. Thanks, Nadav Waisbrod.
  • ENHANCEMENT: Update to Italian translation. (Thanks again, Angelo Giammarresi)
  • ENHANCEMENT: Added a text domain and path to the plugin header.

  • BUG: Fixed bugs in pmpro_hasMembershipLevel that caused shortcodes like [membership levels="0"] and [membership levels="-1"] to stop working.


  • SECURITY: Patched a cross site scripting (XSS) vulnerability on the Memberships -> Addons page in the dashboard. Thanks to Burak Kelebek for the discovery and responsible disclosure of this vulnerability.
  • BUG: Added pmpro_btn-submit-checkout class to the PayPal checkout buttons.
  • BUG: Updated Stripe and Braintree gateways to load billing fields and JavaScript when it's the default gateway (if not the current gateway specified).
  • BUG: Fixed bug where cancelation emails weren't being sent to users if they originated from PayPal.
  • BUG: Fixed bug where unsucessful invoices were shown on the Membership Account page. We aren't showing refunded invoices here now either, but plan to in the future.
  • BUG: The update billing page now uses the pmpro_include_billing_address_fields filter so gateways and addons can properly override the payment fields when needed.
  • BUG: The update billing page now uses the validatecreditcard.js script to set the Card Type in the background, just like checkout. Fixes some issues with updating credit cards on certain gateways.
  • BUG: Reintroduced the pmpro_members_list_sql filter.
  • BUG/ENHANCEMENT: Switched the Japanese Yen and South Korean Won to not use decimals by default. (Thanks, flatworld21 on
  • ENHANCEMENT: Added an option to skip the confirmation step with PayPal Express.
  • ENHANCEMENT: Added the pmpro_membership_levels_table filter on the membership levels page of the dashboard to allow addons (like the upcoming MMPU addon) to override the HTML for the table shown.
  • ENHANCEMENT: Added the checkout_id column to the pmpro_membership_orders table. This will be used by addons and possible core in the future to track multiple orders that happen during the same checkout process.
  • ENHANCEMENT: Added support for the Serian language. (Thanks, Sasa Trifkovic)
  • NOTE: We are planning to remove the certificate_id and certificate_amount columns from the pmpro_membership_orders table. Please contact us if you are using this column for something to come up with a work around.

  • BUG: Fixed bug introduced in where member start and end dates weren't being set correctly. Includes an update script to fix past users affected by this.
  • BUG: Fixed warnings on new order page in the dashboard.
  • BUG/ENHANCEMENT: Fixed the pmpro_checkout_default_submit_button() methods of the PayPal Express to no longer check if the current gateway is a paypal one. The method is only called when the gateway is loaded anyway or when another addon (e.g. the pmpro-pay-by-check addon) adds the hook.
  • BUG/ENHANCEMENT: Moved check instructions code into the check gateway class so it can be overriden by addons (e.g. an update to the pmpro-pay-by-check addon).

  • BUG: Fixed SQL in pmpro_changeMembershipLevel that caused issues with some MySQL setups.
  • BUG: Fixed URL PayPal Express and PayPal standard redirect to at checkout. (Although the incorrect URL was still working on the PayPal side.)
  • BUG: Addon page now passes $status to the plugin_row_meta filter to fix warnings that were sometimes showing up. (Thanks, jawhite)
  • BUG: Fixed typo in the pmpro_orders_csv_extra_columns filter introduced in (Thanks, Johannes Jokelin)

  • BUG: Fixed bug where some recurring orders members who checked out with Stripe in very old versions of PMPro would show up as orders with a blank user_id and membership_id. This update includes a fix for this and an update script to fix old orders affected by this.
  • BUG: Fixed bug where the Stripe class activation/deactivation methods were setup too late to actually run on activation/deactivation.
  • BUG: Updated the Stripe class to use the same language and markup in the Payment Information section as the default checkout.
  • BUG: Now forcing pmpro_getMembershipLevelForUser() in admin change emails.
  • BUG: Fixed warning in comments_array and comments_open filters. (Thanks, Mihail Chepovskiy)
  • BUG: Fixed format error for dates when saving orders. (Thanks, EmreErdogan)
  • BUG: Fixed bug that was causing issues in the cancellations report.
  • BUG: Fixed the pmpro_cron_expiration_warnings script to properly skip deleted and already expired members.
  • BUG: Reverted code to generate the CVV popup URL.
  • BUG: Fixed a couple bugs in the pmpro_loadTemplate function.
  • BUG/ENHANCEMENT: Updated URL used in the IPN Handler API calls to match the latest PayPal docs. (Thanks, pbaylies)
  • BUG/ENHANCEMENT: Overhauled the orders list CSV export for improved performance. There is still scaling work to be done on the exports, but timeouts and memory errors will happen much less often.
  • ENHANCEMENT: Added Greek (el_GR) translation. (Thanks, Alexandros Karypidis)
  • ENHANCEMENT: Added $order as a parameter to the pmpro_orders_user_row_actions hook. (Thanks, SquareLines)
  • ENHANCEMENT: Added a warning to backup your database to the update notice.


  • BUG: Fixed bug with recurring orders and TwoCheckout.
  • BUG: Fixed bug where some non-members (membership_id was 0 or NULL) were being processed for expiration.
  • BUG: Fixed bug where the address/street wasn't showing up when printing orders from the dashboard.
  • BUG: Fixed bug where the Stripe class would sometimes show its billing and payment fields even if a secondary gateway was chosen.
  • BUG: Making sure $this->total is set for new orders and available to the pmpro_add_order, pmpro_added_order filters.
  • BUG: Fixed bug where email templates were not being loaded out of the /paid-memberships-pro/languages/email/ directory. (Thanks, menardmam on
  • BUG: No longer showing a "renew" link on the membership account or membership levels pages if the user's level is not allowing sign ups.
  • BUG: Fixed bug where the expiration script might try to run on deleted or expired users.
  • BUG/ENHANCEMENT: Change membership shortcode to call pmpro_hasMembershipLevel when checking for level="" as well. This ensures the pmpro_has_membership_level filter runs, which some addons/etc need.
  • ENHANCEMENT: Updated categories list on the edit levels page to show nested categories.
  • ENHANCEMENT: Now adding a pmpro-no-access class (similar to the pmpro-has-access class) to the post element if a user doesn't have access to that post.
  • ENHANCEMENT: Added pmpro_checkout_end_date filter, similar to pmpro_checkout_start_date. Takes params $enddate, $user_id, $pmpro_level, $startdate.

  • BUG: Fixed issue in pmpro_has_membership_access() that was causing issues on some sites, specifically sites running PMPro Series.

  • BUG: Fixed bug with new order creation.

  • BUG: Fixed issue in pmpro_has_membership_access() that kept member content from being locked down on blog homepages and archive/index pages.
  • BUG: Fixed display of renew button for memberships with an enddate, but no expiration number or period (e.g. if an admin changed the enddate).
  • BUG: Fixed issue where the subtotal was not being recorded properly for some new orders.
  • BUG: Fixed issues some where having running the update scripts.


  • BUG: Fixed issue where recurring Stripe orders were being created with $0 totals.
  • BUG: Fixed issues in pmpro_has_membership_access() that was affecting some sites with files locked down for members. (Thanks, MannyC on GitHub)
  • BUG: Fixed issue where data in the Signups vs Cancellations detailed view chart was shifted back one day. (Thanks, TYT)
  • BUG: Fixed issue where whitespace in email addresses and user names could confuse the pre-existing user checks.
  • BUG: Added some closing HTML tags where needed.
  • BUG: Fixed issue where discount codes could be created with special characters even though only letters, numbers, and - will work at checkout.
  • BUG: Some fixes to the pt_BR language. (Thanks, )
  • ENHANCEMENT: Refactored the members list CSV to use less memory and scale better. It should work faster in general and better on large sites. (Thanks, Thomas Sjolshagen)
  • ENHANCEMENT: Added pmpro_reports_signups_sql and pmpro_reports_get_cancellations_sql filters to filter SQL that generates cancellation numbers in reports.
  • ENHANCEMENT: Now setting the timeout on PayPal API calls to 60 seconds from 5 seconds.
  • ENHANCEMENT: Now checking admin capabilities on each load in the dashboard in case PMPro-related admin capabilities have been changed. This avoids issues where users were upgrading PMPro but wouldn't have access to updates or new features without deactivating and reactivating PMPro.
  • ENHANCEMENT: Added a pmpro_paypal_level_description filter that can be used to filter the description of the level sent to PayPal.
  • ENHANCEMENT: Added Catalan translations (ca, ca_AD, ca_ES). (Thanks, Jordi Martín)
  • ENHANCEMENT: Added Estonian translations (et_EE). (Thanks, Enriko Ojala)

  • BUG: Using HTTP 1.1 for calls to the PayPal API now.
  • BUG: The pmpro_cron_credit_card_expiring_warnings cron job setup by PMPro needed a monthly schedule added via the cron_schedules filter.
  • ENHANCEMENT: Added the pmpro_maybe_schedule_event() function. This checks if an event with the same hook and args is already scheduled before scheduling the new event.
  • ENHANCEMENT: Added a script that will run on upgrade to clean out old cron jobs.

  • BUG: Fixed bug where pmpro_activation() was firing on every page load. (Thanks, Tigertech and MegaZ on
  • BUG: Fixed bugs with internationalized date formats in a few places.

  • BUG: Added missing files via svn.


  • BUG: Fixed bug where recurring Stripe orders were saving the customer ID in the subscription_transaction_id instead of the subscription ID. This was causing issues with plugins like AffiliateWP that tried to track recurring orders. After upgrading to 1.8.7, a script will run on your database to fix old recurring orders.
  • BUG: Fixed bug where cancellations weren't showing up in the chart views of the membership stats reports.
  • BUG/ENHANCEMENT: The IPN service will now look for the payment_date parameter to set the timestamp of the recurring order/etc when processing IPN requests.
  • ENHANCEMENT: Added tools to run large database updates (e.g. Stripe fix above) over AJAX to avoid timeouts.
  • ENHANCEMENT: MemberOrder class will now insert/update the timestamp if a ->timestamp or ->datetime variable is set on the object.
  • ENHANCEMENT: Updated the Norwegian translation. (Thanks, Thomas Sjolshagen)
  • ENHANCEMENT: Added Argentine Peso (ARS) as a currency.
  • ENHANCEMENT: Added Nigerian Naira as a currency option. (Thanks, Maria)
  • ENHANCEMENT: Added a second option $conjunction parameter to the pmpro_implodeToEnglish() function. So you can use pmpro_implodeToEnglish($array, 'or') to change the 'and' in the text to 'or' or something different.
  • ENHANCEMENT: The "Sales" numbers on the sales and revenue reports now only includes orders with totals > $0. (More reports updates in the works.)

  • BUG: Fixed bug in the Payflow gateway class that was breaking API calls and checkout.

  • BUG/ENHANCEMENT: Adding to inline JavaScript to avoid issues where themes/plugins were adding formatting into the JavaScript code. (Thanks, Isabelle Couillard)
  • BUG: Removed calls to force_ssl_login(), which has been deprecated in WP 4.4+. We are using force_ssl_admin() instead.
  • BUG: Fixed issue in pmpro_isLevelExpiringSoon() which controls when "renew" links are shown to users. (Thanks, Thomas Sjolshagen)
  • ENHANCEMENT: Updated PayPal gateway classes to use the WP HTTP API instead of CURL directly.

  • BUG: Fixed issue with prices over $1000 when using TwoCheckout. (Thanks, BigBradBrown and others.)
  • ENHANCEMENT: Removed the API Private Key option from 2Checkout setup since we don't actually use that in the API.
  • ENHANCEMENT: Using the pmpro_check_status_after_checkout filter to set the status of orders for recurring check payments in addition to one time payments. This update supports the update Pay by Check Add On v.5.
  • ENHANCEMENT: Added +1 to timestamp when the pmpro_cron_expiration_warnings cron is scheduled to make sure it runs after the pmpro_cron_expire_memberships cron.
  • ENHANCEMENT: Added email templates for Greek translation. (Thanks, Dimitris Kalliris)

  • BUG: Fixed issue introduced in where "Please enter all required fields" errors would show up even for free/etc levels at checkout.

  • BUG: Now checking for required fields even if $pmpro_requirebilling is not set.
  • BUG: The redirect_to URL is now encoded with urlencode() when using the !!referrer!! tag in the logged out/non-member text settings on the advanced settings tab. (Thanks, Robert Wilkins)
  • BUG: Fixed issue where filters stopped working on the orders page in the dashboard.
  • BUG: Fixed issue in pmpro_isLevelExpiringSoon that caused the "renew" link to not appear sometimes. (Thanks, xzistance3)
  • BUG: Fixed wording of level cost text for levels with billing limits and billing periods with cycles > 1, e.g. "$1 now and then $1 every 2 Months for 2 periods". Thanks, russell77)

  • BUG/ENHANCEMENT: Now expiring members before sending expiration warnings.
  • BUG: Now adding a specific user agent to IPN requests to PayPal (and other gateways) to avoid 403 errors.
  • ENHANCEMENT: Added a constant PMPRO_USER_AGENT used in all outside HTTP requests. The user agent will look like "Paid Memberships Pro v1.8.6.4;".

  • SECURITY: No longer showing email addresses in output when cron jobs are processed by non-admins. (Thanks, Daniel Bachhuber)
  • BUG: Better handling of errors when validating PayPal IPN requests. Added pmpro_ipn_validate filter. PayPal users should read the release notes here:
  • BUG: Fixed bug where both the return and first order INS would change membership and update the order twice, leading to unwanted cancellations and emails. (Thanks, Steffen Dressler)
  • BUG: No longer using the $pmpro_levels global in pages/levels.php.

  • BUG: Stripe supports daily recurring subscriptions. Fixed issue where PMPro was still throwing a warning in some cases.
  • BUG: Removed warnings in the membership stats report.
  • CODE: Changed a couple instances of "since v2.0" to "since v1.8".
  • ENHANCEMENT: Added a hook for pmpro_checkout_order_free that functions like pmpro_checkout_order but fires for the blank order created for free checkouts.
  • ENHANCEMENT: Using site_url to get full URL to for the redirect_to value generated by !!referrer!! in the non-member/logged-out text strings in the advanced settings page. This fixes issues with using !!referrer!! on multisite setups. (Thanks, Keith Hall)
  • ENHANCEMENT: Updated pmpro_post_classes to work on the $post_id passed by the filter instead of the global $post variable.
  • ENHANCEMENT: Added pmpro_body_classes to add classes like pmpro-body-level-required, pmpro-body-level-1, and pmpro-body-has-access to the body tag based on the queried object.
  • ENHANCEMENT: Reformatted the PMPro Reports dashboard.
  • ENHANCEMENT: Now using separate invoice templates for email and print.

  • SECURITY: Removed debug code from the PayPal IPN Handler script that was causing invalid IPN requests to process as if they were valid. (Thanks, Francois Harvey)


  • BUG: The pmpro_membership_level_profile_fields_update() function now only fires on the personal_options_update and edit_user_profile_update hooks instead of the profile_update hook since this function expects to be called from the your-profile or edit-user page.
  • FEATURE: Added the ability to print invoices/orders from the Memberships -> Orders page in the dashboard. (Thanks, AgResources)
  • FEATURE: Added the ability to email invoices/orders from the Memberships -> Orders page in the dashboard. (Thanks, AgResources)
  • ENHANCEMENT: Added pmpro_before_change_membership_level action. Runs before the subscriptions are cancelled and before the SQL executes to change a user's level. Passes $level_id and $user_id.
  • ENHANCEMENT: Updated Stripe Web Hook handler to save event into global $pmpro_stripe_event so filters can act on it.
  • ENHANCEMENT: Added $pmpro_level as a second parameter for the pmpro_setup_new_user filter. (Thanks, David Crabill)
  • ENHANCEMENT: Added Vietnamese language pack. (Thanks, Alex Training Center)

  • ENHANCEMENT: Added pmpro_payflow_authorize_nvpstr, pmpro_payflow_void_nvpstr, pmpro_payflow_charge_nvpstr, pmpro_payflow_subscribe_nvpstr, pmpro_payflow_update_nvpstr, pmpro_payflow_cancel_nvpstr filters for PayPal Payflow Pro gateway. Usage is the same as PayPal Express NVP string filters.
  • ENHANCEMENT: Added printable and emailable invoice templates to the Orders page.
  • BUG: Fixed $pmpro_core_pages bug added in
  • BUG: Removed styling of .input from frontend.css. (Thanks, Russell Jamieson)
  • BUG: Commented out a console.log call from Stripe JavaScript code. (Still there to uncomment if you want to debug.)
  • ENHANCEMENT: No longer requiring the CVC/CVV code with Stripe. If blank, Stripe will try to verify without it. If your Stripe settings are to decline transactions that fail CVC check, you will still need a valid CVC code at checkout.

  • BUG: Added a $pmpro_core_pages global and using that in includes/init.php so we don't try to load preheaders and templates for pages added to that from other addons/etc.

  • ENHANCEMENT: Added pmpro_get_membership_level_for_user and pmpro_get_membership_levels_for_user filters to change the levels returned for a user with the pmpro_getMembershipLevelForUser() and pmpro_getMembershipLevelsForUser() functions.
  • ENHANCEMENT: Updated pmpro_hasMembershipLevels() function to search for expired members with "e" or "E". Also applies to [membership] shortcodes.
  • ENHANCEMENT: Added the pmpro_extra_page_settings filter to add additional page settings fields for use with add-on plugins, etc.
  • BUG: Fixed infinite redirect issues that would come up on servers setting $_SERVER['HTTPS'] to 'Off' vs 'off' or false. (Thanks, Gordon Seirup)
  • BUG: Using current_time('timestamp') in the sales report to avoid issues where sales at the beginning or end of the day aren't showing up under Today.
  • BUG: Fixed issues where delete links using the askfirst() JavaScript function would break for some language settings.
  • BUG: Added "CVV" and "What's This?" from the checkout page to the .pot file. (Thanks, Laurentc)
  • BUG: Fixed issue where preheaders/account.php was not loaded on the account page if you passed it sections params. (Thanks, sweettea)
  • BUG: Fixed issue where no data was showing up for the 31st of the month on the graph of the signups/cancellations report. (Thanks, David Koller)
  • ENHANCEMENT: Added the pmpro_extra_page_settings filter to add additional page settings fields for use with add-on plugins, etc.
  • ENHANCEMENT: Added the pmpro_next_payment filter to PayPal Express and Stripe gateways. These use the respective APIs to get the next payment date instead of estimating it from the date of the last order. These filters are in place, but haven't been enabled because hitting the API on each call could cause performance issues when exporting members or something else.
  • ENHANCEMENT: Now showing which levels a category is locked down for on the edit category page.
  • ENHANCEMENT: Updated the PayPal IPN handler to check the initial_payment_status and set order to "error" status if the payment failed. This will keep PMPro from counting the order in sales totals and can be used by gists and addons to tweak how orders are dealt with.
  • ENHANCEMENT: Filtering post_classes to add pmpro-level-required, pmpro-level-#, pmpro-has-access classes to post elements that require membership and/or the user has access to.

  • BUG: Fixed issue where addon information was not being updated. (Thanks, walcee, jeff1010ihs, and ron)
  • BUG: Fixed DB errors that would happen sometimes on brand new activations.
  • BUG: Fixed notices in the code that shows a member's payment amount on the edit user/profile page.
  • BUG: Fixed warnings that would show up if you used pmpro_getLevel('name') to get a level by name for a level that didn't exist.

  • BUG: Fixed notice in pmpro_reset_update_plugins_cache
  • BUG: Removed debug code from the PayPal Express gateway.

  • ENHANCEMENT: Added the pmpro_get_addons_timeout and pmpro_license_check_key_timeout filters to change the default timeout during addon and license key checks.
  • BUG: Fixed error handling during addon and license key checks.


  • BUG: Fixed bug where the subscription_transaction_id was not showing up in the orders CSV export.
  • BUG: Fixed bug where gateway subscriptions were not being cancelled when the "cancel at gateway" option was checked when changing a user's level on the edit user page.
  • BUG: Drag and drop for reordering levels has been disabled if there are < 2 levels or if the user is searching the levels list. (Thanks, Isaac Coleman.)
  • BUG: Fixed bug where sales and revenue charts would never show data for the 31st of the month. (Thanks, TYTNetwork)
  • ENHANCEMENT: Now showing the time in date column of on the orders page and in the timestamp column of the orders CSV export.
  • ENHANCEMENT: Added the pmpro_next_payment filter so you can alter how the next payment date is found. Also added a filter to the PayPal Express gateway class, but left it disabled for performance reasons.
  • ENHANCEMENT: Now zeroing out the initial payment and billing amount in pmpro_memberships_users when an order gets cancelled.
  • ENHANCEMENT: Modified how billing information shows up on the edit user page.
  • ENHANCEMENT: Added partial Finnish translations. (Thanks, Onni Hakala)
  • FEATURE: Overhauled the Add Ons page with one click installs and automatic updates of add ons for PMPro Plus members.

  • BUG: Fixed broken links when adminpages/admin_header.php is loaded outside of the PMPro settings tabs.
  • BUG: Fixed issue with PMPro page templates being loaded from child themes. (Thanks, SeventhQueen)
  • BUG: Fixed bug where gateway subscriptions would sometimes be cancelled even if an admin unchecked the "cancel at gateway" option when changing a user's level on the edit user page. (Thanks, Scott Noelle)
  • ENHANCEMENT: Added debugging to the Braintree webhook. Use define('PMPRO_BRAINTREE_WEBHOOK_DEBUG', true); in your wp-config.php to have debug emails sent to the admin when the Braintree webhook is hit.
  • ENHANCEMENT: Updated email fields on checkout and billing update form to use the "email" field type instead of "text". If you need to revert this back to "text" type, use the pmpro_email_field_type filter like this: apply_filters('pmpro_email_field_type', '__return_false'); (Thanks, Yann Kozon)
  • ENHANCEMENT: French translation updated and now includes email templates. (Thanks, Jean-Christophe Michel)
  • ENHANCEMENT: Added the pmpro_is_ready filter. This should be used by gateway plugins to set the $pmpro_gateway_ready global variable.
  • ENHANCEMENT: Added pmpro_memberslist_per_page and pmpro_orders_per_page filters to change the default number of items to show on those admin pages.
  • ENHANCEMENT: Added pmpro_new_user and pmpro_new_user_setup hooks to allow for alterring the user creation code at checkout. For an example of how to use these see ( (Thanks, David Crabill)
  • ENHANCEMENT: Now setting the Stripe API version in the Stripe class. (Set to version "2015-07-13" right now.) This ensures that Stripe processes PMPro API calls correctly. We will update this to the latest versions as they come out and we test PMPro against them. You will still need to update the API version in the Account Settings of your Stripe dashboard to versio 2015-07-13 (or later as we update the version we work against) so webhook events originating from Stripe are sent out in the correct format.

  • BUG: Fixed issue where subscriptions cancelled at Stripe wouldn't cancel the related PMPro membership if the membership was created after updating to v1.8. (Thank, Ninjami-Juho)
  • BUG: Now tracking "views" when the wp_head hook is fired instead of the "wp" hook. Previously page redirects and AJAX calls might have been counted as "views". Using wp_head will result in more accurate numbers (compared to something like Google Analytics, e.g.). Also note that the number of views will now be much much lower than before on some sites. (Thanks, Michael Cummings)
  • BUG: Fixed loading of email templates from language folders in themes, child themes, and languages folder. (Thanks, Karel Martens)
  • ENHANCEMENT: Added the pmpro_format_phone filter to change how phone numbers are formated. Param 1 is $r, the formatted phone number. Param 2 is $phone, the original phone number.
  • ENHANCEMENT: Added doc blocks to cleanPhone and formatPhone functions and the new pmpro_format_phone filter.

  • SECURITY PATCH: Fixes to Cross Site Scripting vulnerabilities in the PMPro settings pages in the WordPress dashboard. Advisory ID HTB23264. (Thanks, High-Tech Bridge Security Research Lab)

  • BUG: Fixed bug where dropdown to set the account page in the page settings was showing up twice.
  • BUG: Fixed warning in pmpro_account shortcode.
  • BUG: Grammar fixes in admin pages. "Setup" changed to "Set Up" when used as a verb. (Thanks, sumobi on GitHub)
  • ENHANCEMENT: If the option is set, terms of service page embedded on the checkout page will not be passed through do_shortcode so shortcodes get processed in the text. (Thanks, cliffordp on GitHub)
  • ENHANCEMENT: The pmpro_account shortcode will now accept "membership" or "memberships" for the section name.

  • BUG: Fixed issue introduced in 1.8.4 where levels wouldn't show up in the front end if they hadn't been reordered.


  • BUG: Fixed the Stripe webhook to work on new orders that are storing the subscription id instead of the customer id in the subscription_transaction_id field. (Thanks, nickd32 on GitHub)
  • BUG: Fixed issue where the name and email address of customers was not being sent to Stripe if existing members checked out while the "show billing address" option was set to false.
  • BUG: Fixed bug where users who checked out with the Braintree Payments gateway could checkout again using their on file credit card if an invalid credit card was entered at checkout the second time. (Thanks, patternsinthecloud)
  • BUG: Updated the 2Checkout PHP API library and fixed some issues with 2Checkout integration.
  • BUG: Fixed issue where custom roles had to have pmpro_membershiplevels capability to view other PMPro-related dashboard pages. (Thanks, squarelines)
  • ENHANCEMENT: Added the ability to order levels on the Levels page by drag and drop in the WordPress admin.
  • ENHANCEMENT: Now hiding tabs in the PMPro settings if a user doesn't have access to that tab (but does have access to other tabs).
  • ENHANCEMENT: Converted all files to unix format and removed trailing whitespace. This has no functional change on the plugin, but helps developers who are contributing. (Thanks, meths on GitHub)
  • ENHANCEMENT: New Danish translation. (Thanks, Morten Stenbæk and Frederik Hermund)

  • BUG: Changed some uses of $wpdb->base_prefix to $wpdb->prefix to fix multisite support.
  • BUG: Wrapped pmpro_isDateThisMonth in a function_exists check since some addons already have this defined.


  • SECURITY PATCH: The pmpro_getOption function has been updated to not set values from $_REQUEST when available. This allowed malicious users to override PMPro settings on single page loads allowing them to inject text into pages and do other "bad things". (Thanks, Charles Hill)
  • SECURITY PATCH: Many calls to pmpro_getOption("gateway") were changed to use pmpro_getGateway which specifically allowed for overriding that one value via a request parameter (the validity of the gateway is double checked).
  • BUG: No longer showing the number of visits/views/logins "this month" when the user hasn't visited in over a month. (Thanks, Kenneth)
  • BUG: Fix for email from names with apostrophes and quotes in them.
  • BUG: Using current_time() and escaping form values better in logins report.
  • BUG: Fixed issue in pmpro_generateUsername() when checking for duplicates. (Thanks, Ruslan)
  • BUG: Fixed issue where $user var wasn't set for emails sent out in the Braintree webhook script. (Thanks, Charles Hill)
  • ENHANCEMENT: Added pmpro_account_bullets_top and pmpro_account_bullets_bottom hooks to add content to the accounts page.
  • ENHANCEMENT: Added pmpro_get_recurring_payments_profile_details_nvpstr, pmpro_manage_recurring_payments_profile_status_nvpstr, pmpro_create_recurring_payments_profile_nvpstr, pmpro_do_express_checkout_payment_nvpstr, and pmpro_get_express_checkout_details_nvpstr hooks to filter specific nvp strings in the PayPal Express integration.
  • ENHANCEMENT: Added labels to checkboxes in the dashboard settings pages.
  • ENHANCEMENT: Can now use the [pmpro_account] shortcode on other pages/widgets/etc. Can also limit to specific sections [pmpro_account sections='membership,profile,invoices,links'] just remove sections from that list.
  • ENHANCEMENT: Changed all uses of the global $table_prefix to use $wpdb->base_prefix to aid in compatibility when loading WordPress with other PHP code (e.g. phpBB). (Thanks, Dion)
  • ENHANCEMENT: The notification script was updated to point to instead of This allows us to keep our notification script on a different server. This script is used to insert notifications into the PMPro admin pages when important updates are available.

  • BUG: Fixed conflicts when other plugins with older Recaptcha libraries are also activated. Prefixed our copy of the Recaptcha library and functions with pmpro_ and added code to handle cases where an older version of recaptch is used at checkout.
  • BUG: Fixed warnings in pmpro_formatPrice. (Thanks, Andrea Carraro)

  • BUG: Fixed issue where admins would get emails RE membership changes whenever a profile was updated even if the membership wasn't changed. (Thanks, chrisw123)


  • BUG: Fixed issue where calls to pmpro_hasMembershipLevel() using level names wasn't working. (Thanks, Scott Slone)
  • BUG: Fixed issue with memberslistcsv capabilities. (Thanks, Arnaud Devic)
  • BUG: Fixed fatal error that could come up sometimes when PMPro could not find a subscription for a user in Stripe. (Thanks, Chris Eller)
  • ENHANCEMENT: Triming whitespace off of search text on members list and orders list searches.
  • ENHANCEMENT: Security hardening of SQL queries for members list, orders list, and some helper functions.


  • BUG: Fixed typos in pmpro_memberslist_csv and pmpro_orderscsv capabilities. (Thanks, Arnaud Devic)
  • BUG: Only loading the Braintree API when using it now.
  • BUG: Fixed fatal error that would occur at checkout if PayPal Standard were used with a discount code. (Thanks, John Zeiger)
  • BUG: Fixed issue where discount codes would not work if billing address fields were hidden. (e.g. paying by PayPal or check)
  • BUG: Fixed issue with the logic around sending emails when admin's change a member's level or expiration date. Admins will always get an email. Members will only get an email if the checkbox is checked.
  • ENHANCEMENT: No longer showing check instructions at checkout if the level is free.
  • ENHANCEMENT: Added pmpro_stripe_create_subscription filter. (Thanks, nickd32 on GitHub)
  • ENHANCEMENT: Added Czech (cs_CZ) language files and support for using decimals as separators. (Thanks, Martin "shr3k" Kokeš on GitHub)


  • ENHANCEMENT: Payment gateway classes updated so all settings and checkout fields are processed via the gateway class file. This will make it easier to maintain, update, and add new gateways.
  • ENHANCEMENT: Added a pmpro_after_membership_level_profile_fields hook after the "Membership Level" field dropdown on the edit profile page.
  • ENHANCEMENT: Added new statuses for orders when cancelled. cancelled = cancelled by user on cancel page or via gateway, cancelled_admin = cancelled by an admin, expired = cancelled via expiration script, level_change = user upgraded/downgraded to a different level.
  • ENHANCEMENT: All gateways use the $pmpro_currency global instead of getting the value via pmpro_getOption.
  • ENHANCEMENT: Changing South African Rand (ZAR) to use the symbol R to the left of prices. (Thanks, Rasada)
  • BUG: Fixed some translation issues on the checkout page and in level cost text. (Thanks, Jenkisan)
  • ENHANCEMENT: Added plural forms of Day, Week, Month, Year to es_ES translation. Other translation files will need to as well.
  • BUG: Fixed bug where the $short parameter of pmpro_getLevelCost wasn't shortening the output in some cases. (Thanks, Kimberly Coleman)
  • BUG: Fixed warning in membership dropdown on edit user/profile page. (Thanks, Thomas Sjolshagen)
  • ENHANCEMENT: Added German (de_DE) translation files. (Thanks, Cedros)
  • ENHANCEMENT: Added Dutch (nl_NL) translation files. (Thanks, Het Verzamelteam)
  • ENHANCEMENT: Added settings links to plugins page.
  • BUG: Fixed bug in Safari for iOS where checkout submission would fail after choosing "Not Now" when prompted to save the card.
  • ENHANCEMENT: Added user row actions to the members list and orders list in the dashboard. Add actions using the pmpro_memberslist_user_row_actions and pmpro_orders_user_row_actions filters which work the same as the core WP user_row_actions filter.
  • BUG: Fixed issues with the membership shortcode and pmpro_hasMembershipLevel function.
  • ENHANCEMENT: Can now use L or -L to check if a user is logged in (L) or not (-L) in the membership shortcode or pmpro_hasMembershipLevel function.
  • ENHANCEMENT: Updated to the new version of Google's ReCaptcha.
  • BUG: Fixed issue with quotes and other special characters in membership level names, descriptions, and confirmations. (Thanks, Marcelo Hinojosa)

  • BUG: Now correctly setting $saveid when a discount code is created so the pmpro_save_discount_code hook will have the correct id value when codes are created.
  • BUG: Using get_userdata in checkout code for better multisite support when setting default role of new users.

  • BUG: Stripe JS looks for a field with id AND name = CardType now so the new checkout code is compatible with older checkout templates and will avoid "complete all fields" errors.
  • BUG: Removed the urlencode wrappers on the Payflow API calls. Payflow seems to expect the values to be NOT encoded.
  • BUG: No longer running email content through wpautop if there is already HTML in an included header or footer for the email. (Thanks, Erik Bertrand)

  • BUG: Fixed issue where "complete all required fields" was being shown when using Stripe. They are calling the CardType "brand" in their return object, not "type".
  • BUG: Removed code from includes/notifications.php that was deleting the transient used to keep PMPro installs from hitting the PMPro server too often.
  • ENHANCEMENT: Added the "pmpro_checkout_signon_secure" filter so you can tell PMPro to login over http or https in case other plugins (like WordPress MU Domain Mapping) conflict with what should be chosen here.
  • Avoiding some warnings.


  • SECURITY FIX: The /services/getfile.php script has been disabled by default. You must set the PMPRO_GETFILE_ENABLED constant to true or 1 to allow the script to run. Additionally, the script will strip ../ and /. type strings out of the URI when looking for files to get and will not read any files using the extensions set via the pmpro_getfile_extension_blacklist filter. By default inc, php, php3, php4, php5, phps, and phtml file types are not allowed. (Thanks, Kacper Szurek)
  • BUG: Fixed issue with Stripe integration where existing members checking out for new recurring subscriptions would receive extra charges. Now deleting the old Stripe subscription and any related open invoices and creating a new subscription instead of just updating the old subscription. (Thanks, Antonv and Thomas Sjolshagen)
  • BUG: Fixed issue with Braintree integration where the billing address associated with a credit card was not being updated via the update billing page. (Thanks, Keith Abramo)
  • BUG: Fixed issue where pmpro_next_payment() would return a 0 timestamp instead of false when there is no previous order. (Thanks, Thomas Sjolshagen)
  • ENHANCEMENT: Added pmpro_formatPrice() and pmpro_getCurrencyPosition() functions. Now using them to render prices with formatting. You can use the pmpro_format_price filter or pmpro_currecies filter to adjust the formatting of prices to support currency symbols after the price or to use commas instead of periods for separators.
  • ENAHNCEMENT: Added getSubscriptionStatus() to gateway class. Also fixed up some of the logic around checking the gateway environment.
  • BUG: Now urlencoding the API Username and Password sent through the PayPal APIs in case your values have + or other special characters in them. (Thanks, mrschmiddy)
  • BUG: Now showing cycle number in the Fee column of the members list. E.g. a level that is $10 every 3 months will now show up as $10.00 + $10.00/3 Months.
  • BUG: Fixed bug where user first_name and last_name were being overwritten by PayPal values when using PayPal Standard.
  • ENHANCEMENT: Added PMPRO_CRON_LIMIT constant, which can be used to limit the number of records processed by each scheduled cron job. This can for example, keep your server from going over PHP time limits or email limits. Use define('PMPRO_CRON_LIMIT', 100); to set the limit to 100.
  • BUG: Discount code AJAX calls now going through admin-ajax.php, fixing issues where the Themed Profiles module of Theme My Login would block those calls. (Thanks, Tony)
  • ENHANCEMENT: Removed the "CardType" field at checkout and now using the jquery.creditCardValidator script to determine the card type on form submit.
  • BUG: No longer setting $order->subtotal and invoice total to the billing amount (vs the initial price) for recurring payments with Cybersource, PayPal Standard, PayPal Express or Twocheckout. (Thanks, Joce Nunes)
  • ENHANCEMENT: The search filter will no longer filter out a post that is in a category blocked by one membership level if the user also has access to that content through another category.
  • BUG/ENHANCEMENT: Running email body through wpautop if it doesn't look like HTML.
  • ENHANCEMENT: Added pmpro_getfile_before_error hook in getfile.php.
  • ENHANCEMENT: Added pmpro_ipn_check_receiver_email filter if you want to change how the email is checked in the IPN log.
  • BUG: Fixed bug where reports would show duplicate month labels on the last day of the month.
  • BUG: Fixed some issues with logging in at checkout, especially when using FORCE_SSL_ADMIN. (Thanks, Wimans)
  • ENHANCEMENT: Added "pending" as a default status for orders available on the edit order page in the dashboard.

  • BUG: Removed the debug call to d($...) that was left in preheaders/checkout.php and would show up when checkout forms were submitted with empty fields. (Thanks, Nicolas)

  • BUG: Fixed warnings in PayPal Express class that could break redirects at checkout. (Thanks, Adam Warner)
  • BUG: Fixed issue where new users who checked out with Braintree weren't having their customerid's saved, which led to subscription syncronization issues if they checked out again or updated their billing.
  • BUG: Fixed warnings in the membership-billing page.
  • BUG: Fixed false positive "There are JavaScript errors on the page. Please contact the webmaster." errors.
  • BUG: Fixed issue where users on some sites running 1.7.14 could not logout.
  • OTHER: Changed the CSS class of the checkout button generated via [checkout_button] shortcode or pmpro_getCheckoutButton() function from "btn btn-primary" to "pmpro_btn" to match other buttons generated with PMPro.


  • BUG: Fixed bug where level cost would sometimes have incorrect pluralization of months/weeks/etc. (Thanks, Kevin Ackerman)
  • BUG/ENHANCEMENT: Now checking the child and parent theme for email_header.html and email_footer.html files to use for emails. The child theme is checked first.
  • ENHANCEMENT: Added pmpro_getfile_before_readfile hook (passes $filename and $mimetype params) in getfile.php
  • BUG/ENHANCEMENT: getMembershipLevel met

I need help installing, configuring, or customizing the plugin.

Please visit our premium support site at for more documentation and our support forums.

I found a bug in the plugin.

Please post it in the WordPress support forum and we'll fix it right away. Thanks for helping.

My site is broken or blank or not letting me log in after activating Paid Memberships Pro

This is typically caused by a conflict with another plugin that is trying to redirect around the login/register pages or trying to redirect from HTTP to HTTPS, etc.

To regain access to your site, FTP to your site and rename the wp-content/plugins/paid-memberships-pro folder to wp-content/plugins/paid-memberhsips-pro-d (or anything different). Now WP will not be able to find PMPro, and you can gain access to /wp-admin/ again. From there, visit the plugins page to fully deactivate Paid Memberships Pro. (You'll want to rename the folder back to paid-memberhsips-pro again.)

Long term, you will need to find and fix the conflict. We can usually do this for you very quickly if you sign up for support at and send us your WP admin and FTP credentials.

Does PMPro Support Multisite/Network Installs?

"Supporting multisite" means different things to different people.

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 Network/Multisite Add On allows members to choose a site name and title at checkout and will set up a network site at checkout.

Our Network Membership Add On 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, sign up for support at

Does PMPro Support X?

Not sure? You can find out by doing a bit a research.

  1. Check our compatibility page.
  2. Check our add ons.
  3. Do a search on our site.
  4. Ask in the forums here.

Requires WordPress version: 4 or higher

Compatible up to: 4.7.2

Last Updated 06 Feb 2017

Date Added: 06 Jul 2011

Plugin Homepage


4 stars
181 ratings


Not Enough Data

Works: 0
Broken: 0