Table of Contents
Email Templates
Short codes
Frequently Asked Questions (FAQ)
Filters & Hooks for Developers

This drip content plugin – Sequences by Eighty/20 Results – started its life as the PMPro Series plugin by Stranger Studios. The Sequences plugin contains all number of drip content capabilities that are unavailable to the PMPro Series add-on.Unlike the PMPro Series plugin, this plugin is more of a ‘click to configure’ plugin. As a result, in spite of the number of features, this plugin is hopefully a little less intimidating for the non-programmers to use. That said, there are a number of options available for programmers too (filters). 

About the default email alert templates

These templates are standard HTML files and need to have .html as their extension. By default, we have included two template files, one template is for the scenario where you want to send one alert per new post available that day. The other is a digest approach where we include a link of posts that were made available for the sequence and user that day.

The alert templates support a few variables that it can substitute:

!!name!! – The First Name for the user as defined in their profile

!!sitename!! – A filtered variable containing the name of the site (default: is the option ‘blogname’ as defined in the Site settings).

!!post_link!! – Either an <a href> tag (if configured to send one message per new post) or an unordered list of <a href> entries for each of the posts made available that day (depending on settings).

!!post_url!! – The URL to the available post. This URL will first send the user to the login page. If the user is logged in already, they will get redirected to the Sequence member post. If they are not logged in, they’ll be shown the login form and then redirected to the Sequence Member post. This specific variable is only available when the notification is configured to send one alert per new drip content post/page.

!!post_urls!! – An array of URLs to the available posts when sending digest type notifications. These URLs (links) are also designed to send users who haven’t logged in to the login page first. Once logged in, unless something is interfering, the user should get redirected to the content in the link. You will need to convert this list into a series of HTML link elements when processing the email message. This can be done with the e20r-sequence-email-substitution-fields filter.

!!today!! – The date for when the user is supposed to get access to the specified post/page in the sequence (i.e. membership startdate + delay value)

!!excerpt!! – The excerpt from the post/page containing the content we’re sending a reminder about.

!!ptitle!! – The title of the post/page we’re sending the alert about.

The template file must end with the .html extension. Whether or not the template file contains any of the replaceable variables is entirely optional.

Email Templates in PLUS Edition

When you purchase and activate the Sequences Plus license, the cumbersome .html email template system described above changes. From then on, email message templates are edited and managed in the “Email Notices” menu option in the WordPress Admin backend.

The email notices system uses the standard WordPress post/page editor and supports the same features as your posts and pages. Additionally, there’s a helpful list of all supported “substitution variables” included on the “Edit Email Notice” page, with documentation. As each email message is sent, the plugin will replace the substitution variable key with the related date for the recipient.

In addition to the substitution variables included above, the Plus License enables Email Notices that include the Post/Page Title, Post/Page Excerpt and/or the Post/Page content itself. The original use case for this enhanced functionality is an automated “One Email Per Day” capability.

Drip Content Shortcodes

The shortcode [sequence_links] will display a list of the posts or pages in the sequence (configured from the Sequence edit.php page in the WP backend.)

Supported arguments:

  • id=”<Post ID for the sequence>”
  • title=”The title you’d like to display above the listing” (<h3>)
  • highlight=”1″ (Whether to display a green highlight & checkmark for the entry in the sequence list that was most recently made available to the user)
  • button=”1″ – Whether to include the “Available now” button (uses class=”pmpro_btn”) for each post/page in the sequence list
  • scrollbox=”1″ (Whether to wrap the list in a vertically scrollable <div></div> enclosure – supports scrolling)

Example for shortcode:

[[sequence_links id="7888" title="My Title" highlight="1" button="1" scrollbox="1"]]

