PMPro Update

Version of Paid Memberships Pro is out with a handful of bug fixes and enhancements.

About the Update

In this update, a specific bug with the Braintree webhook has been fixed which may have resulted in out of sync subscriptions and/or missing orders for recurring payments.

Upgrading to version will fix this issue for new users and recurring orders going forward. We are working on a script to fix subscriptions that may have gone out of sync (i.e. cancel memberships for users who stopped paying last month) and find orders that didn’t make it into the PMPro database. When this script is available, we will update this post and send out another update to let you all know about that.

Please update Paid Memberships Pro from the plugins page of your WordPress dashboard. You can also get the latest version of PMPro here or version specifically here.

The full list of updates is below.

  • BUG FIX: Fixed fatal error in the Braintree webhook that will have caused syncing issues for Braintree users.
  • BUG FIX: Stopped sending the cancel subscription request to the PayPal API if we are processing the IPN request for the same subscription.
  • BUG FIX: Fixed issue where the Stripe API version was shown for non-Stripe gateways on the payment settings page.
  • BUG FIX: Using self:: instead of static:: in the Stripe class that could keep the pmpro_stripe_customerid from being updated.
  • BUG FIX: Fixed some fatal errors in PHP 5.2. (We still recommend a minimum PHP 5.6.)
  • BUG FIX/ENHANCEMENT: Removed a unnecessary hr element when viewing the table of all active memberships.
  • BUG FIX/ENHANCEMENT: Cleaned up some CSS code around buttons.
  • BUG FIX/ENHANCEMENT: Added formatting for the Danish Krone.
  • BUG FIX/ENHANCEMENT: Removed the warning regarding billing limits with the Stripe gateway. Our Stripe implementation has actually supported billing limits for a while.
  • ENHANCEMENT: Added Kenyan Shilling as a currency. (Thanks, Urandu Bildad Namawa)
  • ENHANCEMENT: Updated the description, url, email, and copyright info in the plugin header.
  • ENHANCEMENT: Now showing a note on the pages list in the dashboard if a page is linked to a PMPro page.
  • ENHANCEMENT: Improving logo and watermark in the dashboard for retina displays.

Send members an additional invoice via email after Membership Checkout

Paid Memberships Pro emails a membership invoice for all recurring or renewing membership subscriptions. This email is not sent after the initial membership checkout because all of the relevant invoice details are included in the Membership Confirmation email. If you’ve customized the Confirmation email and removed invoice details, you may want to send a separate invoice email using the recipe below.

This page requires a Plus Account or higher.

Already have an account?

Log In

New to this site?

Register Now

How to adjust your membership site’s default currency format.

Currency formatting varies from country to country. For example, the placement of a comma (“,”) or period (“.”) in a currency format can mean something completely different depending on what currency is being used. Our core plugin offers formatting for several built-in currencies, which you can specify on the Memberships > Payment Settings page, but what if your currency is not being properly represented?

This code recipe demonstrates how to use the pmpro_currencies filter to adjust the format to match your desired currency.

Danish Krone as Default Currency

This page requires a Plus Account or higher.

Already have an account?

Log In

New to this site?

Register Now

Add “Select a Payment Plan” box to membership checkout (code demo)

Do you offer three different payment options for the same membership access? This new code gist allows you to easily add a selection box to the checkout page.


The code example below shows you how to define level “groups”—levels that are related and should appear as payment plans on the membership checkout page.

Video Demo

The Code Recipe

This code recipe requires a Plus Account or higher.

View Membership Options

Using the [pmpro_member] Shortcode to display current member information.

I’ve been asked this simple question many times recently: “How do I display the current user’s membership level in my theme?”

This post details how to use the [pmpro_member] shortcode, included in the main plugin, to show specific information about the current logged in user’s membership.

Why would you want to do this?

We created the [pmpro_member] shortcode so that you can build a more robust and personalized experience on your membership site.

How to use the shortcode:

You can place this general shortcode anywhere in your site, either in post content or widgets, or via template files using the WordPress do_shortcode() function.

Available shortcode attributes:

The shortcode accepts one single parameter, with a specific set of values as listed below. These values will pull the data directly from the current logged in user record.

[pmpro_member field="membership_name"]

Supported “field” Values Include:

