Plugin Directory

Paid Memberships Pro

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


  • 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 non-WordPress.org 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 (https://github.com/strangerstudios/paid-memberships-pro/pull/224). (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 notifications.paidmembershipspro.com instead of http://www.paidmembershipspro.com/notifications/. 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 Authorize.net 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 method of MemberOrder can now handle when discount_code property is an object. Also, the IPN Handler and 2Checkout handler will now try to get the discount code for the order to correctly update the users pmpro_memberships_users entry.
  • BUG: Removed extra class attribute from CVV field that interfered with the required * JS code and some other CSS/JS-related things. (Thanks, catapult)
  • ENHANCEMENT: Added code to redirect to the redirect_url if you pass a redirect_url to the login page and the user is already logged in. Updated the links in email confirmations to use login links with redirects instead of direct links.
  • EHANCEMENT: Added pmpro_email_attachments filter, which can be used to add attachments to PMPro emails that are sent out. E.g., https://gist.github.com/strangerstudios/c4e771dca8723613bce3

  • Fixed bug introduced in 1.7.12 where discount code uses were not being tracked.
  • Added pmpro_check_discount_code filter so you can do your own checks on discount codes.


  • Added Danish (da_DK) translation. (Thanks, Mikael)
  • Fixed bugs with timestamps in various places (especially around trial dates) introduced in 1.7.12
  • Another fix to keep PMPro from sending "undefined undefined" as the name to Stripe when the 'don't show billing fields' option is chosen.
  • $pmpro_stripe_verify_address flag defaults to same value of Stripe's showbillingaddress option now.
  • Changed the priority of pmpro_applydiscountcode_init hooking on init to 11 so pmpro_init() will run before and setup pmpro_currency_symbol among other things. (Thanks, semyou on GitHub.)
  • Explicitly setting $current_user->membership_level in a few places to avoid issues where current_user is overwritten between init and when we try to use it.
  • Avoiding a warning in pmpro_getMetavalues() function. (Thanks, Scott Sousa)
  • Added target="_blank" to help links on admin pages. (Thanks, AntonVrba on GitHub)


  • Now including expiration text in text that is updated when a discount code is used. (Thanks, John Zeiger)
  • Fixed check for subscription_transaction_id in readonly fields array.
  • Making sure that $myuser->membership_level is set in pmpro_has_membership_access().
  • Added Norwegian locale files. (Thanks, Maritk)
  • Added Turkish locale files. (Thanks, yasinkuyu on GitHub.)
  • Fixed error where "undefined" was being passed to Stripe for the name.
  • Fixed error with setting enddates on the edit user page for users with multiple "active" memberships.
  • "Renew" link will show up on levels page only if the user has the level and it is not recurring and has an enddate.
  • Stripe gateway is using $pmpro_currency global instead of getting value via pmpro_getOption, so it can be overridden via code like https://gist.github.com/strangerstudios/8806443
  • Payflow Pro gateway is now passing the currency code to the API for non-US currencies. (Thanks


  • Added "Filter searches and archives?" setting to advanced settings tab. If you had "Show excerpts to non-members?" set to No before, then this will be set to Yes after upgrade. But now you can show excerpts on single post pages while still hiding restricted content from searches and archives.

  • Fixed MySQL warning/error that was introduced in and showing for some people who had "hide excerpts" enabled.

  • Fixed bug where the $pmpro_levels global would sometimes not include all levels on the levels page. (A better fix for this is coming in v2.0.)
  • Fixed bug in pmpro_getMemberDays that sometimes reported more days than the user had really been a member. (Thanks, surefireweb)
  • Fixed bug where search results were being incorrectly filtered. The pmpro_search_filter() function in includes/content.php hides member content from non-members if the "show exceprts" setting is set to false.
  • Now checking specifically for payment_status = 'Failed' in the IPN handler before sending off the payment failed emails. (There may be other statuses we want to consider as "failures" as well, but we want to avoid failing on "pending" statuses/etc.)


  • Added getGatewaySubscriptionStatus() and getGatewayTransactionStatus() methods to the MemberOrder class. These are implemented for PayPalExpress right now and will hit the gateway API to return information on a subscription or transaction.
  • Added pmpro_memberslist_expires_column filter to members list. $order is passed as second parameter. Use this to filter the date or "Never" shown in the Expires column.
  • No longer showing "Membership Levels" link in dashboard menu if a user has access to other PMPro settings pages, but not the membership levels page.
  • Added pmpro_applydiscountcode_return_js hook. http://www.paidmembershipspro.com/hook/pmpro_applydiscountcode_return_js/
  • Fixed formatting of the level cost when a discount code is applied via AJAX.
  • Removed extra $ in checkout_check.html email template.
  • Fixed bug where pmpro_setOption was not working for array values in $_POST, e.g. the hideadlevels setting on the Advanced Settings page.
  • pmpro_getMembershipCategories($level_id) now returns an array of category IDs instead of an array of arrays.
  • Swapped all _x function calls to use __ or _e so they are translated.
  • Initial Czech Republic (cs_CZ) translation files. (Thanks, Petr Hlaváček)

  • Firing activation hook on upgrade so menu doesn't disappear.


  • Updated PayPal Express/Standard/WPP gateways to throw an error when trying to cancel a subscription that is in pending or suspended status. A warning is shown to the user to contact the site owner or cancel the subscription through PayPal. The WP admin should also get an email about the failure. In the future, there may be a better way to handle these situations automatically, but PayPal doesn't advise how to "cancel" pending subscriptions.
  • Added optional $membership_id parameter to getLastMemberOrder() method of the MemberOrder class. So you can get the last member order of a specific level.
  • Added Slovakian translation. (Thanks, Peter Belko)
  • Added WP capabilities for each PMPro settings or report page. Admins are given these caps on plugin activation. Or you can set up other roles to use these caps. E.g. https://github.com/strangerstudios/pmpro-membership-manager-role/

  • Updated the Stripe API library to version 1.11.0.
  • Fixed issues where users upgrading or downgrading would have their subscriptions cancelled at Stripe.
  • Fixed issues where extra emails were being sent out when users cancelled a membership when using Stripe.
  • Generally made the Stripe integration better and ready for version 2.0.
  • The Stripe webhook will now add a 5 second delay before processing most requests. This is to ensure that PMPro has time to update the order during checkout (Stripe can sometimes receive a charge or cancellation, then send the webhook, and WP can process that in the split second it takes PMPro to save an order during checkout.). This prevents duplicate orders in the PMPro DB on some charges and fixes some issues with cancellations.
  • Setting constant PMPRO_STRIPE_WEBHOOK_DEBUG to true will send an email to the WP admin every time the Stripe Webhook is hit. You can also set it to an alternative email address or "log" to have it added to ../paid-memberships-pro/logs/stripe-webhook.txt.
  • Setting constant PMPRO_IPN_DEBUG to true will send an email to the WP admin every time the IPN handler is hit. You can also set it to an alternative email address or "log" to have it added to ../paid-memberships-pro/logs/ipn.txt.
  • Now showing the PMPro order ID/code in INVOICE emails instead of the Stripe order id when using the Stripe gateway.

  • Important fix for Braintree Payments users. Credit card information is now correctly updated in Braintree when users submit the form on the billing information page or checkout again on the site. (Thanks, Bryan Paronto and venrooy)
  • Updated Italian translation files. (Thanks, Angelo Giammarresi)
  • Fixed string wrapping in reports for translation.
  • Fixed PHP warning in membership stats report.


  • Added various hooks.
  • Updated the expiration field dropdown on the edit levels page to use translation strings. (Thanks, 24uurdates)
  • Fixed other missing strings for translation. Added Right-to-Left support. (Thanks, louy on GitHub.)
  • Added the pmpro_member_startdate filter to filter the pmpro_getMemberStartdate function. Passes $user_id, and $level_id as parameters.
  • Added pmpro.getMembershipLevelForUser and pmpro.hasMembershipAccess XMLRPC methods. Example usage: https://gist.github.com/strangerstudios/9099164
  • Moved the Terms of Service page/etc to right above the checkout button.
  • Now caching the pmpro_getAllLevels() function.
  • Added HTML wrappers to the JS on checkout.php. Helps with validation and potentially really old browsers.
  • Fixed warnings in includes/login.php.
  • Added pmpro_delete_discount_code and pmpro_delete_membership_level actions which run just BEFORE a membership level is deleted. Both pass the discount code ID or level ID respectively.
  • Added a third "short" parameter to the pmpro_getLevelCost() function. If set to true the "The price for membership is" text is left off the beginning. The new levels page uses this param.
  • Updated the table on the levels page to have one "Price" column showing the cost and expiration text. The text is generated using pmpro_getLevelCost and pmpro_getLevelExpiration instead of its own rules.
  • Updated level cost text to say $1/mo instead of $1 now and then $1/mo, etc. (Thanks, louy on GitHub.)
  • Added a debug by email method for the Authorize.net Silent Post handler. Add define('PMPRO_AUTHNET_SILENT_POST_DEBUG', true); to your wp-config.php. We will probably move the other services to debug by email as well.
  • PMPro will now only filter the from name and email if the default values are detected (WordPress wordpress@sitename.com). This fixes issues where the from name and email on form emails or other plugin emails were being swapped out with the PMPro settings, which was not always desirable. (Thanks, Helen Hou-Sandi and others.)
  • Added an "Only Filter PMPro Emails?" option to the email settings. If checked, only emails sent through the PMProEmail class will have their from name and email adjusted to match the PMPro email settings.
  • Added filter options to orders page in admin and export. (Thanks, HTCIA and Harsha Venkatesh)
  • Added Brazilian Portuguese translation. (Thanks, dballona on GitHub.)
  • Fixed some warnings. (Thanks, AlexBiddle on GitHub.)
  • Added pmpro_custom_advanced_settings hook to add settings to advanced settings page. Details on usage here: https://github.com/strangerstudios/paid-memberships-pro/pull/86 (Thanks, Jess Oros)
  • Updated addon categorization to reflect a lot of addons which have moved into the WordPress.org repository as well as updated versions.


  • Fixed bug where user_id = '' was breaking on some MySQL setups and keeping the pmpro_membership_orders table from being populated.
  • Updated "Joined" column in members list to use the WP date format setting.
  • Removed redundant phone number on checkout page if bphone is already set.
  • When adding extra columns to the Members List CSV export via pmpro_members_list_csv_extra_columns, we are now passing the original heading/field name to callback function. So you can use that in your callback functions. This generally means you can use one function that just dumps the meta value rather than requiring a separate function for each meta value.
  • Fixed bug where "Show Billing Fields" option was visible on the payment settings page for the testing gateway. (This option is only for Stripe.)
  • Fixed bug with choosing levels to hide ads from on advanced settings tab. (Thanks, Alain Fradette)
  • Fixed bug where PayPal Express was adding tax twice for subscription charges. (This does not fix existing subscriptions on the PayPal side.)
  • Fixed bug with the Stripe Webhook where non-PMPro orders were being added to PMPro via the webhook. If the customer_id cannot be found (i.e. it's a non-PMPro customer), the order is ignored. (Thanks, Jacob Glenn)
  • The getMemberOrderByPaymentTransactionID() function has been updated to return false if no payment_transaction_id is passed in (instead of finding the first order where the id is blank). This is inline with the getMemberOrderBySubscriptionTransactionID() function.
  • Fix to code that hides posts from search to NOT hide posts that a user has access to but might also be accessible by users of a different level. (Thanks, normanyung on GitHub)
  • Added a pmpro-en_GB translation that changes "State" to "County" on the billing address fields. (Thanks, alexbiddle on GitHub)


  • Added "Old Members" option to the members list page to view members who don't have an active membership, but did in the past. (Note that we don't differentiate between members who expired and who cancelled.)
  • The PayPal IPN Handler has been updated to process "subscr_cancel" messages from PayPal. This should cancel memberships in WP/PMPro when users or PayPal admins cancel a subscription at PayPal when using PayPal Express or Website Payments Pro. There are still known issues with syncing cancellations with PayPal Standard.
  • Fixed bug where "error cancelling subscription" emails were being sent out erroneously. These should only go out now if PMPro has trouble cancelling a subscription. If you got a lot of these before, you should get less. If you never got this, you might start getting it sometimes.
  • Orders are now set to "cancelled" status whether any attached subscriptions were cancelled or not. (Keeps us from trying again.)
  • Fixed bug where All Pages view in WP dashboard would sometimes redirect to the registration page if you had Theme My Login installed.
  • Setting startdate to NOW() when a user's level is changed via pmpro_changeMembershipLevel() using a level ID... also when admin's manually change a user's level. This fixes issues with PMPro Series where users who were given a level this way appear to have a start date in 1970, etc.
  • Fixed bug with the pmpro_save_discount_code_level filter where -1 was being passed as the code_id for brand new codes.
  • Updated "The ____ code has been applied to your order" message to it is wrapped for localization.
  • Now checking ICL_LANGUAGE_CODE instead of $_REQUEST['lang'] to support WPML using different language URL formats.
  • Unsetting $all_membership_levels[$user_id] at the bottom of pmpro_changeMembershipLevel().
  • Added $force parameter to pmpro_getMembershipLevelForUser($user_id, $force). If set to true, it will ignore the cached value and pull the level from the DB.
  • Added autocomplete="off" to credit card account number field on checkout and update billing pages.
  • Added an optional $seed parameter to pmpro_getDiscountCode() which will add $seed to the scrambled string. Useful when generating many discount codes quickly and time() might not have changed.
  • Now hiding "Change Membership Level" link from Member Links section of Membership Account page if PMPRO_DEFAULT_LEVEL is defined.
  • Clearing the AccountNumber value at checkout if it is XXXX..., e.g. when we mask the Stripe CC number. This way users will know they need to re-enter the credit card again. (Thanks, Gary)
  • Fixed bug on checkout page where html classes for the bstate field were being set based on the bcity value instead.
  • Fixed bug where there was no space after the "." in some level cost text. (Thanks, multiple observers ;)
  • Added some explanatory text to the payment settings page about taxes and SSL seals.
  • Added a pmpro_formatAddress() function to format billing addresses/etc.
  • Fixed bug where blank billing addresses were showing up in confirmation emails. If you use custom email templates, update them to use the !!billing_address!! variable instead of the full address section.
  • Design updates to checkout buttons, admin screens, etc, to work better with WP 3.8 and the TwentyFourteen theme.


  • Fixed all open bugs with 2Checkout gateway. You can now use this gateway for one time and recurring levels. We're still keeping the beta message though until we have further live testing.
  • The shortcodes for the PMPro pages (e.g. pmpro_levels/etc) will now work on multiple pages. Things may still act funny if you put the shortcodes on pages other than those set in the page settings, but you can do so if you know what you are doing. One limitation still in place is that you can only have one PMPro page shortcode per page. Whichever comes first will be used.
  • Added support for WPML. Simply make a copy of each PMPro page for each language. Set the PMPro page settings to the default language pages.
  • Updated pmpro.pot template along with a script gettext.sh that will allow us to easily update the pmpro.pot file when we need to.
  • Updated the pmpro_url function, should work the same but if you use addons or customizations and notice bugs around URLs, let me know.
  • Fixed bug where old membership data was being included in the members list export instead of the latest active membership data.
  • Filtering $morder->membership_level at checkout as well as $pmpro_level global.
  • When loading bemail and bconfirm email from user meta for existing users, just setting them both to $bemail so different emails don't show up.
  • Now sending a member's email address to Stripe when customers are created/updated.
  • No longer running wpautop on email via pmpro_send_email filter.
  • If first_name and/or last_name are passed at checkout, these are used to create a new user instead of bfirstname and blastname.
  • Added "view" links to the page settings page.
  • Fixed some potential warnings in adminpages/reports/login.php.


  • Updated PayPal IPN to use HTTP 1.1 and "Connection: Close" per recent PayPal IPN updates.
  • Fixed bug with slashes being added to the SSL Seal text when Payment Settings are saved.
  • Now applying the pmpro_checkout_level filter when a membership level is loaded from an order during the review step with PayPal Express checkouts. This will fix many customizations that might have not worked with PayPal Express.
  • Cleaned up PayPal Express API integration a bit. Fixes some bugs on sites with one-time payments and taxes calculated in.
  • Change the use_ssl payment setting. You can choose "No" now for gateways that require SSL. Just make sure you set it to Yes when going live or use another method to force SSL on your checkout page. You can also set it to Yes (use JavaScript redirect) to fix some issues that come up with infinite redirects on shared hosting with specific caching/proxy techniques.
  • Optimized the members list and orders CSV exports to run with less memory. Especially important for large sites.
  • Including Italian, French, Spanish/Peru, and Spanish/Chile language files contributed from the community. Thanks Mirco Babini (mirkolofio on GitHub) and Javier Monorové (zillionsk8 on GitHub)
  • Fixed the email template issue for admin emails as well. The email sent to admins for free checkouts won't include the empty billing address info anymore. (Thanks, inator on GitHub)
  • Now redirecting from /register/ to PMPro levels page when latest versions of Theme My Login are activated. Can still disable by returning false with the pmpro_register_redirect or pmpro_login_redirect filter.
  • Now showing a "renew" button for the current user's level on the levels page if their level is not recurring.
  • Fix in crons.php where in rare cases the pmpro_expiration_notice meta was not being set correctly for users, which might lead to multiple expiration warning emails.
  • Updated pmpro_next_payment to work for any cycle number or period. (Thanks, antonv and others.)
  • Now checking for a logged in user before trying to get a billing address to prepopulate at checkout.
  • Updated frontend.css to make sure that background gifs in error messages aren't repeated or applied to dropdowns.
  • Added some currencies: CNY, INR, IDR, KRW, TRY, VND, ZAR
  • All currencies now available to all gateways. You still need to make sure that your gateway supports the chosen currency.
  • Now sending all emails from the PMProEmail class from the pmpro_getOption("from_email") setting. Some were sent from the get_option("admin_email") setting before.

  • Using MySQL to calculate months since first order instead of date_diff, which is only available in PHP 5.3+


  • pmpro_longform_address and pmpro_international_addresses now default to true. See this gist to go back to US-specific address format: https://gist.github.com/strangerstudios/6478242
  • Added "Show Billing Address Fields" option for the Stripe payment gateway. Set to 'No' to hide billing address fields. Replaces the functionality of the "Stripe Lite" plugin.
  • Added language files for es_ES, es_CL, and es_PE. Thanks, Javier Monorové (zillionsk8 on GitHub).
  • Added language files for fr_FR. Thanks, Jérémy De la casa.
  • NOTE: Language files may not be complete. The get involved, join us on GitHub.
  • Added Cybersource and 2Checkout gateways in beta.
  • Added pmpro_paypal_button_image filter so you can override the URL of the PayPal button image.
  • Added a new report showing signups vs. cancellations, monthly recurring revenue, and lifetime value.
  • Fixed issue where the checkout_paid template was always being used for emails. It now checks if the level at checkout is free and sends either the checkout_free, checkout_paid, or checkout_trial templates accordingly. (Thanks, inator on GitHub)
  • Fixed sales report to not show $ when hovering over bars for "sales" vs. "revenue".
  • Fixed issue where PayPal Standard levels using a billing frequency > 1 (e.g. every 3 months) would have an extra payment charged after one period.
  • Fixed SQL error in discount code admin page that could result in cycle_periods of code levels saving incorrectly. (Thanks, Sam D'Amico)
  • Removed note that Payflow gateway doesn't support recurring payments. It does.
  • Now passing the membership level id in the $data var for checkout and cancellation emails. The key is "membership_id" so use $data['membership_id'] to check/access it.
  • No longer setting the subtotal property of orders when the "subscribe" method of the gateways is called. This will fix cases where an initial order or a subscription with a free trial showed a charge amount > $0.
  • Clicking enter in discount code box at checkout will no longer submit form and will click the "apply" button.
  • Hiding the "Apply" button on the checkout page if a discount code was passed in. Showing it if the text field is changed.
  • Authorize.net now supports CAD, GBP, and EUR currencies (for US merchants only) http://community.developer.authorize.net/t5/The-Authorize-Net-Developer-Blog/Authorize-Net-Expansion-into-Canada-the-United-Kingdom-and/ba-p/33690
  • Fixed notice in getfile.php
  • Fixed notices and expiration dates in login report.
  • Fixed notices in includes/notifications.php (Thanks, Nilesh)
  • Allowing dashes (-) in discount codes now.

  • Fixed warning when trying to load the "free" gateway on free level checkouts.
  • Fixed warning coming from login report tracking.
  • Changed all $wpdb->escape() calls to esc_sql() to fix notice.
  • Fixed another bug in revenue/sales report for daily charts. (backported to 1.7.2, but a few people who upgraded missed it)
  • Fixed bug on add/edit level page that was causing issues in some versions of IE.
  • Fixed bug where links in the email_header.html and email_footer.html templates were not being converted to true links.
  • Removed an extra $ from the PayPal Express confirmation emails.
  • Fixed loading of local (in the paid-memberships-pro/languages directory) translation files. (Should have some bundled with the plugin soon.)


  • Fixed the revenue/sales report to accurately track recurring sales and reports from earlier years.
  • Now trimming whitespace on any text field updated through the PMPro settings pages. This prevents issues like those that come up if you have whitespace in your Stripe API key, etc. Thanks, Scott Sousa.
  • Added discount code use tracking for PayPal Standard. Saving the use before the user goes to PayPal to pay.
  • Added discount code id and code columns to orders and members list CSV exports.
  • Changed default capability check to 'manage_options' (administrator), and added a filter named 'pmpro_edit_member_capability' to allow dev's to change this capability. Thanks, Scott Sousa.
  • Now removing empty (only includes the PMPro shortcode) PMPro pages when uninstalling PMPro. Thanks, Scott Sousa.
  • Now adding classes to the body tag (if the theme supports it through the body_class() function) to aid in design. Classes are pmpro-account, pmpro-billing, pmpro-cancel, pmpro-checkout, pmpro-confirmation, pmpro-invoice.
  • Adding $0 orders for free level checkouts (will help reporting).
  • Added pmpro_invoice_bullets_top and pmpro_invoice_bullets_bottom hooks to confirmation and invoice pages. Passes $pmpro_invoice.
  • Fixed members list CSV export for lists with search queries.
  • Added is_ssl() check to pmpro_https_filter so PMPro will add HTTPS to URLs even if the $besecure global hasn't been set yet. Thanks, Andrew Calaio at wpcurve.com.
  • Removed the pmpro_cron_trial_ending_warnings daily cron so trial ending emails will no longer go out. The function pmpro_cron_trial_ending_warnings() is still there if you want to call it yourself. There were issues on some sites where these emails were going out erroneously and also many ways of doing "custom trials" including setting the subscription start date back a certain number of days was not picked up as a trial by this script anyway.
  • Added the pmpro_cron_credit_card_expiring daily cron to send out warnings a month or so before credit cards on record are set to expire.
  • Updated pmpro_has_membership_access to return true if the $post_id is empty or cannot be found. This fixes issues where member warnings were being added to non-pages, e.g. the bbPress forums archive. To lock down "pages" like this, you'll need to use custom coding, URL detection, etc. Thanks, Scott Sousa (scottsousa on GitHub and WP.org) from Slocum Studio.


  • Design updates to frontend and backend pages.
  • Added Sales and Revenue Report.
  • Fix to Braintree webhook that should help get it verified by Braintree more easily.
  • Fix to PayPal IPNHandler to check both that either the primary or the business email address sent from PayPal matches the one stored in the payment settings.
  • Added pmpro_ajax_timeout hook to change the timeout limit from 2000 (2 seconds) to something else.
  • Fixed bug that occurred when the pmpro_register_redirect filter returned false or a blank link. Thanks, Vladimir Garagulya.
  • Added pmpro_paypal_standard_nvpstr and pmpro_set_express_checkout_nvpstr filters to change or add parameters to an name-value-pair string sent to PayPal in a couple cases.
  • Fixed checkout failure on Free level when in mySQL Strict Mode. (Thanks, inator on GitHub)
  • Only checking pmpro_checkForUpgrades in admin/dashboard now. (Thanks, topdown on GitHub)
  • No longer loading recaptcha library in the admin. Also wrapped the recaptchalib require in an init function to delay it a bit so we can check if other plugins have already loaded it.
  • PMPro-Mailchimp and WP-Bouncer have been moved into the WP repository. Other Add-on upd

Requires: 3.5 or higher
Compatible up to: 4.3.1
Last Updated: 2015-10-1
Active Installs: 40,000+


4.1 out of 5 stars


11 of 93 support threads in the last two months have been resolved.

Got something to say? Need help?


Not enough data

0 people say it works.
0 people say it's broken.

100,1,1 100,1,1 0,1,0 100,2,2 67,3,2 0,1,0 100,1,1
100,1,1 100,1,1
100,1,1 100,1,1 100,1,1 100,1,1 100,1,1 100,1,1 100,1,1 100,1,1
100,1,1 50,2,1 0,1,0
100,1,1 100,1,1
100,1,1 100,1,1 100,2,2
100,1,1 100,1,1 100,1,1
100,1,1 100,1,1 100,1,1 100,1,1 67,3,2 0,1,0
0,1,0 50,2,1 100,2,2 100,3,3
100,1,1 100,1,1
100,1,1 100,1,1
100,1,1 100,1,1 50,2,1
100,1,1 0,1,0
100,1,1 50,4,2 100,1,1
100,4,4 100,1,1
67,3,2 50,2,1
0,1,0 100,1,1