Note: There are no spaces between the brackets ‘[‘ and the sequence_links text when using this shortcode “in real life”.

The shortcode [sequence_alert] will display the check-box to allow a user to opt in or out from receiving the email alert/notices.

Supported arguments:

  • sequence_id=”<Post ID of the sequence>”

Example for shortcode:

[[sequence_alert sequence_id="7888"]]

The shortcode [e20r_available_on] will hide any content between the [e20r_available_on] and [/e20r_available_on] shortcodes until the days, or the date specified in the ‘when’ attribute has arrived and/or passed (this is relative to the logged-in users PMPro membership level start date).

If a date is specified, the content will become visible for all users, regardless of membership status(!), once that date arrives/has passed. If an integer delay value is specified, the content will remain hidden for all non-logged in users, always. Once a the membership for the user – assuming they are actually logged in to the site – has been active for longer than what the ‘when’ value specifies, the user will see/get access to the content. The integer/number represents the number of days since the logged in user’s start-date for the membership level they’re currently on.

Note that if you use a date value for the when attribute, it can be any date format supported by the strtotime() PHP function.

Supported arguments:

  • when=”<Integer representing the number of days since membership start | A valid date>”

Example for shortcode:

[e20r_available_on when="10"]Something important we don't want anybody except members who have been members for more than 10 days to see[/e20r_available_on]


[e20r_available_on when="2016-01-01"] Something we do not want anybody to see until January 1st, 2016 And I've included another shortcode too: [gravity_forms][/e20r_available_on]


The Sequences plugin includes a WordPress widget. This widget can be used to display an excerpt of the most current drip-sequence post/page (member).

You can configure:

  • whether to include the post or page title in the widget output;
  • what you would rather use (the default post/page summary title) if you decided to “hide” the actual post/page title for the drip content sequence entry.
  • the number of words to include in the displayed excerpt (I use 35 words for mine);
  • which of the created drip-sequences to use for the widget (drop-down list);
  • and what the overall title text for the widget should be.

There are also numerous filters available to let you configure the widget. (See filter list below.)

Random questions (FAQ)

What is the difference between PMPro Series add-on and the Sequences Drip Content plugin?

The differences are significant, but the most obvious is how simple it is to configure a Sequence versus a Series. For instance, with Sequences you can add a new post/page to a sequence while you’re editing the post/page. No need to go to Sequence and add it manually.

Sequences uses a Graphical User Interface to configure each of the sequences, including setting when a sequence should process and send new content reminder emails to your members. All of the settings are per-sequence, so with Sequences you can create multiple sequences sending emails at different times during the day.

What is the difference between the Free and the Plus plugin?

The key difference would be the number of available and useful features. Although the Free plugin contains a bunch of stuff that the PMPro Series add-on lacks (see the above FAQ), there are a number of additional capabilities activated by the Plus license/plugin. Check out the Product Description page for the Sequences Plus License for more details.

How difficult is it to migrate from PMPro Series?

It’s very easy actually. If you’ve spent time and effort building complex drip-feed series of content, this plugin supports a non-destructive import of existing PMPro Series drip content feeds. That means you can import your Series to Sequences and keep your existing PMPro Series around until you’re satisfied the migration/conversion was successful.

Or, if you invest in the Sequences Plus Edition plugin, you’ll find a Graphical User Interface to walk you through the process.

I installed E20R Sequences, but none of my existing PMPro Series show up?

Correct. This plugin does not assume you want to automatically import any previously existing PMPro Series.

However, there is a filter available (see the filter list below) which will let you automatically import PMPro Series and the posts they manage (all of the defined series, a list of series, none of them (default)) when activating this E20R Sequences plugin. In other words, the filter needs to be defined and available before you activate the E20R Sequences plugin.

How many posts/pages can I include in a single Sequence?

Ultimately, it depends on the size and processing power of your web server. At the moment, I have sequences that have 100s of posts per sequence configured for my shared WordPress hosted production environment. These sequences are all configured to send email notices to users whenever new content is available for them, which for some of them are daily.

Can I add my own template for email alerts?

Yes (This is way easier when you have purchased the Sequences Plus Edition license!)

Create a .html file consisting of regular HTML (and, if you want, your own CSS) then;

  1. Create a directory (`sequence-email-alerts`) in the root directory for the current active theme: /wp-content/themes/<your theme>
  2. Create the HTML you want to use as a new content notice template and include it in a file (must use the .html file extension).
  3. Upload your .html file to this directory
  4. Go to your Sequence (in the Sequence editor) and select your template under the “Settings for this Sequence” metabox ( Sequences -> Select the Sequence to Edit -> Settings for this Sequence -> Template).

How do you hide upcoming posts from the end-user (so they can’t see the title and when the post becomes available)?

Use the “Hide all future posts” setting on the Sequence definition page (in /wp-admin/).

How do you signify the first day of the delay/membership?

Here’s my basic premise; Humans operate and think along the lines of “On the first day of my membership…”, not “On the zeroth day of my membership…”. We do recognize our 1st day or 1st year after it is complete, but we still refer to it as “day 1” and “day 1 + 1 second” as the beginning of the 2nd day. Even in the Gregorian calendar, there’s no “year 0” or “day 0”. Those are an instant, then it immediately switches to 1.

So in this plugin, I treat the 1st second of the membership as “day 1” .

Thus, if you configure delays by days (not date of release), you’ll need to consider that content you want available instantly needs to be configured with a delay of 0 or 1. Once the 2nd day has started (i.e. at midnight + 1 second after they signed up), the delay comparison would be 2 (and not 0 which is what it is for the  PMPro Series plugin).

What does “current” mean?

I use the word “current” to describe the post/page in the specific drip-sequence that is currently the post with a delay value that is the closest match to either the users current “day of membership” or the specific calendar date for the posts or pages in the post/page drip sequence.

What’s the point of the “Preview” functionality?

This functionality was included to let my users get access to a post/page a configurable number of days prior to what the delay value for the post/page is. I use this preview value to let my clients see/access upcoming lessons since I may want to let them prepare for the day of release in advance. At the same time, the highlight functionality in the shortcode/list correctly identifies the “lesson of the day”.

I need help! Something isn’t working… (or it’s stupidly laid out)

It’s bound to happen, so let me start by apologizing.

I’ve tried to test the living daylights out of this, and I have the handy “It works for me!” excuse ready for a quick cut ‘n paste.

I do, however, realize that you’re going to have a different thought pattern and different ideas from me on how something ought to work. You’re also likely to be more creative than I am when it comes to how you go about using it.

I love that fact!

So please, if you have a problem with this plugin, start by making sure you’re running the most recent version. Then please leave me a message in the support forum for E20R Sequences and tell me:

  • what you were trying to do;
  • what did or didn’t happen;
  • plus any and all error/warning messages you saw;
  • and get ready to help me troubleshoot.

I will probably ask you to (temporarily) enable WP_DEBUG for your environment. This will degrade the performance of your site while it’s enabled, so I suggest you only enable it to try and reproduce your error, then disable it again when you’ve reproduced it.

While WP_DEBUG is enabled, the E20R Sequence plugin will log a lot of information to files in its debug directory. This directory is normally found at: %wp-content%/uploads/e20r-sequences/. There are up to two files that have filenames that look like this: “debug_log.txt” and “debug_log.txt.old”.

Please upload your debug log to something like or, or any other upload service, and then us the Support Forum to point me in the right direction.


The public repository for this plugin is hosted on There’s also a Trello board with current thinking/priorities for additional plugin features. Please consider sponsoring a new feature if you need it faster than what the Trello board indicates our progress to be.

Filters & Actions

FilterDescriptionDefault value
e20r-sequence-managed-post-typesThe post types the sequence plugin can mange. This is how to add CPTs, for instancearray( “post”, “page” )
e20r-sequence-allowed-post-statusesThe post has to have one of these statuses in order for the user to be granted access to the post (and it shows up in the post list)array( ‘publish’, ‘future’, ‘private’ )
e20r-sequence-found-closest-postThe post ID that is the closest to the day of membership for the currently logged in userResult from E20R\Sequences\Sequence::get_closestPost() function
e20r-sequence-list-titleThe HTML formatted title to use when displaying the list of sequences on the front-endOutput from E20R\Sequences\Sequence::setShortcodeTitle() – HTML formatted $title
e20r-sequence-closest-post-indicator-imageURL to the image to use to indicate which of the posts in the post list is the most recently available post for the current userURL to PLUGIN_DIR/images/most-recent.png
e20r-sequence-list-pagination-codeThe Pagination code for the Sequence List being renderedResult from E20R\Sequences\Sequence::post_paging_nav() function
e20r-sequence-list-htmlThe HTML (as a table) for a paginated list of posts (E20R Sequence posts)$html – the HTML that will render to show the paginated list (self-contained    
e20r-sequence-email-alert-template-pathArray of paths to the email alert template(s)$path = E20R_SEQUENCE_PLUGIN_DIR . “/email/” – the file system path to the templates
e20r-sequence-has-access-filterA plug-in specific version of the pmpro_has_membership_access_filter filter$hasAccess (bool), (WP_Post) $post, (WP_User) $user, (array) $levels
e20r-sequence-add-startdate-offsetOffset the apparent startdate for a user when calculating access rights for a specific sequence.(int) $sequence_id
e20r-sequence-check-valid-dateCheck whether the supplied string is a valid date. Return true if so.Return value from E20R\Sequences\Sequence::isValidDate( $delay )
e20r-sequence-can-add-post-statusPost statuses (i.e. the status of the post) that can be added to a sequence. It may (still) not display unless the ‘e20r-sequence-allowed-post-statuses’ filter also matchesarray( ‘publish’, ‘future’, ‘pending’, ‘private’)
e20r-sequence-has-edit-privilegesUsed to indicate whether the user is permitted to do something – like edit the sequence member list, settings, etctrue/false from E20R\Sequences\Sequence::userCanEdit() function
e20r-sequence-alert-message-excerpt-introSets the text to use in place of the !!excerpt_intro!! placeholder in the “new content alert” messagePMProSequence->options->excerpt_intro
e20r-sequence-alert-message-titleThe in-message post title ( replacing the !!ptitle!! placeholder) for the “new content alert” email message.post_title for the post id being processed
e20r-sequence-cpt-labelsOverride the Custom Post Type labelsarray() of label definitions
e20r-sequence-cpt-slugSet the Custom Post Type Slug‘sequence’
e20r-sequence-cpt-archive-slugSet the archive slug for the Custom Post Type‘sequence’
e20r-sequence-not-found-msgHTML error message for when a sequence isn’t available/foundThe specified E20R Sequence was not found.
Please report this error to the webmaster.
e20r-seq-recentpost-widget-nopostfoundSet ID for the h3 element if a post isn’t founde20r-seq-widget-recentpost-nopostfound-title
e20r-seq-widget-recentpost-nopostfound-bodySet the class for the error message if no post is foundempty
e20r-seq-recent-post-widget-title-idSet the element ID for the widget titlee20r-seq-widget-recentpost-title
e20r-seq-widget-postlink-classSet a class for the link to the post in the widgetempty
widget_titleSet the title for the Widget$instance[‘title’]
e20r-sequence-widget-prefixSet prefix for the widget$instance[‘prefix’]
e20r-sequence-widget-default-post-titleSet the default title for the member post$instance[‘default_post_title’]
e20r-sequence-widget-before-widget-titleInsert text before the widget title$instance[‘before_title’]
e20r-sequence-widget-after-widget-titleInsert text after the widget title$instance[‘after_title’
e20r-sequence-widget-seqidOverride the widget specified sequence ID (post ID for the Sequence CPT)$instance[‘sequence_id’]
e20r-sequence-before-widgetInsert stuff before the widget gets rendered$instance[‘before_widget’]
e20r-sequence-after-widgetInsert stuff after the widget gets rendered$instance[‘after_widget’]
e20r-sequence-import-pmpro-seriesWhether to automatically try to import PMPro Series CPT entries to this plugin. Accepts a number of different return values: The string ‘all’ or boolean true will import all defined series. An array of Post IDs, i.e. array( 2000, 4000 ), will treat the numbers as the post id for the Series. A single number (array or otherwise) will be treated as a Post ID to import.__return_false()
e20r-sequence-shortcode-text-unavailableThe text to display if the current user should not be permitted to see the content protected by the e20r_available_on shortcodenull
e20r-sequence-user-startdateReturns the startdate (as seconds in UNIX epoch) for the specified user IDstrtotime(today) – midnight today
e20r-sequence-days-as-memberReturns the number of days the user Id has been a member of the site0
e20r-sequence-membership-level-for-userReturns the membership level the user ID has been assignedfalse or an integer value representing a level id
e20r-sequence-has-membership-levelDecide whether or not the user is assigned the specified membership level(s)false
e20r-sequence-membership-accessWhether the user ID has been granted access to the post ID specified3 element array: 0 => boolean for access, 1 => Numeric array of level Ids w/access, 2 => string array of level descr
e20r-sequence-default-sender-emailThe email address to use as the default sequence notification senderemail address for admin user
e20r-sequence-default-sender-nameThe name to use as the default sequence notification senderName of the admin user (display name)
e20r-sequence-site-nameA text/string containing the name you wish to use as the blog name for this siteget_option(‘blogname’)

TODO – Trello board

We have a – somewhat inactive – board for the E20R Sequences for Paid Memberships Pro plugin (opens in a new tab/window). This Trello board is used to track user requests for new plugin features/capabilities. We also use it to track our progress with developing those requests.

Whenever we accept and start working on a feature, it will moved from the “Requested Features” board to the “In-Progress Features” board and should typically be assigned a schedule.

If you believe the schedule needs to be accelerated, please consider sponsoring parts of the development effort, or even the whole thing.

Known issues

  • If you started with this plugin on one of the V2.x versions, you *must* deactivate and then activate this plugin to convert your sequences to the new metadata formats. (Won’t fix)
  • The conversion to the V3 metadata format disables the ‘Send alerts’ setting, so remember to re-enable it after you’ve re-enabled the plugin. (Won’t fix)
  • Format for “Posts in sequence” metabox doesn’t handle responsive screens well – Fix Pending

For more, see the Issues section for the plugin on



  • ENHANCEMENT: Display sequence entries by delay value(s) in the Drip Content Settings metabox
  • REFACTOR: Removed stale code

Old Changelog


  • Initial version of the Sequence plugin including support Sequence specific display & delay type options.
  • Renamed from “Series” to try and avoid namespace collisions and allow people to transition manually to this plugin if desirable.


  • Version bump for fixes added after the initial version (minor typo & namespace bugs)


  • Fix: Incorrect page ID supplied when filtering sequence member pages


  • Added support for templated and configurable new content alerts. Includes scheduling (cron) by sequence
  • Reformat of the Sequence Settings metabox.
  • Added support for pre PHP v5.3 releases. (tentative – not been able to test)
  • Optimized settings save functionality (one instance of the save functionality).
  • Separated out Javascript & cleaned up AJAX handling for sequence handling, post addition/removal & settings. (@Askelon)
  • Started adding support translations (I8N) based on work by Askelon (@Charlie Merland)
  • Split admin & user Javascript functionality.
  • Added support for all public & searchable CTPs plus Pages & Posts to the list of posts in a sequence (drip)
  • Admin may now select to let the delay time (when a post in the sequence will be accessible to the user) be displayed as a ‘Calendar date’ or as ‘days since membership started’.
    • Only available and applicable when the Delay Type is configured as “Days after sign-up”.
  • Added support for admin configurable format of !!today!! (date) placeholder in email templates.
  • Added a message to the front-end sequence page for when there are no released (visible) posts available to the user in that sequence.
  • Fix: Incorrect save of options when using “Publish” save vs Sequence Settings save.
  • More bug fixes and updates.


  • Translation for Norwegian and English (US)
  • Feature: Trigger sending of email alerts from the admin UI
  • Support “preview” functionality for posts in sequence.
    • Will let the user read/access the post a number (up to 4) days before it’s officially available content – if on the site. However, the user will not receive an alert message in their inbox until the post is officially released.


  • Set version number
  • Feature: Widget containing excerpt from most recently available post in a sequence (by user ID)


  • Complete refactoring of the plugin sources.
    • Moved anything sequence related into the PMProSequence class and cleaned out pmpro-sequence.php file.
  • Feature: Sequence metabox on post editor page (allows assignment of sequence & delay within post/page editor).
    • Editor can add the post to any number of sequences they want.
  • Feature: Save of post will also add/update sequence settings for the post.
  • Feature: Import of PMPro Series posts on plugin activation.
    • Use the filter ‘pmpro_sequence_import_all_series’ and return the boolean value `true` or `__return_true();` to enable.
  • Feature: Lots of new filters, see for details.
  • Feature: Let admin schedule if and when email alerts are supposed to be processed for a specific sequence.
  • Feature: Let admin decide whether to show availability date for upcoming sequence posts as a date or “days since membership started”
  • Feature: Timestamp (and allow very rudimentary “caching”) for the private $posts variable (array of posts).
    • Hopefully increase performance a little.
  • Enh: Email alerts will only get sent if the post delay value is the same as the normalized “days since start of membership level” value for the user_id being processed.
  • Enh: isValidDate() now supports any valid PHP date format
  • Enh: Workaround for cases where WordPress may inject <br/> tags into metabox forms.
  • Enh: Added recursive in_array() function ( in_array_r() )
  • Enh: Added recursive in_object() function ( in_object_r() ) to process arrays of stdClass() objects looking for key/values.
  • Enh: Simplified pmpro_sequence_hasAccess() function
  • Enh: Added CSS for ‘most recent post’ widget.
  • Fix: Cleaned up init of Sequence options, including setting empty variables to default if needed.
  • Fix: Would sometimes add a 2nd opt-in check-box during sequence listing
  • Fix: Send new content alert for the current & accessible post in the sequence, only – Old behavior would send a number of email alerts per user (one per “not yet alerted on” post)
  • Fix: Only let user access posts that match the ‘pmpro-sequence-allowed-post-statuses’ filter result or have a post status of ‘private’, ‘publish’ and ‘future’.
  • Fix: Ensure current user has permission to edit the sequence. (Future: Specific capability added for users with Sequence edit rights)
  • Fix: Would not always respond to click events in settings metabox.
  • Fix: Further fixes to (hopefully) support I18N correctly.
  • Fix: Always load posts from DB on init()
  • Fix: Only reload posts on add/remove
  • Fix: Reset notification settings for all users if post is removed
  • Fix: Email alerts were occasionally “off by one” – i.e. would get sent out for a post/page that wasn’t the “most current” one for the $user_id.
  • Fix: Added i18n text domain to Plugin header comment.
  • Fix: Plugin would assume the first 24 hour time period after the ‘startdate’ value in pmpro_memberships_users were day 0 (now considered “day 1”).
  • Fix: Removed ‘pmpro_sequence’ prefix from all functions
  • Fix: Updated paths to match current plugin directory layout
  • Fix: Seems that min-device-pixel-ratio is invalid CSS(?) – removed it
  • Fix: Improved timezone support.
  • Fix: Email alerts would not always get sent when cron-job fired.
  • Fix: Post order sort wasn’t correct if sequence was configured to use dates as delay values.
  • Fix: Move loading of meta boxes to more appropriate actions – not ‘init’
  • Fix: Clean up duplication of sequence post->ID’s in the post meta tag ‘_post_sequences’
  • Fix: createTimestamp() used UTC

2.1 (Dev only)

  • Organized source files a bit more
  • Feature: UI for Selectable alert listings (in addition to selecting the template for the alert message, the admin will be able to set the alert as “one email per new piece of content” or “list of links to new content”.
  • Renamed most of the filters (see for details)
  • Enh: Debug uses levels DEBUG_SEQ_[[CRITICAL\|WARNING\|INFO]]. INFO is default level.
  • Fix: Moved a number of formerly public functions to private.
  • Fix: Renamed Widget class to seqRecentPostWidget()
  • Fix: Renamed userCan() to userCanEdit()
  • Fix: Debug causing the cron job to not complete.


  • Feature: Enable WP_DEBUG to start logging copious amounts of debug info to a dedicated PMPro Sequence debug log (./debug/sequence_debug_log-<date>.txt)
  • Feature: Added ‘pmpro-sequence-allowed-post-statuses’ filter to widget
  • Feature: Added public getAllSequences() function (API)
  • Fix: Widget would sometimes attempt to list a sequence member that wasn’t visible to end users.
  • Fix: Infinite loop in certain situations during configuration.
  • Fix: URL paths for icons
  • Fix: Typo in pmpro-sequence-cpt-labels fitler
  • Enh: Add filter for sequence slug (pmpro-sequence-cpt-slug)
  • Enh: Add filter for archive (pmpro-sequence-cpt-archive-slug)
  • Refactor: import PMPro Series before registering cron hook on plugin activation (use filter).
  • Removed: Not using PMPRO_SEQUENCE_DEBUG to enable debug logging to separate file.


  • Fix: Empty sequences would not be processed correctly.
  • Fix: Error messages would occasionally cause PHP error
  • Fix: Typo in filter for post types managed by the PMPro Sequence plugin (pmpro-sequence-managed-post-types)
  • Enh: Moved select2() init to .js file
  • Enh: Allow complete reset of user notifications.
  • Enh: Load select2 functionality from CDN (performance & updatability).


  • Fix: Renamed all of the widget filters


  • Fix: Calculating “most recent post” with only one post defined in the sequence would generate error message.
  • Fix: Font size for settings metabox
  • Fix: Would not consistently load admin specific JavaScript.
  • Fix: Displays membership length in wp-admin.


  • Fix: Would sometimes fail to load default settings for new sequences
  • Fix: Correctly manage global $post data while processing shortcode
  • Fix: Returned incorrect data for empty post lists when calculating the most recent post for the member
  • Fix: Typo in return value when finding most recent post for certain members
  • Fix: Incorrect handling of post_type variable while saving settings
  • Fix: Would let user activate plugin even if Paid Memberships Pro was not present on system
  • Fix: noConflict() mode for pmpro-sequences.js
  • Fix: Sequence would not be updated if user specified a delay value of 0 for a post/page
  • Fix: Paid Memberships Pro phpmailer action would sometimes trigger error for email messages not related to PMPro Sequence
  • Nit: Remove commented out code from pmpro-sequences-admin.js
  • Nit: Remove inline php for disabled settings


  • Fix: Sequence would not be updated if user specified a delay value of 0 for a post/page.
  • Fix: Paid Memberships Pro phpmailer action would sometimes trigger error for email messages not related to PMPro Sequence
  • Fix: Adding new post to new (unsaved) sequence caused silent error on initial “Update Sequence” click.
  • Fix: Properly initialize the user notice data structure
  • Fix: Remove all sequences that no longer exist while loading the Drip Sequence Settings metabox
  • Fix: Return error message asking user to report this to the admin (filtered) if a shortcode uses a sequence ID that no longer exists
  • Fix: Remove all sequences that no longer exist while loading the Drip Sequence Settings metabox
  • Fix: Metabox – handle cases where a post/page/CPT doesn’t belong to a sequence yet
  • Fix: Variable init for widget instance
  • Fix: Load front-side javascript for widget that didn’t need it
  • Fix: Make sure we load the front-side javascript only if the sequence_links shortcode is used
  • Fix: Load admin scripts when editing PMPro Sequence post types only
  • Fix: hasAccess() would incorrectly deny access in certain scenarios
  • Fix: Remove warning message during load of admin scripts due to un-inited variable(s)
  • Fix: Typo in variable
  • Fix: Didn’t always load the user javascript when needed
  • Fix: Didn’t always load stylesheets in backend
  • Fix: Removed local select2.css file
  • Fix: Get rid of unneeded whitespace in .css file
  • Enh: Add ‘pmpro-sequence-not-found-msg’ filter for short-code error message
  • Enh: Infrastructure for setting/getting a default slug (future option / settings page


  • Fix: Complete load of select2 from CDN by removing local file(s)


  • Enh: Deletes sequence specific list of posts (for the user ID) that has had an alert/notice sent.


  • Fix: Opt-in notice warning Fix: Loading javascript & css for shortcode
  • Enh: Debug to revolving log file


  • Fix: Default user notice settings


  • Fix: Build plugin didn’t always respect version number
  • Fix: Center the box on the page.
  • Fix: Didn’t always send notifications when using date based delays.
  • Enh: New notification email template example (VPT Reminder)


  • Enh: Add support for plugin-update
  • Fix: Path to plugin debug log


  • Refactor for two classes & member functions.
  • Make settings updates more uniform w/o breaking compatibility with back-end.
  • Remove old function/event structure.
  • Refactor settings metabox to improve UI experience.
  • Add support for sending alerts as digests or as individual messages.
  • Updated text
  • Transition away from PHP4 constructors


  • Fix settings text for previews
  • Adjust new change log creation script for this plugin


  • Init the update checker on plugin load
  • Correct path to update check functionality


  • Updated translations


  • Edit license text (copyright)


  • Fix excerpt, post_link and post title (ptitle) handling for pmproemail class.
  • Remove pmpro_after_phpmailer_init filter/handler.


  • Instantiate $class variable within bind_controls() function.
  • Handle meta control display when adding/editing supported posts/pages.


  • Instantiate $class variable


  • Reload content of sequence list select in post/page metabox


  • Fix ‘Drip Content Settings’ metabox actions/events.
  • We should _enable_ not _disable_ a disabled row.


  • Remove redundant footer-like text
  • Remove \n for replaceable text


  • Update docs for pmpro_has_membership_access_filter()
  • Apply new ‘pmpro-sequence-has-access-filter’ filter to result from $this->hasAccess() in has_membership_access_filter() function
  • Increase priority of has_membership_access_filter() function in pmpro_has_membership_access_filter.


  • Added ‘pmpro-sequence-add-startdate-offset’ filter which will allow the admin to add an offset (pos/neg integer) to the ‘current day’ calculation. This modifies when the current user apparently started their access to the sequence. The filter expects a numeric value to be returned.


  • Removed CR+LF (\n) from sendEmail()


  • Set allowRepeatPosts default to false
  • Add $delay to javascript entries for edit/remove post entries in sequence
  • Add allowRepeatPosts setting to sequence settings metabox
  • Fix typo in allowRepeatPosts setting
  • Refactor getting the sequence users for a sequence to its own private function (get_users_of_sequence())
  • Add convertNotifications() function to convert post notification settings for all users/sequences to new post_id & delay format
  • Use get_users_of_sequence() in removeNotifiedFlagForPost()
  • Add $delay value to add/remove callbacks for
  • Make PMPro dependency error message translatable
  • Make sure settings for hiding any future sequence posts get saved
  • Add convertNotifications() to activation hook
  • Fix edit/remove/add posts to sequence in back-end scripts
  • Add short code – &#91;sequence_opt_in sequence=<sequence_post_id>&#93; – for the Alert/Notification email opt-in (user managed).
  • Simplify has_membership_access_filter() (Thanks to Jessica Oros @ PMPro)


  • Check whether V3 postmeta is the current format on admin_init.
  • Skip sending notices for sequences that haven’t been converted yet.
  • Add error message if the meta data for the sequence members isn’t in V3 format.
  • Ensure all posts in the sequence gets loaded when an admin/editor is processing the sequence CPT.
  • Correctly identify sequence members that haven’t been converted to V3 format yet.
  • Add consistent error check (and error message) for init() of sequences
  • Fix issue where type of edit operation in sequence editor window wasn’t working.
  • Didn’t always save the repeat post setting for the sequence
  • Add conversion to V3 post meta_data to activate() function
  • Didn’t always set the checkbox value for the sequence settings
  • Differentiate between cron processing and normal (admin) processing
  • Didn’t always correctly indicate the most current post for the requested user_id
  • Simplify cache check for $this->posts content
  • Avoid perma-loop while in post loop
  • Would sometimes add posts the user_id didn’t actually have access to yet
  • Removed duplicate processing for delay values.
  • Didn’t correctly convert user alert (notice) settings to V3 format
  • Fixes to help user notice processing handle new v3 formats (and simplify post processing)
  • Consistently use post_id + post_delay values for alert keys
  • Adds support for multiple delay values for a single post_ID within the same sequence (i.e. repeating posts without duplication of content).
  • Add support for ‘upcoming’ specific post array
  • Record metadata as individual post entries (simplifies search/load of sequence info)
  • Renamed all active functions to ‘WordPress friendly’ naming (i.e. lower case and underscores)
  • Started work to allow tracking using google analytics. (Possible future feature, ETA is TBD if at all)
  • Simplify loading of sequence member post(s).
  • Simplified post/sequence member lookup.
  • Commented out duplicate or unnecessary code
  • Removed some unneeded code.
  • Updated path to login page in a template
  • Support new V3 functions & post management
  • Use new user notification settings (per sequence rather than global)
  • Use new debug logger function
  • Renamed Debug logging function
  • Use new user notification settings (per sequence rather than global)
  • Would generate undefined variable error in certain situations
  • Remove superfluous load of font-awesome css file
  • Use FontAwesome for admin page icon(s)
  • Fix getPostKey() function to support post_id/delay combinations (for repeating post IDs in sequence)
  • Add debug output for get_users_of_sequence() function
  • Fix convertNotification() function (works)


  • Track conversion to v3 metadata based on sequence ID in options table
  • If option value isn’t configured, double-check that the V3 metadata isn’t there in is_converted()
  • Reduce the number of error messages on back-end
  • Wouldn’t always reload posts when changing sequence ID to manage
  • Load delay type for each sequence to front-end (JavaScript)
  • Add test for old-style metadata use if a sequence is found to be empty.
  • Convert if needed. Warn admin/editor/user if a sequence hasn’t been converted yet.
  • Didn’t always save the sequence ID when a post was added to a new sequence in edit.php
  • Removed redundant saving of sequence ID for a post_id during add_post()
  • Load all instances of a sequence/delay combination in edit.php
  • Refactor edit.php metabox rendering
  • Avoid warning message when no posts are found in get_delay_for_post()
  • Remove unused code paths
  • Simplify addition of new sequence/delay values to a post in edit.php
  • No longer calling back-end when adding new sequence ID to post/page in edit.php
  • Simplify removal of sequence/delay pair from a post in edit.php
  • Support removing one of multiple sequence entries from a post/page in edit.php


  • Renamed ‘Add’ button to ‘New Sequence’
  • Would sometimes add an extra sequence/delay input field when the ‘Add’ button was clicked in edit.php


  • Update the TODO section in README.txt
  • Clean up TODO items class.PMProSequence.php
  • Would loop indefinitely if there were no sequence posts and the sequence was attempted viewed from the front-end.
  • Allow users with admin privileges to have access to any sequence & posts.
  • Didn’t always save the opt-in settings for the user(s).
  • Typo in opt-in setting.
  • Force user id when looking for closest post.
  • Didn’t always allow administrators to see posts in sequence
  • Sanitize date values as delays
  • Re-enable the wipe functionality when changing the type of sequence from day # based to date based (or vice versa)


  • Fix error handling in add post to sequence operation
  • Add class function to configure & time out error message in /wp-admin/
  • Fix $_POST variables in add_entry()
  • Clean up error & success functions for jQuery.ajax() call in add_entry()
  • Handle error messages returned from back-end
  • Correct warning for (future) Google Analytics ID variable in configuration
  • Rename (make consistent) filter for the type of posts that can be managed by this plugin
  • is_present() will loop through the $this->posts array looking for the post_id & delay value specified. Returns false if not found & the array key value if found.
  • Ensure the error <div> is present in the sequence metabox
  • Remove ‘draft’ as a valide default post status to list.
  • Clean up variable names in $_POST for the add operation
  • Return error message/warning to back-end if post_id/delay combination is present in system.
  • Refactor add_post_callback()


  • Primarily convert to V3 as part of plugin activation or if the user attempts to load the sequence.
  • Would sometimes get into a load/convert loop Flag conversion attempt as ‘forced’ if no posts are found with V3 format and the sequence is NOT previously converted.
  • Add padding to opt-in checkbox
  • Could loop indefinitely during conversion of user opt-in settings for certain users.
  • Would sometimes hide the opt-in check-box
  • Don’t print settings to debug log.
  • New and empty sequences would incorrectly be flagged as needing conversion.
  • Updated translations (Norwegian & English/US)


  • Wouldn’t always honor the refresh value when loading the sequence
  • Refactor conversion for user’s new-post notice settings
  • Clean up erroneous notification settings for user
  • Didn’t save the “Allow email notification” setting
  • JavaScripts now reflect the version number of the plug-in.


  • Didn’t always set the optin_at timestamp correctly in the default user alert settings
  • Removed redundant option management
  • Don’t show a checkmark if the user has opted-out of receiving alert notices/emails
  • Fixed typo in send_notices variable for the opt-in callback
  • Prevent user from being overwhelmed by old alert messages when opting back in
  • Didn’t always handle situations where the alert notice timestamp for a user was reset
  • Use post->id and the normalized delay value for the notified flag in user alert settings
  • Allowed saving of user alert settings when there was no sequence ID specified
  • Force load (refresh cache) of sequence members on start of convert_alert_setting()
  • Fix fix_user_alert_settings() so it correctly identified valid & invalid alert notices.
  • Refactor load of metadata version matrix
  • Add check of validity of post cache
  • Use cached data to locate specific post ID in find_by_id (faster loop rather than DB lookup)
  • Add debug for load_sequence_post() variables
  • Refactor load_sequence_post()
  • Improve search for delay values (correctly identify date or numeric format)
  • Load options rather than posts & options in load_sequence_meta()
  • Refactor get_sequences_for_post()
  • Remove impossible option load in sort_posts_by_delay()
  • Refactor function order in class
  • Use normalized delay values in convert_alert_setting()
  • Add function to fix user alert settings
  • Add function to remove old user alert settings
  • Fix is_after_opt_in() to support new user alert setting format


  • Didn’t always display the delay input box in the post editor metabox.
  • Make opt-in checkbox responsive
  • Update change log & version numbers


  • Add all_sequences() static function
  • Add post_details() static function
  • Update change log & version numbers
  • Allow calling PMProSequence::sequences_for_post() to return array of sequence IDs for the post_id specified
  • Add static function to fetch all sequence IDs that a post_id is associated with


  • Update version number and change log
  • find_by_id() would sometimes load unneeded posts (and not honor cache)
  • When loading a specific post_id for the sequence, don’t ignore drafts (May cause duplication in DB)
  • Fix typo in debug output for remove_post()
  • Log the specific post being removed from the post list in remove_post()
  • Only overwrite belongs_to array if the array is empty first
  • Include sequence ID when loading the sequence specific meta data for $post_id in rm_sequence_from_post() callback function
  • Update translations
  • Update text in email opt-in checkbox


  • Load Font Awesome fonts as part of script/style load
  • Update path to Font Awesome fonts (CDN)


  • Would sometimes return all posts in the sequence while deleting one post.
  • Fix undefined variable warning in load_sequence_post()
  • Didn’t include sequence members (posts) in DRAFT state when displaying list of sequences in metabox(es)
  • Can specify post_status values to include in load_sequence_post() (array() or string)
  • Prefix any post in draft status with ‘DRAFT’ (or translated equivalent) in metabox list of posts for sequence
  • Run wp_reset_query() before returning all sequences in get_all_sequences().


  • Would sometimes issue warning in find_by_id()
  • Updated to direct user to dashboard


  • Would sometimes trigger warning message while searching for a specific post ID
  • Only grant blanket access to post in sequence if admin is logged in on dashboard and we’re not in an ajax operation
  • Comment out incomplete Google Analytics tracking support
  • Add debug output for send_notice() to help troubleshoot
  • Make opt-in form full-width


  • On the edit.php page, add a ‘Clear alerts’ button for a specific post/sequence/delay combination
  • Allow admin to clear notification flags for a specific post/delay/sequence id from the posts edit page
  • Make language tag consistent


  • Conditional return triggered fatal error in certain situations
  • Use absolute URL for fontawesome
  • Respect theme settings for fonts/text in widgets
  • Respect theme settings for fonts/text in other text
  • Fix error if is_managed() is called while PHP is outputting data
  • Stop forcing access check for posts that aren’t managed by any sequences.
  • Fix formatting problem
  • Initial update of version number to 3.0.4
  • Update template file for vpt_reminder.html


  • Fix: Namespace declaration for Sequences class(es)
  • Fix: Move namespace declaration to Sequence class
  • Fix: PHPDoc for some of the classes (apply namespace)
  • Fix: Namespaces for Sequence class
  • Fix: Set global namespace for standard PHP classes (DateTime, DateTimezone, stdClass, WP_Query, etc)
  • Fix: Loading Fontawesome from local resource for Sequence icon(s)
  • Enh: Use wp_enqueue_* rather than wp_register_* functions
  • Fix: Use namespace in register_widget()
  • Update namespace for WP_Widget parent class
  • Add FontAwesome as local resource
  • Add fonts directory to build script
  • Replace pmpro_ and pmpro- instances with e20r_ and e20r- instances respectively
  • Rename all instances of pmpro-sequence to e20r-sequence
  • Rename plugin to e20r-sequences Use namespaces for classes
  • Move all classes under PLUGIN_DIR/classes and PLUGIN_DIR/classes/tools
  • Create Tools\Cron class & move worker function to its own class & namespace
  • Rename widget class to PostWidget
  • Rename the sequences controller class to Sequence
  • Remove sequence icon images (using fontawesome instead)
  • Rename all pmpro_ files to e20r_
  • Update README & .json files


  • Fix: Namespace for Tools/Cron
  • Fix: Use singleton model for sequence object
  • Fix: Renamed Job() class to Cron() for autoloader purposes Refactor file
  • Fix: Renamed class to simplify autoload
  • Fix: Behave different if the user isn’t logged in
  • Fix: Only remove old pmpro sequences cron jobs if PMPro Sequences is no longer loaded/active
  • Fix: Didn’t correctly identify the privilege level of the user
  • Fix: Transmit sequence to process in do_action for cron hook when manually requesting notices to be sent
  • Fix: Properly identify the sequence to process alert notices for (when specified)
  • Fix: Manual send of post notices (with argument).
  • Fix/Enh: e20r_available_on shortcode now only needs ‘when’ attribute. Can be a date, or days since the currently logged in user’s start of membership
  • Enh: Move all cron job management to E20R\\Sequences\\Tools\\Cron\\Job class
  • Enh: Adding debug info
  • Enh: Add call to import/convert existing PMPro Sequences metadata as needed.
  • Enh: Refactor cron management and move to Cron\\Job class
  • Enh: Use singleton pattern with hook for instance
  • Enh: Refactor class-tools-cron.php
  • Enh: Refactored class-sequence.php file
  • Enh: Update README.* files
  • Enh: Add PMPro Sequences conversion function (incomplete)
  • Enh: Update version number (4.0.1)
  • Enh: Add Shortcode namespace
  • Enh: Skip unneeded code traversal in convert_date_to_days when receiving a day number as our argument
  • Enh: Add e20r_available_on shortcode – Let admin wrap content/text that won’t be visible to the user until the specified day of membership, or date.
  • Enh: Initial commit for available_on shortcode class
  • Enh: Renamed Job() class to Cron() and renamed the source file for autoloader simplicity
  • Enh: Moved PostWidget class definition into widgets directory for autoloader/namespace reasons.
  • Enh: Add autoloader support for classes
  • Enh: Remove static load of classes


  • Set namespace for main plugin file
  • Define namespaces used by main plugin file
  • Fix autoloader
  • Use renamed Controller() class for Sequence
  • Escape global namespace entities
  • Renamed class & class file Fix namespace issues
  • Fixed typo in Namespace alias
  • Fixed Namespace issues
  • Fixed PHP Warning message while processing cron jobs


  • Fix: Namespace for functions to import PMPro Series and PMProSequences data


  • Fix: Error when loading [[e20r_available_on]] shortcode.


  • Fix: Email alert sent on days where no new/repeating post is released
  • Enh: Load fontawesome fonts from local server (not CDN)


  • Fix: Format check for ‘when’ attribute didn’t always return the correct result.
  • Fix: Sometimes generates an undefined offset notice while running cron job
  • Fix: Test actual parameter that should be configured unless options haven’t been defined yet
  • Enh: Use \WP_Query() and leverage cache while deactivating the plugin & removing cron jobs.
  • Enh: Add link to issues section on


  • Fix: Searchable select box would sometimes stop working in backend
  • Fix: More reliable detection of origination of add/remove post/page
  • Fix: More robust error handling during remove post/page operation
  • Fix: More robust error handling during add post/page operation
  • Fix: More robust error handling during clear cache operation
  • Fix: Display any warning messages after add post/page operation
  • Fix: Avoid confusion when checking user access rights to a post/delay/sequence combination
  • Fix: Extra training slashes for the autoloader paths
  • Fix: opacity setting when fading the post as we hover in sequence history list
  • Fix/Enh: Include warning messages resulting from add/remove operation
  • Fix/Enh: Make add/remove operations more robust
  • Enh: Add error handling as class: E20RError
  • Enh: Add styling for ‘clear cache’ button position in back-end
  • Enh: Add & load Error message class (E20RError)
  • Enh: Force a sequence cache clean-up from wp-admin
  • Nit: Refactor Controller class


  • Fix: Adding/Removing posts to sequence could result in JavaScript error
  • Fix: Would sometimes attempt to process auto-drafts


  • Fix: Generating warning message while processing delay configuration for sequence(s)
  • Fix: Didn’t always ignore unpublished/unavailable sequences


  • Fix: Didn’t always select the correct key for the sequence cache
  • Fix: Didn’t always load new sequence data


  • Fix: Load template (or exit if template can’t be found)
  • Fix: Didn’t respect settings for individual alerts for new content (not digest)
  • Fix: Remove hidden/inactive code
  • Fix: Correctly handle digests and single notification per post scenarios
  • Fix: Add support for multiple or single notification message to user.
  • Fix: Use actual sequence objects when processing notices/alerts
  • Fix: Typo in template example
  • Enh/Fix: Allow more than one post to be returned if there are multiple posts with the same delay value in the sequence
  • Enh: Include post excerpt(s) when loading post(s) for/to a sequence
  • Enh: Remove unused code from closest post logic Fix: Didn’t always respect the notice type (as a digest of links or individual posts) for notices/alerts.
  • Enh: Add support for sending one or more notices to user for a single day’s worth of content.
  • Enh: Add new_content_list template (Improved formatting for list of new content in the sequence).


  • Fix: Didn’t always load the correct font while in backend


  • Fix: Didn’t include all ‘unalerted’ content prior to the specified delay value when sending alerts to users


  • Fix: Intermittent login page display error
  • Fix: Avoid using reserved variable names
  • Fix: Use the \WP_Error as parent for E20RError class


  • Fix: Didn’t always allow access to a post that was supposed to be available
  • Fix: The subject of email alerts used the incorrect date for the post alert
  • Enh: Didn’t have a default notification type (single post per alert)
  • Enh: Use WP’s time constants (DAY|WEEK|etc_IN_SECONDS)
  • Enh: The replaceable value !!today!! didn’t use the delay value of the post to calculate the date.


  • Fix: Would attempt to load sequence posts for users not logged in.
  • Fix: Didn’t include the title for the new content in alert(s)


  • Fix: Various problems with calculating the correct time for the next cron run.
  • Fix: Plugin info Fix: Copyright notice
  • Fix: Version number bump
  • Fix: Update copyright notice
  • Fix: Would sometimes load zero sequence members (posts) due to caching issues
  • Fix: Confirm that there is a live cache entry for the user/sequence in is_cache_valid()
  • Fix: Wouldn’t load sequence posts if running as a cron job
  • Fix: Simplify timestamp management/creation
  • Fix: Bump minimum required PHP version to 5.4
  • Maint: Escape backslash for JSON
  • Maint: Updated .gitignore
  • Enh: Add modules namespace (preparation for dedicated content protection modules)
  • Enh: Initial commit of membership module base class
  • Enh: Use constant for select2 library versions Fix: Path to CDN for select2 library Fix: Enqueue select2 CSS
  • Enh: Loading list of sequence(s) and its consumers (users) in dedicated & filtered function
  • Enh: No longer depends on PMPro to process cron jobs, but has default reliance on it (Upcoming: Decouple PMPro requirement)
  • Enh: Better error recovery in cache management
  • Enh: Use standard method for obtaining the cache identifier for the user/sequence
  • Enh: Decouple most of the PMPro dependencies & use filters instead
  • Enh: Enforce singleton behavior for sequence class
  • Enh: Use static variable – self::$seq_post_type – to identify the sequence post type
  • Enh: New filter for default sender email for a sequence: e20r-sequence-default-sender-email (returns email address, uses admin email as default)
  • Enh: New filter for default sender name for a sequence: e20r-sequence-default-sender-name (returns a string, uses admin’s display_name as default)
  • Enh: New filter for user’s startdate: ‘e20r-sequence-user-startdate’ (accepts startdate, user_id variables, returns a UNIX timestamp/seconds since start of epoch)
  • Enh: New filter for days as member calculation: ‘e20r-sequence-days-as-member’ (accepts $user_id & $level_id, returns #of days (float or int))
  • Enh: New filter to get the membership level for a user: ‘e20r-sequence-membership-level-for-user’ (Accepts a user_id and a boolean ‘force’ variable to indicate whether to read from DB or cache if applicable. Returns the user’s membership level ID or false if not a member)
  • Enh: New filter to check membership levels for a user id: ‘e20r-sequence-has-membership-level’ (Accepts an integer or array representing level id(s) and a user Id to check. Returns true/false)
  • Enh: New filter to check membership access to a post id for a user id: ‘e20r-sequence-membership-access’ (Accepts optional post id, optional user_id and a boolean flag to determine whether to force a read from any DB table (if it exists).


  • Fix: Roll back $seq_post_type static use
  • Fix: Remove dependency on pmpro_getMemberStartdate() function
  • Fix: Could fail with error during import of PMPro Series member posts
  • Fix/Enh: Rely completely on autoloader
  • Enh: New version of update-checker for plugin.


  • Fix: Whitescreened due to undefined function call


  • FIX: Didn’t always handle cases where post/page was given delay value of 0
  • FIX: Make text translatable
  • FIX: Update translation file to include latest updates
  • FIX: Would show the calling function for the active function
  • FIX: Returned warning if sequence was empty.
  • FIX: Didn’t use the correct opt-in string in shortcode.
  • FIX: Didn’t always load translation
  • FIX: Didn’t load translations correctly
  • FIX: Update copyright notice
  • FIX: Grammar update
  • FIX: Clean up Change log
  • FIX: Remove old PMPro functions
  • FIX: Transition to DBG::log()
  • FIX: Transition to DBG::log()
  • FIX: Didn’t use absolute path when loading the language files.
  • FIX: Uninitialized variable warnings
  • ENH: Refactor shortcodes to own class files
  • ENH: Add new Norwegian translation files
  • ENH: Adding example settigns for user_email & display_name in default settings.
  • ENH: Add debug logging class
  • ENH: Add excerpt support for CPT page
  • ENH: Rename local datediff() function
  • ENH: Use DBG::log() functions & configure for current plugin
  • ENH: Autoloader needs to support new DBG:: class.
  • ENH: Updated translation files for Norwegian/Bokmål
  • ENH: Refactor debug functionality to own class & namespace


  • FIX: Would sometimes trip on Singleton error
  • FIX: Updated language files
  • FIX: Removed old language files (didn’t load)


  • FIX: e20r-sequence-email-alert-template-path requires array() of paths as argument
  • FIX: Support for customized reminder templates (stored in ‘sequence-email-alert’ directory under active theme.
  • FIX: Add login form redirect support to email notices
  • ENH: Add !!post_url!! as valid substitution in email templates.
  • ENH: Add filter to !!sitename!! variable for email alerts


  • FIX: Error while attempting to print debug output


  • FIX: Remove function name(s) in debug output for cron job(s).
  • FIX: Clean up path management for template(s).
  • ENH: Remove dependency on PMProMailer class and roll our own mailer class.
  • ENH: Introduce use of own function for fetching Sequence option(s)
  • ENH: Rename prepare_mailobj() function to prepare_mail_obj()
  • ENH: Use get_option_by_name() in prepare_mail_obj()
  • ENH: Remove dependency on PMPro mail class (roll our own, based on theirs)
  • ENH: Add E20R\Sequences\Tools\e20rMail() class
  • ENH: Use own email class
  • ENH: Make all substitute codes filterable by default.
  • ENH: Add filter to modify/set data to substitute
  • ENH: Clean up how we handle directories and files for templates


  • FIX: Didn’t always have a saved setting for the type of alert to send (digest or individual for each post).
  • FIX: Verify correct PHP version before loading the plugin
  • FIX: License header
  • ENH: Fix I18N string for PHP warning
  • ENH: Updated Norwegian translation files
  • ENH: Update README.txt to highlight new substitution filter(s)
  • ENH: Update to highlight new substitution filter(s)
  • ENH: Add set_option_by_name() function


  • FIX: Add e20r-sequences loader file to build
  • FIX: Incorrect path to loader file


  • FIX: Would sometimes error during display of available posts for sequence (in post list metabox)
  • FIX: Simplified security management
  • FIX: Refactored CSS (out of .php & into dedicated CSS files)
  • FIX: Error when attempting to load sequence info
  • FIX: Would sometimes return too many sequences
  • FIX: Would sometimes return incorrect number of sequences.
  • FIX: Reflect new version number (4.4)
  • FIX: Revert version fix
  • FIX: Didn’t account for pages < pagesize.
  • FIX: Autoload the views class
  • FIX: Conversion check didn’t always return the correct status for a sequence
  • FIX: Updated default options to match new, simpler settings management
  • FIX: Load the appropriate upgrade logic (if present).
  • FIX: Didn’t always load the front-end scripts when loading the sequence page
  • FIX: Don’t send notification alerts for posts with a 0 delay
  • FIX: Make compatible with new settings/option names & fields
  • FIX: Instantiation of singleton class
  • FIX: Numerous issues related to moving the view code out of the controller
  • FIX: Simplify saving of sequence options/settings from backend
  • FIX: Didn’t always load the correct instance of the class
  • FIX: Would sometimes loop too many times during update check
  • ENH: Clean up Sequence meta from member posts/pages/CPTs if the sequence itself is deleted
  • ENH: Convert settings to new (easier to manage) settings for the sequence. (initial commit)
  • ENH: Add stub functions for update actions in e20rSequenceUpdates class
  • ENH: Simplify up-front loading of classes
  • ENH: Make ‘add post to sequence’ metabox responsive
  • ENH: Remove some of the duplicate DEBUG info
  • ENH: Support using separate view class
  • ENH: Set option for update(d) version
  • ENH: Simplify saving options/settings for the sequence
  • ENH: Add debug to debug status of post/pages being loaded from DB
  • ENH: Move view related code to own class
  • ENH: Remove some of the duplicate DEBUG info
  • ENH: Remove sequence meta from post(s) when sequence gets deleted.
  • ENH: Add upgrade handling to hook system
  • ENH: Simplify saving/loading options & settings in backend meta box
  • ENH: Initial commit for refactoring view related functions
  • ENH: Initial commit for update functionality tool
  • ENH: Add debug output for is_after_opt_in()
  • ENH: Whitespace clean-up
  • ENH: Simplified security protocol (minimize probability for error while maximizing security)
  • ENH: Add license information
  • ENH: Updated Norwegian translation (Norsk/Bokmål)
  • ENH: Add description on how to add new alert templates
  • NIT: Updated fix version
  • NIT: Refactored class


  • FIX: Intermittent problem changing sort order
  • FIX: Didn’t always display full sequence list for shortcode
  • FIX: Sequence listing didn’t always display correctly in sequence_list shortcode
  • FIX: Pagination didn’t always work after view/controller split


  • FIX: Update version number and link to plugin info
  • FIX: Clean up update checker
  • FIX: Run upgrade process for all versions after v4.4
  • FIX: Duplicate DEBUG info
  • FIX: Didn’t always include the excerpt data for the notification message when sending one message per post
  • ENH: Updated Translation files
  • ENH: Update version history for updates


  • FIX: Didn’t always update the plugin
  • FIX: Update WP Compatibility


  • FIX: Didn’t always trigger the cron jobs
  • ENH: Update version for upgrade history


  • FIX: Disable cleanup on delete
  • FIX: Debug cleanup
  • ENH: Update version for upgrade history


  • FIX: Strict standards warning
  • FIX: Better handling of new values
  • ENH: Update version for upgrade history


  • DOC: More functions w/documentation
  • FIX: Didn’t always run the deactivation/activation functions
  • FIX: Keep backwards compatibility for now (to old sequence versions)
  • FIX: Didn’t force a sequence load after conversion
  • FIX: Didn’t always trigger conversion to V3 format
  • ENH: New constant for the main plugin file
  • ENH: Refactor (a little) for code readability
  • ENH: Add support for per-sequence start date (uses membership plugin startdate if there isn’t any info in the users usermeta)
  • ENH: Modified user_can_edit to support filter of required permissions (user settable)
  • ENH: Simplified loading of front-end JavaScript & Styles (fewer hoops)
  • ENH: Add update code for 4.4.7


  • FIX: Didn’t always handle checkbox settings correctly


  • FIX: Refactor for code readability
  • FIX: Simplify error message(s) for non-converted sequences
  • FIX: Didn’t always handle start times for users
  • FIX: Don’t attempt to fix conversion during sequence load
  • FIX: Didn’t handle situations where the timezone for the server wasn’t configured yet
  • FIX: Only attempt to upgrade a sequence during activation.
  • FIX: Renamed convert_sequence function to upgrade_sequence() and add $force variable.
  • FIX: Make user notice config a per-sequence update event.
  • FIX: Formatting for sequence configuration metabox
  • ENH: Add more formatting for metaboxes


  • ENH: Refactor for readability
  • ENH: Record startdates for a user’s (new) sequences on membership module purchase action/activity
  • ENH: Add infrastructure to support startdate management for any hookable membership module
  • FIX: Didn’t capture the correct startdate for the user with the sequence


  • FIX: Didn’t always return all of the configured sequences
  • FIX: Didn’t return the right list of sequences protected by a specific membership level
  • FIX: sequences_for_membership_level() didn’t handle cases where there were no sequences configured yet
  • FIX: Didn’t consistently return valid SQL for sequence list belonging to a given membership level (PMPRO)
  • ENH: Added update version history
    ENH: Automatically update active membership user records w/the right startdate for the sequence(s) in the system.
  • ENH: Updated get_user_startdate() to support upgrade functionality
  • ENH: Add sequence ID to filters for startdate
  • ENH: Added PHPDoc for new function(s)


  • FIX: Didn’t always trigger upgrade activity for v4.4.11
  • FIX: get_user_startdate() caused whitescreen due to method visibility.


  • FIX: Didn’t always return all of the configured sequences


  • FIX: Escape variables being loaded to the front-end listing of Sequence members.
  • FIX: List upcoming posts if they’re supposed to be visible
  • FIX: The default shortcode settings weren’t correct.
  • FIX: Flag an update routine as having ran after executing the pre/update/post hooks.
  • FIX: Didn’t always find the cache key to use
  • FIX: Didn’t always load the sequence data for the user from cache when available
  • FIX: Didn’t always paginate sequence lists properly
  • FIX: Would sometimes remove old metadata erroneously
  • FIX: paginate_posts() didn’t always return the correct list of posts
  • FIX: Make the display_sequence_content() function behave a little ‘better’ when being executed by the ‘the_content’ filter
  • FIX: Didn’t always align the future & current availability info.
  • FIX: Resolved a possible CSS element name conflict with themes
  • FIX: Didn’t always load the post title in the sequence list view
  • ENH: Optimize the number of times we attempt to load sequence posts
  • ENH: Use the WordPress configured date format when listing future (unavailable) posts & the sequence is configured to show dates.
  • ENH: Would sometimes run the update functionality more than once
  • ENH: Clean up debug logging


  • FIX: has_post_access() would sometimes return the incorrect access value for the post_id.
  • FIX: [sequence_links] shortcode would sometimes show the sequence info for users who didn’t have access to it.
  • FIX: Various styling issues
  • FIX: Make usertstyle URL filter more self-documenting in nature
  • ENH: Load support for user created styles (loads after default Sequences styles)
  • ENH: Filter & use member specific sequence ‘access denied’ message(s).
  • ENH: Add Member Module specific access denied message(s).
  • ENH: Hook for Member Module Specific access denied message(s)
  • ENH: Added filterable ‘Content is inaccessible’ message.


  • FIX: Clean up Navigation links


  • FIX: Delay column formatting/layout
  • FIX: Doesn’t properly display the Meta-table for the Sequence members on the editor page
  • FIX: Formatting for table of sequence posts on post-editor page


  • FIX: Didn’t always mark ‘future’ posts as being ‘future’.


  • FIX: Didn’t load the Optin handler script correctly
  • FIX: Avoid JS error if the sequence settings were missing
  • FIX: Clean up HTML for post list in admin metabox
  • FIX: Didn’t allow translation of ‘None’ option in offset drop-down.
  • ENHANCEMENT: Started work to make Sequence Post metabox (bottom) responsive
  • ENHANCEMENT: Refactor & clean up
  • ENHANCEMENT: Added user ID to e20r-sequence-add-startdate-offset filter
  • ENHANCEMENT: Added ‘e20r_sequences_load_membership_plugin_meta’ action (future user)
  • ENHANCEMENT: Clean up buffers & returns the content (warning / notice messages) for AJAX calls
  • ENHANCEMENT: New filters to support per-sequence startdate functionality (including using usermeta) – e20r-sequence-use-membership-startdate, e20r-sequence-use-global-startdate
  • REFACTOR: Make CSS file more readable

2 Replies to “Easy to Configure Drip Content plugin for Paid Memberships Pro”

  1. Having read this I thought it was extremely enlightening. I appreciate you taking the time and effort to put this short article together. I once again find myself personally spending a lot of time both reading and commenting. But so what, it was still worth it!

  2. It’s actually a nice and useful piece of info. I am glad that you just shared this useful info with us. Please keep us up to date like this. Thank you for sharing.|

Leave a Reply

Your email address will not be published. Required fields are marked *