Membership Level Fields:
  • membership_id
  • membership_name
  • membership_code_id
  • membership_code
  • membership_initial_payment
  • membership_billing_amount
  • membership_cycle_number
  • membership_cycle_period
  • membership_billing_limit
  • membership_trial_amount
  • membership_trial_limit
  • membership_startdate
  • membership_enddate

Fields Stored in the users table
  • user_login
  • user_email
  • user_url
  • user_registered
  • display_name

Payment Fields Stored in user_meta:
  • bfirstname
  • blastname
  • baddress1
  • baddress2
  • bcity
  • bstate
  • bzipcode
  • bcountry
  • bphone
  • bemail
  • CardType
  • AccountNumber
  • ExpirationMonth
  • ExpirationYear

Learn more about General Shortcodes in Paid Memberships Pro »

Allowing Gateway Webhooks or IPN Data into a Protected Site (for testing or development)

Many development and staging sites want to restrict total access to the site’s folder on the webserver. One of the easiest ways to do this is by setting a UNIX password at the server level.

This advanced developer recipe shows you how to set up custom .htaccess rules to allow your Webhook or IPN data through this security measure. This will allow you to properly configure and test payment gateways in Paid Memberships Pro.

About the Recipe

If your site has a UNIX password or is in Coming Soon/Maintenance Mode, your gateway will not be able to get to your site and send their data.

The recipe below will allow any of the listed IP addresses access to your website and will prompt everyone else to enter your secret UNIX username and password.

Note that this recipe specifically allows the IP addresses of the PayPal IPN Live Server and the Stripe Webhook. If you are using another gateway or using PayPal in Sandbox mode you will need a separate list of IP addresses. Please consult your payment gateway documentation to locate their active IP addresses.

This recipe will only work with sites restricted by a UNIX password. If you are using a Coming Soon plugin, you’ll need to take another approach to allow gateway access to your site (the easiest method is to disable the maintenance mode while running your tests). We’ll try to put together a similar recipe for popular plugins with this feature, or you can open topic in the members-only support forum for personal help.

The Code Recipe

This code recipe requires a Plus Account or higher.

View Membership Options

How to set all member subscriptions to renew on the same date or schedule.

While most membership sites we work with offer a rolling membership, many sites operate with a specific renewal schedule. Our Subscription Delays Add On adds a “delay” field to your membership levels and discount codes, allowing you to set a variable-length period between the member checkout and the subscription payment start date.

Read on to explore some popular applications of this logic.

How to: Calendar Year Membership

The most common reason sites would like all members to renew on the same date is for a calendar-year membership (from January 1 to December 31). Members can sign up any time within the year, pay the initial payment (if applicable), and then have their active subscription begin on the 1st of January the following year.

To do this: set the “Delay” field on the “Edit Membership Level” page to Y2-01-01.

Subscription delay settings for an annual renewal on the first of the year.

Pro Tip: Remember that regardless of your subscription delay, the “Initial Payment” for your level will be charged immediately at checkout. If you do not want to charge the member until the start of the subscription, just leave the “Initial Payment” value empty.

How to: Membership Starts on the First of the Month

Another common application of the Subscription Delays Add On is for Monthly Memberships where all members renew on the 1st of the month. Members can sign up any time within the current month, pay the initial payment (if applicable), and then have their active subscription begin on the 1st of the following month.

To do this: set the “Delay” field on the “Edit Membership Level” page to Y1-M2-01.

Subscription delay settings for a monthly renewal on the first of the month.

How to: Membership Starts on a Specific Date

If you’re running a course or group membership that kicks off on a specific date, you can use the Subscription Delays Add On to activate every member’s subscription on the same date. Members can sign up any time prior to the activation date, pay the initial payment (if applicable), and then have their active subscription begin on your specific date.

To do this: set the “Delay” field on the “Edit Membership Level” page to the format YYYY-MM-DD, i.e. 2019-03-15 for the 15 March 2019.

Subscription delay settings for membership to start on 15 March 2019.

Pro Tip: Remember to turn off registrations for the level after the start date or cut-off window but editing the level and checking the box to “Disable new signups”.

Video Demo

The video below will walk through how to use these examples for your membership site.

But wait, there’s more!

This Add On can also allow variable-length trials.

It’s a limitation of most payment gateways that you can only set a trial period equal to your subscription period (i.e. a monthly subscription can only offer a month-long trial). Sites can now offer a unique trial period using this Add On, such as:

  • Set a 30-day trial on an annual membership level by setting the “Delay” field to 30.
  • Set a 1 week trial on a monthly membership level by setting the “Delay” field to 7.
Pro Tip: You can use this Add On to offer a “Free Trial” but still capture the member’s payment information—users would simply need to cancel within the trial window to avoid being charged. To do this, just leave the “Initial Payment” value empty.

View the Add On


This entry was posted by Kimberly Coleman in Add Ons and tagged . Bookmark the permalink. Last updated: September 17, 2018. Titled How to set all member subscriptions to renew on the same date or schedule.

How to use a Page Builder to create a custom Membership Level Pricing page.

The landing page for your levels is the primary place your site will attract and sell its membership products. Our plugin includes a few options to design this page, including the default [pmpro_levels] shortcode and the enhanced options when using the Advanced Levels Page Shortcode Add On.

What if you need more control over this page and would like to design a completely custom page for your levels? In this article, I will take you through the process of building a new membership levels page using the Elementor Page Builder, an open source plugin available in the WordPress plugin repository.

Did you know…

You do not need to use the default plugin-generated Membership Level page for your membership site. In step 2 of the plugin setup process, a page named “Membership Levels” is automatically created with the shortcode [pmpro_levels]. You can customize this page depending on your preferences, skill level, and the needs of your membership site.

A few ways you can customize the levels page include:

  1. Use Custom CSS to adjust the default layout.
  2. Create your own custom Page Templates for the levels page layout.
  3. Replace the default shortcode with the options included in the Advanced Levels Page Shortcode Add On which includes column-based or comparison-type options.
  4. Use a Page Builder or your theme’s included “pricing page” layouts to craft a totally custom page.

In this article, I’m focusing on the last option above and will demo how to use the Elementor Page Builder to create a Membership Levels page.

Video Demo

1. Choose the method that works for you.

Your skillset and goals will generally determine the method that you choose to build your membership levels page.

You do not have to use a Page Builder and might find that using your theme’s included layouts or theme’s shortcodes to create your membership level page will be easier. Chances are, you already have an idea of what will work for you. I chose to use Elementor in this article because it is a popular page builder plugin that many of our support customers are using.

Screenshot of the Elementor Plugin Homepage

2. Develop your membership levels page.

Now that you have chosen the tools needed to create your levels page, it is time to start building.

These steps assume you are working on an existing membership site and want to create the new design without affecting the current site’s levels page. If you are setting up a brand new membership site, you can directly edit the generated page for your Membership Levels. Just remove the [pmpro_levels] shortcode from that page and begin your work.
  1. Navigate to your Dashboard > Pages > Add New.
  2. Enter a title for your new membership levels page (mine is “My Level Page”).
  3. Start creating the layout exactly as you need it. Feel free to get creative here. Enhance the page with images, comparison tables, testimonials and more. This is the primary page your potential customers will visit to explore your product and, hopefully, convert to members. It’s important to make the page as compelling, clear and attractive as possible.

Screenshot of admin developing a membership level page using a page builder.

Pro Tip: Keep this page as concise, clear and simple as possible. It can be tempting to add a whole lot of detail to this page, but remember that confusion often leads to “cart abandonment”.

3. Link “buttons” to the level-specific membership checkout page.

As you can see from my screenshots, I created a membership level page that gives a little more information on the two membership levels that I want my users to sign up to. One level is free; the other is a premium membership.

I will now need to link up my membership checkout page to each of my “Sign Up” and “Buy Now” buttons in the layout.

In most cases, the URL for membership checkout will be something like this:

This URL is primarily the same for each level checkout page—you just need to update the last attribute of the URL with the appropriate level’s ID.

  1. Navigate to the default Membership Levels Page and click the button to membership level that you want to link.

    Screenshot of default Paid Memberships Pro levels page

  2. Copy the URL of the checkout page. Notice that each URL will include the membership level’s ID. In my case, I am linking my “Gold” Membership Level (which has a level ID of “18”). You should see something similar to /membership-account/membership-checkout/?level=18

    Screenshot of admin copying the URL of a Paid Memberships Pro Checkout page

    Pro Tip: You can automatically include a discount code in the URL by adding the attribute &discount_code=CODENAME at the end of the button’s link to checkout.

  3. Add the copied URL to the appropriate button/link that you created on your custom membership levels page. Repeat steps 1-3 for each Membership Level you have added to your custom page.

    Screenshot of Admin pasting in a link to redirect users to the checkout page

4. Last Step: Set your newly created Membership Level page as the default.

This last step will ensure that every generated link to your membership levels page will direct users to your new/custom page instead of the plugin-generated page. If you have inserted a link to the membership levels page within your post content, you will need to manually update those links to this new page.

  1. Navigate to your WP Dashboard > Memberships > Page Settings > Level Page > Select your new membership level page.

    Admin seeting Paid Memberships Pro Default Levels Page

Pro Tip: As a clean up step, you will also want to delete the old (plugin-generated) membership levels page and redirect that deleted page’s slug to this new page. You can alternately update your new page’s slug to match that of your previous page.

That’s it – and that’s alot.

If you have any questions about using this process to create the membership levels page of your dreams, please share a comment below.

Notify Members of Upcoming Recurring Payment / Automatic Renewal for Membership

Our Recurring Payment Email Reminder Add On allows you to notify members that their membership renewal payment is processing soon. This recipe shows you how to use the pmpro_upcoming_recurring_payment_reminder filter to modify when that notification is sent.

View the Add On

About The Code Recipe

By default, the Recurring Payment Email Reminder Add On will send a notification 7 days prior to a member’s recurring payment date. In the example below, we are modifying that default to send the notification 14 days (or two weeks) prior to renewal. Annual plans may want to adjust this to 30 days prior (roughly 1 month) or another value that best fits the needs of your membership program.

The Code Recipe

This code recipe requires a Plus Account or higher.

View Membership Options

PMPro Update

Version of Paid Memberships Pro is out with a handful of bug fixes. Included are fixes for Theme My Login 7, Stripe and TwoCheckout integration, and a few others.

About the Update

In addition to the improvements mentioned above, we added some SQL escaping to our reports pages. While this work is marked as a SECURITY update, we do not believe there were any related vulnerabilities in the prior code. It’s just good practice to be extra cautious here to harden the code for future updates.

In addition to the PMPro team, this update includes work by many third party authors including Jeff Farthing, Charl P. Botha, and David Cervantes Caballero.

Please update Paid Memberships Pro from the plugins page of your WordPress dashboard. You can also get the latest version of PMPro here or version specifically here.

About the Level Description and Confirmation Message

As of version, we are no longer using the WordPress the_content filter when displaying the membership level’s description or confirmation message. Using the the_content filter in these areas allowed you to use shortcodes and other post styling that relied on that filter. However, some sites (depending on the other plugins installed) would get caught in an infinite loop while rendering this text and crash. If you need to revert your site, please copy and paste this code recipe into a helper PMPro Customizations plugin.

Note that these filters only affect the level description and confirmation message when displayed on your site. If your level description or confirmation message appear in emails to your members, shortcodes and other styles may not work even with the above gist installed.

The full list of updates is below.

  • SECURITY: Some values used in SQL queries in our reporting code were sanitized but not later escaped via esc_sql(). All variables added to SQL queries in the reports are now wrapped in esc_sql(). The previous code was not vulnerable to any known attack, but this change hardens the code against vulnerabilities in the case other parts of the code change in the future.
  • BUG FIX: Fixed issue with lost passwords when Theme My Login 7 is active. (Thanks, Jeff Farthing)
  • BUG FIX: No longer sending an “error canceling the subscription” email when subscriptions are cancelled from Stripe.
  • BUG FIX: Fixed issue where TwoCheckout orders were not correctly updating the TOS consent data. (Thanks, Charl P. Botha)
  • BUG FIX: Fixed issue where privacy function weren’t defaulting to $current_user correctly. In practice, we were always passing a user_id anyway.
  • BUG FIX/ENHANCEMENT: Changed the confirmation message to use wpautop() instead of apply_filters('the_content'). If you were relying on shortcodes or other content that required that filter, you must use the custom functions outlined earlier in this post to revert this for your site.
  • BUG FIX/ENHANCEMENT: Using the strict parameter of sanitize_user when getting usernames. This will prevent some special characters from being used in usernames at checkout. This is inline with WP core and other plugins. (Thanks, David Cervantes Caballero).
  • ENHANCEMENT: Added a breakdown of orders at each price point to the Sales Report widget.
  • ENHANCEMENT: Showing the Stripe version we use on the Payment Settings page.
  • ENHANCEMENT: Updated Copyright date and GPLv2 link in license.txt.