== Changelog ==
= 3.8.1 - 2026-06-29 =
* ENHANCEMENT: Added a new `style` attribute to the `[pmpro_checkout_button]` shortcode to render it as a link or a button, and improved its styling. #3708 (@kimcoleman)
* ENHANCEMENT: Improved the HTML validity and accessibility of frontend forms and pages, including fixing duplicate `id` attributes and invalid fieldset/legend markup. #3707 (@kimcoleman)
* ENHANCEMENT: Added a new `pmpro_restrictable_taxonomies` filter, allowing Add Ons to register custom taxonomies whose terms can be restricted by membership level from the term edit screen. #3704 (@kimcoleman)
* BUG FIX: Fixed a fatal error on the Membership Billing page when a subscription's gateway object could not be loaded. #3706 (@kimcoleman)
* BUG FIX: Fixed the Members List CSV export so the exporting admin is no longer incorrectly included when exporting filtered or searched results. #3711 (@andrewlimaza)
* BUG FIX: Fixed a 404 error when viewing email log details in the modal on sites using Plain permalinks. #3712 (@dwanjuki)
* BUG FIX: Fixed select fields overflowing the viewport on small screens. #3705 (@kimcoleman)
* BUG FIX: Saving a membership level no longer clears term restrictions, such as tag restrictions, that were set from the term edit screen. #3704 (@kimcoleman)
* BUG FIX: Restricted posts are now correctly hidden from searches and archives when a term's ID and term taxonomy ID differ. #3704 (@kimcoleman)

= 3.8 - 2026-06-15 =
* FEATURE: Upgraded the email template editor to the standard WordPress visual/text editor with built-in Liquid syntax autocomplete for variables, tags, and filters. #3695 (@dparker1005)
* FEATURE: Added a new `[pmpro_membership_level]` shortcode for displaying membership level details. #3087 (@kimcoleman)
* ENHANCEMENT: Added Divi 5 compatibility for PMPro module-level restrictions and no-access message handling. #3620 (@JarrydLong)
* ENHANCEMENT: Added a new `level_group_id` email template variable to every email template class that exposes `membership_id`. #3684 (@kimcoleman)
* ENHANCEMENT: Allowed shortcodes in the account page message. #3682 (@kimcoleman)
* ENHANCEMENT: Removed the misleading "Advanced Settings" hint from the no-access message controls. #3699 (@dparker1005)
* ENHANCEMENT: Clarified the user field meta key hint on the user field settings page. #3698 (@kimwhite)
* ENHANCEMENT: Added an Add On icon for the MemberPress Migration Toolkit. (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now hiding the recurring trial settings on membership level and discount code edit pages when the active gateway doesn't support recurring trials. #3628 (@dparker1005)
* BUG FIX/ENHANCEMENT: Added a fallback for email logging when SMTP plugins (e.g. Gravity SMTP) bypass the `wp_mail_succeeded` and `wp_mail_failed` actions. #3697 (@andrewlimaza)
* BUG FIX: Cleaned up orphaned membership level relationships when a level is deleted. #3693 (@dparker1005)
* BUG FIX: No longer shows the membership confirmation message when the order has not been confirmed. #3682 (@kimcoleman)
* BUG FIX: Fixed a fatal error on the Membership Billing page for logged-out requests. #3694 (@flintfromthebasement)
* BUG FIX: Fixed the Orders list table appearing blank on mobile by setting the order code as the default primary column. #3696 (@dparker1005)
* BUG FIX: Cleared stale card information when a recovered Stripe payment uses a non-card payment method. #3703 (@dparker1005)
* REFACTOR: Removed unused `pmpro_userfields_get_group` and `pmpro_userfields_get_field` AJAX handlers. #3672 (@dparker1005)
* DEPRECATED: Deprecated the credit card expiring email template. #3688 (@dparker1005)
* DEPRECATED: The Membership Billing page no longer writes `pmpro_b*` user meta on save, and the email field has been removed from that page. #3668 (@dparker1005)

= 3.7.4 - 2026-05-28 =
* BUG FIX/ENHANCEMENT: Skip the `pmpro_visit` cookie when `WP_CACHE` is active so page caches like Surge, Cloudflare, Varnish, and WP Super Cache aren't bypassed on anonymous front-end requests. Added a new `pmpro_set_visit_cookie` filter to override the default behavior. #3690 (@flintfromthebasement)
* BUG FIX: Fixed Stripe recurring orders silently saving `tax = 0` after the Stripe API version bump by deriving tax from `invoice->total_excluding_tax` instead of the deprecated `invoice->tax`. #3685 (@dwanjuki)
* BUG FIX: Fixed Site Health reporting a false-positive Action Scheduler library conflict on Windows hosts by normalizing the library path before the conflict check. #3687 (@dparker1005)
* BUG FIX: Fixed button icons no longer being inline in the WordPress 7.0 admin and the "Show" label floating to the right of the levels dropdown on the Members List screen. #3689 (@RachelRVasquez)

= 3.7.3 - 2026-05-14 =
* SECURITY: Added a nonce check to the Update Billing Information page to prevent CSRF, and tightened the gate so enforcement only skips on sites explicitly opted into a pre-3.7.3 custom billing template. The billing template version has been bumped to 3.7.3. #3671 (@dparker1005)
* SECURITY: Tightened the checkout page nonce enforcement gate so it only skips on sites explicitly opted into a pre-3.0 custom checkout template, closing a gap where sites with a pre-3.0 custom `checkout.php` in their theme could bypass nonce checks without opting in. #3674 (@dparker1005)
* ENHANCEMENT: Added new action hooks to the subscriptions panel of the Edit Member screen and the single subscription view. #3666 (@kimcoleman)
* ENHANCEMENT: Added nonce checks to read-only admin AJAX handlers (`pmpro_orders_print_view`, `pmpro_get_order_json`, `login_report_csv`, `sales_report_csv`, `membership_stats_csv`) for consistency with other admin AJAX endpoints. #3673 (@dparker1005)
* ENHANCEMENT: Added the new `pmpro_use_advisory_locks` filter as a system-wide escape hatch to disable MySQL advisory locking on hosts where persistent MySQL sessions or other environment quirks cause stuck locks. #3649 (@dparker1005)
* ENHANCEMENT: Replaced the vague "Stripe dashboard settings" wording with a direct link to the Stripe Radar rules page in the billing address field description. #3677 (@dparker1005)
* BUG FIX: Prevented concurrent Stripe webhook deliveries from racing on the same order by introducing a MySQL advisory lock around webhook processing. This fixes cases where "at least once" Stripe delivery from multiple infrastructure nodes could create duplicate membership rows or cancel a freshly-created subscription. #3649 (@dparker1005)
* BUG FIX: Fixed the Old Members CSV export to exclude users who currently have any active membership, matching the logic already used by the expired and cancelled filters. #3680 (@dwanjuki)
* BUG FIX: Fixed a PHP warning and a missing payment transaction ID when Stripe checkout sessions complete asynchronously (e.g. Bank Transfer), where the PaymentIntent has no `latest_charge` at completion time. #3655 (@dwanjuki)
* BUG FIX: Honored the configured currency decimals in `pmpro_get_price_info()`'s `amount_string` so zero-decimal currencies (JPY, KRW, VND, UAH, ALL) no longer produce strings like "25.00" that PayPal billing rejects. Also fixed `pmpro_get_currency()` so it actually honors the `$currency` parameter it advertises. #3676 (@dparker1005)
* BUG FIX: Allowed updating billing for subscriptions without a successful order on file, so manually-linked subscriptions in the admin no longer redirect users away from the billing page. #3667 (@dparker1005)
* BUG FIX: Fixed the Restricted Files protection self-test reporting "Unable to determine" on sites with no member uploads, by writing a non-dotfile marker (`pmpro-protection-test.txt`) alongside the existing `.htaccess`. #3675 (@dalemugford)

= 3.7.2 - 2026-05-01 =
* SECURITY: Tightened ownership check in the `/pmpro/v1/order` REST permission callback to bail early for anonymous requests, require a non-empty order ID, and use a strict integer comparison. #3643 (@flintfromthebasement)
* SECURITY: Scoped the `/pmpro/v1/quick_search` users meta lookups to custom profile fields by skipping internal WP/plugin meta keys. Added the `pmpro_rest_api_quick_search_meta_key_blocklist` filter so sites can extend the blocklist. #3644 (@flintfromthebasement)
* SECURITY: Fixed a non-functional capability guard in `PMPro_Field_Group::save_fields()` where a literal string comparison made the `current_user_can( 'edit_user' )` check unreachable. #3645 (@flintfromthebasement)
* ENHANCEMENT: Reworked the Email Settings and Security Settings admin pages to detect the active email sending method and security provider, surface that information in Site Health, recognize PMPro Max as a provider, and remove the legacy built-in SendWP integration. #3656 (@kimcoleman)
* ENHANCEMENT: Renamed the Builder and Plus Add Ons to Max throughout the admin and labeled all paid Add Ons under the new Premium license tier. #3650 (@dparker1005)
* ENHANCEMENT: Added the new PayPal Gateway Add On to the Payment Gateway settings page, surfacing it as "Enabled (via Add On)" when active as a secondary gateway. #3657 (@dparker1005)
* ENHANCEMENT: Added new filters for avatar upload location and render location to support multisite installations. #3648 (@kimcoleman)
* ENHANCEMENT: Updated the Design Settings page link to a direct URL so tracking parameters work without a redirect. #3625 (@kimwhite)
* ENHANCEMENT: Added/updated Add On icons including a new MailerLite icon for an upcoming Add On. #3627, #3652 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed three bugs that caused member CSV export downloads to return 403/404: deferred export record cleanup until after the file is served, extended download token TTL to 7 days and hardened the URL builder when no token is available, and prevented zero-record exports from creating a ghost "complete" state. Introduced the `pmpro_restricted_file_served` action and buffered handler output to avoid corrupting the response. #3637 (@dalemugford)
* BUG FIX: Fixed a deprecated `pmpro_changeMembershipLevel()` call when deleting a WP user. #3660 (@kimwhite)
* BUG FIX: Fixed deprecation notices in `pmpro_cleanPhone()` when the phone value is `null`. #3654 (@dwanjuki)
* BUG FIX: Fixed the All Levels member export producing duplicate rows and omitting members with higher user IDs in large exports. #3632 (@flintfromthebasement)
* BUG FIX: Fixed the `checkbox_grouped` field input not receiving the correct CSS selectors. #3646 (@kimcoleman)
* BUG FIX: Skipped content visibility controls for unsupported blocks in widget editors to prevent JS errors. #3653 (@dwanjuki)

= 3.7.1 - 2026-03-25 =
* BUG FIX: Fixed some admin pages not saving due to POST redirect in list table referer cleanup. #3624 (@kimcoleman)
* BUG FIX: Fixed PHP 8.1 deprecation warnings in restricted files functions on Windows servers with misconfigured upload directories. #3623 (@flintfromthebasement)
* DEPRECATED: Deprecated the PayPal Express gateway. PayPal is retiring the NVP/SOAP API that PayPal Express relies on. A new PayPal integration is coming soon. #3622 (@dparker1005)
* DEPRECATED: Renamed the Website Payments Pro gateway slug from `paypal` to `paypalwpp` to free the `paypal` slug for the upcoming PayPal REST API Add On. #3622 (@dparker1005)

= 3.7 - 2026-03-23 =
* FEATURE: Added native profile picture (avatar) support, allowing members to upload custom avatars managed entirely within PMPro instead of relying on Gravatar. #3597 (@ideadude)
* FEATURE: Added a Quick Search feature for navigating Memberships admin pages. #3563 (@dparker1005)
* FEATURE: Added Liquid-style template rendering for email bodies with support for variables, filters, and conditionals. #3584 (@dparker1005)
* FEATURE: Added email logging for all emails sent by PMPro. The new `pmpro_should_log_email` filter can be used to enable email logging for non-PMPro emails as well. #3573, #3581 (@dparker1005)
* ENHANCEMENT: Added sidebar filter panels for the orders and subscriptions admin pages with support for level, status, date range, discount code, gateway, and total filters. #3602 (@dparker1005)
* ENHANCEMENT: Added To, CC, and BCC settings to the Email Templates editor. #3588 (@kimcoleman)
* ENHANCEMENT: Members and orders CSV exports now use Action Scheduler for improved reliability on large datasets. #3543 (@dalemugford)
* ENHANCEMENT: Added optional Action Scheduler support for deferrable webhook events. #3589 (@dparker1005)
* ENHANCEMENT: Added Site Health critical issue notification when plugins are using incorrect folder names. #3553 (@andrewlimaza)
* ENHANCEMENT: Added a restricted directory check to detect and report issues with the protected files directory. #3557 (@dalemugford)
* ENHANCEMENT: Improved support for reCAPTCHA v3 with score validation, defaulting to 0.5 and customizable via the `pmpro_recaptcha_v3_min_score` filter. #3564 (@andrewlimaza)
* ENHANCEMENT: Adjusted the Update Billing page to no longer automatically redirect away to the account page. #3566 (@andrewlimaza)
* ENHANCEMENT: Updated the Subscriptions admin screens to match the orders admin screens for view, edit, and link styling. #3568 (@kimcoleman)
* ENHANCEMENT: Removed use of the deprecated `SQL_CALC_FOUND_ROWS` modifier across all queries. #3571 (@dparker1005)
* ENHANCEMENT: Consolidated membership signup and cancellation queries for improved performance on dashboard reports. #3574 (@dparker1005)
* ENHANCEMENT: Now caching the Members Per Level report for improved dashboard performance. #3580 (@dparker1005)
* ENHANCEMENT: Added `membership_id` as a default column in the Members List CSV export. #3604 (@andrewlimaza)
* ENHANCEMENT: Now supporting `light-dark` values for contextual message CSS custom properties. #3606 (@kimcoleman)
* ENHANCEMENT: Added PMPro icon to the admin menu and updated the top menu bar to use an icon with screen reader text. #3607 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Updated the checkout form submit handler to improve reliability of payment processing. #3545 (@dwanjuki)
* BUG FIX/ENHANCEMENT: Updated the capability check for viewing admin user fields to use `pmpro_edit_members`. #3561 (@dparker1005)
* BUG FIX: Fixed dependencies for the content visibility block component to prevent enqueue issues. #3538 (@dparker1005)
* BUG FIX: Fixed a default height prop warning in block editor components. #3540 (@dwanjuki)
* BUG FIX: Fixed a console warning in WordPress 6.3+ by moving block asset enqueuing to the `enqueue_block_assets` hook. #3549 (@andrewlimaza)
* BUG FIX: Fixed slashed level names displaying with backslashes in the setup wizard. #3617 (@dparker1005)
* REFACTOR: Refactored the Stripe webhook handler into a new `PMPro_Stripe_Webhook_Handler` class. #3589 (@dparker1005)
* REFACTOR: Removed unused test scripts. #3600 (@dparker1005)
* DEPRECATED: Marked the Subscription Check Add On as deprecated on the Add Ons page. #3601 (@dwanjuki)
* DEPRECATED: Reading webhook status via `pmpro_doing_webhook()` is now deprecated. Use `pmpro_doing_webhook( $gateway, true )` for write mode only. #3603 (@dparker1005)
* DEPRECATED: The `pmpro_before_members_list_csv_export` and `pmpro_after_members_list_csv_export` actions are deprecated and no longer fired. #3543 (@dalemugford)
* DEPRECATED: Removed bundled core translation files to reduce the shipped plugin package size. #3605 (@dparker1005)

= 3.6.6 - 2026-03-13 =
* SECURITY: Added capability and nonce checks to Stripe webhook AJAX management endpoints. #3615 (@dparker1005)
* SECURITY: Added shared-secret token validation for the deprecated Authorize.net ARB Silent Posts integration with a configurable `pmpro_authnet_silent_post_token` option in gateway settings. #3598 (@dparker1005)
* BUG FIX: Fixed an operator precedence bug causing corechart.js to load on all report pages. #3609 (@flintfromthebasement)
* BUG FIX: Fixed an "Attempt to read property ID on null" warning in display post states. #3599 (@dwanjuki)

= 3.6.5 - 2026-02-26 =
* SECURITY: Gated the unverified Stripe webhook event fallback behind a new `pmpro_stripe_webhook_allow_unverified_post_event` filter, which defaults to `false`. #3592 (@dparker1005)
* ENHANCEMENT: Updated links to the Member Directory and Podcasting Use Case landing pages and hubs. #3593 (@kimcoleman)
* ENHANCEMENT: Added a new `pmpro_memberships_widget_periods` filter to allow customizing the time periods shown in the Memberships Report widget. (@kimcoleman)
* ENHANCEMENT: Added a new icon for the PMPro Kit Add On. #3575 (@kimcoleman)
* ENHANCEMENT: Now clearing the object cache when user fields are created, updated, or deleted to ensure changes show immediately when using persistent object caching. #3565 (@dalemugford)
* ENHANCEMENT: Updated the WP Fusion Lite integration through v3.47.6. #3583 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now ignoring PayPal error code 11556 when cancelling a subscription that is already inactive to avoid unnecessary admin notifications. #3572 (@dparker1005)
* BUG FIX: Fixed an issue where the field group description was not showing due to an incorrect variable reference. #3591 (@mircobabini)
* BUG FIX: Fixed an issue where failed Stripe recurring payment orders were missing card info and billing address data. #3590 (@dparker1005)
* BUG FIX: Fixed an issue where the membership level billing amount could be recalculated incorrectly when processing checkout via webhook, potentially losing discount code pricing. #3585 (@dparker1005)
* BUG FIX: Fixed an issue where the timestamp for new orders created in the admin could default to 1970 when the site timezone is not UTC. #3582 (@dparker1005)
* BUG FIX: Resolved PHP 8.5+ deprecation warnings for non-canonical cast names. #3560 (@dwanjuki)

= 3.6.4 - 2026-01-08 =
* ENHANCEMENT: Adding a new `!!order_url!!` email template variable to checkout email templates. #3555 (@kimcoleman)
* ENHANCEMENT: Now limiting failed payment emails to be sent a maximum of once daily per subscription. #3552 (@dparker1005)
* ENHANCEMENT: Now cleaning up library conflict records that are older than 7 days. #3554 (@dalemugford)
* BUG FIX/ENHANCEMENT: Discount codes now expire at the end of the date set as the "Expiration Date" instead of at the start of that date. #3559 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now ignoring Stripe `charge.failed` webhook events for subscriptions that have already been cancelled in Stripe which could interfere with processing the subsequent `customer.subscription.deleted` webhook event. #3556 (@dparker1005)

= 3.6.3 - 2025-12-15 =
* SECURITY: No longer prepopulating the password field on the checkout page after a failed checkout attempt. #3551 (@dparker1005)
* BUG FIX/ENHANCEMENT: Updated membership actions to run more frequently to improve support for hourly memberships. #3547 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Improved the styling for nested `.pmpro_card` elements. #3539 (@kimcoleman)
* BUG FIX: Fixed the HTML structure when displaying image-type file fields to improve appearance. #3537 (@kimcoleman)
* BUG FIX: Corrected the links shown for the Stripe Tax setting. #3546 (@dwanjuki)

= 3.6.2 - 2025-11-20 =
* ENHANCEMENT: Stripe subscriptions will no longer be created with an application fee or will have the fee immediately removed when the initial payment is complete. Application fees will then be added per-invoice during the `invoice.created` webhook to ensure that fees are only charged when PMPro is actively managing the subscription. #3535 (@dparker1005)
* ENHANCEMENT: Updated the Stripe webhook handler to remove application fees from existing subscriptions over time during the `invoice.upcoming` webhook event. This helps to ensure that websites that have stopped using Stripe Connect will not be charged the 2% application fee. #3535 (@dparker1005)
* ENHANCEMENT: Updated the PayPal IPN handler to use the `add_order_note()` method when adding the IPN ID to an order. #3534 (@dparker1005)
* BUG FIX: Restored fallback logic for pulling billing addresses from Stripe customer objects and previous PMPro orders when a Stripe recurring payment is received without a billing address set on the payment method. #3533 (@dparker1005)
* BUG FIX: Fixed an issue where correcting data in fields with validation errors did not clear the error border from the input. #3531 (@andrewlimaza)
* BUG FIX: Fixed an issue where the Edit Member sidebar may not show the correct user field panels after changing a user's membership level. #3532 (@dparker1005)

= 3.6.1 - 2025-11-12 =
* ENHANCEMENT: Now showing TOS Consent information on the admin "View Order" page. #3520 (@kimcoleman)
* ENHANCEMENT: Added a new helper method `add_order_note()` to the MemberOrder class. #3524 (@dparker1005)
* ENHANCEMENT: Added icons for WP Activity Log and WP Fusion Lite. #3521 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Now updating the next payment date for subscriptions when there is a failed payment. #3526 (@dparker1005)
* BUG FIX: Fixed an issue where post restrictions could not be removed when using the classic editor. #3530 (@dparker1005)
* BUG FIX: Fixed an issue where page contents would not load in the Beaver Builder editor if the post is restricted. #3529 (@dparker1005)
* BUG FIX: Fixed an issue where plus characters in usernames may be converted into spaces when shown in login page error messages. #3519 (@andrewlimaza)
* BUG FIX: Fixed a deprecation warning when installing Add Ons from the Membership > Add Ons screen. #3525 (@andrewlimaza)

= 3.6 - 2025-10-21 =
* FEATURE: Added compatibility with WP Fusion Lite. #3461 (@jarrydlong)
* ENHANCEMENT: Added a new admin “view order” page before the “edit” step. #3467 (@kimcoleman)
* ENHANCEMENT: Now saving orders in `pending` status when a Stripe or PayPal recurring payment fails. #3491 (@dparker1005)
* ENHANCEMENT: Now updating the email address for customers in Stripe when the corresponding user is updated in WordPress. #3454 (@dparker1005)
* ENHANCEMENT: General improvements to the Add Ons page including filters for active and inactive Add Ons. #3488 (@dalemugford)
* ENHANCEMENT: Now automatically adjusting the content-disposition header for restricted files based on the file type. #3473 (@andrewlimaza)
* ENHANCEMENT: Added a new filter `pmpro_restricted_file_content_disposition` to dynamically adjust the content-disposition header for restricted files. #3473 (@andrewlimaza)
* ENHANCEMENT: Added a new filter `pmpro_order_action_links` to allow modifying the action links when viewing an order on the frontend. #3465 (@dparker1005)
* ENHANCEMENT: Added a new action `pmpro_after_updating_post_level_restrictions` to run code after the level restrictions for a post is updated. #3462 (@dparker1005)
* ENHANCEMENT: Now repairing membership-based course enrollments when LifterLMS courses are saved while streamline is enabled. #3462 (@dparker1005)
* ENHANCEMENT: Now removing membership-related LifterLMS engagement triggers when streamline is enabled. #3439 (@kimcoleman)
* ENHANCEMENT: Updated Stripe API version to 2025-09-30.clover. #3459 (@dparker1005)
* ENHANCEMENT: Improved styling of “file” type user fields. #3498 (@kimcoleman)
* ENHANCEMENT: Added a new function `pmpro_get_gateway_nicename()` to retrieve a gateway's nicename by its slug. #3508 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Fixes member list exports including “expired” in the file name when exporting “old members”. #3500 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Added Brazil to the list of countries that do not allow Stripe Connect application fees. #3490 (@dparker1005)
* BUG FIX/ENHANCEMENT: Optimized queries when showing “old members” on the Members List. #3494 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now hiding links from the Account page if the linked page is not set. #3516 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now saving the Stripe invoice ID as the PMPro order’s payment transaction ID whenever an invoice is generated in Stripe. #3464 (@dparker1005)
* BUG FIX: Fixed an issue where incorrect tax values may be set on orders when using Stripe Checkout. #3489 (@dparker1005)
* BUG FIX: Adding back the !!membership_id!! email template variable to the “admin_cancel” email template. #3503 (@kimcoleman)
* BUG FIX: Fixed localization in the email header and footer templates. #3492 (@dwanjuki)
* BUG FIX: Fixed an issue where LifterLMS access plans meta boxes may still show when streamline is enabled. #3439 (@kimcoleman)
* REFACTOR: Added abstracted functions for processing recurring successful and failed payments during webhook/IPN handlers. #3491 (@dparker1005)
* REFACTOR: Created a new class `PMPro_AddOns` for managing Add Ons. #3488, #3497 (@dalemugford)
* REFACTOR: Added an abstracted function `pmpro_update_post_level_restrictions()` for setting the level restrictions for a post. #3462 (@dparker1005)

= 3.5.6 - 2025-09-10 =
* ENHANCEMENT: Added styles for frontend tables with data filter options. #3482 (@kimcoleman)
* BUG FIX: Fixed an issue where a generic error message may be shown at checkout instead of the intended error message. #3483 (@JarrydLong)
* BUG FIX: Fixed an issue where recurring PayPal Express payments would not be recorded in PMPro if the associated subscription did not already have orders present on the site. #3484 (@dparker1005)
* BUG FIX: Fixed an issue where PayPal subscriptions may remain in "paused" status after being marked as cancelled in PMPro. #3485 (@dparker1005)
* BUG FIX: Fixed an issue where Stripe application fees could be updated for invoices that did not originate from PMPro subscriptions. #3487 (@dparker1005)

= 3.5.5 - 2025-08-26 =
* ENHANCEMENT: Improved readability of order notes by adding line breaks before appending data via automated processes. #3480 (@kimcoleman)
* ENHANCEMENT: Added formatting for the Polish zloty currency. #3478 (@warnaa)
* ENHANCEMENT: Updated the Gocodebox_Banner_Notifier library and prefixed the class with `PMPro_` to avoid plugin conflicts. #3474 (@dparker1005)
* BUG FIX: Fixed performance issues that may occur when the plugin is in "pause mode". #3476 (@dparker1005)
* BUG FIX: Fixed an issue where some admin banners could not be dismissed. #3472 (@dparker1005)
* BUG FIX: Resolving a PHP warning that may show when deactivating the plugin. #3475 (@dalemugford)
* BUG FIX: Corrected the description for the Credit Card Expiring email template. #3471 (@kimwhite)
* REFACTOR: Moved some compatibility code from the PMPro_Action_Scheduler class to separate compatibility files. #3475 (@dalemugford)

= 3.5.4 - 2025-08-18 =
* BUG FIX/ENHANCEMENT: Now marking restricted Elementor content as "dynamic content" to prevent it from being cached by Elementor. #3469 (@andrewlimaza)
* BUG FIX: Fixed an issue where "Payment Reminder" emails may go out daily depending on the site's set timezone. #3463 (@dalemugford)
* BUG FIX: Fixed an issue where some restricted Elementor data may not have successfully migrated after the PMPro v3.5 update. #3466 (@dparker1005)
* BUG FIX: Fixed an issue where the "Rebuild Webhook" button on the Stripe Payment Settings page would not create a new webhook. #3457 (@dparker1005)
* BUG FIX: Fixed an issue where PMPro checkouts would not complete if the Stripe Checkout session was set to "no_payment_required" status. #3458 (@johnorourke)
* BUG FIX: Fixed an issue where PayPal subscriptions may be set to "paused" status instead of "cancelled" after recurring payments are suspended due to failed payments. #3468 (@dparker1005)
* BUG FIX: Fixed a PHP deprecation warning that may show when updating billing information. #3460 (@dparker1005)

= 3.5.3 - 2025-07-25 =
* ENHANCEMENT: Added a new `!!renew_url!!` email template variable to expiration and cancellation email templates. #3448 (@kimcoleman)
* ENHANCEMENT: Extended the checkout spam protection setting to also protect the login form. #3450 (@ideadude)
* ENHANCEMENT: Added a `startdate` column to the Members List CSV export. #3443 (@dparker1005)
* ENHANCEMENT: Changed the name of the "Membership Recurring" email template to "Recurring Payment Reminder". #3451 (@kimwhite)
* ENHANCEMENT: Added an "Action Scheduler Health" section to the PMPro Site Health report. #3453 (@dalemugford)
* ENHANCEMENT: Now cleaning up PMPro Action Scheduler scheduled tasks when the plugin is deactivated or uninstalled. #3440 (@dalemugford)
* BUG FIX/ENHANCEMENT: Now avoiding cases where duplicate PMPro Action Scheduler scheduled tasks may be created. #3444 (@dalemugford)
* BUG FIX: Fixed an issue where the Admin Activity Email would not be sent. #3441 (@dalemugford)
* BUG FIX: Fixed an issue where "Recent Members" metabox may not show correctly on websites using custom database table prefixes. #3442 (@dparker1005)
* BUG FIX: Fixed an issue where an incorrect level name may be sent in renewal emails when level for the associated subscription had changed. #3449 (@dparker1005)
* BUG FIX: Fixed an issue where sorting columns on the Subscriptions List Table would not work when a search term was set. #3447 (@dparker1005)
* BUG FIX: Fixed a rare plugin conflict that could prevent Elementor data from completing the migration included in PMPro v3.5. #3445 (@dparker1005)
* BUG FIX: Fixed an issue where Wisdom data would only ever be sent on the first day of each month. #3446 (@dparker1005)

= 3.5.2 - 2025-07-14 =
* BUG FIX: Fixed an issue where members may receive multiple recurring payment reminder emails for the same payment. #3437 (@mircobabini)
* BUG FIX: Fixed an issue where gateway settings may not show for some gateways. #3436 (@dparker1005)
* BUG FIX: Fixed an issue where "Recent Members" metabox may not show correctly on websites using custom database table prefixes. #3434 (@jeiseman)
* BUG FIX: Fixed a PHP error that would occur when the `post__not_in` parameter of `WP_Query` is not an array. #3438 (@dparker1005)
* BUG FIX: Added back a missing argument for the deprecated `pmpro_email_template` filter. #3432 (@dparker1005)

= 3.5.1 - 2025-07-09 =
* ENHANCEMENT: Added caching to the `pmpro_getMembershipCategories()` function to improve performance. #3421 (@dalemugford)
* ENHANCEMENT: Optimized the query used to retrieve the list of members to show in the Members List table. #3413 (@dalemugford, @dparker1005)
* BUG FIX: Removed code added in 3.5 that would slow down the query to retrieve the list of members to show in the Members List table. #3430 (@dparker1005)
* BUG FIX: Fixed an issue where the subscription ID may not be shown in some Stripe webhook log messages. #3429 (@dwanjuki)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

= 3.1.4 - 2024-09-18 =
* ENHANCEMENT: Improved the wording of the Stripe webhook checker message that displayed when there are event types that have not yet been triggered in Stripe. #3115 (@dparker1005)
* BUG FIX/ENHANCEMENT: Improved the validation of IP addresses before they are returned by the `pmpro_get_ip()` function. #3113 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: `pmpro_set_curent_user()` is now only called in the `pmpro_clear_level_cache_for_user()` function if we are clearing the cache for the current user. #3127 (@mircobabini)
* BUG FIX/ENHANCEMENT: Localized the billing periods for subscription cost text strings. #3140 (@kimcoleman)
* BUG FIX: Fixed an issue where an empty "Account Information" box might appear at checkout if using the `pmpro_skip_account_fields` filter to skip the account fields for new users. #3135 (@kimcoleman)
* BUG FIX: Fixed the background color for input fields on the login form. #3124 (@kimcoleman)
* BUG FIX: Fixed an issue where the `code_id` may not reflect the discount code ID that was used at checkout. #3138 (@dparker1005)
* BUG FIX: Fixed an issue where incorrect data may be returned when calling `getDiscountCode()` on a blank MemberOrder object. #3120 (@dparker1005)
* BUG FIX: Fixed PHP errors on the Visits, Views, and Logins report page when the usermeta values that are retrieved are not in the correct format. #3139 (@kimcoleman)

= 3.1.3 - 2024-08-06 =
* ENHANCEMENT: Improved the appearance of input fields on dark-background themes. #3111 (@kimcoleman)
* ENHANCEMENT: Improved the appearance of dropdown arrow icons. #3111 (@kimcoleman)
* ENHANCEMENT: Added an icon for the upcoming Localized Pricing Add On. #3110 (@kimcoleman)
* BUG FIX: Fixed an issue where new subscriptions might be immediately cancelled after checkout when re-purchasing a level that the user already had. #3107 (@dparker1005)
* BUG FIX: Fixed an issue where Braintree billing updates would fail due to the `CardType` JavaScript not being present in the update billing form. #3108 (@dparker1005)

= 3.1.2 - 2024-08-02 =
* ENHANCEMENT: Added an admin notice on PMPro settings pages when using Stripe without a webhook set up. #3103 (@dparker1005)
* ENHANCEMENT: Added a new filter `pmpro_stripe_card_element_style` to allow developers to customize the Stripe card element style. #3099 (@kimcoleman)
* ENHANCEMENT: Improved the styling of bulleted lists. #3095 (@kimcoleman)
* BUG FIX: Fixed an issue where Braintree checkouts would fail due to the `CardType` field not being present in the payment form. #3102 (@JarrydLong)
* BUG FIX: Fixed an issue where billing updates could fail for some gateways. #3102, #3106 (@JarrydLong, @dparker1005)
* BUG FIX: Fixed PHP errors when showing a "no access" message and there is not a levels page or checkout page set. #3096 (@kimcoleman)
* BUG FIX: Fixed an issue where checkouts would fail when using the Stripe payment request button and reCAPTCHA v3. #3094 (@dparker1005)
* REFACTOR: Updated doc block for the `pmpro_set_expiration_date()` function to allow `null` as a valid value for the `$enddate` parameter. #3098 (@ZebulanStanphill)

= 3.1.1 - 2024-07-29 =
* ENHANCEMENT: Added autocomplete functionality for name and billing fields on the checkout page. #3081 (@andrewlimaza)
* ENHANCEMENT: Improved the field structure and styling for checkbox and radio user fields. #3077 (@kimcoleman)
* ENHANCEMENT: Added a new hook `pmpro_lost_password_before_submit_button`. #3090 (@dioliviers, @dparker1005)
* BUG FIX/ENHANCEMENT: The current panel on the Member Edit page is now included in the form action instead of as a hidden input. #3092 (@mircobabini)
* BUG FIX/ENHANCEMENT: Improved the LifterLMS streamline option to prevent LifterLMS from modifying the login form links on the PMPro login page. #3089 (@kimcoleman)
* BUG FIX: Fixed an issue where fields may overlap on the checkout page when viewing on a mobile device. #3078 (@kimcoleman)
* BUG FIX: Fixed an issue where pages could not be saved when they contain the "Confirmation Page" block. #3085 (@dparker1005)
* BUG FIX: Fixed an issue where the billing address fields were always shown on the Update Billing page, even when disabled. #3082 (@dparker1005)
* BUG FIX: Fixed an issue where some required fields did not display a "required" asterisk or the `aria-required` attribute. #3076 (@kimcoleman)
* BUG FIX: Fixed the styling for fields with errors after submitting the checkout form. #3076 (@kimcoleman)
* BUG FIX: Fixed an issue where the default expiration date when adding a new membership level via the Edit Member page would be calculated based on the current UTC time. #3093 (@mircobabini)
* BUG FIX: Fixed an issue where free orders would not process correctly when the default gateway was set to PayPal Standard or 2Checkout. #3091 (@dparker1005)
* BUG FIX: Fixed an issue where some HTML elements were missing class names. #3080 (@mircobabini)
* BUG FIX: Fixed the alignment of the action links on the "lost password" form. #3084 (@kimcoleman)
* BUG FIX: Fixed an issue where content added to the login form via hooks might be given flex alignment. #3083 (@kimcoleman)
* BUG FIX: Fixed an issue where requesting a subscription date as a timestamp would always return in the UTC timezone regardless of if `$local_time` was set to `true`. #3069 (@mircobabini)
* BUG FIX: Fixed a typo of "Akismet" on the PMPro Security settings page. #3081 (@andrewlimaza)
* BUG FIX: Fixed the alignment of the "search" field on the Add Ons dashboard page. #3079 (@kimcoleman)

= 3.1 - 2024-07-17 =
* FEATURE: Added a new "Design" tab to the Memberships > Settings page with multiple frontend style variations to choose from. #3003 (@kimcoleman)
* FEATURE: Added a new "Security" tab to the Memberships > Settings page. #2999 (@MaximilianoRicoTabo)
* ENHANCEMENT: Updated the styling of frontend pages. #3003 (@kimcoleman)
* ENHANCEMENT: Improved the logic around how "no access" messages are generated and added filters to customize these messages. #3003 (@kimcoleman)
* ENHANCEMENT: Standardized CSS selectors to make theming a PMPro site more straightforward. #3003 (@kimcoleman)
* ENHANCEMENT: Added an "Edit Customer in Stripe" button to the "View Subscription" page for Stripe subscriptions. #2987 (@dparker1005)
* ENHANCEMENT: Set Stripe Checkout to be the default Stripe payment flow on new websites. #3006 (@dparker1005)
* ENHANCEMENT: Updated the "Check out with PayPal" button so that it is more accessible and can be translated. #3026 (@kimcoleman)
* ENHANCEMENT: Updated the billing failure email to link directly to the "update billing information" page for the corresponding subscription. #3032 (@MaximilianoRicoTabo)
* ENHANCEMENT: Updated the term "Invoice" to "Order" in most places throughout the plugin. #2982 (@kimcoleman)
* ENHANCEMENT: Added filters for updating how the total, subtotal, and tax are displayed for an order. #3009 (@dparker1005)
* ENHANCEMENT: Added a new filter `pmpro_subscription_cost_text` for updating how the subscription cost is displayed. #3021 (@dparker1005)
* ENHANCEMENT: Added new filter `pmpro_dashboard_meta_boxes` to allow developers to hide dashboard widgets and add their very own widgets to the PMPro dashboard area. #3019 (@andrewlimaza)
* ENHANCEMENT: Now detecting Add Ons with incorrect folder names in site health. #2069 (@mircobabini)
* BUG FIX/ENHANCEMENT: Email headers and footers are now added after email body filters are run. #2000 (@mircobabini)
* BUG FIX/ENHANCEMENT: Added an error message on the Edit Member page when an order refund fails. #3015 (@dparker1005)
* BUG FIX/ENHANCEMENT: Moved the "Edit Customer in Stripe" button on the Edit Member page to the "User Info" tab. #2987 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Added a fallback to get the site URL from the database should the SERVER_NAME parameter not be available in certain cases like using WP-CLI and some other instances. #2996 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Now including email template variables for the expired level ID and level name on the membership expired email template. #2954 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: When using PMPro Lifter Streamline mode, now making sure that Lifter does not reserve the `/membership/` slug. #2927 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Enabled localization for certain strings throughout the plugin. #3005 (@DAnn2012)
* BUG FIX/ENHANCEMENT: Updated the "Login Name" setting for Authorize.net to "API Login ID" to match the Authorize.net documentation. #3058 (@dparker1005)
* BUG FIX: Fixed an issue where the payment transaction ID would not be saved for an order while purchasing a subscription via Stripe Checkout. #3025 (@dparker1005)
* BUG FIX: Fixed an issue on some hosting setups where subscriptions would not be successfully inserted into the database. #3002 (@dparker1005)
* BUG FIX: Fixed an issue where the "Content Visibility" block editor settings could break some core WordPress blocks. #3014 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where a user's membership might not be removed when a PayPal Express subscription is suspended due to payment failure. #3016 (@dparker1005)
* BUG FIX: Fixed a broken link to the PMPro Approvals documentation page when creating a new membership level. #3001 (@dparker1005)
* BUG FIX: Fixed an issue where testing the "cancel on next payment date" email template might fail. #2984 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where a PHP warning might be shown when dynamically adding the membership level body CSS class. #3013 (@andrewlimaza)
* BUG FIX: Fixed an issue where the "From Name" email setting could add slashes before escaped characters when saved. #3050 (@andrewlimaza)
* BUG FIX: Fixed an issue where the "View With" admin bar dropdown might not work correctly when using Firefox. #2953 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where there might not be a space between class names when creating a user field. #3046 (@kimcoleman)
* BUG FIX: Fixed issues where user IDs over 4294967295 would not be correctly linked to their subscription. #3065 (@dparker1005)
* BUG FIX: Fixed over-escaped HTML in the admin activity email. #2985 (@MaximilianoRicoTabo)
* BUG FIX: Fixed some typos in the plugin. #3062 (@szepeviktor)
* REFACTOR: Updated the checkout preheader to use the abstracted `pmpro_complete_checkout()` function. #2937 (@dparker1005)
* REFACTOR: Removed duplicate code from PayPal gateway classes. #2932 (@dparker1005)
* DEPRECATED: Removed the ability to customize no access messages for the RSS feed and the secondary option for logged out members. Filters should be used to customize these messages. #3003 (@kimcoleman)
* DEPRECATED: Removed the "Update Billing Flow" option from the Stripe gateway settings. Billing information will now be updated on-site if using the on-site payment flow and off-site if payments are taken via Stripe Checkout. #3006 (@dparker1005)
* DEPRECATED: Removed the `print.css` file from the plugin. These styles are now in `frontend.css`. #2940 (@dparker1005)
* DEPRECATED: Deprecated the `pmpro_longform_address` filter. Address fields will always be shown in longform format. #2990 (@kimcoleman)
* DEPRECATED: Removed setting and display of SSL Seal Code option from database and frontend pages. #2991 (@kimcoleman)
* DEPRECATED: No longer storing an option for accepted card types or allowing a card type select field in payment forms. #2989 (@kimcoleman)
* DEPRECATED: Deprecated the billable invoice, credit card expiring, checkout express, checkout trial, and checkout free trial email templates along with their admin counterparts. #3032 (@MaximilianoRicoTabo)
* DEPRECATED: Removed the setup.sql file from the plugin. #3068 (@dparker1005)

= 3.0.6 - 2024-07-01 =
* SECURITY: Fixed an authenticated SQL injection vulnerability in the Orders and Discount Codes list tables. (Thanks, Trương Hữu Phúc from Patchstack)
* BUG FIX: Fixed PHP errors when calling `pmpro_is_checkout()` too early in the page load. (@kimcoleman)

= 3.0.5 - 2024-06-24 =
* SECURITY: Fixed a vulnerability in the 2Checkout payment integration that could allow unauthenticated users to move orders from the "pending" status to the "success" status (Thanks, Rafie Muhammad from Patchstack)
* BUG FIX: Fixed an incorrect query when using the "Show Only New" or "Show Only Renewals" filters on the sales report. (@ideadude)

= 3.0.4 - 2024-05-08 =
* ENHANCEMENT: Now detecting whether a webhook is set up in Stripe and, if not, showing a button to set one up. Webhooks are also automatically set up after the Stripe Connect flow is created. #2976 (@dparker1005)
* ENHANCEMENT: Added a `group` attribute to the `[pmpro_member]` shortcode to show specific member information in the context of a level group. #2966 (@kimcoleman)
* ENHANCEMENT: Added a new "gateway" column to the Orders tab of the Edit Member page. #2970 (@andrewlimaza)
* ENHANCEMENT: Added a new "gateway" column to the Subscriptions tab of the Edit Member page. #2979 (@andrewlimaza)
* ENHANCEMENT: Adjusted the hierarchy and names for PMPro pages generated as part of the initial plugin setup. #2967 (@kimcoleman)
* ENHANCEMENT: Added the ID for each group to the `Memberships > Settings > Levels` settings page. #2978 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Updated the `+ New > Member` admin bar menu item to be visible to any user with the `edit_users` capability. #2968 (@kimcoleman)
* BUG FIX: Fixed an issue where the login redirect may incorrectly redirect back to the login page. #2971 (@andrewlimaza)
* BUG FIX: Fixed an issue where purchasing a recurring membership with PayPal Express for a level that the user already had would immediately cancel the new payment subscription. #2972 (@dparker1005)
* BUG FIX: Fixed PHP deprecation warnings on the User Fields settings page for some versions of PHP. #2975 (@dparker1005)
* DEPRECATED: No longer showing the "Register a webhook" popup after connecting to Stripe since this process is now automated. #2976 (@dparker1005)

= 3.0.3 - 2024-04-18 =
* ENHANCEMENT: No longer making API calls to pull subscription data from Stripe or PayPal Express when we do not have gateway credentials. #2956 (@mircobabini)
* ENHANCEMENT: Added new filters `pmpro_subscription_gateway_object` and `pmpro_order_gateway_object` to allow developers to modify gateway objects before they are used. #2962 (@mircobabini)
* ENHANCEMENT: Added a new filter `pmpro_stripe_before_retrieve_webhook_event` to allow developers to modify the Stripe API key before retrieving a webhook event. #2962 (@mircobabini)
* BUG FIX: Fixed an issue where nonce verification checks may fail when creating a new user at checkout. #2963 (@dparker1005)
* BUG FIX: Fixed issues where users' roles could be unintentionally changed on the Edit Member page by making the "Role" field read-only. #2961 (@dparker1005)
* BUG FIX: Fixed an issue where the status for an old membership level would be `changed` instead of `admin_changed` when an admin modified a user's membership. #2965 (@dparker1005)
* BUG FIX: Fixed PHP errors in the PMPro "Recent Members" Dashboard widget when a user that would be shown on that list was deleted. #2964 (@andrewlimaza)
* BUG FIX: Added some missing global variables on admin pages. #2955 (@mircobabini)
* BUG FIX: Fixed missing CSS color variable. #2955 (@kimcoleman)
* BUG FIX: Fixed variable name when generating an error message in the Stripe webhook. #2955 (@mircobabini)
* BUG FIX: Fixed an issue where the Braintree webhook log may not include transaction details. #2955 (@mircobabini)
* REFACTOR: Removed duplicate array elements throughout the codebase. #2955 (@mircobabini)

= 3.0.2 - 2024-04-11 =
* ENHANCEMENT: Added settings to disable custom page templates when they are out of date. #2923 (@dparker1005, @kimcoleman)
* ENHANCEMENT: Now defaulting the "View: My Access" setting to "View with my access". #2938 (@andrewlimaza) 
* ENHANCEMENT: Added a new filter `pmpro_show_setup_wizard_link` to adjust whether the link to the setup wizard should show. #2372 (@andrewlimaza)
* ENHANCEMENT: Added level group information to site health. #2931 (@dparker1005)
* ENHANCEMENT: Improved how custom page templates are displayed in site health. #2923 (@dparker1005)
* BUG FIX/ENHANCEMENT: Added a nonce when updating the order of level groups. #2930 (@dparker1005)
* BUG FIX/ENHANCEMENT: No longer removing quotes from discount code error messages at checkout. #2935 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Now supporting users without a role on the Edit Member page. #2942 (@dparker1005)
* BUG FIX/ENHANCEMENT: Updated some JS code used while processing PMPro form submissions to only run for PMPro forms. #2779 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Made the "discount code applied to your order" strings consistent for localization. #2941 (@dparker1005, @mircobabini)
* BUG FIX/ENHANCEMENT: Now including email template variables for the level ID and level name on the billable invoice email template. #2947 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Now only showing log-in errors if the user was not successfully logged in. #2949 (@dparker1005)
* BUG FIX: Fixed a fatal error when editing a level group on some versions of PHP. #2933 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where subscription creation would fail when using PayPal Express in Sandbox mode. #2944 (@dparker1005)
* BUG FIX: Fixed an issue where discount codes with unsupported billing details would not be highlighted on the Discount Codes list. #2928 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where using the MemberOrder::get_orders() method may incorrectly return an empty array when filtering by `discount_code_id`. #2929 (@dparker1005)
* BUG FIX: Fixed an issue where a month would always be considered 30 days when renewing a level with an expiration date. #2945 (@dparker1005, @fisher2470)
* BUG FIX: Adding back the `pmpro_deactivate_old_levels` filter that was removed in 3.0. #2946 (@dparker1005)
* BUG FIX: Fixed an issue where the Members List CSV Export could generate incorrect data when it was not ordered by user ID. #2811 (@rollsappletree)
* BUG FIX: Fixed a PHP warning when passing null to strtolower(). #2926 (@MaximilianoRicoTabo)
* BUG FIX: Fixed a PHP warning when passing null to esc_url(). #2939 (@dparker1005)
* BUG FIX: Fixed PHP deprecation warnings by declaring properties in the PMPro_Discount_Code class. #2936 (@MaximilianoRicoTabo)
* BUG FIX: Fixed PHP deprecation warnings by declaring properties in the PMProEmail class. #2934 (@MaximilianoRicoTabo)
* BUG FIX: Fixed some HTML tags that were being incorrectly escaped in the Admin Activity email. #2948 (@dparker1005)
* REFACTOR: Fixed some typos throughout the codebase. #2777, #2950, #2951 (@mircobabini)

= 3.0.1 - 2024-03-27 =
* ENHANCEMENT: Improved the admin UI on mobile devices. #2913 (@kimcoleman)
* ENHANCEMENT: Now hiding save messages when switching tabs on the edit member page. #2910 (@dparker1005)
* ENHANCEMENT: The "Generate pages" checkbox in the setup wizard is now checked by default. #2916 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now only showing membership groups on the levels page if the group contains levels that will also be shown. #2917 (@dparker1005)
* BUG FIX: Fixed a fatal error caused by plugin conflicts with plugins triggering the `current_screen` action before `add_meta_box()` is defined. #2911 (@dparker1005)
* BUG FIX: Fixed a plugin conflict that may cause the "Require Membership" metabox not to show when editing a post. #2911 (@dparker1005)
* BUG FIX: Fixed an issue where the "Add New Level" button on the levels settings page would not work. #2905 (@dparker1005)
* BUG FIX: Fixed an issue where the expired/cancelled date would not show in the members list when filtering by old members. #2908 (@dparker1005)
* BUG FIX: Fixed an issue where the "Edit Member" link on the edit user page was visible to everyone. #2903 (@dparker1005)
* BUG FIX: Fixed an issue where custom code using the `pmpro_account_membership_expiration_text` filter would no longer run. #2906 (@dparker1005)
* BUG FIX: Fixed an issue where custom code passing an array of statuses to `pmpro_next_payment()` would no longer work. #2904 (@dparker1005)
* BUG FIX: Fixed an issue where discount codes could not be applied when using an outdated checkout page template. #2921 (@dparker1005)
* BUG FIX: Fixed a PHP warning when creating a new membership level. (@dparker1005)
* BUG FIX: Fixed a PHP warning when passing NULL to `pmpro_no_quotes()`. #2909 (@ipokkel)
* BUG FIX: Fixed a PHP warning when passing NULL as a value to `pmpro_setOption()`. #2915 (@dparker1005)
* BUG FIX: Fixed a PHP warning when saving a restricted post in the block editor. #2919 (@dparker1005)
* BUG FIX: Fixed the formatting of the "Status" column of the Stripe webhook checker. #2918 (@dparker1005)
* REFACTOR: Changed uses of `pmpro_getOption()` to `get_option()`. #2914 (@dparker1005)

= 3.0 - 2024-03-25 =
* FEATURE: Now tracking payment subscriptions using a new subscriptions table. (@dparker1005)
* FEATURE: The Multiple Memberships Per User Add On has been merged into the core PMPro plugin. #2250 (@dparker1005)
* FEATURE: The Stripe Billing Limits Add On  has been merged into the core PMPro plugin. All gateways now support billing limits. #2384 (@dparker1005)
* FEATURE: The Cancel On Next Payment Date Add On  has been merged into the core PMPro plugin. #2389 (@dparker1005)
* FEATURE: Added a new Edit Member page for editing a user's membership information. #2657 (@kimcoleman, @ideadude, @dparker1005)
* FEATURE: Added a "Admin Membership Access" setting to the toolbar to allow admins to choose whether they want to view the website with full membership access, no membership access, or with their current membership levels. #2541 (@andrewlimaza)
* FEATURE: Added "content visibility" settings to all core WordPress blocks to allow restricting by membership level. #2680 (@MaximilianoRicoTabo)
* FEATURE: Added the Single Membership Level block to display information about a specific membership level. #2654 (@JarrydLong, @kimcoleman)
* ENHANCEMENT: Added a script that will run on upgrade to change all `cancelled` orders to `success` so that we can remove `cancelled` status. #2025 (@dparker1005)
* ENHANCEMENT: Moving the "Require Membership" settings in the block editor to a new block editor panel. #2445 (@dparker1005)
* ENHANCEMENT: Added a setting for customizing the word "Check" when collecting offline payments. #2655 (@MaximilianoRicoTabo)
* ENHANCEMENT: Now prefixing the level and discount code URL parameters at checkout. #2506 (@dparker1005)
* ENHANCEMENT: Overhauled UI across administrative screens. #2667 (@kimcoleman)
* ENHANCEMENT: Updated front-end pages and pre-headers. (@kimcoleman, @dparker1005)
* ENHANCEMENT: Now setting collate when creating database tables. #2566 (@dparker1005)
* ENHANCEMENT: Adding a `$name` parameter to the `pmpro_user_taxonomy_args` filter. #2456 (@mircobabini)
* ENHANCEMENT: Now sending payment descriptions to Stripe when users pay via Stripe Checkout. #2744 (@dparker1005)
* ENHANCEMENT: Added the `pmpro_get_membership_expiration_text()` function to replace the various ways we were getting the expiration text for the Members List table and when showing levels on the account page. Includes a `pmpro_membership_expiration_text` filter that is meant to replace the `pmpro_memberslist_expires_column` and `pmpro_account_membership_expiration_text` filters. The old filters are still applied if in place, but will be deprecated eventually. #2838 (@ideadude, @dparker1005)
* ENHANCEMENT: Now hiding on-PMPro notices on the PMPro dashboard pages. #2797 (@ideadude)
* ENHANCEMENT: Added Screen Options for the orders and discount code list tables. #2799 (@dparker1005)
* ENHANCEMENT: Now showing links and previews when viewing file fields as read only. #2792 (@ideadude)
* ENHANCEMENT: Now passing the `$item` object to the `pmpro_manage_memberslist_custom_column` so that custom code knows which specific level is being shown for the user. #2857 (@dparker1005)
* ENHANCEMENT: You can now set block visibility for nested blocks. #2869 (@kimcoleman)
* ENHANCEMENT: Added `pmpro_braintree_subscription_create_array` filter. #2890 (@dparker1005)
* ENHANCEMENT: Added subscription transaction ID and next payment date to members list export. #2872 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now storing payment information in individual orders instead of in user meta. #2398 (@JarrydLong)
* BUG FIX/ENHANCENENT: Now showing "Credit Card" instead of "Pay With Credit Card" on the Update Billing page when using the Stripe payment request button. #2684 (jahidhasan018)
* BUG FIX/ENHANCEMENT: Now preventing multiple user field groups with the same name from being created. #2625 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Now only calculating order tax and total when creating a new order. #2703 (@dparker1005)
* BUG FIX/ENHANCEMENT: Defaulting tax on MemberOrders to a float for consistency and to avoid potential edge cases. #2656 (@mircobabini)
* BUG FIX/ENHANCEMENT: Updated our "Lost Password"/"Reset Password" flow to track whether a password reset was initiated by Paid Memberships Pro. If not, some functions related to password reset will be disabled to avoid conflicting with other plugins. #2595 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Now using pmpro_cancelMembershipLevel() when processing an expiration. #2762 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now caching the recent members and orders dashboard reports. #2850 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed caching of sales reports that were 0 values. #2851 (@dparker1005)
* BUG FIX/ENHANCEMENT: Allowing dynamic properties in gateway and field classes to avoid PHP 8.2+ warnings. #2844 (@dparker1005)
* BUG FIX/ENHANCEMENT: No longer attempting to load our blocks if the register_block_type function is unavailable. (ClassicPress compatibility.) #2840 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Adjusted the dashboard UI to hide some elements when the current user doesn't have the proper caps to use them. #2771 (@kimcoleman)
* BUG FIX/ENHANCEMENT: No longer making the AJAX call to check for notifications if notifications are turned off. #2856 (@mircobabini)
* BUG FIX/ENHANCEMENT: Adding nonce to email order modal and prefixing params. #2864 (@dparker1005)
* BUG FIX/ENHANCEMENT: Adding nonce to checkout form. #2893 (@dparker1005)
* BUG FIX/ENHANCEMENT: Small fixes for theme compatibility in Kadence, BuddyBoss. #2894 (@kimcoleman)
* BUG FIX: Fixed an issue in the WordPress dashboard where the site locale would be loaded instead of the user locale. #2707 (@andrewlimaza)
* BUG FIX: Fixed an issue where `admin_only` user fields would still show on the frontend profile if the current user was an administrator. #2432 (@dparker1005)
* BUG FIX: Fixed an issue where the annual membership report would not show cancellations. #2630 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an incorrect class name in the profile edit fields. #2632 (@patric-boehner)
* BUG FIX: Fixed issue where invalid dates were breaking SQL queries in the members export and sales reports. #2835 (@dparker1005)
* BUG FIX: Fixed issue where clicking outside of a modal popup was not closing the popup. #2776 (@mircobabini)
* BUG FIX: Fixed an issue where reCAPTCHA v3 wouldn't show the badge for offsite gateways. #2826 (@andrewlimaza)
* BUG FIX: Fixed an issue where reCAPTCHA v3 wouldn't show the badge for gateways that use a custom submit button at checkout. #2867 (@dparker1005)
* BUG FIX: Fixed edge case issues when blocks were set to hide from multiple levels. #2884 (@dparker1005)
* BUG FIX: Fixed "WordPress database error Index column size too large." issues on some MySQL setups. #2876 (@dparker1005)
* REFACTOR: Updated how we enqueue blocks to follow most recent WordPress standards. #2647 (@briansantos10)
* REFACTOR: Removed deprecated and unused code in the Stripe gateway integration code. #2428 (@dparker1005)
* REFACTOR: Changing uses of `pmpro_getOption()` to `get_option()`. #2491, #2493, #2494, #2495 (@JarrydLong, @MaximilianoRicoTabo)
* REFACTOR: The pmpro_edit_memberships capability has been replaced with the pmpro_edit_members capability. This cap is required to edit members in the dashboard or through the API.
* REFACTOR: Replaced deprecated jQuery shorthands with generic handler and trigger. #2859 (@mircobabini)
* DEPRECATED: No longer using `$pmpro_levels` global variable. #2666 (@dparker1005)
* DEPRECATED: Marked the following hooks as deprecated: pmpro_admin_pagesetting_post_type_array (replaced by pmpro_admin_pagesetting_post_type), pmpro_stripe_subscription_deleted, pmpro_subscription_cancelled. #2819 (@dparker1005)
* DEPRECATED: Removed the following functions which were previously marked deprecated: `pmpro_set_pause_mode()`, `pmpro_cron_trial_ending_warnings()`. #2818 (@dparker1005)
* DEPRECATED: No longer showing "billing address" user meta fields in the Members List table or the Members CSV export. #2873 (@dparker1005)
* DEPRECATED: The checkout_levels API endpoint has been marked as deprecated. Please use the checkout_level (no s) endpoint instead. #2879 (@dparker1005)

= 2.12.10 - 2024-02-08 =
* BUG FIX: Fixed fatal error on post save introduced in 2.12.9.
* ENHANCEMENT: Now simplifying the members and user search on sites where wp_is_large_user_count() is true.

= 2.12.9 - 2024-02-07 =
* SECURITY: Only users with the "edit_users" capability may add the pmpro_member shortcode to posts and widgets now. #2817 (Thanks, Scott Kingsley Clark)
* BUG FIX/ENHANCEMENT: Removed the 24 option from the hours dropdown for expiration dates since the hours start with 00. #2812 (@MaximilianoRicoTabo)

= 2.12.8 - 2024-01-22 =
* SECURITY: Added missing nonce when updating the level order through drag and drop. (Thanks, Kodai Kubono from WordFence) #2773 (@dparker1005)
* BUG FIX/ENHANCEMENT: The `pmpro_stripe_order_description` filter now applies to Stripe Checkout orders as well. #2774 (@MaximilianoRicoTabo)
* BUG FIX: Fixed issues with ApplePay and GooglePay when using Stripe Checkout. #2769 (@dparker1005)
* BUG FIX: Fixed issue when user fields added through code set the levels property to a single integer. This is supported again. #2775 (@MaximilianoRicoTabo)

= 2.12.7 - 2024-01-10 =
* SECURITY: Fixed a security issue where sensitive user data was sometimes showing up in web server logs. Please see https://www.paidmembershipspro.com/pmpro-security-update-2-12-7/ for more information, including notes on how to tell if your site was affected by this issue and what to do about it.

= 2.12.6 - 2023-12-18 =
* SECURITY: Fixed a security issue where unauthorized users could abuse the REST API endpoints to add new levels or edit existing levels. (Thanks, Craig Smith at WordFence) #2742 (@ideadude)
* BUG FIX: Now hiding level confirmation messages from the output returned by the checkout_levels API route. #2742 (@ideadude)

= 2.12.5 - 2023-12-12 =
* ENHANCEMENT: Now allowing links to be included in user field group descriptions. #2681 (@dparker1005)
* ENHANCEMENT: Now sorting the Levels column on the Discount Codes list table by the sorted level order. #2628 (@kimcoleman)
* ENHANCEMENT: Now recommending the new Group Members Add On instead of the Sponsored Members Add On. #2714 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Improved accessibility for the frontend membership levels page default table. #2689 (@kimcoleman)
* BUG FIX: Fixed a PHP warning when selecting "other" as the site type in the setup wizard. #2708 (@MaximilianoRicoTabo)
* BUG FIX: Fixed an issue where new payment methods may not be charged after a user updates their payment method while using the Authorize.net gateway. #2330 (@dparker1005)
* BUG FIX: Removed definition of `PMPRO_BENCHMARK` constant that was defaulting that constant to `true` in certain admin CSV files. #2724 (@andrewlimaza)

= 2.12.4 - 2023-11-16 =
* SECURITY: Fixed security issue where in some cases users could upload files at checkout with disallowed file types, e.g. .php files that could then be accessed to run arbitrary code on the server. For more information, see https://www.paidmembershipspro.com/pmpro-update-2-12-4/ (Thanks, István Márton and WordFence)
* ENHANCEMENT: New icons for LifterLMS and the GA4 Add On.
* BUG FIX/ENHANCEMENT: Fixed issues with the notifications shown when updating billing details. (Thanks, dwanjuki on GitHub)

= 2.12.3 - 2023-10-03 =
* ENHANCEMENT: Updated the PayPal Express integration to save checkout data in order meta instead of sessions to improve compatibility with various Add Ons. #2616 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed performance issue in deprecation code. #2621 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Fixed warning in PHP 8.1 when using the pmpro_member shortcode without a field attribute. #2622 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Updated pmpro_hasMembershipLevel() function to accept a string of comma separated level ids or names. This also fixes issues in The Events Calendar ticketing add ons. #2623 (@MaximilianoRicoTabo)
* BUG FIX: Fixed issue where user fields may not be shown in admin checkout emails. #2613 (@andrewlimaza, @dparker1005)
* BUG FIX: Fixed issue where the incorrect label could be shown for a user field value. #2613 (@dparker1005)
* BUG FIX: Fixed issue where the Visits, Views, and Logins report CSV export may show the user's "joindate" in the "enddate" column. #2608 (@dparker1005)
* BUG FIX: Now only declaring the `recaptcha_get_html()` function on the PMPro checkout page. This fixes conflicts with other plugins that declare their own `recaptcha_get_html()` function. #2607 (@dparker1005)
* BUG FIX: Fixed issue where row action to view a discount code's orders was not showing for unlimited use codes. #2599 (@kimcoleman)
* REFACTOR: Marking the PMPro Table Pages Add On as deprecated. #2606 (@dwanjuki)

= 2.12.2 - 2023-08-13
* ENHANCEMENT: Improving the LifterLMS Streamline functionality. #2572 (@ideadude)
* ENHANCEMENT: Now also applying the pmpro_checkout_message filter to the bottom message box on the checkout page. #2567 (@ipokkel)
* ENHANCEMENT: Caching the Stripe webhook status checks. #2565 (@dparker1005)
* BUG FIX: Fixed issue where some advanced settings added by Add Ons weren't applying properly. Resave and try again. #2571 (@ideadude)

= 2.12.1 - 2023-08-07 =
* BUG FIX: Fixed issue where password reset attempts may incorrectly show that the user's password reset key is invalid. #2561 (@dparker1005, @andrewlimaza)

= 2.12 - 2023-08-04 =
* FEATURE: Added integration with LifterLMS to streamline setting up that plugin when Paid Memberships Pro is active. #2533 (@ideadude, @MaximilianoRicoTabo)
* ENHANCEMENT: A “no access” message can now be set when restricting Elementor widgets. #2525 (@andrewlimaza)
* ENHANCEMENT: A “no access” message can now be set when restricting content with DIVI. #2526 (@andrewlimaza)
* ENHANCEMENT: Added `pmpro_stripe_checkout_session_parameters` filter. #2555 (@JarrydLong)
* ENHANCEMENT: Now delaying non-security notification banners for 1 week the first time an admin user visits a PMPro dashboard page. #2552 (@MaximilianoRicoTabo)
* ENHANCEMENT: Now showing a modal with instructions for setting up webhooks after linking an account through Stripe Connect. #2554 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Removed associative array check in the `pmpro_get_label_for_user_field_value()` function to ensure that user-friendly values are always returned. #2524 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Updating the “Active Members Per Level” to ignore deleted users. #2482 (@JarrydLong)
* BUG FIX/ENHANCEMENT: Added a new capability pmpro_loginscsv for exporting the login report data and a new capability pmpro_reportscsv as a fallback for exporting all report data. #2536 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Fixed issue where subscriptions weren't cancelling when users deleted their own account using BuddyPress or BuddyBoss. #2559 (@dparker1005, @andrewlimaza)
* BUG FIX/ENHANCEMENT: Use wpautop() for membership confirmation message. This fixes an issue where Elementor and possibly other solutions were not honoring the \n as paragraphs. #2549 (@andrewlimaza)
* BUG FIX: Fixed post restriction logic for posts that are in multiple categories. #2522 (@andrewlimaza)
* BUG FIX: Fixed an issue where extra checkout fields weren’t being displayed correctly in admin checkout emails. #2537 (@andrewlimaza, @MaximilianoRicoTabo)
* BUG FIX: Updated login functions to broken links from potentially being generated. #24722, #2244, #2475, #2476, #2477, #2478 (@JarrydLong)
* BUG FIX: Fixed styling for h2 tags on the Membership Account page. (@kimcoleman)
* BUG FIX: Fixed the ID parameter in the `pmpro_manage_discount_code_list_custom_column` filter. #2517 (@JarrydLong)
* BUG FIX: Fixed issues where suggested Add Ons would not show in setup wizard if the site type was not specified. #2524 (@andrewlimaza)
* BUG FIX: Fixed the timing of the `pmpro_discount_code_used` filter when processing a Stripe Checkout payment. #2532 (@dparker1005)
* BUG FIX: Fixed issue where only the first page of orders was showing up when searching orders. #2553 (@JarrydLong)
* BUG FIX: Fixed issue with some DB setups where levels couldn't be added to the table. #2546 (@dparker1005)
* REFACTOR: Updated enum columns in database to varchar. #2529 (@andrewlimaza)

= 2.11.2 - 2023-06-14
* BUG FIX: Reverting the application of the required attribute for required fields at checkout. This would break valid checkouts in some cases if required fields were hidden. We need to address this differently. #2516 (@ideadude)

= 2.11.1 - 2023-06-13
* ENHANCEMENT: Now using HTML5 required field attribute on required fields at membership checkout.#2511 (@kimcoleman)
* ENHANCEMENT: Better wording for the "Disconnect from Stripe" button in the payment settings so folks understand this will disconnect ANY site connected to Stripe through that account. #2514 (@dparker1005)
* BUG FIX/ENHANCEMENT: Removed the "What's This?" text from the CVV field on Membership Billing page. #2512 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Minor fixes to the Orders List Table. #2509 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed the text domains for the default headings for the account page shortcode. #2508 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed the default page titles when using the account block. #2505 (@dparker1005)

= 2.11 - 2023-06-07 =
* FEATURE: Now tracking users that are created at checkout but never complete checkout or otherwise use the site. These users can be found and deleted from the Users Table in the admin dashboard. #2435 (@dparker1005, @ideadude)
* FEATURE: Added compatibility with Oxygen Builder. #2404 (@JarrydLong)
* ENHANCEMENT: Updated the Orders list to use a WP List Table. #2383 (@JarrydLong)
* ENHANCEMENT: Updated the Discount Code list to use a WP List Table. #2370 (@JarrydLong)
* ENHANCEMENT: Now showing a notice when using a page template that is out of date. #2427 (@JarrydLong, dparker1005)
* ENHANCEMENT: Reducing calls made to `get_option()` from `pmpro_getOption()`. #2137 (@JJJ)
* ENHANCEMENT: Now allowing account page section titles to be customized. #2459 (@MaximilianoRicoTabo)
* ENHANCEMENT: Adding filters `pmpro_stripe_webhook_event_received` and `pmpro_stripe_webhook_before_exit`. #2465 (@dparker1005)
* ENHANCEMENT: Improved Add Ons search to support multiple keywords and phrases. #2444 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Improved accessibility across the entire admin dashboard. Thanks for contributions from Piccia Neri, Alex Stine, and Amber Hinds. #2448 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now making sure that our reCAPTCHA functions are always loaded. #2449 (@mircobabini, @dparker1005)
* BUG FIX/ENHANCEMENT: Improved the chart title wording for some sales and revenue report periods. #2488 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Removing trailing colons after question marks in Advanced Settings. #2467 (@mircobabini)
* BUG FIX/ENHANCEMENT: Removed unused spinner.gif file. #2486 (@ipokkel)
* BUG FIX: Resolved issue where checkouts using Stripe may complete even if reCAPTCHA fails. #2449 (@dparker1005)
* BUG FIX: Resolved issue where "log out" link may not show on the update billing page. #2489 (@dparker1005)
* BUG FIX: Fixed an issue where radio button would always show asterisk even when not required. This now applies the asterisk to each and every radio button individually to support multiple radio buttons at checkout. #2499 (@andrewlimaza)
* REFACTOR: Removed leading slash in all uses of `admin_url()`. #2429 (@jahidhasan018)
* REFACTOR: Removing unused variable in `pmpro_rest_api_recent_memberships()`. #2469 (@andrewlimaza)

= 2.10.7 - 2023-05-23 =
* ENHANCEMENT: Updated sales and revenue report to compare to previous periods. #2426 (@JarrydLong)
* ENHANCEMENT: Updated sales and revenue report to show orders from a predefined timeframe (ex. last 30 days). #2426 (@JarrydLong)
* ENHANCEMENT: Added "Active Memberships Per Level" report. #2426 (@JarrydLong)
* BUG FIX/ENHANCEMENT: Now preventing multiple clicks on the "submit" button on the cancel page. #2425 (@dparker1005)
* BUG FIX: Fixing incorrect value for `PMPRO_VERSION` constant.

= 2.10.6 - 2023-05-19 =
* SECURITY: Added extra precautions to make sure credit card and password information does not get stored in the `checkout_request_vars` order meta when using Stripe Checkout. More info here: https://www.paidmembershipspro.com/pmpro-update-2-10-6/ #2468, #2473 (@dparker1005, @ideadude)
* ENHANCEMENT: Added a new filter `pmpro_sales_widget_periods` to allow filtering the periods for the sales widget. (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now including the administrator's display name in emails that are sent to the admin. #2453 (@MaximilianoRicoTabo)
* BUG FIX/ENHANCEMENT: Now validating license keys in setup wizard. #2464 (@dparker1005)
* BUG FIX: Fixed fatal error on payment gateway settings page when using Stripe with expired API keys. #2455 (@dparker1005)
* BUG FIX: Fixed issue where an error message would not be displayed on the Update Billing page when a credit card number was not entered. #2457 (@MaximilianoRicoTabo)
* BUG FIX: Fixed issue where the orders export date filter may ignore the site's timezone. #2460 (@JarrydLong)

= 2.10.5 - 2023-04-27 =
* BUG FIX/ENHANCEMENT: Fixed issue where the date/time of orders in the Member History table were sometimes off based on timezone. #2552 (@JarrydLong, @dparker1005)
* BUG FIX: Fixed issue where checkouts for subscriptions with a $0 initial payment were failing with Stripe. #2454 (@dparker1005)
* BUG FIX: Fixed the error that would occur if the AUTH_KEY and SECURE_AUTH_KEY constants were not set (e.g. with Local by Flywheel). #2451 (@JarrydLong)

= 2.10.4 - 2023-04-26 =
* ENHANCEMENT: The spam protection setting is now enabled by default for new installs. #2421 (@dparker1005)
* ENHANCEMENT: Now showing a dismissible notice if the spam protection setting is not enabled. #2422 (@dparker1005)
* BUG FIX/ENHANCEMENT: Now trimming the whitespace around values for dropdown/etc fields to ensure consistent results. #2410 (@JarrydLong)
* BUG FIX/ENHANCEMENT: Now setting the Stripe payment method per subscription instead of using the default payment method when using the update billing form. #2412 (@dparker1005)
* BUG FIX/ENHANCEMENT: Marking the Register Helper plugin as deprecated. More info here: https://www.paidmembershipspro.com/register-helper-add-on-deprecated/
* BUG FIX/ENHANCEMENT: Removed the "activate" link from the plugins page for deprecated Add Ons. #2424 (@dparker1005)
* BUG FIX/ENHANCEMENT: No longer links added through incorrect use of the pmpro_membershiplevels_page_action_links filter. #2431 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed warning when updating billing with Stripe. #2420 (@mircobabini)
* BUG FIX: Updated the PayPal IPN handler to cancel memberships when the maximum number of retries have failed for a subscription payment. Previously, some of these subscriptions would get stuck in a "suspended" status, which did not trigger the PMPro membership to cancel. #2407 (@dparker1005)
* BUG FIX: Fixed where file user fields save their files on multisite setups. #2406 (@dparker1005)
* BUG FIX: Fixed PHP8 compatibility issues with our visit tracking cookie. #2414 (@dparker1005, @JarrydLong)
* BUG FIX: Fixed PHP8 compatibility issues in the Braintree library. #2418 (@dparker1005)
* BUG FIX: Fixed issue where taxonomy user fields were not saving correctly in the database. #2423 (@dparker1005)
* BUG FIX: Fixed issue where the views, visits, and logins CSV report would only include the first page of data. #2436 (@dparker1005)
* BUG FIX: Fixed issue where the "Account Information" section of checkout would still show up even if the user was just created. #2437 (@dparker1005)
* BUG FIX: Fixed race condition issue where duplicate refund emails were sometimes sent when using the Stripe gateway. #2438 (@dparker1005)
* BUG FIX: Fixed timezone offset issue when filtering orders by date range. #2440 (@mircobabini)
* BUG FIX: Fixed the "transient error" issues happening with some reports in the dashboard. #2443 (@JarrydLong, @ideadude)

= 2.10.3 - 2023-03-02 =
* BUG FIX: Fixed issue with alternative login methods that call the wp_login_failed hook with only 1 parameter.

= 2.10.2 - 2023-02-28 =
* BUG FIX: Fixed issue where the "Site URL Changed" message would show up on sites where the site_url wasn't actually changed. We are now ignoring the scheme (http/https) when checking.
* REFACTOR: Removed the pmpro_is_paused option and deprecated the pmpro_set_pause_mode() function. Now checking specifically for site_url changes in real time during admin_init. We no longer intend to expand on the "pause mode" concept or otherwise try to align with the WP_ENVIRONMENT_TYPE values.

= 2.10.1 - 2023-02-21 =
* BUG FIX/ENHANCEMENT: Changed how reports are loaded to avoid fatal errors if PMPro had an incomplete update.
* BUG FIX/ENHANCEMENT: Fixed escaping of the discount code message to allow the strong tag.
* BUG FIX/ENHANCEMENT: Now running the pmpro_tos_content filter AFTER the TOS page content is escaped. This could be used to override that escaping if needed. See: https://gist.github.com/ideadude/2ce102d7fd554172e4e2a98d80e74352

= 2.10 - 2023-02-20 =
* FEATURE: Added Setup Wizard
* FEATURE: Stripe Checkout and Stripe Customer Portal integrations are now fully released. Increased Stripe fee to 2% for newly connected sites.
* ENHANCEMENT: Now "pausing" some PMPro functionality when the site URL changes.
* ENHANCEMENT: Categories and tags can now be restricted directly from their respective settings pages.
* ENHANCEMENT: Updated Stripe webhook checker to check each event type separately.
* ENHANCEMENT: Admins will now be given the choice to delete a user's membership history when deleting a user.
* ENHANCEMENT: Stripe Checkout now creates Invoices for one-time payments.
* ENHANCEMENT: Updated Stripe library to version 10.0.
* ENHANCEMENT: Excluding more dev/staging-related subdomains and TLDs from Wisdom tracking.
* ENHANCEMENT: Added the add class attribute to the "rate us" notice in the footer of PMPro pages. You can use this to hide the notice.
* BUG FIX/ENHANCEMENT: WordPress users will now be created before payments are charged at checkout.
* BUG FIX/ENHANCEMENT: No longer cancelling subscriptions for users with a membership level when the level is deleted.
* BUG FIX/ENHANCEMENT: Removed the "What's This?" text from the CVV field.
* BUG FIX/ENHANCEMENT: Fixed error thrown if all pmpro_reports were unset.
* BUG FIX/ENHANCEMENT: Fixed localization issues with the Members List table in the dashboard and several other areas.
* BUG FIX/ENHANCEMENT: Fixed issue where usage tracking was disabled, even if you clicked the "allow" button in the notice. Double check that this is set how you'd like at Memberships > Settings > Advanced Settings > Enable Tracking.
* BUG FIX: Fixed issue where "Visits, Views, and Logins" report may not show up on some setups.
* BUG FIX: Fixed issue where invoice emails were not sending due to issues with the pmpro_get_order_json() function.
* BUG FIX: Fix for fatal error on site health check page if login/password is required for ftp account. #2374 (Thanks, @freax on GitHub)
* REFACTOR: Deprecating CyberSource and PayPal Website Payments Pro gateways.
* REFACTOR: Marking "trial ending" cron as deprecated.
* REFACTOR: Removed the ability to direct access the scripts in the /crons/ and /services/ directories. Only the getfile.php script can be accessed this way when activated.

= 2.9.12 - 2023-02-16 =
* SECURITY: Updated sanitization, escaping, and other security-related code across the plugin.

= 2.9.11 - 2023-01-27
* BUG FIX: Fixed issue introduced in 2.9.9 where recurring_payment IPN transactions in PayPal were not being processed yet. If you have recurring subscription with PayPal Standard or PayPal Express, you will need to resend those transactions to make sure completed (and in some cases failed) recurring orders were processed on your site. More information here: https://www.paidmembershipspro.com/pmpro-update-2-9-11/

= 2.9.10 - 2023-01-25 =
* ENHANCEMENT: Much nicer thumbnail for one of our add ons. #2338 (@kimcoleman)
* ENHANCEMENT: Adding some other missing add on thumbnails. #2339 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Updated the orders and discount code tables in the dashboard to display better on small screens. #2334 (@kimcoleman)
* BUG FIX: Fixed issue with some widgets, e.g. the login widget, introduced in 2.9.9. #2335 (@jarrydlong)
* BUG FIX: Fixed issue where Invoice Emails would fail to send from the orders page of the dashboard. #2340 (@ideadude)

= 2.9.9 - 2023-01-18 =
* SECURITY: Updated sanitization, escaping, and other security-related code across the plugin.
* ENHANCEMENT: When using expirations on levels, the default date is now +1 year again. #2328 (@dparker1005)
* ENHANCEMENT: Now showing option labels instead of values when displaying multiselect type fields using the pmpro_member shortcode. #2327 #2314 (@dparker1005, @ideadude)
* ENHANCEMENT: Updated the user fields UI to say "Required at Checkout?", which more accurately describes the behavior. Note: we don't require these fields on profile updates because it can interfere with core user updates and other plugins. #2320 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed warning in cases where users were deleted or otherwise not found when processing Stripe webhooks. #2331 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed some issues in notifications and messages related to previous escaping updates. #2321 (@dparker1005)
* BUG FIX/ENHANCEMENT: The pmpro_checkout_box-{groupname} class given to divs on the frontend user profile is now sanitized to avoid spaces and special characters there. #2319 (@kimcoleman)
* BUG FIX: Fixed issues with CSV exports when filtered within a date range. #2315 (@jarrydlong)

= 2.9.8 - 2022-12-27 =
* SECURITY: Updated many queries to use $wpdb->prepare and esc_sql for better security. In almost all of these cases, the variables uses in the queries were escaped earlier or otherwise trusted, but it's good practice to escape in the query anyway to be extra safe and avoid issues when code is updated in the future. #2312 (@andrewlimaza, @ideadude)
* ENHANCEMENT: Removed duplicate "display_name" definition in the PMPro Email class. #2297 (@mircobabini)
* ENHANCEMENT: Fixed PMPRO_MIN_PHP_VERSION constant name in a few places. #2298 (@mircobabini)
* ENHANCEMENT: Including the PMPro Akismet and MailPoet icons for use on the Add Ons page. #2307 #2309 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Fixed some notices in the Authorize.net Gateway class. #2295 (@mircobabini)
* BUG FIX/ENHANCEMENT: Fixed HTML in the nl_NL email templates. #2300 (@mircobabini)
* BUG FIX/ENHANCEMENT: Added the !!membership_level_confirmation_message!! var to admin checkout emails. #2305 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed typo "could" in error message shown when an Add On cannot be installed. #2313 (@kimcoleman)

= 2.9.7 - 2022-11-30 =
* BUG FIX/ENHANCEMENT: Added compatibility for the Avada theme. Protected content is now editable. #2285 (@andrewlimaza)
* BUG FIX: Avoiding sprintf issues during cron runs. This caused issues where the expiring soon emails were being sent out multiple times. #2290 (@dparker1005)
* BUG FIX: Adding id parameters to billing address fields to avoid Stripe errors when checking out with the show address fields option set to true. #2284 (@ipokkel)
* BUG FIX: Adding id parameters to billing address fields to avoid Stripe errors when updating billing with the show address fields option set to true. #2289 (@dparker1005)
* BUG FIX: Fixed issue with subscription profile start dates when using Authorize.net and custom code that alters start dates. #2280 (@dparker1005)
* BUG FIX: Fixed warning that happened with some MySQL versions when setting a user's expiration to 'No' from the edit user page. #2291 (@andrewlimaza)

= 2.9.6 - 2022-11-14 =
ENHANCEMENT: Added content restriction settings to Elementor "containers". #2254 (Thanks, @Minebomber)
ENHANCEMENT: Added !!levels_url!! to all email templates by default. #2263 (@andrewlimaza)
ENHANCEMENT: Added docblocks to all methods of the PMProEmail class. #2263 (@andrewlimaza)
ENHANCEMENT: Now allowing strong, code, em, br, p, and a tags in field descriptions. #2246 (@andrewlimaza)
BUG FIX/ENHANCEMENT: Fixed message show when editing an existing level. #2245 (@mircobabini)
BUG FIX/ENHANCEMENT: Fixed issue where the billing address wasn't being sent to Stripe if it was added to checkout via an add on or other custom code. #2271 (@dparker1005)
BUG FIX/ENHANCEMENT: Fixed the $user_id parameter passed to the pmpro_discount_code_used action hook in the Stripe Webhook handler. #2273 (@mircobabini)
BUG FIX/ENHANCEMENT: The required field asterisk now appears correctly if a hint is used on a textarea, select, or other user field. #2274 (@ideadude)
BUG FIX/ENHANCEMENT: Avoiding fatal errors that occurred when trying to use Stripe Connect in countries that don't allow an application fee. The fee is set to 0% for these users/countries. #2228 (@dparker1005)
BUG FIX/ENHANCEMENT: Fixed CSS in the CVV/CVV popup window. #2224 (@dparker1005)
BUG FIX/ENHANCEMENT: Now pulling the billing address from the Stripe Customer record or a previous order if the billing address isn't available in the Payment Method object passed to webhook calls. #2272 (@dparker1005)
BUG FIX/ENHANCEMENT: Fixed CSS for the new level popup to no longer rely on selectors that broke when certain translations were used in the WP dashboard. #2276 (@kimcoleman)
BUG FIX/ENHANCEMENT: Fixed trial wording for custom trials where the initial payment was > $0. #2277 (@andrewlimaza)
BUG FIX: Fixed bug where file type fields weren't uploaded or saved properly when using Stripe Checkout. #2251 (@dparker1005)
BUG FIX: Fixed an issue where the dropdown "What should users without access see?" for the Require Membership Block would reset on each page load. #2243 (@andrewlimaza)
BUG FIX: Fixed issue where user fields were not showing on the profile sometimes when they should have been. #2270 (@dparker1005)
BUG FIX: Fixed the $MemberOrder->get_orders method query so it works when a 'membership_level_id' arg is passed in. #2251 (@dparker1005)
BUG FIX: Fixed issue where the billing zipcode was not pulled from user meta correctly when using the $MemberOrder->find_billing_address() method. #2275 (@mircobabini)

= 2.9.5 - 2022-09-17 =
* ENHANCEMENT: Added Select2/Autocomplete as a field type in the user field settings. #2237 (@kimcoleman)
* ENHANCEMENT: Improving our in-app notification styling. #2234 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now skipping Secure Customer Authentication (SCA) for Stripe subscriptions at checkout with a $0 initial payment. This fixes issues where SCA failure would orphan active subscriptions. Recurring payments are working fine without this additional check.
* BUG FIX/ENHANCEMENT: Improved CSS for frontend form fields.
* BUG FIX/ENHANCEMENT: Fixed placement of required field asterisks for certain field types. #2231 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed display of the CVV popup. #2224 (@dparker1005)
* BUG FIX: Fixed application fee issue that happened when users in some countries tried to use Stripe Connect. #2228 (@dparker1005)
* BUG FIX: Fixed case where user fields wouldn't show for users if earlier fields/groups were only for admins. #2233 (@kimcoleman)
* BUG FIX: Fixed fatal error for older versions of WordPress missing the wp_get_environment_type() function. #2236 (@mircobabini)
* BUG FIX: Fixed issue where PMPro memberships were sometimes not cancelled when a subscription was cancelled in Stripe. #2217 (@dparker1005)
* BUG FIX: Fixed fatal error that was preventing the weekly (opt in) data tracking from running. #2242 (@ideadude)

= 2.9.4 - 2022-08-30 =
* BUG FIX/ENHANCEMENT: Added MMPU compatibility for some crons. #2211 (@dparker1005)
* BUG FIX/ENHANCEMENT: The default "More Information" group name/label is now translatable. #2214 (@mircobabini)
* BUG FIX/ENHANCEMENT: Added JavaScript code to prevent duplicate clicking of the cancel button. #2216 (@mircobabini)
* BUG FIX/ENHANCEMENT: Fixed PHP notice on the update billing page. #2219 (@mircobabini)
* BUG FIX/ENHANCEMENT: Avoiding line breaks in very long labels for checkbox fields. #2221 (@mircobabini)
* BUG FIX: Fixed issue with processing customer.subscription.deleted webhook events from Stripe with newer versions of PHP. #2217 (@dparker1005)

= 2.9.3 - 2022-08-25 =
* ENHANCEMENT: Added pmpro_add_user_field_where( $where, $field ) and pmpro_add_user_field( $field, $where ) filters.
* BUG FIX/ENHANCEMENT: Added MMPU support for some emails so correct level information is shown. #2200 (@dparker1005)
* BUG FIX/ENHANCEMENT: The pmpro_checkout_box-{groupname} id given to checkout box divs is now sanitized to avoid spaces and special characters there. #2209 (@dparker1005)
* BUG FIX/ENHANCEMENT: Trimming underscores off the front/back of suggested group names in the user field settings. #2209 (@dparker1005)
* BUG FIX: Fixed issues with fields showing in some checkout checkbox/group locations. #2204 #2205 (@ipokkel)
* BUG FIX: Fixed issue where discount code uses weren't being tracked when using the Stripe Checkout beta. #2196 (@dparker1005)

= 2.9.2 - 2022-08-10 =
* BUG FIX/ENHANCEMENT: Now correctly deprecating the pmprorh_section_header() function. We accidentally had it reversed and throwing a warning when using the new pmpro_default_field_group_label() function. (@kimcoleman)
* BUG FIX/ENHANCEMENT: When saving user fields, now making sure that the group name is not blank and unique. Blank or duplicate group names could cause other issues, e.g. with required fields or fields being shown multiple times at checkout. #2187 (@ideadude)
* BUG FIX/ENHANCEMENT: Fixed issue where the sales report widget cache was not being updated when new orders came in.
* BUG FIX/ENHANCEMENT: Better error handling in the PayPal IPN handler. #2194 (@mircobabini)
* BUG FIX: Fixed issue where user fields set as "required" weren't being styled as required on the checkout page. #2180 (@ipokkel)
* BUG FIX: Now showing the new level templates even if you click on the link in the dashboard or on a fresh install's levels page. #2181 (@kimwhite)
* BUG FIX: Fixed issues where pmprorh_sanitize was being called instead of the new pmpro_sanitize, causing issues with date fields and others at checkout. #2182

= 2.9.1 - 2022-07-28 =
* ENHANCEMENT: Enhanced doc blocks for some functions in includes/functions.php.
* BUG FIX/ENHANCEMENT: Fixed localization of a few strings.
* BUG FIX/ENHANCEMENT: Added unset magic method to the MemberOrder class to avoid warnings, e.g. in the REST API endpoints, which remove some data from orders before output. #2177 (@dparker1005)
* BUG FIX/ENHANCEMENT: Removed unused local variable name_parts. #2170 (@mircobabini)
* BUG FIX/ENHANCEMENT: Fixed CSS/UI issues in the mobile view of some dashboard pages. #2174 #2175 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now filtering the confirmation URL when using Stripe Checkout. #2178 (@dparker1005)
* BUG FIX/ENHANCEMENT: Removed some trailing commas that were throwing errors for some users on old versions of PHP. (@ideadude, @andrewlimaza)
* BUG FIX/ENHANCEMENT: User fields added through settings are now included in the members list CSV export by default as intended.
* BUG FIX: Fixed fatal error when reactivating the Register Helper plugin. #2173 (@ideadude, @JarrydLong)
* BUG FIX: Fixed issue with saving group levels when you have more than one group.

= 2.9 - 2022-07-18 =
* FEATURE: Added a "User Fields" tab to the settings page. You can now add "Register Helper" style fields through the WP admin dashboard without code. (@ideadude, @kimcoleman, @dparker1005)
* FEATURE: The "Add Ons" tab has a new look, with better browsing and searching. (@kimcoleman)
* FEATURE: Added support for level templates to more easily allow admins to create popular types of levels. (@kimcoleman)
* FEATURE: Added a CSV export option to the built-in reports. (@andrewlimaza, @JarryLong)
* ENHANCEMENT: Redesigned the Add/Edit Membership Level screen to focus on the applicable settings for the type of level. (@kimcoleman)
* ENHANCEMENT: Testing PHP sessions in site health now. (@JarrydLong)
* ENHANCEMENT: Fixed doc block for the pmpro_getLevel() function. (@eighty20results)
* ENHANCEMENT: Showing a notice on the PMPro settings pages if the next update for PMPro has an "update notice" section in the readme for that version. (@dparker1005)
* ENHANCEMENT: Removed the odd line break from the "Powered by Paid Memberships Pro" HTML comment. (@mircobabini)
* ENHANCEMENT: Added filter pmpro_membershiplevels_page_action_links to add/modify buttons on the Settings > Membership Levels admin page. (@kimcoleman)
* ENHANCEMENT: Added pmpro_unhandled_webhook action that is thrown when a webhook or IPN handler encounters a webhook that isn't processed by PMPro. You can use this hook to log these cases for debugging purposes. (@mircobabini)
* ENHANCEMENT: Disabled the credit card options for the Stripe gateway. Instead, it now says "We accept all major credit cards". (@mircobabini)
* ENHANCEMENT: Added a pmpro_order_status_{status} hook that is fired whenever an order's status changes. Passes the $status, $order, and $original_status as params. (@JarryLong)
* BUG FIX/ENHANCEMENT: Added the pmpro_calculate_profile_start_date() function, which is used in all built-in gateways now. This fixes some issues with inconsistencies for subscriptions with multiple month billing periods. (@dparker1005, @messica)
* BUG FIX/ENHANCEMENT: Now handling the subscr_failed IPN message for PayPal. This message is now sent sometimes instead of the "recurring_payment_skipped" one. (@andrewlimaza)
* BUG FIX/ENHANCEMENT: The PayPal IPN handler is now treating "Voided", "Denied", and "Expired" payment statuses similar to "Failed". (@JarrydLong)
* BUG FIX/ENHANCEMENT: Now requiring a name when adding/editing a level. (@JarrydLong)
* BUG FIX/ENHANCEMENT: Updates to the level save logic to avoid some edge case issues. (@ideadude)
* BUG FIX/ENHANCEMENT: Removed some trailing commas in arrays that were breaking PHP 5.6 users. (@mircobabini)
* BUG FIX: Fixed "No such product" bug that happened sometimes when checking out with Stripe. We catch this now and create the products when they are missing. (@dparker1005)
* REFACTOR: Removed update notice RE Better Login Reports being merged into core PMPro (which happened a few years ago). Now using the general deprecation notices RE old add ons. (@JarrydLong)
* REFACTOR: Refactored the MemberOrder class a bit to avoid PHP 8+ warnings. (@JarrydLong)

= 2.8.3 - 2022-05-23 =
* BUG FIX/ENHANCEMENT: Avoiding multiple DB queries related to license key checks when no license key is enabled.
* BUG FIX: Fixed issue where some PayPal subscriptions had an extra 1 year trial when set up.
* BUG FIX: Avoiding warnings about application fees when using Stripe legacy keys.
* REFACTOR: Refactored recent updates to the Divi compatibility code to avoid issues for users who might be running a similar gist.

= 2.8.2 - 2022-05-20 =
* ENHANCEMENT: Now noting the chosen PMPro login page on the pages table in the dashboard. #2073 (@mircobabini)
* ENHANCEMENT: Improved help text on the payment settings page when using Stripe legacy keys. Reminder to disconnect from Stripe if also using legacy keys. #2078 (@dparker1005)
* BUG FIX/ENHANCEMENT: Fixed redirect issues that happened if the login page was trashed. #2077 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Tweaked display of long numbers in the sales report widget. #2071 (@mircobabini)
* BUG FIX/ENHANCEMENT: Renamed the hideads field on the advanced settings page so adblockers don't block it. #2072 (@mircobabini)
* BUG FIX/ENHANCEMENT: Fixed responsive display of various admin pages when viewed on smaller screens. #2079 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed tracking of hideads feature via Wisdom. #2081 (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Adding HTML to our no_access messages when using Divi to avoid display issues. #2080 (@kimcoleman)
* BUG FIX/ENHANCEMENT: Fixed a warning on memberships report when using MMPU. #2104 (@mircobabini)
* BUG FIX: Moved call to pmpro_doing_webhook in the Stripe webhook handler to make sure Stripe libraries are already loaded. #2101 (@mircobabini) 
* BUG FIX/ENHANCEMENT: Avoiding duplicate DB calls when pmpro_license_isValid() is called with no key. This was happening on the plugins, update, and add ons pages in the dashboard. (@ideadude)
* BUG FIX: Fixed issues where payment failed events were not being processed correctly in the Stripe webhook handler. #2100 (@andrewlimaza, @dparker1005, @ideadude)
* BUG FIX: Fixed issue where recurring orders were not saving if a payment method could not be found. #2099 #2105 #2104 (@dparker1005, @ideadude)
* BUG FIX: Fixed error on the orders page happening in some versions of PHP. #2075 (@mircobabini)

= 2.8.1 - 2022-05-10 =
* BUG FIX/ENHANCEMENT: Fixed typos in some block descriptions. #2064 (@mircobabini)
* BUG FIX: Fixed issue where the digest email cron and some others were running more often than intended. #2070 (@mircobabini)

= 2.8 - 2022-05-05 =
* FEATURE: Added refunds buttons for Stripe and Paypal Express orders. #1948 (@JarrydLong)
* FEATURE: Released Beta version of Stripe Checkout. Add `define('PMPRO_STRIPE_CHECKOUT_BETA_ENABLED', true);` to your wp-config.php to enable this gateway during the beta. #1923 (@dparker1005)
* ENHANCEMENT: Introduced a new set of functions that handle cron-related tasks including: `pmpro_get_crons()` to get the list of PMPro registered crons. #1999 (@sc0ttkclark)
* ENHANCEMENT: New filter `pmpro_registered_crons` which you can register new crons to be handled by PMPro. They show up in the PMPro Site Health info and are automatically scheduled when they need to be. #1999 (@sc0ttkclark)
* ENHANCEMENT: Added an opt-in stats collection so we can get better insight on how people use Paid Memberships Pro. (@sc0ttkclark, @ideadude)
* ENHANCEMENT: Added Formal German translation files. #1926
* ENHANCEMENT: Tracking library conflicts in Site Health, e.g. when other plugins are loading gateway libraries at the same time as PMPro. (@dparker1005)
* ENHANCEMENT: UI/UX improvements to the Orders admin area for list and single edit view. #2017 (@kimcoleman)
* ENHANCEMENT: Improved the UI for email template variables reference on the Settings > Email Templates admin page. #2018 (@kimcoleman)
* ENHANCEMENT: Various other UI improvements to the admin area. #2019 (@kimcoleman)
* ENHANCEMENT: Improved block names, descriptions, keywords, and organization for discover and usability. #2011 (@kimcoleman)
* ENHANCEMENT: Added "show_noaccess" as a setting on the Membership Required block for swapping in the appropriate content message. #2011 (@kimcoleman)
* ENHANCEMENT: Added filter 'pmpro_braintree_transaction_sale_array' to allow adding or adjusting of the sale transaction method. #2006 (@andrewlimaza)
* ENHANCEMENT: Moved the TOS input inside the label to support multiline i18n. #2002 (#mircobabini)
* ENHANCEMENT: Added new action `pmpro_checkout_after_tos` to output content after the TOS. #2003 (@mircobabini)
* ENHANCEMENT: Added filters to change gateway ipn/webhook logfile. #1996 (@mircobabini)
* ENHANCEMENT: Added filter to perform actions during PPHttpPost() method of the PayPal gateways. #1992 (@mircobabini)
* ENHANCEMENT: Added untranslated gateway identifiers to Site Health info. #1989 (@JarrydLong)
* BUG FIX/ENHANCEMENT: Fixed escaping and localization for many strings across the codebase. #1976 (@mircobabini)
* BUG FIX/ENHANCEMENT: Resolve admin area conflicts with other plugins using similar class names. #1991 (@sc0ttkclark)
* BUG FIX: Crons are now automatically rescheduled if they disappear form the cron schedule. #1999 (@sc0ttkclark, @mircobabini)
* BUG FIX: Resolved problems with PHP float precision and prevent passing along faulty floats to the gateway APIs. #1929 (@sc0ttkclark)
* BUG FIX: Fixed issue where TOS setting was not saving when using the PayFast gateway. #1990 (@andrewlimaza)
* BUG FIX: Fixed issue where the is_renewal() method didn't work during the pmpro_added_order hook. (@andrewlimaza)

= 2.7.5 - 2022-03-01 =
* ENHANCEMENT: Now sending "name" separate from the "description" when creating customers for Stripe checkouts. (@ideadude)
* ENHANCEMENT: You can now search the members list on specific user table columns or user meta fields by using a colon in your search term. These queries are faster than the default queries. The format is meta_key:meta_value (no backticks). You can also use login, nicename, email, url, or display_name as the meta_key and the users table will be searched against the related column. (@ideadude)
* BUG FIX/ENHANCEMENT: Increased search limit to make sure we reuse Stripe "prices" when members check out for recurring plans with Stripe. (@ideadude)
* BUG FIX: Fixed issue where Stripe application fees were still charged for PMPro Standard and PMPro Builder license holders. From now on, payments and subscriptions will not include the fee. (@ideadude)

= 2.7.4 - 2022-02-22 =
* ENHANCEMENT: Adjusting the readme title and description. (@kimcoleman)
* ENHANCEMENT: Improved error handling for Stripe Prices. (@dparker1005)
* ENHANCEMENT: Adjusted the '/change_membership_level' route to support email and create_user parameter to improve our Zapier integration. No parameters are removed, this is to ensure backwards compatibility for any pre-existing applications using this REST route. (@andrewlimaza)
* ENHANCEMENT: Now showing new vs renewal orders on the sales and revenue reports. (@ideadude, @JarrydLong, @kimcoleman)
* ENHANCEMENT: Better tool tips in the sales and revenue reports. (@ideadude, @JarrydLong, @kimcoleman)
* ENHANCEMENT: Now handling recurring_payment_profile_created IPN transactions and updating the payment_transaction_id for new orders made via PayPal. (@mircobabini)
* ENHANCEMENT: Added pmpro_webhook_unhandled action at the end of any webhook handler. (@mircobabini)
* BUG FIX/ENHANCEMENT: Updated logic and text around license keys to account for new premium plans. (@ideadude, @kimcoleman)
* BUG FIX/ENHANCEMENT: Made Terms of Service text a bit darker for accessibility. (@kimcoleman)
* BUG FIX/ENHANCEMENT: Updated queries in includes/cleanup.php to use WPDB delete method for better DB escaping. (@andrewlimaza)
* BUG FIX/ENHANCEMENT: Fixed the text domain for some strings that weren't translatable. (@mircobabini)
* BUG FIX/ENHANCEMENT: Fixed misspelled text domains in the pmpro_reset_password_form() function. (Thanks, @isaiahfb)
* BUG FIX: Fixed issues with the update billing page when using PayPal Websites Payments Pro. (@dparker1005)
* BUG FIX: Fixed issues with Stripe checkouts when users had previous checkouts through a different gateway. (@dparker1005)
* REFACTOR: Removed unused condition in send method of PMProEmail class. (Thanks, @freax)
* BUG FIX: Fixed notice when pmpro_check_plugin_version was called for an invalid plugin file. (@ideadude)

= 2.7.3 - 2022-02-01 =
* ENHANCEMENT: Added CSS to make sure input fields input fields aren't extra tiny/short, e.g. in the Twenty Twenty Two theme. (@kimcoleman)
* BUG FIX: Fixed a fatal error for older PHP sites when visiting the page settings in the admin dashboard. (@andrewlimaza)
* BUG FIX: Fixed issue where license keys were incorrectly flagged as invalid if expiring within 1 month. (@ideadude)
* BUG FIX: Fixed issue where billing addresses were not added to the Stripe customer at checkout. (@dparker1005)

= 2.7.2 - 2022-01-17 =
* BUG FIX/ENHANCEMENT: Improved error messages when creating subscriptions with Stripe. (@dparker1005)
* BUG FIX: Fixed issue where certain Stripe trial periods would be sent to the Stripe subscription as longer than intended. #1912 (@dparker1005)
* BUG FIX: Fixed visual issues with dropdowns in our blocks when using Full Site Editing in WP 5.9+. #1909 (@sc0ttkclark)

= 2.7.1 - 2022-01-13 =
* BUG FIX: Fixed issue on some MySQL setups that would throw an error about the primary key in the pmpro_memberships_pages and pmpro_memberships_categories tables.

= 2.7 - 2022-01-13 =
* FEATURE: Added a "Spam Protection" option to the advanced settings page. When used, IP addresses are blocked from checkout if there are more than 10 failsures within 15 minutes. (@ideadude)
* ENHANCEMENT: Checkouts with Stripe will now reuse Stripe Products and Prices. (@dparker1005)
* ENHANCEMENT: User profile now links to Stripe customer so that subscriptions can easily be directly updated in Stripe rather than through Subscriptions Updates which is now deprecated. (@dparker1005)
* ENHANCEMENT: Improved usability of the Require Membership metabox for sites with a large number of levels. #1885 #1692 (@kimcoleman)
* ENHANCEMENT: Include reCAPTCHA on Billing Page form. #1884 (@ideadude)
* ENHANCEMENT: Membership pages URLs are now included in the Site Health Information. (@JarrydLong)
* BUG FIX/ENHANCEMENT: Set the default for the `pmpro_send_200_http_response` filter to `false` instead of `true` to reduce impact of the functionality on sites that don't need it. #1868 (@dparker1005)
* BUG FIX/ENHANCEMENT: Consolidated the "Free memberships only" option into the "All memberships" option for enabling reCAPTCHA to ensure that paid memberships with discounts that make the membership $0 cost show reCAPTCHA consistently. #1878 #1840 (@JarrydLong)
* BUG FIX: Resolved PHP 8 fatal error with Authorize.net Silent Post handling. #1899 (@ZebulanStanphill)
* BUG FIX: The new filter `pmpro_admin_pagesetting_post_type` replaces the now deprecated filter `pmpro_admin_pagesetting_post_type_array` to allows setting one specific post type instead of always getting the first from an array. #1866 #1865 (@ipokkel)
* BUG FIX: Resolved issue where users may not be linked to their Stripe customer. (@dparker1005)
* BUG FIX: Now including all levels (public and hidden) in the Paid Memberships Pro section of Site Health information. #1898 (@kimcoleman)
* BUG FIX: Set cancelled/error status from PayPal Express IPN even when an order has no user. #1897 (@mircobabini)
* BUG FIX: Ensure styles are removed from excerpts generated for protected content. #1894 (@sc0ttkclark)
* BUG FIX: Various text adjustments for readability. #1892 (@kimcoleman)
* BUG FIX: Set primary key for `wp_pmpro_memberships_categories` and `wp_pmpro_memberships_pages` tables. #1891 (@ideadude)
* BUG FIX: Fixes around the `pmpro_manage_memberslist_columns` filter to accommodate sites that aren't in English. #1879 #1876 (@JarrydLong)
* BUG FIX: Use the correct cancel method when cancelling an order through PayPal Standard IPN requests. Fixes compatibility with PMPro Cancel on Next Payment Date add on. #1882 (@mircobabini)
* BUG FIX: Discount code expiration date is now properly being used in the REST API. #1877 (@JarrydLong)
* BUG FIX: Remove the `SHIPTOPHONENUM` parameter sent to PayPal Website Payments API and encode all parameters passed into API updates. #1883 (@dparker1005)
* BUG FIX: Resolve timezone issue with Stripe subscriptions to resolve problems where trials would receive an extra day depending on the time of checkout. #1874 (@dparker1005)
* BUG FIX: Now using a single product per level and a single Stripe price per payment amount to prevent duplicate products and prices. #1824 (@dparker1005)
* REFACTOR: Organized and simplified Stripe gateway class. (@dparker1005)

= 2.6.7 - 2022-01-06 =
* SECURITY: Updated escaping in the pmpro_getLevelAtCheckout and pmpro_checkDiscountCode functions as extra precaution against SQL injections. (Thanks, WPScan)

= 2.6.6 - 2021-11-18 =
* SECURITY: Updated escaping on the discount codes page in the dashboard to prevent XSS attacks. #1867 (Thanks, Erwan from WPScan)
* BUG FIX/ENHANCEMENT: Added code to remove duplicate active rows in the pmpro_memberships_users table after level change. This might have happened e.g. if users were purchasing a level via the WooCommerce Add On multiple times. #1860 (@dparker1005)
* BUG FIX/ENHANCEMENT: Improved the REST API endpoints to better support Zapier native requirements. #1862 (@andrewlimaza)
* BUG FIX: Fixed PHP notices in the name parser library. #1861 (@sc0ttkclark)

= 2.6.5 - 2021-11-12 =
* ENHANCEMENT: Introduced new action `pmpro_before_commit_express_checkout` to allow additional changes after an order has been saved but before sending customer to PayPal Express checkout. #1852 (@mircobabini)
* BUG FIX/ENHANCEMENT: Added login compatibility for Jetpack WordPress.com SSO when using the PMPro login page. #1848 (@sc0ttkclark)
* BUG FIX: Fixed PHP notices from status headers when server protocol information is unavailable. #1849 (@dparker1005)
* BUG FIX: Fixed metadata compatibility for membership levels and orders when calling `get_pmpro_membership_level_meta()` and `get_pmpro_membership_order_meta()` so they support getting all meta values for all keys. #1853 (@mircobabini)
* BUG FIX: Escape all Webhook communication debug output coming from gateways. #1855 (@ideadude, Victor Garcia)

= 2.6.4 - 2021-11-02 =
* ENHANCEMENT: Now including some information from the htaccess file in Site Health, including whether a getfile.php script is defined or if caching is being used. (@sc0ttkclark)
* ENHANCEMENT: Now including some of the PMPro-related PHP constants in the Site Health. (@sc0ttkclark)
* ENHANCEMENT: Now including the minimum PHP version (5.6 currently) in the readme.txt so it's shared on the WordPress.org page. (@sc0ttkclark)
* ENHANCEMENT: Added scrollable classes to the member history shown on user profile edit page in the dashboard. (@kimcoleman)
* BUG FIX/ENHANCEMENT: Now sending a 200 OK status message early when the Stripe webhook is running to avoid timeout issues. We may use this new pmpro_send_200_http_response in the other webhook/IPN handlers later on. (@dparker1005)
* BUG FIX/EHNANCEMENT: Removed the "fee" info from the edit user page. This was often misleading. The fee is still shown on the members list and frontend account page. Future updates will include work to make sure the fee is more accurate in cases where subscriptions or levels are being changed by admins after checkout. (@ideadude)
* BUG FIX/ENHANCEMENT: Once again enqueuing the admin.css file on all WP admin pages. This fixes issues where styles weren't being applied to the edit user/profile page in the dashboard. (@ideadude)
* BUG FIX/ENHANCEMENT: Removed the "Member Value Report". We didn't intend to move this over from the old Member History add on. The report was inaccurate and had optimization issues. (@kimcoleman)
* BUG FIX/ENHANCEMENT: Added login compatibility for wordpress.com hosted sites. This fixes some issues with wordpress.com's SSO when using the PMPro login page. (@sc0ttkclark)
* BUG FIX: Fixed issue introduced in 2.6.3 where memberships were not being cancelled when cancelled at PayPal. (@mircobabini)
* BUG FIX: Now including time when calculating profile start date. In the past, we would set it to 00:00:00 which could add or remove a few hours from the subscription. (@dparker1005)
* BUG FIX: Fixed issue where enddates were incorrectly set sometimes when expiration period was "Hour". (@kimwhite)

= 2.6.3 - 2021-10-11 =
* ENHANCEMENT: Now passing "app" information to Stripe through API calls. (@dparker1005)
* ENHANCEMENT: Updated PayPal IPN to detect messages for refunds to at least log it. (@mircobabini)
* ENHANCEMENT: Updated PayPal IPN to differentiate between cases where the initial payment failed vs a subscription was cancelled. (@mircobabini)
* ENHANCEMENT: Better styling of the membership levels history when empty. (@mircobabini)
* BUG FIX/ENHANCEMENT: Now showing better error messages when license key checks fail due to connection issues. (@ideadude)
* BUG FIX: Improved PayPal API integration to handle cases where PayPal is returning encoding errors but still processing payments and subscriptions. (@mircobabini)
* BUG FIX: Fixed issue where the Stripe sandbox key wasn't saved properly when using Stripe connect. (@dparker1005)
* BUG FIX: Fixed issue where a double $$ was showing up in specific emails. (@andrewlimaza)
* BUG FIX: Fixed warnings in various webhook and IPN handlers. (@ideadude)
* BUG FIX: Fixed warning in the admin activity email cron job. (@andrewlimaza)

= 2.6.2 - 2021-09-17 =
* ENHANCEMENT: Made username the first column in the members list. This helps with the mobile view. #1764 (@dparker1005)
* BUG FIX/ENHANCEMENT: Will now block uninstall.php from running if an older version of PMPro is deleted from the plugins page. #1773 (@mircobabini)
* BUG FIX/ENAHCEMENT: Expanded the allowed HTML for pmpro_kses to support email templates and added a pmpro_kses filter. #1770 (@sc0ttkclark)
* BUG FIX/ENHANCEMENT: Updated the CSS for "clickable" labels in checkbox lists. #1752 (@kimcoleman)
* BUG FIX: Fixed bug with sending test emails from the email templates page. #1765 (@ideadude)
* BUG FIX: Added the !!membership_level_confirmation_message!! var to the list on the email templates page. #1783 (@kimwhite)
* BUG FIX: Updated the SendWP link per their new dashboard area. #1777 (@kimcoleman)
* BUG FIX: Fixed bug where PMPro-related usermeta was sometimes blanked out if those fields weren't present at checkout, e.g. when a logged in user was checking out. #1762 (@andrewlimaza)
* BUG FIX: Fixed issue where gateway-related notices weren't showing up on the discount codes page. #1757 (@mircobabini)
* BUG FIX: Fixed some design issues with the member history tables. #1753 (@mircobabini)
* BUG FIX: Fixed issues where the option to block subscribers from the dashboard would interfere with other plugins, e.g. the MailPoet plugin. #1749 (@sc0ttkclark)
* BUG FIX: Fixed issues where the RTL stylesheets might not load if your theme overrode frontend.css or admin.css but didn't have the RTL equivalents. (@ideadude, @sc0ttkclark)

= 2.6.1.1 - 2021-08-25 =
* BUG FIX: Fixed issue with PMPro blocks not showing up in the block editor.
* REFACTOR: Some JS functions and element IDs and names have been prefixed with pmpro_ to avoid conflicts.

= 2.6.1 - 2021-08-24 =
* SECURITY: Added capability checks to further tighten security around email template settings. (@ideadude, @sc0ttkclark)
* SECURITY: Added a pmpro_kses function and using that to sanitize email template bodies and all email bodies before sending. (@ideadude, @sc0ttkclark)
* ENHANCEMENT: Added Email Templates link to PMPro Dashboard for getting started. #1722 (@kimcoleman)
* ENHANCEMENT: All actions in the admin list tables are now filterable for Discount Codes (`pmpro_discountcodes_row_actions`), Membership Levels (`pmpro_membershiplevels_row_actions`), and Orders (`pmpro_orders_user_row_actions`). #1686 (@sc0ttkclark, @mircobabini)
* BUG FIX: Ensure our admin scripts/styles only load on PMPro admin pages. #1724 (@sc0ttkclark)
* BUG FIX: Remove unused code in `pmpro_comments_filter()` that was triggering a PHP warning. #1730 (@freax)
* BUG FIX: Stop turning on autoloading for PMPro options when saving them. #1719 (@freax)
* BUG FIX: Prevent fatal error for PHP 8 in `pmpro_email_templates_email_data()` to strictly check for `WP_User` objects. #1729 (@ZebulanStanphill)
* BUG FIX: Fix problem where `pmpro_round_price()` would not take into account currencies with decimals set to 0. #1732 (@dparker1005, @ipokkel, @sc0ttkclark)
* BUG FIX: Clarify that Stripe Legacy keys remain connected and will continue to work. #1735 (@dparker1005, @sc0ttkclark)

= 2.6 - 2021-08-12 =
* FEATURE: Updated Stripe integration to use Stripe Connect. See [Gateway Fees](https://www.paidmembershipspro.com/gateway/stripe/#tab-fees) for information about transaction fees for Stripe Connect and our platform fee for those without an active Plus/Unlimited license.
* FEATURE: Improved REST API endpoints to support Zapier integration natively.
* FEATURE: You can now set levels to expire after a certain number of hours, and can set users to expire at a specific time down to the minute.
* FEATURE: The Member History Add On has been merged into the core PMPro plugin. A table of the user's membership and order history is shown on the edit user page of the admin dashboard.
* FEATURE: The Email Templates Add On has been merged into the core PMPro plugin. You can edit PMPro-related email templates from the Memberships -> Settings -> Email Templates page in the admin dashboard.
* FEATURE: You can now use PMPro blocks in the new widget area of WP 5.8.
* BUG FIX/ENHANCEMENT: Establishing style for scrollable boxes throughout core plugin.
* BUG FIX/ENHANCEMENT: Using HTTPS to set the pmpro_visit cookie if over HTTPS. (Thanks, freax on GitHub)
* BUG FIX: Fixed fatal error in PHP 8 when deleting a Stripe webhook. (Thanks, Zebulan Stanphill)
* BUG FIX: Fixed warnings shown on the widget page when using WP 5.8+.

= 2.5.10.2 - 2021-08-02 =
* ENHANCEMENT: New scripts to use WP CLI to update pot and po/mo files.
* BUG FIX/ENHANCEMENT: Updated cancellation logic to support upcoming Cancel on Next Payment Date Add On changes.
* BUG FIX/ENHANCEMENT: Making sure to use the correct security setting when calling setcookie from an HTTPS site. (Thanks, freax on GitHub)
* BUG FIX: Now archiving Stripe products after checkout. We create a unique product for each checkout, and these would clutter up the Stripe reports.
* BUG FIX: Fixing data erasure and data export request action for login page.
* BUG FIX: Fixed issue where PMPro settings on Elementor elements could override the "should_render" setting incorrectly. (Thanks, codezz on GitHub)
* BUG FIX: Now catching the case where you try to email an invoice for an order that has no user.

= 2.5.10.1 - 2021-07-05 =
* BUG FIX/ENHANCEMENT: The 'Edit Code: %s' string on the discount codes page is now wrapped for translation.
* BUG FIX: Fixed issue with the getfile.php script introduced in 2.5.10.

= 2.5.10 - 2021-06-25 =
* SECURITY: Fixed XSS vulnerability on the edit order page in the dashboard. (Thanks, Scott Kingsley Clark)
* ENHANCEMENT: Improved escaping and localization for the message returned when clicking to apply discount code.
* ENHANCEMENT: Now hiding gateway setting API keys behind asterisks.
* ENHANCEMENT: Added some extra hooks to the edit membership levels page in the dashboard: pmpro_membership_level_after_billing_details_settings, pmpro_membership_level_after_other_settings, pmpro_membership_level_after_content_settings.
* ENHANCEMENT: Added a pmpro_after_order_settings_table hook to the edit order page in the dashboard.
* BUG FIX/ENHANCEMENT: Now passing a CARDONFILE parameter with PayPal Payflow payment and subscription transactions.
* BUG FIX/ENHANCEMENT: Using the wp.passwordStrength.userInputDisallowedList function from WP 4.5 if available.
* BUG FIX/EHNANCEMENT: Now making sure that the pmpro_update_order and pmpro_updated_order hooks fire whenever an order is updated in the DB.
* BUG FIX: Fixed issue in getfile script where parameters in the URL would cause File not found errors.
* BUG FIX: Fixed how the PayPal IPN handler handles cases where a subscription is set up correctly but the initial payment failed. We now correctly cancel these users and mark their order as error.
* BUG FIX: Improved error handling in the PayPal Express integration, particularly when a subscriptions PROFILESTATUS is missing.
* BUG FIX: User registered date is now shown in local time.
* BUG FIX: Fixed issue where the deprecated pmpro_getClassForField function wasn't returning a value properly. (Thanks, Elena Draculet)
* BUG FIX: Updated the pmpro_sort_levels_by_order function to use level IDs for keys, since some code expects that for level arrays. This matches the behavior we had before introducing this function.
* BUG FIX: Updated the pmpro_changeMembershipLevel function always set the order status to error if that was passed in as the "old level status".
* BUG FIX: Fixed warning in searches/pages when PMPro pages is not set.
* BUG FIX: Fixed warnings being generated when using PHP 8 and Divi
* BUG FIX: Fixed warnings related to PayPal Express session variables.

= 2.5.9.1 - 2021-05-12 =
* BUG FIX/ENHANCEMENT: Updated pmpro_changeMembershipLevel() to return null if the user's level is not changed. For the past 2 versions, we've been returning true in these cases, which caused PMPro to send emails to the admin when the edit use page was saved, even if there was no level change. This change has been backported to versions 2.5.8 and 2.5.9.

= 2.5.9 - 2021-05-05 =
* ENHANCEMENT: Adjusting style for prices and price parts shown on the frontend.
* ENHANCEMENT: Adjusting HTML for links in the Orders table in the dashboard.
* BUG FIX: Reverted the change to the pmpro_is_checkout() function. Since we default to the first available level, calling pmpro_getLevelForCheckout() was causing pmpro_is_checkout to return true on ALL pages. This disrupted a lot of functionality.
* BUG FIX: Fixed warnings in the pmpro_getLevelAtCheckout() function.
* BUG FIX: Fixed issue where "All Time Sales" was showing up as 0, even when there were sales.

= 2.5.8 - 2021-04-30 =
* ENHANCEMENT: Added `pmpro_membership_content_filter` filter to let other plugins change how PMPro filters member content.
* ENHANCEMENT: Improved de_DE email template translation. (Thanks, biker238 on GitHub)
* ENHANCEMENT: Added `pmpro_change_level` filter.
* ENHANCEMENT: Improved display of prices on invoices and added pmpro_display_price_parts function and filters so plugins like the upcoming AvaTax add on can add subtotals to the price displays.
* ENHANCEMENT: Added a pmpro_after_all_membesrhip_level_changes hook that fires at the end of the page load and can be used to process all membership changes in bulk.
* ENHANCEMENT: The "User" column on the orders page now shows the username and email.
* ENHANCEMENT: Added a pmpro_stripe_create_subscription_array filter. (Thanks, ermGit on GitHub)
* BUG FIX/ENHANCEMENT: pmpro_change_level returns true now if the function is called to change a user’s level to one they already have.
* BUG FIX/ENHANCEMENT: No longer calling $order->updateTimestamp() on orders adminpage.
* BUG FIX/ENHANCEMENT: Updated conditional to check ‘street’ instead of ‘name’ when displaying billing address on Invoice/Confirmation.
* BUG FIX/ENHANCEMENT: Improved localization and added missing strings to translation.
* BUG FIX/ENHANCEMENT: Updated to use `get_user_locale1 to load localization.
* BUG FIX/ENHANCEMENT: Now Preserving existing values for `post__not_in` and `category__not_in` when filtering search and archive queries.
* BUG FIX/ENHANCEMENT: Fixed sorting of the Membership Level column on the Users List table in the WP admin dashboard.
* BUG FIX/ENHANCEMENT: Added a pmpro_sort_levels_by_order function and using it in various places to make sure levels are listed in the order they are in on the PMPro settings page.
* BUG FIX/ENHANCEMENT: Added an extra check in the pmpro_is_checkout function that helps with issues that were coming up in some add ons.
* BUG FIX/ENHANCEMENT: The level cache now takes into account the $include_active parameter.
* BUG FIX/ENHANCEMENT: The CSS class is now properly added to the body tag when a PMPro page block is used on a page.
* BUG FIX/EHNANCEMENT: Better timezone handling in sales reports.
* BUG FIX/ENHANCEMENT: Fixed a few places where we might think a free order was paid if using a currency with more or less than 2 decimal places.
* BUG FIX: Fixed deprecated jQuery functions in pmpro-admin.js.
* BUG FIX: Fixed warning for a missing/deleted level in the pmpro_post_classes function.
* BUG FIX: Default `pmpro_longform_address` to true on Billing Information page.
* BUG FIX: Fixed `pmpro_twocheckout_validate` filter.
* BUG FIX: Fixed variables passed to the `pmpro_discount_code_used` filter.
* BUG FIX: CZK currency should have 2 decimals.
* BUG FIX: Avoiding a redirect loop if the login page is deleted. (Thanks, George Stephanis)
* BUG FIX: Fixed the password reset link in new user notification email when not using pretty permalinks.
* BUG FIX: Fixed issues with password reset URLs on multisite networks.
* BUG FIX: Fixed the issue where sales weren't showing up on report charts sometimes on the 31st of the month.

= 2.5.7 - 2021-03-10 =
* ENHANCEMENT: Added a pmpro_checkout_message filter that can be used to filter error messages shown at checkout.
* BUG FIX/ENHANCEMENT: Now making sure some billing address fields are available for the billing failure emails sent during the PayPal IPN handler.
* BUG FIX/ENHANCEMENT: Fixed issues where HTML entities were shown in level prices in some places when using certain currencies. All prices are sent through a special pmpro_escape_price function that allows div, span, and sup tags with id and class attributes. Also removed from unneeded small tags and grey coloring of prices in certain spots.
* BUG FIX: Now cancelling membership when a SUBSCRIPTION_CANCELED message is sent to the Braintree webhook handler. In the past, we incorrectly sent the payment failed email instead.
* BUG FIX: Fixed display issues with the Require Membership block. The level select field has been swapped with a list of checkboxes.
* BUG FIX: Fixed warnings that occurred when processing failed payments in webhook and IPN handlers.
* BUG FIX: Fixed our Braintree class so we will only attempt to update a user's credit card and address when the getCustomer method is called at checkout or during a billing update.
* BUG FIX: Fixed issue where refreshing the checkout review page when using PayPal Express caused the associated order to be updated again. Now the order status is updated to review and only updates again when the user confirms.
* BUG FIX: Avoiding warnings when the pmpro_url function is used if the PMPro pages haven't been set up yet. (Thanks, Thomas Sjolshagen)
* REFACTOR: Updated the pmpro_getSpecificMembershipLevelForUser( $user_id, $level_id ) function so both fields are required. Will still default to the current user if null is passed for the $user_id.

= 2.5.6 - 2021-03-05 =
* SECURITY: Now sanitizing and escaping the `order` parameter when filtering the users table in the dashboard. (Thanks, Gen Sato)
* BUG FIX/ENHANCEMENT: Now hiding the ApplePay/GooglePay "Payment Request" buttons when the main checkout form is submitted. This helps to prevent double checkouts.
* BUG FIX: Fixed missing membership data in the billing failed email.

= 2.5.5 - 2021-02-22 =
* SECURITY: Better sanitization of parameters on some REST API endpoints.
* SECURITY: Now showing reCAPTCHA field at checkout even for logged in users.
* ENHANCEMENT: Added find_billing_address() method to the MemberOrder class. This will look for the address on the last order with the same sub id or in user meta.
* ENHANCEMENT: Better styling for invoices shown on the frontend.
* ENHANCEMENT: No longer forcing column width % in the members list table.
* ENHANCEMENT: Added a pmpro_doing_webhook action that is fired at the beginning of our webhook/IPN handlers.
* ENHANCEMENT: Added a pmpro_membership_level_after_billing_details_settings hook to the edit membership level page. This hook should now be used to add billing related settings.
* BUG FIX/ENHANCEMENT: Allowing order total to be set to 0, even if there is a subtotal and tax amount.
* BUG FIX/ENHANCEMENT: Stripe checkout fields will now use the language set in the Stripe settings.
* BUG FIX/ENHANCEMENT: The URL check in our notifications code now accepts arrays (e.g. to see if a URL has one of a group of top level domains). This fixes a warning some may have seen in error logs.
* BUG FIX: Fixed issues where totals on PayPal recurring payments were sometimes incorrect if both an mt_gross and amount field were passed via IPN.

= 2.5.4 - 2021-01-28 =
* ENHANCEMENT: Bump license year 2021 - 10 years.
* ENHANCEMENT: Now passing billing street in `pmpro_tax` filter.
* ENHANCEMENT: Prefixed our pmpro_stripeResponseHandler function to avoid conflicts.
* ENHANCEMENT: Added getRealPaymentTransactionId method to PayPal Express gateway class to recover a missing transaction ID.
* ENHANCEMENT: Added `pmpro_checkout_before_form` action to hook anything before the membership checkout form.
* ENHANCEMENT: Added avatar as a valid field type for the [pmpro_member] shortcode.
* ENHANCEMENT: Changed license key field to text type and unmasked. Masking implied the key was hashed before saving which is not true.
* ENHANCEMENT: Added`pmpro_discount_code_used` action hook for when a discount code is used.
* ENHANCEMENT: Stripe will now pull billing address info for recurring orders from webhooks.
* BUG FIX/ENHANCEMENT: Improved user interface, error handling, and messages in the frontend password reset process.
* BUG FIX/ENHANCEMENT: Added a space between state and zip code in billing info.
* BUG FIX/ENHANCEMENT: Now rounding amount sent with Stripe payment request button.
* BUG FIX/ENHANCEMENT: Improved `pmpro_check_plugin_version` function to also check a specific value of the `get_plugin_data` array.
* BUG FIX/ENHANCEMENT: Added `pmpro_membership_levelmeta` and `pmpro_membership_ordermeta` tables to uninstall process.
* BUG FIX/ENHANCEMENT: Escaped things in SQL queries in 2Checkout INS service handler.
* BUG FIX/ENHANCEMENT: Cleaned up levels page template and added MMPU compatibility.
* BUG FIX/ENHANCEMENT: Fixed pagination and export issues with a discount code filter on the Orders admin page.
* BUG FIX/ENHANCEMENT: Prefixed our `pmpro_stripeResponseHandler` function to avoid conflicts with other Stripe code that may not be prefixed.
* BUG FIX/ENHANCEMENT: Cleaned up conditionals and escaping improvements in the `pmpro_redirect_to_logged_in` function.
* BUG FIX/ENHANCEMENT: Fixed deprecation notices for sites running PHP 8.
* BUG FIX/ENHANCEMENT: Improved SQL query format in the applydiscountcode service.
* BUG FIX: Fixed issues with ReCAPTCHA v2 and certain gateways.
* BUG FIX: Fixed bug where blog name was not showing in Admin Activity email.
* BUG FIX: Improved incorrect PHP doc blocks.
* BUG FIX: Fixed an issue on some sites where password reset link in email was incorrect.
* BUG FIX: Fixed level change issues during 2Checkout checkout.
* BUG FIX: Fixed issue where `checkout_levels` REST API endpoint could return the wrong initial payment
* BUG FIX: Fixed undefined notice for timestamp variable in the Stripe gateway class.
* BUG FIX: Avoiding warnings when user ids are in the memberships_users table, but a user doesn't exist.
* BUG FIX: Now setting the correct value for membership_id in the admin change emails.

= 2.5.3 - 2021-01-26 =
* SECURITY: Fixed indirect object reference vulnerability where order information, including customer names, email addresses, and order numbers could be accessed by non-admin WordPress users. (Thanks, WP Plugins Team)
* SECURITY: Now checking ReCAPTCHA validation before enabling the submit button on the checkout form when using ReCAPTCHA v2. This helps to keep bad actors from testing credit cards on your checkout page. We were already doing a similar check when using ReCAPTCHA v3. Further updates to rate limit credit card failures are planned.

= 2.5.2 - 2020-10-23 =
* BUG FIX: Fixed issue where the RECAPTCHA library wasn't being loaded early enough to validate at checkout.
* BUG FIX: Fixed issue where code in the Stripe class was unsetting some required fields, even if Stripe was not being used at checkout.

= 2.5.1 - 2020-10-16 =
* SECURITY: Fixed XSS vulnerability on the Members List page of the dashboard. (Thanks, Ron Masas from Checkmarx.com)
* ENHANCEMENT: Add Ukrainian Hryvnia currency. (Thanks, Mirco Babini)
* ENHANCEMENT: Added a "non-members" option to the Beaver Build module.
* BUG FIX: Fixed issue where only USD and US were allowed with Stripe's GooglePay/ApplePay buttons.
* BUG FIX: Fixed issue where some profile fields, e.g. those added with Register Helper, were accidentally updated or removed when accessing the frontend profile page.
* BUG FIX: Fixed issue with tracking discount code uses when using the 2Checkout gateway. (Thanks, karambk on GitHub)
* BUG FIX: No longer running excerpts through wpautop when a more tag is used.

= 2.5 - 2020-10-02 =
* FEATURE: When using the Stripe Gateway, you may now allow users to pay using Apple Pay, Google Pay, or Microsoft Pay depending on their browser. Enable this feature from the payment settings page.
* FEATURE: Added Divi Builder compatibility.
* FEATURE: Updated the Braintree Gateway class to be able to use the Braintree API for the pmpro_next_payment() function. Note, for performance reasons, you must call this method directly or enable it by hooking it up with code like `add_filter('pmpro_next_payment', array('PMProGateway_braintree', 'pmpro_next_payment'), 10, 3);`
* FEATURE: Added ordermeta tables and functions. We will wait about a year for all users to upgrade before using these widespread. (Thanks, Mirco Babini)
* ENHANCEMENT: The "short" version of the level cost text for a free level is now "Free" instead of "0.00 now".
* ENHANCEMENT: Added a `get_original_subscription_order` method to the MemberOrder class. This will return the first order in a subscription when called from a recurring order.
* ENHANCEMENT: Removed the old style license nags.
* BUG FIX/ENHANCEMENT: Using microtime and a static counter int to make sure our order and discount codes are unique. In the past very high traffic sites could run into duplicates if two checkouts happened at the exact same second.
* BUG FIX/ENHANCEMENT: Adjust order delete prompt to support other locales.
* BUG FIX/ENHANCEMENT: Better handling of tax amounts in recurring payments, e.g. when using the PMPro VAT Tax add on.
* BUG FIX/ENHANCEMENT: Optimized how often we hit the Stripe API when events on the checkout page could potentially update the price of checkout.
* BUG FIX/ENHANCEMENT: The checkout_levels api call now takes `level` as param.
* BUG FIX/ENHANCEMENT: No longer running sanitize_text_field on password fields. This would break passwords that had strings of characters resembling html tags.
* BUG FIX/ENHANCEMENT: Now warning admins if the Stripe billing period is longer than 1 year. Billing periods greater than 1 year are not allowed by Stripe.
* BUG FIX/ENHANCEMENT: Now detecting when a Stripe webhook is set up for an older version of the Stripe API and showing a notice with a link to update.
* BUG FIX/ENHANCEMENT: Adding MAXFAILEDPAYMENTS=1 to PayPal add subscription requests. This tells PayPal to cancel a subscription after the first failed payment. In our experience, the automatic retries rarely worked well. This change fixes issues with subscriptions going out of sync or users retaining access to your site when their payment has failed. Members still receive the payment failed email, which prompts users to return to the site to renew.
* BUG FIX/ENHANCEMENT: Fixing some issues where we are adding extra break tags into the password reset email. There are still some issues like this when using certain plugins. We are working on a general fix.
* BUG FIX/ENHANCEMENT: Removed the "coupon amount" field from the edit order page. These were hold outs from the 2007! ecommerce plugin PMPro was forked from. You can set the pmpro_orders_show_coupon_amounts filter to __return_true to show these fields again if you were using them for tracking things in your custom code.
* BUG FIX: Fixed MMPU compatibility when using discount codes.
* BUG FIX: No longer filtering the wp login url when on wp-login.php. This fixes issues with iThemes Security 2FA.
* BUG FIX: Fixed issues where the Stripe webhook was not being updated sometimes when clicking the button to update.
* BUG FIX: Fixed some notices and warnings when using Braintree.
* BUG FIX: Now resetting memberslist page number when changing shown level.
* BUG FIX: Now ensuring that the discount code field updates, update the Request Button price.
* BUG FIX: Fixed issue where non-pretty permalinks may break frontend password resets.
* BUG FIX: Fixed invoice links on the account page. (Thanks, Mateusz Hołtyn)
* BUG FIX: Fixed incorrect label "for" attribute for uninstall setting.
* BUG FIX: Fixed issue where some free plugins distributed by PMPro would show warnings about requiring a Plus license.

= 2.4.4 - 2020-09-02 =
* BUG FIX: Fixed fatal error that sometimes occurred on the payment settings page when using PHP 5.6 or earlier.
* BUG FIX: Fixed fatal errors that showed up on the frontend invoice page.
* BUG FIX: Fixed issue where the confirmation message was not showing up in the confirmation email if that option was checked.
* ENHANCEMENT: Added a pmpro_stripe_charge_params filter that can be used to edit or add params sent to the Stripe create charge method. (Thanks, Michael Bester)
* ENHANCEMENT: Tweaked the markup of the invoice page so the payment type information looks a little better.

= 2.4.3 - 2020-08-25
* SECURITY: Fixed a cross-site scripting vulnerability in the code that updates the Required Membership settings on a post. This vulnerability could have been used in conjunction with other security vulnerabilities to trick an admin into editing the membership settings for a page, potentially exposing members only content to non-members. It is unlikely that there was any active exploitation of this vulnerability. This issue may also have shown up as a bug on some sites using page builders, where the membership settings for a post would be cleared out when editing a post. (Thanks to the wp.org plugin review team for catching this issue.)
* SECURITY: Better escaping of variables shown in the Require Membership meta box and related SQL queries.
* BUG FIX/ENHANCEMENT: Renamed the Vietnamese language files to match what is expected.

= 2.4.2 - 2020-08-24
* SECURITY: Updated the PMPro REST API endpoints accessed via the GET method to also require appropriate capabilities to access. The membership confirmation text will be hidden from non-members and non-admins. The endpoints to check a user's level or access to a post require the pmpro_edit_memberships capability now. You should make sure your API users have the appropriate capabilities to use the API. You can use the pmpro_rest_api_route_capabilities filter and/or pmpro_rest_api_permissions filter to change this behavior.
* BUG FIX: Fixed issues with the PMPro REST API endpoints, including the discount code and checkout level endpoints.
* BUG FIX: Fixed issue with backslashes in the display name when editing form the PMPro frontend profile page.
* BUG FIX: Fixed issue where timestamps were showing up incorrectly for recent orders shown on the dashboard page.
BUG FIX: Fixed issue where PMPro would always try to add capabilities to the administrator role, even if you removed that role for some reason.
* ENHANCEMENT: Added a pmpro_get_no_access_message() function, which can be used to show the no access messages.
* ENHANCEMENT: Added a "show_noaccess" property to the membership shortcode. When set, it will show the noaccess message to users who don't have the levels specified.
* ENHANCEMENT: Added a pmpro_user_profile_update_errors hook, which can be used to show errors on the PMPro frontend profile page.
* ENHANCEMENT: The pmpro_set_capabilities_for_role() function now returns true or false if the caps were added in case others want to use this function and tell if it worked.
* ENHANCEMENT: You can now include links in the description of the fields you add to the PMPro advanced settings page via the pmpro_custom_advanced_settings filter.
* ENHANCEMENT: Updated the PayPal gateways to use the latest versions of the PayPal buttons.
* ENHANCEMENT: Fixed styling of the PMPro update script notice.
* ENHANCEMENT: Added the pmpro_account_membership_expiration_text filter to the expiration dates shown on the cancel page when using MMPU.

= 2.4.1 - 2020-08-10 =
* BUG FIX: Fixed issues with password resets on WP Engine hosting due to security features added by their mu-plugin.
* BUG FIX: Fixed issue where end dates were showing up incorrectly in the confirmation email sometimes.
* BUG FIX: Fixed issue where renewing memberships were extended one day less than they should have been in some cases.
* BUG FIX: Fixed issue where users without a PMPro Plus license were sometimes not getting an error when trying to update a Plus Add On.
* BUG FIX/ENHANCEMENT: Added compatibility for core auto-updates for our Add Ons which aren't hosted in the .org repository.
* BUG FIX/ENHANCEMENT: Fixed issue where PHP sessions were set up to track ReCAPTCHA even if you weren't using ReCAPTCHA. ReCAPTCHA is now only loaded on the checkout page. Loading sessions unnecessarily would break some Varnish cache setups.
* BUG FIX/ENHANCEMENT: Updated the single invoice/order page. No longer showing the end date, which isn't really related to the order. Showing a better status related to the order now.
* BUG FIX/ENHANCEMENT: Fixed some links to the PMPro site in the plugin admin area.
* BUG FIX/ENHANCEMENT: Now saving a hash of the Stripe secretkey when saving webhook ids. This allows us to keep track of webhook ids if you switch between gateway environments or swap your Stripe keys for some reason.
* BUG FIX/ENHANCEMENT: No longer running the Terms of Service text through wpautop. This usually just added extra spacing to your TOS. Shortcodes are rendered now though. Added a filter pmpro_tos_content so you can change the TOS content or how it is shown.
* ENHANCEMENT: Added a checkout_levels API endpoint. This will allow us to build features that adjust the price on the frontend at checkout.
* ENHANCEMENT: Added a pmpro_member_profile_edit_form_tag action to the form tag on the frontend member profile page. This is useful to set the form enctype for file uploads.
* ENHANCEMENT: Added Romanian Leu as a currency option.
* ENHANCEMENT: Added the pmpro_stripe_payment_intent_params filter. Useful if you would like to set a specific statement descriptor for the site. See https://gist.github.com/ideadude/16983fdfa0da12fc40ef36d870f4cbd0
* REFACTOR: Removed some unused methods from the Stripe class.
* REFACTOR: Removed the help pointer about the menu location change.

= 2.4 - 2020-07-24 =
* FEATURE: Now detecting if the Stripe webhook is set up correctly. You can now create or disable the webhook from the payment settings page in the WP admin dashboard.
* FEATURE: Added a link to use and set up SendWP for more reliable email sending from WP.
* BUG FIX: Fixed further issues with dates and timezones.
* BUG FIX: Fixed issue where reports would cause white screens on some server set ups. We had some report start dates set to 1960, which caused issues. (Thanks, Sam "gausam" on GitHub)
* BUG FIX: Fixed issue with the query to find expiring memberships that happened on certain MySQL setups.
* BUG FIX: Fixed issue that was caused if other code called wp_login_url() too early.
* BUG FIX: Fixed an error in the is_login_page() function.
* BUG FIX: Fixed a fatal error that was happening in PHP 5.2 or earlier due to code syntax that was not supported then. We noticed a few other cases as well, but decided we won't support PHP 5.2 consistent with WP and other plugins.
* BUG FIX: Fixed the URL used when using 2Checkout in sandbox mode.
* BUG FIX: Fixed JavaScript errors that would occur sometimes on the Billing Update page when using the Stripe gateway.
* BUG FIX: Fixed issue where the dummy $0 orders created when using the "Stripe Updates" feature weren't saving with the updated subscription_transaction_id. This would prevent future payments from being linked to that user and could prevent subscriptions cancellations from being synchronized. When updating to PMPro 2.4, an update script will run to try to restore these subscription_transaction_id values. However, any recurring orders that occurred when the id was missing will not be added to PMPro. You will have to update them manually.
* BUG FIX: Fixed JavaScript error on the edit discount code page.
* BUG FIX/ENHANCEMENT: Showing expiration date as text when it is set as a readonly field. (Thanks, Rodmar "rodmarzavala" on GitHub)
* BUG FIX/ENHANCEMENT: Now checking if headers were already sent before trying to start the PHP session. If headers are sent before PMPro tries to start the session, there is usually another error somewhere on the WP site that needs to be fixed. But at least we aren't adding to the confusion by trying to start the session late causing another error in the log.
* BUG FIX/ENHANCEMENT: Updated misleading hint for the PayPal Express IPN URL on the payment settings page.
* BUG FIX/ENHANCEMENT: Fixed invalid key description in the SQL in includes/setup.sql. The actually query used to set up table in PMPro was correct though. The setup.sql file is included for reference and developers who want to create the tables "manually" in MySQL.
* BUG FIX/ENHANCEMENT: The post type search filter now supports cases where post type set in WPQuery is an array.
* BUG FIX/ENHANCEMENT: Fixed warning that showed when a user with no levels visited the frontend account page.
* BUG FIX/ENHANCEMENT: Fixing warnings that would be logged at checkout in certain cases.
* BUG FIX/ENHANCEMENT: Better handling of cases where users who checked out using a gateway different from the current setting are shown a message that they cannot update their billing information. They should instead checkout again to renew their membership.
* ENHANCEMENT: Updated to use the latest version of the Stripe API and SDK.
* ENHANCEMENT: More detailed logging for Braintree webhook debug emails.
* ENHANCEMENT: Added a getTransactionStatus method to the PayPal and PayPal Express payment gateway classes. (Thanks, Mirco Babini)
* ENHANCEMENT: Added a checkout_level API call. This will be used in the future to update the price total at checking using JS and is also needed to implement support for Google Pay and Apple Pay through Stripe.
* ENHANCEMENT: Cleaned up the email settings page.
* ENHANCEMENT: Better handling of some login and password reset errors.
* ENHANCEMENT: Added links to the PMPro YouTube and Facebook profiles.
* REFACTOR: Cleaned up some code in incldues/content.php, especially around the pmpro_search_filter() function.
* REFACTOR: Removed the package-lock.json file from the repository.

= 2.3.4 - 2020-06-18 =
* SECURITY: Better escaping of values on the billing and confirmation pages.
* BUG FIX: Fixed issue where expiration dates could be set to 1 day in the past when editing a user in the dashboard if certain timezones were chosen in the General settings.
* BUG FIX: Fixed issue where users were redirected back to the /login/ page if WordPress needed them to confirm their admin email address. Users will now be taken to the default WP login page with the form to confirm their email address.
* BUG FIX: Fixed bug where the reset password link in the new user email was not filtered to go to the frontend login page if being used.
* BUG FIX: Fixed issue where some errors were not being shown when password resets failed.
* BUG FIX: Fixed bug with action links added to the orders table.
* BUG FIX: Fixed issue where empty dates would show current date in the members list.
* BUG FIX: Fixed fatal error that was happening when using some of the new API endpoints.
* BUG FIX: Timestamps returned by the Stripe API when getting the next payment date needed to be adjusted based on the site's timezone setting.
* BUG FIX: Fixed a bug where the change password form wouldn't show up sometimes when using the login shortcode.
* BUG FIX: Fixed notice in the PayPal IPN handler when adding notes to an order.
* BUG FIX: Fixed issue where PMPro would generate the wrong excerpt in some cases where the more tag was used but the excerpt was generated before the more tag code or blog was not yet converted to HTML. Specifically this fixes an issue with excerpts generated for AMP with the SchemaApp plugin.
* BUG FIX/ENHANCEMENT: Added an advanced setting to "Uninstall PMPro on Deletion". You must check and save this option first or PMPro will not delete data from the DB when deleting from the plugins page. This keeps users from accidentally deleting orders and member data.
* BUG FIX/ENHANCEMENT: Now hiding the profile and change password links on the membership account page if a frontend profile page is not set and users are locked from the WP dashboard by the advanced setting.
* BUG FIX/ENHANCEMENT: Resetting the signups and cancellations report cache when there are new membership level changes.
* ENHANCEMENT: Added a pmpro_get_element_class function and filter. We now use this function when adding classes to HTML elements in our templates. The filter can be used to alter or append to the classes used in the HTML tags. This will make it easier to create code and CSS to make PMPro look better with popular themes.
* ENHANCEMENT: Added a pmpro_authorizenet_post_values filter to the Authorize.net class. An array of $post_values is passed in to be filtered along with a string for the API method about to be called.
* ENHANCEMENT: Added a pmpro_member_profile_edit_user_object_fields filter to add or remove fields from the frontend edit profile page.
* ENHANCEMENT: Now showing information about the current billing method on the update billing page. Can hide this information by having the pmpro_billing_show_payment_method filter return false.
* ENHANCEMENT: No longer saying "Great Work!" in the admin digest emails. This was especially embarrassing if you didn't have any sales during the diget period.
* REFACTOR: Refactored some code in the CSV exports to avoid false positives by malware scanners.
* REFACTOR: Added a build_post_string method to the Authorize.net class to avoid redundant code.
* REFACTOR: Added a cancelSubscriptionAtGateway method to the PayPal Express class. This is useful if you want to cancel the subscription without cancelling the membership. (Thanks, Mirco Babini)

= 2.3.3 - 2020-05-13 =
* SECURITY: Fixed SQL injection vulnerability when logged in as an administrator and adding new orders in the dashboard. JVN#20248858 (Thanks, Kenichi Okuno of Mitsui Bussan Secure Directions, Inc)
* SECURITY: Making sure to properly escape all values on the add/edit order form in the dashboard.
* BUG FIX: Now properly setting the order status to "error" when an initial payment fails when using PayPal Express. Before the order status would be set as "cancelled", which would count the order toward reports and make it harder to find orders that had errors. (Thanks, Mirco Babini)
* BUG FIX: Fixed issue with the PMPro logo and some other assets loading over the wrong schema (http vs https) in some cases.
* BUG FIX: Fixed issue where the chosen discount code was not shown after submitting when adding a new order through the dashboard.
* BUG FIX/ENHANCEMENT: Using "PMPro" in the admin activity email subject to keep the line shorter and avoid issues when replacing the word "member" via gettext.
* ENHANCEMENT: Added a pmpro_allow_weak_passwords filter. You can set this to return true (like this https://gist.github.com/ideadude/5a12119b9ce1c2aad87b2d69cb8f9505) to allow weak passwords on the change password and reset password pages. Note that at this time, weak passwords are still allowed on the checkout page no matter the value of this filter. We expect to change that in the future. For now, you can use our PMPro Strong Passwords plugin to force strong passwords at checkout.
* REFACTOR: Updated the logic around checking the PMPRO_IPN_DEBUG constant in the IPN handler. (Thanks, Mirco Babini)

= 2.3.2 - 2020-05-07 =
* BUG FIX: Fixed errors calling is_main_query() that came up with certain themes.
* BUG FIX: Fixed typo in the pmpro_account_profile_action_links filter.
* BUG FIX/ENHANCEMENT: Added a new force parameter to the pmpro_getAllLevels() function. This is used by the Multisite Membership Add On to fix an issue where levels were missing or incorrect on the subsites.
* ENHANCEMENT: Removed mention of the ezAdsense plugin, which has been discontinued.
* ENHANCEMENT: Added $recipient param in sendAdminActivity() function so you can send additional activity emails like this https://gist.github.com/dparker1005/6bf650370a12aef44adf8c8c26d3e906

= 2.3.1 - 2020-05-01 =
* BUG FIX: Fixed infinite redirect issue if no account page was set. Fixed a few other places where we do is_page() type checks just in case.
* BUG FIX: Fixed issue where all pages were retitled to Welcome when logged in, if no login page was set.
* BUG FIX: Fixed issue with BuddyBoss and other themes/plugins that use the_title filter with only one parameter.
* BUG FIX: Fixed error when trying to check if is_main_query in the admin or with certain themes.

= 2.3 - 2020-05-01 =
* FEATURE: Added frontend login and password reset.
* FEATURE: Added frontend user profile editing.
* FEATURE: Added [pmpro_login] shortcode and Log In Form block.
* FEATURE: Added [pmpro_member_profile_edit] shortcode and Member Profile Edit block.
* FEATURE: Added "Member Log In" widget.
* FEATURE: Added "WordPress Toolbar" Advanced Setting to hide the WordPress Toolbar from "subscriber" role.
* FEATURE: Added "WordPress Dashboard" Advanced Setting to block dashboard access for the "subscriber" role.
* FEATURE: Added new Admin Activity Email. Weekly emails to the site admin with sales stats and other info. Change how often the email is sent or disable it from the advanced settings tab.
* FEATURE: Added Beaver Builder module compatibility to restrict modules by membership level.
* FEATURE: Created new REST API endpoints and extended existing endpoints.
* FEATURE: Updated Elementor code to allow for restriction of "sections" as well.
* BUG FIX: Updated all timestamp code to be compatible with WordPress v5.4+ which fixes issues where orders could lose one hour or one day when saved.
* BUG FIX: Updated logic to filter body_class on pages with Membership Account shortcode or any "section" of the shortcode displayed.
* BUG FIX: Improved `pmpro_getAllLevels` function to cache even when `force` is `true`. This saves multiple DB hits per page load.
* BUG FIX/ENHANCEMENT: Cancellation report now calculates based on membership enddate.
* BUG FIX/ENHANCEMENT: Fixed warnings and errors in PHP 7.4+.
* BUG FIX/ENHANCEMENT: Now allowing translation for text generated by JavaScript.
* BUG FIX/ENHANCEMENT: Updated all uses of "Email" to remove the hyphen.
* BUG FIX/ENHANCEMENT: Updated to default to international addresses on Billing Information page. Fixes a bug with the State Dropdown Add-On.
* BUG FIX/ENHANCEMENT: Now treating "recurring_payment_failed" transactions from PayPal IPN as cancellations. PMPro will cancel membership and attempt to cancel the associated subscription.
* ENHANCEMENT: Added membership level class for the `PMPro_Membership_Level` object. This is currently only used in the REST API calls, but will eventually be used whenever interacting with a membership level object or array.
* ENHANCEMENT: Added discount code class for the `PMPro_Discount_Code` object. This is currently only used in the REST API calls, but will eventually be used whnever interacting with a discount code object or array.
* ENHANCEMENT: Now allowing all users and members access to the Membership Account page.
* ENHANCEMENT: Updating logic for all redirects from core pages like Invoices, Billing, and Cancel to allow past members to access their data. Generally more often redirecting where you would expect to in different situations.
* ENHANCEMENT: Several core frontend page style improvements for responsive displays and gateway-dependent fields.
* ENHANCEMENT: Added `getSubscriptionStatus` method to the Stripe gateway API class. This fixes issues with the PMPro Subscription Check Add-On.
* ENHANCEMENT: Added !!levels_page_url!! and !!login_url!! as replacement variables in Advanced Settings > Message Settings. Using these by default on new installs.
* ENHANCEMENT: Improved Block Editor code and webpack configuration.
* ENHANCEMENT: Added support for `PMPRO_AUTHNET_SILENT_POST_DEBUG` to "log" data to /logs/ or send an email to an email address different from the site admin.
* ENHANCEMENT: Added time fields to Memberships > Orders admin page when vieweing, updating or saving an order.
* ENHANCEMENT: Added pmpro_admin_orders_filters and pmpro_admin_orders_query_condition filters to add new filters to the orders page in the dashboard. (Thanks, Mirco Babini)
* ENHANCEMENT: Added an SVG icon to the PMPro blocks category.
* REFACTOR: Improved the Members List list table code to use a function for each column of data and support the code core WP methods for extending list tables with custom columns.
* REFACTOR: Moved all Theme My Login compatibility code to includes/compatibility/theme-my-login.php and only loading if plugin is active.

= 2.2.6 - 2020-02-20 =
* SECURITY: Escaping the post title shown in the Terms of Service section of the checkout page.
* BUG FIX: Fixed issue where the CVV/Security Code was not being passed to Authorize.net when using that gateway.
* BUG FIX: Fixed issues with the update billing page when using Stripe.
* BUG FIX: Fixed issues with the update billing page when using the MMPU Add On.
* BUG FIX: Fixed issue where password fields would disappear when the checkout form was submitted. This behavior was required to address bugs in older versions of iOS that shouldn't be in use any more.
* BUG FIX: No longer sending an extra cancel request to the PayPal API when processing a cancel for a PayPal Express subscription through the IPN handler.
* BUG FIX: The currency option is no longer hidden when using the check gateway.
* BUG FIX: Fixed the comparisons in the pmpro_check_plugin_version function and related notification checks.
* BUG FIX: Avoiding warnings in the sendAdminChangeEmail method if the user doesn't have a level.
* BUG FIX: Fixed some cases where the Members List CSV export wouldn't match the members shown in the table/search.
* BUG FIX: Fixed issue where the Members List may show the wrong count or enddate.
* BUG FIX/ENHANCEMENT: Added support for Elementor. Filtering content later so the builder's filters can run first. Also added the ability to choose which membership levels an element should be visible for.
* BUG FIX/ENHANCEMENT: Fixed the confirmation page formatting when paying by check. Added a div with class "pmpro_payment_instructions" around the payment instructions shown on the confirmation and invoice pages.
* BUG FIX/ENHANCEMENT: Added an Oxford Comma to the the pmpro_implodeToEnglish() function.
* BUG FIX/ENHANCEMENT: Moved the Japanese Yen symbol to the left of the total instead of the right.
* BUG FIX/ENHANCEMENT: Added the pmpro_checkout_login_redirect filter, which filters the url_redirect parameter of the login link on the checkout page. This is used by some Add Ons to make sure you are returned to the checkout page properly after logging in through that link.
* ENHANCEMENT: Added the Ghanian Cedi currency.
* ENHANCEMENT: Added the pmpro_are_levels_recurring() function to help with MMPU.
* ENHANCEMENT: Improved the look and source of the CVV popup.

= 2.2.5 - 2020-01-05 =
* BUG FIX: Once again loading JavaScript on the update billing page when using Braintree.
* BUG FIX: Loading Braintree JavaScript at checkout for free levels to support the variable pricing and donation add ons.
* BUG FIX: Fixed issues with PayPal orders when using the pmpro_paypal_level_description filter.
* BUG FIX/ENHANCEMENT: Responsive update for smaller device viewports for the Membership Levels table in the dashboard.
* ENHANCEMENT: Added filters: pmpro_is_level_free, pmpro_is_level_trial, and pmpro_is_level_expiring.

= 2.2.4 - 2019-12-20 =
* BUG FIX: Fixed issue with the update billing page when using the Stripe gateway.

= 2.2.3 - 2019-12-09 =
* BUG FIX: Fixed issue where Stripe checkout failed for free levels that had their price adjusted through the donations or variable pricing add ons.
* BUG FIX: Fixed undeclared variables warnings in the members list.
* BUG FIX: Fixed the edit user links in the email sent to admins when cancellations have errors.
* REFACTOR: Removed some unused code from the members list class.

= 2.2.2 - 2019-11-29 =
* BUG FIX: Fixed issue with member search.
* BUG FIX: Fixed issue with custom columns in the members list. (Thanks, Tim Sparks)

= 2.2.1 - 2019-11-27 =
* BUG FIX: Fixed performance issues with the new WP List Table implementation of the members list.
* BUG FIX: Fixed sorting issues with the new members list.
* BUG FIX: Fixed issues with the sales report widget and breakdown by price.
* BUG FIX: Now showing an appropriate message if you search for members, levels or discount codes in the dashboard and there are no results.
* BUG FIX: Fixed bug where option to pay with PayPal wouldn't show if paid discount code was applied to free level.

= 2.2 - 2019-11-22 =
* FEATURE: The Members List is now shown in an official "WP List Table". Most columns are sortable. The screen options in the upper right can be used to add/remove columns. (Thanks, Thomas Sjolshagen, Paul Barthmaier, and David Parker)
* FEATURE: Showing useful notifications in the PMPro dashboard area. Notifications are shown no more than once ever 12 hours, and no more than 3 times every week. The PMPro Advanced Settings page has an option to only show security-related notifications.
* SECURITY: Better sanitizing of values in the 2Checkout INS handler.
* BUG FIX: Fixed issue since WP 5.3 where expiration dates and other dates could be off by a month after saving.
* BUG FIX: Fixed issue where Stripe orders processed through the webhook would use the current date instead of the date of the order. This was an issue if you had to rerun a webhook later.
* BUG FIX: Fixed issue level confirmation text was sometimes not shown in emails when it was supposed to.
* BUG FIX: Russian Rubles are now configured to have 2 decimals again. In practice, decimals aren't often used for rubles and we are looking into ways to store the decimals (because gateways like Stripe need them) while showing values without decimals.
* BUG FIX: Fixed bug where the "logged in as" message would sometimes show twice on the update billing page.
* BUG FIX/ENHANCEMENT: Updated dashboard to adopt WordPress 5.3 formatting updates.
* BUG FIX/ENHANCEMENT: Updated frontend pages to improve cross-browser and cross-theme compatibility.
* BUG FIX/ENHANCEMENT: New free orders will always have the "success" status after checkout.
* BUG FIX/ENHANCEMENT: Better handling of tax values in the PayPal IPN handler.
* ENHANCEMENT: Added "Edit User" and "Edit Order" links to the admin email when a gateway subscription fails to cancel.

= 2.1.4 - 2019-10-31
* BUG FIX: Better exception handling in the Stripe gateway class for PHP 7+.
* BUG FIX: Fixing some JS issues at checkout, e.g. related to the "validateCreditCard method is not available" error.
* BUG FIX: Better messaging if the Stripe Billing Limits Add On is already installed.
* BUG FIX: Fixed cases where PMPro would email users about credit cards expiring when they had used an offsite gateway like PayPal Express.
* BUG FIX: Fixed issue where some user information was missing from the pmpro_orders_user_row_actions filter.
* BUG FIX: Fixed issues where the level confirmation text was not available in some cases.
* BUG FIX/ENHANCEMENT: Updates to the French language translation.

= 2.1.3 - 2019-10-14 =
* BUG FIX: Updating Stripe subscriptions from the edit user page will no longer cause an extra charge.
* BUG FIX: Correctly localizing the expiration date on the frontend account page.
* BUG FIX: Moved the row actions on the orders page into the correct column. (Thanks, Tim Sparks)
* BUG FIX: Fixed issue with CSV exports if the fpassthru function is unavailable.
* BUG FIX: Fixed warning that occurred when the Email Log plugin was active. (Thanks, Matty Cohen)
* BUG FIX: Fixed warning that occurred with sessions sometimes. (Thanks, Matty Cohen)
* ENHANCEMENT: Made labels and styling more consistent across settings pages.
* ENHANCEMENT: The Consent Log will go into a scrollable box if more than 10 items are in the list.
* ENHANCEMENT: Updated the copy on the license page.

= 2.1.2 - 2019-09-26 =
* BUG FIX: Fixed bug where Stripe subscriptions weren't updated to use the new payment method when users updated their billing method on the Update Billing page. You may have users with an updated "default payment method" but their subscriptions still need to be updated manually in Stripe to use that new method. Otherwise, payments will fail. This is fixed going forward.
* BUG FIX: Fixed bug where PMPro Blocks were sometimes not loading on the edit post page.
* BUG FIX: Fixed bug where discount codes would cause ugly warnings to be shown on the checkout page.
* BUG FIX: Fixed bug where custom templates would sometimes not load.
* BUG FIX: Fixed issue where a warning was thrown sometimes when loading SESSION vars.
* ENHANCEMENT: Moved the License page under Memberships.
* ENHANCEMENT: Updated our UTM tracking links in various places we link to the Paid Memberships Pro website.
* ENHANCEMENT: Added some help text and links to popular add ons in a few places in the PMPro settings.

= 2.1.1 - 2019-09-16 =
* BUG FIX: Fixed issue with SCA authentications via Stripe for subscriptions with a $0 initial payment. (Thanks, mjulian87 on GitHub.)
* BUG FIX: Fixed issue where code was shown in the message box when applying a discount code.
* BUG FIX: Fixed issue where pmpro_is_checkout() would always return true if no checkout page was set. This caused JavaScript issues on non-checkout pages.
* BUG FIX: The SVN repo on WordPress.org was missing a file for about 10 minutes after version 2.1 was pushed. Users who upgraded during this time may be missing that file. Updating now will restore it.

= 2.1 - 2019-09-13 =
* FEATURE: Updated Stripe integration to support Stripe v3, Stripe Elements, and their Secure Customer Authorization process.
* FEATURE: Updated how we store prices to support up to 8 decimals (e.g. for Bitcoin gateway implementations).
* ENHANCEMENT: Improved error messaging on the update billing page when a gateway doesn't support it or the user's current membership doesn't have a subscription.
* ENHANCEMENT: Added a  pmpro_is_checkout() function that will return true if on the PMPro checkout page or a page with the PMPro checkout shortcode or block.
* ENHANCEMENT: Showing a warning message when a user about to be deleted has a membership so admins know that existing subscriptions will be deleted at the gateway.
* ENHANCEMENT: Added a pmpro_braintree_plan_id filter in case you need to adjust plan IDs. This is useful if you have several sites running on the same Braintree account.
* ENHANCEMENT: Added a pmpro_num_expiration_years filter to adjust the number of years to include in the dropdown to set the year membership will expire.
* ENHANCEMENT: Tweaked the UI of the orders list and members list in the dashboard.
* ENHANCEMENT: Added pmpro_membership_levels_table_extra_cols_header and pmpro_membership_levels_table_extra_cols_body hooks to add columns to the members list.
* ENHANCEMENT: Showing notices to admins when categories are hidden from them on the frontend of the site.
* ENHANCEMENT: Added a pmpro_url filter to filter URLs returned from that function.
* ENHANCEMENT: Adding a pmpro_checkout_gateway-stripe or pmpro_checkout_gateway-paypal/etc CSS class to the wrapping div for payment fields to aid in styling.
* ENHANCEMENT: Using the site's date format option when printing orders.
* BUG FIX/ENHANCEMENT: If a site has no paying levels, the test gateway will show as the "Default" gateway and we will no longer show a message about requiring gateway setup on the checkout page.
* BUG FIX/ENHANCEMENT: Updated Russian Ruble definition to have 0 decimals and use &nbsp; as the thousands separator. (Thanks, Airat Halitov)
* BUG FIX/ENHANCEMENT: Using add_query_arg when generating IPN URLs to avoid issues on sites that aren't using pretty permalinks or have moved their admin directory.
* BUG FIX/ENHANCEMENT: Fixed issue on advanced settings page where clicking on labels didn't check the corresponding check boxes.
* BUG FIX/ENHANCEMENT: Updated our pmpro_generateUsername() function to be a bit smarter.
* BUG FIX/ENHANCEMENT: Now using wp_generate_password() when choosing a random password for a user (e.g. when using the Sign Up Shortcode add on or the $skip_account_fields global).
* BUG FIX/ENHANCEMENT: Setting autocomplete to false on the "fullname" honeypot field. This will prevent user's with certain autocomplete tools from accidentally filling it out.
* BUG FIX/ENHANCEMENT: Now sending name and email fields to PayPay (using Website Payments Pro) even if no address was captured.
* BUG FIX/ENHANCEMENT: More specific CSS selectors for checkout form elements to make sure errors are highlighted/etc with different themes.
* BUG FIX: Fixed issue where the first 2000 or so orders might be skipped when exporting orders on large sites.
* BUG FIX: Fixed issue with setting custom trials on discount codes.
* BUG FIX: Fixed issue in the SQL query in the pmpro_calculateInitialPaymentRevenue() function. This function is deprecated, but still used by some custom code.
* BUG FIX: Fixed issue where default templates would fail to load if a custom template was specified.
* BUG FIX: Fixed fatal errors that could happen when using the PMPro REST API endpoints.
* BUG FIX: Fixed bug where the invoices page would sometimes show data for the current (admin) users instead of the user the invoice was for.
* BUG FIX: Fixed bug where the membership stats graphs would sometimes show up blank.
* BUG FIX: Now falling back to using readfile() if fpassthru() doesn't existing.
* BUG FIX: Fixed issue where the from name and email were not set properly if the Only Filter PMPro Emails setting was checked. (Thanks, mjulian87 on GitHub)
* BUG FIX: Fixed several error handling issues with the Cybersource gateway integration.
* REFACTOR: Moved JavaScript out of pages/checkout.php and other places into files in the /js/ folder. This will avoid issues where other JS at checkout breaks PMPro checkout and will improve compatibility with tools that optimize JS.
* REFACTOR: Added unit testing and a started on coverage of some functions in includes/functions.php. (Thanks, Mike Auteri)
* REFACTOR: The JS function askfirst is now prefixed as pmpro_askfirst.

= 2.0.7 - 2019-05-30 =
* BUG FIX: Fixed issue where the profile start date would sometimes be set incorrectly on the Stripe subscription.
* BUG FIX: Fixed issue where the membership shortcode would not work properly if more than one level name was given.
* BUG FIX: Fixed issue where an incorrect email address was sometimes set in the confirm email field on the update billing page. (Thanks, Jessica Thomas)
* BUG FIX/ENHANCEMENT: Fixed placement of the hr tag above the user fields at checkout for consistency.
* ENHANCEMENT: Set the priority on the Require Membership meta box to "high" so it appears higher in the right sidebar.

= 2.0.6 - 2019-05-30 =
* SECURITY: Now using wp_safe_redirect when possible, especially in includes/login.php where the user-provided redirect_to URL parameter is used. (Thanks PluginVulnerabilities.com)

= 2.0.5 - 2019-04-25 =
* BUG FIX: Fixed fatal error on return from 2Checkout.
* BUG FIX: Removed error when installing PMPro via WP-CLI.
* BUG FIX: Fix database upgrade error on localhost environment. (Thanks, codezz on GitHub)
* BUG FIX: Fixed issue where the credit card expiring email didn't include user info because the user ID wasn't passed in properly. (Thanks, David Cervantes Caballero)
* BUG FIX: Fixed typo on edit level page. (Thanks, Theuns Coetzee)
* BUG FIX: Fixed bug with daily revenue reports not showing up in some cases.
* BUG FIX: Now checking before cancelling a Stripe subscription at the gateway to see if it has already been cancelled.
* BUG FIX/ENHANCEMENT: Now caching the query results in pmpro_getMembershipLevelsForUser(). This improves performance, especially when there are many posts on one page to check membership for. (Thanks, Seagyn Davis)
* BUG FIX/ENHANCEMENT: Now sending display_name to the $data array passed to PMPro email filters. (Thanks, David Cervantes Caballero)
* BUG FIX/ENHANCEMENT: Now searching for the last order with "success" or "pending" status on the Billing page.
* BUG FIX/ENHANCEMENT: Added pmpro_checkout_preheader_before_get_level_at_checkout and pmpro_checkout_preheader_after_get_level_at_checkout action hooks. Using pmpro_checkout_preheader_before_get_level_at_checkout to start the session earlier now.
* BUG FIX/ENHANCEMENT: Removed the "membership_code_id" and "membership_code" as field options for the member shortcode. These weren't working and it's unclear what would be meant to ask for a user's discount code since a user could have several orders with or without discount codes. Added "membership_description" and "membership_confirmation" instead.
* BUG FIX/ENHANCEMENT: Filtering the password reset message to make sure the link still works in all cases when we convert emails to HTML.
* BUG FIX/ENHANCEMENT: Added reCAPTCHA v3 and invisible reCAPTCHA support. It is recommended sites using Stripe or Braintree update to the reCAPTCHA v3 option. Read more here: https://www.paidmembershipspro.com/pmpro-update-2-0-5/
* REFACTOR: Now running the pmpro_billing_preheader hook after the jquery.creditCardValidator script is enqueued in preheader/billing.php to match how we do it in preheader/checkout.php. (Thanks, Rafe Colton)

= 2.0.4 - 2019-01-14 =
* BUG FIX: Fixed warning in code added in 2.0.3 that could cause issues at checkout.
* BUG FIX: Setting priority of pmpro_check_admin_capabilities to 5 to ensure it runs before dashboard redirect.
* BUG FIX: Removed duplicate id attribute on the Membership Account page "cancel" action link.
* BUG FIX/PERFORMANCE: No longer enqueueing frontend.blocks.js which had no functional code, but loaded a lot of Gutenberg JS that wasn't needed on the frontend. When/if our blogs have frontend JS, we will load it again, but also make sure the dependencies are correct.
* BUG FIX/PERFORMANCE: No longer loading blocks.style.css. These frontend styles were redundant with CSS in css/frontend.css.
* NOTE: The SVN repository was missing the 2.0.3 tag when that update went out. Some users may have updated or tried to update and not gotten the correct files for 2.0.3. Everyone should update to 2.0.4, which is Gucci.

= 2.0.3 - 2019-01-11 =
* BUG FIX: Fixed issue where code in the Stripe gateway was cancelling old subscriptions early if users renewed with a different gateway. NOTE: There was a fix for this in version 2.0, but it wasn't implemented fully.
* BUG FIX: Filtering pmpro_other_order_ids_to_cancel to make sure the current checkout's order doesn't get cancelled. This started happening in version 2.0 since we started setting the user_id on orders for existing users before the checkout was fully processed. This fix along with the one above and others will fix cases where users were being cancelled immediately after checkout.
* BUG FIX: Fixed warning on edit levels page by defaulting $confirmation_in_email to 0.

= 2.0.2 - 2019-01-10 =
* BUG FIX: Fixed issues when using non-US currencies. Using the pmpro_round_price function in a few places it was needed. Prepared for a later update that will increase the number of decimals on certain columns in the DB to 8 to support currencies like Bitcoin, but shelving the actual DB update for version 2.1.
* BUG FIX: Fixed issue where existing users who checked out could run into problems. Added a getMembershipLevelAtCheckout method to the MemberOrder class and using that during checkout. The getMembershipLevel method would see the user_id property of the order (added to orders at checkout in version 2.0) and lookup the level data from the pmpro_memberships_users table instead of using the pmpro_level global. Then gateways like PayPal Express (but others also) would use the wrong data when making calls to pmpro_isLevelRecurring/etc.
* BUG FIX: Fixed bug where a notice to deactivate the Better Logins Report plugin could show up for users who couldn't deactivate the plugin.
* BUG FIX: Fixed bad translation in the membership_expired.html file of the French translation.
* BUG FIX: Fixed some strings on updated reports that weren't wrapped for translation.

= 2.0.1 - 2019-01-03 =
* BUG FIX: Fixed issue where the PMPro dashboard and reports pages would appear blank if certain other plugins were active.

= 2.0 - 2018-12-31 =
* SECURITY: Fixing how we escape things in the Memberships report SQL queries.
* BUG FIX: Fixed issue where code in the Stripe gateway was cancelling old subscriptions early if users renewed with a different gateway.
* BUG FIX: Fixed a warning on the Stripe Webhook service.
* BUG FIX/ENHANCEMENT: Removing unused images from core plugin.
* BUG FIX/ENHANCEMENT: Removed unused `getTimestamp` function.
* BUG FIX/ENHANCEMENT: Updated Braintree/PHP Library to 3.36.0
* BUG FIX/ENHANCEMENT: Prefixing Braintree plan name with `pmpro_#`
* BUG FIX/ENHANCEMENT: Better table naming in queries for Memberships and Sales reports.
* BUG FIX/ENHANCEMENT: Changing "blacklist" to "blocklist".
* BUG FIX/ENHANCEMENT: Changing the appearance of the Discount Code "Apply" button on checkout to look more like a text link.
* BUG FIX/ENHANCEMENT: Now calculating the next payment date with time, not SQL.
* BUG FIX/ENHANCEMENT: Updated the pmpro_next_payment method of Stripe to check if a customer is delinquent to avoid returning a next payment date in the future if the last payment failed.
* BUG FIX/ENHANCEMENT: Saving user ID in MemberOrder when a user already exists and they are checking out via an offsite gateway.
* BUG FIX/ENHANCEMENT: Updating Stripe Webhook and PayPal IPN Handler to send the cancelled level ID for better cancellation emails.
* BUG FIX/ENHANCEMENT: Brought back the Stripe Billing limit warnings. Here is a plugin to get billing limits working with Stripe https://github.com/strangerstudios/pmpro-stripe-billing-limits/blob/master/pmpro-stripe-billing-limits.php
* FEATURE: Gutenberg / v5.0 Editor Blocks for Paid Memberships Pro pages, the Checkout Button and Membership "shortcode" functionality.
* FEATURE: Added new "Dashboard" page and adjusted the entire menu structure for "Memberships".
* FEATURE: Created new compatibility checks and included compatibility functions for Beaver Builder, Elementor, and SiteOrigin Page Builder.
* FEATURE: Added REST API routes for post membership access, and user membership level.
* FEATURE: Added option to include the level's Confirmation Message in the Confirmation Email.
* FEATURE: Added a filter by discount code to Memberships and Sales reports.
* FEATURE: Added a filter by discount code to the Orders admin page.
* FEATURE: Added a "Copy" option to discount codes.
* FEATURE: Now allowing you to edit or add a discount code to a single Order edit.
* FEATURE: Added the ability to export orders by discount code used.
* FEATURE: Added new file for deprecated functions or hooks.
* ENHANCEMENT: Moved "Memberships" menu page up in sidebar below Comments.
* ENHANCEMENT: Replaced the Visits, Views, Logins report with the "Better Logins Report" Add On functionality.
* ENHANCEMENT: Updating reports that use the Google Charts library to use the updated chart library (corechart.js).
* ENHANCEMENT: Reports admin page is now loading reports via the `add_meta_box` WordPress function.
* ENHANCEMENT: Added ability to filter membership reports for free or paid levels only.
* ENHANCEMENT: Setting a default level at checkout so that the page doesn't redirect to the Levels page.
* ENHANCEMENT: Showing the discount code used on the All Orders and single Order edit page.
* ENHANCEMENT: Added ability to filter Orders by Free (Orders equal to $0), Paid (Orders greater than $0)
* ENHANCEMENT: Now showing the Invoice's Order Status on the Membership Account page for orders (Paid, Pending or Refunded).
* ENHANCEMENT: Adding additional quick search links when no members are found in members list search.
* ENHANCEMENT: Added a check on the Add Ons page to hide Add Ons that are no longer supported or recommended.
* ENHANCEMENT: Improved Responsive layout of the Memberships admin area for smaller devices.
* ENHANCEMENT: Adding .gitattributes and gitignore. Important now for node stuff in particular.

= 1.9.5.6 - 2018-11-15 =
* BUG FIX: Fixed issue where Braintree would try to cancel a subscription twice if it was cancelled on the Braintree side.
* BUG FIX: Fixed bug in Braintree webhook when using certain versions of PHP.
* BUG FIX: Correct Braintree plans flagged as faulty.
* BUG FIX/ENHANCEMENT: Added Order Code to the Orders Export CSV
* BUG FIX/ENHANCEMENT: Removed another warning RE billing limits with the Stripe gateway. (Thanks, Jordan Kohl)
* ENHANCEMENT: Added the pmpro_include_pricing_fields filter.
* ENHANCEMENT: Adding IDs to action links in the account shortcode so users can target them with CSS/JS.
* ENHANCEMENT: Updated French Translation. (Thanks, Pascal)
* ENHANCEMENT: Retina logo on dashboard pages.
* ENHANCEMENT: Showing what PMPro page a page is in the Post List table of the WP dashboard.

= 1.9.5.5 - 2018-10-19 =
* 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 RE 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.

= 1.9.5.4 - 2018-09-10 =
* 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 use add_filter('pmpro_level_description', 'the_content') 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.

= 1.9.5.3 - 2018-06-26 =
* BUG FIX: The pmpro_ipnhandler_extend_memberships function actually needed use $user_id instead of $current_user.

= 1.9.5.2 - 2018-06-26 =
* BUG FIX: Fixed compatibility with Theme My Login version 7. (Thanks, Jeff Farthing)
* BUG FIX: Fixed missing $current_user bug in pmpro_ipnhandler_level_extend_memberships function. (Thanks, Anne)

= 1.9.5.1 - 2018-06-08 =
* BUG FIX: Fixed issue with the PayPal IPN Handler where existing users checking out for a new level would sometimes have their membership and new subscription cancelled.
* BUG FIX: Fixed PayPal IPN Handler to set the status of old levels to 'changed' (instead of 'inactive') when processing checkouts. This will improve the accuracy of reports.
* BUG FIX/ENHANCEMENT: Now checking for the recurring_payment_skipped transaction type in the PayPal IPN handler. When a payment is skipped and this message is sent, we will now fire off the failed payment email to the customer and admin. (Thanks, mjulian87 on GitHub)
* ENHANCEMENT: Removed validation info from the IPN log.
* ENHANCEMENT: Updated German (de_DE) language files.

= 1.9.5 - 2018-05-24 =
* BUG FIX: Added 'error' to the list of default order statuses.
* BUG FIX: Fixed issue where PayPal recurring_payment messages with status "Pending" were treated as "Failed" by our IPN handler. (Thanks, Matt Julian)
* BUG FIX: The redirect away from the billing page needed to be in the preheader instead of the page shortcode.
* BUG FIX/ENHANCEMENT: Using the pmpro_getOrderStatuses() function in adminpages/orders.php instead of redundant code there.
* BUG FIX/ENHANCEMENT: Passing the $order as a second parameter to pmpro_after_checkout when called from the PayPal IPN handler. (The $order was being passed already for "regular" checkouts.)
* ENHANCEMENT: You can now sort by the Membership Level column added to the users list in the dashboard. (Thanks, Matt Julian)
* FEATURE: Added support for the privacy features added in WP 4.9.6. Details below.
* FEATURE: Added suggest privacy page text.
* FEATURE: Added PMPro-related user meta fields, membership history, and order history to the personal data export. You can filter which user meta fields are included in the export using the new pmpro_get_personal_user_meta_fields filter.
* FEATURE: Deleting PMPro-related personal data fields when personal data is erased. The ereaser deletes a number of user meta fields (filterable through the new pmpro_get_personal_user_meta_fields_to_erase filter). A user's membership history and order history are retained unless the user is deleted.
* FEATURE: Now saving a log of when the TOS page is agreed to at checkout. The ID and date modified of the TOS post is saved along with a timestamp of when the TOS was agreed to. This information is shown on the single order page in the admin, the orders CSV export, and on the edit user profile page in the admin. Note that this feature does not yet backport any data for existing users or ask users to re-agree to the TOS if the TOS has gone out of date.

= 1.9.4.4 - 2018-03-14 =
* BUG FIX: Updated the filters to extend membership levels to use the new pmpro_getSpecificMembershipLevelForUser() function to avoid bugs when MMPU is enabled.
* BUG FIX: Fixed cases where certain email templates were resulting in the body of the email being duplicated.
* BUG FIX: Fixed conflict with pmpro-email-templates when emails were disabled (the pmpro_email filter returns false). (Thanks, Mathieu Hays)
* BUG FIX: Now updating status on related subscription orders BEFORE canceling at gateway to avoid cases where the webhook sent by the gateway after canceling the subscription triggers further cancellation attempts.
* BUG FIX: No longer showing the "Stripe Publishable Key appears incorrect" error message if the key field is blank.
* ENHANCEMENT: Added the pmpro_getSpecificMembershipLevelForUser( $user_id, $level_id ) function for cases where MMPU is enabled and you want data about a specific membership level a user might have.
* ENHANCEMENT: Changed labels on the reCAPTCHA settings to match their current terminology: Site Key and Secret Key.

= 1.9.4.3 - 2018-01-04 =
* BUG FIX: Fixed issue where PMPro would attempt to cancel gateway subscriptions more than once in some cases.

= 1.9.4.2 - 2017-12-07 =
* BUG FIX: Avoid double-encoding the API version in PayPal Standard gateway
* BUG FIX: The update billing page now checks the gateway of the user's last order instead of the default gateway settings in case multiple gateways are in use or the default gateway has changed.
* BUG FIX: Fixed bug where discount codes were not being applied properly if the pmpro_default_level custom field was set and used on a page.
* BUG FIX: Credit card expiration emails were being to sent to members with PayPal Express orders.
* BUG FIX: Now correctly unslashing instructions for the check gateway.
* BUG FIX: Fixed issue with creating pages from the page settings page.
* BUG FIX/ENHANCEMENT: Improved submit button and processing message position for default and RTL on checkout page.
* BUG FIX/ENHANCEMENT: Added invoice total and total billed breakdown back to confirmation and invoice single views.
* BUG FIX/ENHANCEMENT: Avoid double-encoding the PayPal API version number
* ENHANCEMENT: Improved submit button and processing message position for default and RTL on checkout page.
* ENHANCEMENT: Switched order of Publishable and Secret Key fields and added validation check.
* ENHANCEMENT: Conditionally update members list headings for expired, cancelled, or old members.

= 1.9.4.1 - 2017-10-31 =
* BUG FIX: Fixed serious bug where payment fields weren't showing up for the Braintree gateway.
* BUG FIX: Fixed issue where Braintree webhook notifications were failing. We now allow the Braintree library to sanitize the incoming data since our sanitizing efforts were breaking the validation.
* BUG FIX/ENHANCEMENT: The webhook URL given for Braintree now goes through admin-ajax.php instead of a direct link to a php file within our plugin.
* BUG FIX/ENHANCEMENT: Updates to the Recaptcha library. (Thanks, Corin Simpson-Bryars)
* ENHANCEMENT: Made the cancelation failed error email easier to read.

= 1.9.4 - 2017-10-26 =
* BUG FIX: Fixed issue where PayPal was not working for amounts over $1000.
* BUG FIX: Non-decimal currencies now handled correctly with Stripe.
* BUG FIX: Fixed issue where updating a Stripe subscription from the edit user page could cancel the subscription once the webhook fired.
* BUG FIX: Fixed issue where "admin_cancelled" memberships weren't being calculated correctly in membership reports.
* BUG FIX: Fixed issue where users could not drag and drop to change the order of membership levels.
* BUG FIX: pmpro_getMembershipLevelsForUser() would sometimes return duplicate levels in the array if the user had multiple active entries in the pmpro_memberships_users table.
* BUG FIX: Updated includes/metaboxes.php to call pmpro_getAllLevels() instead of relying on the $membership_levels global which is problematic.
* BUG FIX: Fixed a few strings that weren't wrapped for translation or were using the old text domain.
* BUG FIX: Fixed redirect error that occurred when the levels page was not set.
* BUG FIX: Updated getfile.php to support file names with urlencoded characters (e.g. spaces) in them. (Thanks, florent from PMPro blog)
* BUG FIX: Fixed notice when use the getfile.php script due to using add_filter instead of apply_filters in the mimetype class.
* BUG FIX: Fixed the all time views column for the logins report.
* BUG FIX: Fixed fatal error on the logins report, member shortcode and other issues when using PHP7.1+.
* BUG FIX: Fixed issue with saving arrays using pmpro_setOption()
up the lines of text.
* BUG FIX: Fixed typo in the string "Are you sure you want to do that? Try again."
* BUG FIX: Fixed a few strings that used the wrong text domain or weren't wrapped correctly for translation.
* BUG FIX/ENHANCEMENT: Now bundling Google's jsapi.js file for use in the reports.
* BUG FIX/ENHANCEMENT: Fixed issue where some emails (e.g. the password reset email) would not have wpautop applied to them, crunching
* BUG FIX/ENHANCEMENT: Better checking for Theme My Login compatibility when handling login redirects.
* BUG FIX/ENHANCEMENT: Better error handling for Braintree.
* BUG FIX/ENHANCEMENT: Membership stats widget now shows first 3 levels based on level order.
* BUG FIX/ENHANCEMENT: Added the pmpro_member_shortcode_access filter
* ENHANCEMENT: Updated the Stripe PHP library to version 5.2.2 and updated Stripe to use the latest version of their API, 2017-08-15.
* ENHANCEMENT: Changed frontend pages (e.g. checkout.php) to use a div-based layout instead of tables. Important information here if you are using custom page templates or notice UI issues after upgrading:
* ENHANCEMENT: Added pagination to the discount codes page in the admin. Also sorting codes in descending order by ID. Use the pmpro_discount_codes_per_page filter to change the per page limit from 15.
* ENHANCEMENT: Updated plugin admin pages with better links to documentation and support.
* ENHANCEMENT: Updated plugin frontend pages checkout, billing, confirmation, and single invoice to remove most table based layouts.
* ENHANCEMENT: Better error message if trying to checkout using an existing user's email address.
* ENHANCEMENT: Added the pmpro_report_levels filter to let users change levels and order of levels for the memberships.php report.
* ENHANCEMENT: Updated video and copy for readme.txt.
* ENHANCEMENT: Added user display name to Memberlist search query
* ENHANCEMENT: Added Russian Ruble as a currency.
* ENHANCEMENT: Changed the dated term "CVV" to "Security Code (CVC)" when shown on the frontend.
* ENHANCEMENT: Added .doc and .docx to the mimetype class.
* ENHANCEMENT: Added Portuguese language files. (Thanks, Secundino Correia)
* ENHANCEMENT: Updated plugin admin pages with better links to documentation and support.

= 1.9.3 - 2017-07-06 =
* SECURITY: Fixed sanitization of inputs and added nonces in several places to protect against XSS attacks.
* BUG FIX: Showing correct error message when trying to update a PMPro Plus add on with a Core license installed.
* BUG FIX: Fixed issue where subscription and payment transaction IDs were not being saved correctly when copying an order in the dashboard. (Thanks, Pippin Williamson)
* BUG FIX: Fixed fatal errors that occurred in certain PHP versions.
* BUG FIX: Fixed issue where ProfileStartDate was being calculated incorrectly in the test, check, and Cybersource gateways.(Thanks, David Parker)
* ENHANCEMENT: Added a pmpro_sanitize_with_safelist() function that is used to sanitize inputs that have a limited number of exact options.
* ENHANCEMENT: Updated the pmpro_setOption() and pmpro_getParam() functions to take a new last parameter $sanitize_function, which defaults to 'sanitize_text_field'.

= 1.9.2.2 - 2017-06-13 =
* BUG FIX: Fixed warnings on the Network Dashboard's sites page.
* BUG FIX: Skipping update scripts that require the Stripe library if the system doesn't support the minimum requirements for the Stripe API. This avoids warnings and errors during upgrade.

= 1.9.2.1 - 2017-06-05 =
* BUG FIX: Fixed issues with activation on single sites.
* BUG FIX: Starting PHP sessions earlier to fix issues with PayPal/PayPal Express checkouts.

= 1.9.2 - 2017-06-03 =
* BUG FIX: Fixed issue where Braintree checkouts were failing with a CVV error when existing users checked out.
* BUG FIX: Fixed issue loading the Stripe library in PHP 5.6.
* BUG FIX: Member List CSV export was ignoring search parameter.
* BUG FIX: Discount codes weren't being remembered during the "review" step of a PayPal Express checkout. (Thanks, Rafe Colton)
* ENHANCEMENT/FIX: Search Filter would trigger incorrectly for REST API request by slug.
* ENHANCEMENT/FIX: Didn't always identify MasterCard cards correctly to set the CardType with some gateways.
* ENHANCEMENT/FIX: Some custom code or add ons (e.g. the Prorating and Auto-renewal Checkbox add ons) would sometimes break PayPal Website Payments Pro and PayPal Express subscriptions by trying to set the "Profile Start Date" longer than 1 year out. We now limit the Profile Start Date to 1 year out and try to squeeze up to 1 additional year into a trial if it's not already being used. This bug affects PayPal Standard as well, but the fix is different and not included in this release.
* ENHANCEMENT: Tested up to WordPress 4.8.
* ENHANCEMENT: Made countries translatable.
* ENHANCEMENT: Improved performance via PHP $_SESSION management improvements. We now only open the session before we set session vars and close the session when we are finished with it.
* ENHANCEMENT: Added to code to stop network activation of Paid Memberships Pro. (Thanks, Paul Barthmaier)

= 1.9.1 - 2017-05-11 =
* BUG FIX: Fixed the code checking if the Stripe library is already loaded to compatibility issues with other plugins bundling the Stripe API library.
* BUG FIX: Cancel code now properly uses preg_replace when sanitizing the list of level ids to cancel.
* FIX/ENHANCEMENT: Removed test/doc code from Stripe and Braintree libraries.
* ENHANCEMENT: Now pausing the license nag for the first week of use and removed the "invalid" error if no key is being used.

= 1.9 - 2017-04-26 =
* BUG: Fixed issue with cancelling 2Checkout recurring subscriptions. Now using the payment_transaction_id to find/cancel the sale's recurring subscription since no subscription_transaction_id is being saved.
* BUG: Fixed issue where old membership levels were not listed correctly in the cancellation email. (Thanks, Mike from Migrating Eye)
* BUG: Fixed issue where "custom trial" values were not saving for discount codes.
* BUG: Fixed issue where checkouts were still processing even if there were errors with the discount code used.
* BUG: Fixed bug where settings added via the pmpro_custom_advanced_settings were not being saved to DB unless they were prefixed with custom_.
* BUG: Fixed other formatting issues with settings added via pmpro_custom_advanced_settings.
* BUG: Fixed issue where the sendInvoiceEmail method of the email class was expecting $order->discount_code to be a string, but it was sometimes a discount code object. (Thanks, Bill Stoltz)
* FEATURE: Added the pmpro_member shortcode. See the Paid Memberships Pro website for documentation.
* ENHANCEMENT: Added pmpro_account_membership_expiration_text filter to filter the expiration text that shows ona  user's membership account page.
* ENHANCEMENT: Updated our Stripe and Braintree libraries to use their latest versions. This update allows our gateway integrations to support PHP7 and also removes support for PHP 5.2 and 5.3.
* ENHANCEMENT: The Braintree level compatibility check now also looks for a properly named plan.
* ENHANCEMENT: Better error handling when trying to update plugins that update against the PMPro license server.
* ENHANCEMENT: Improved Italian translation. (Thanks, Francesco Pezzotti)
* ENHANCEMENT: Improved German translation. (Thanks, Simon)
* ENHANCEMENT: Added a Sweedish translation. (Thanks, Mathias Persson)
* ENHANCEMENT: Added a "Chinese/Cantonese (Hong Kong SAR China)" translation. (Thanks, Kai Chan)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

= 1.8.8.2 =
* BUG: Fixed bug with new order creation.

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

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

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

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

= 1.8.7.1 =
* BUG: Added missing files via svn.

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

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

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

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

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

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

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

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

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

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

= 1.8.6 =
* 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)

= 1.8.5.6 =
* 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 1.8.5.5.
* 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.

= 1.8.5.5 =
* 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.

= 1.8.5.4 =
* 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.

= 1.8.5.3 =
* 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.

= 1.8.5.2 =
* BUG: Fixed notice in pmpro_reset_update_plugins_cache
* BUG: Removed debug code from the PayPal Express gateway.

= 1.8.5.1 =
* 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.

= 1.8.5 =
* 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.

= 1.8.4.5 =
* 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 version 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.

= 1.8.4.4 =
* 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 formatted. 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.

= 1.8.4.3 =
* SECURITY PATCH: Fixes to Cross Site Scripting vulnerabilities in the PMPro settings pages in the WordPress dashboard. [Advisory ID HTB23264](https://www.htbridge.com/advisory/HTB23264). (Thanks, High-Tech Bridge Security Research Lab)

= 1.8.4.2 =
* 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.

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

= 1.8.4 =
* 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)

= 1.8.3.1 =
* 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.

= 1.8.3 =
* 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 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.

= 1.8.2.2 =
* 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)

= 1.8.2.1 =
* 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)

= 1.8.2 =
* 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: Trimming 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.

= 1.8.1 =
* 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)

= 1.8 =
* 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)

= 1.7.15.3 =
* 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.

= 1.7.15.2 =
* 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)

= 1.7.15.1 =
* 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.

= 1.7.15 =
* 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.

= 1.7.14.2 =
* 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)

= 1.7.14.1 =
* 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 synchronization 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.

= 1.7.14 =
* 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.
* ENHANCEMENT: 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

= 1.7.13.1 =
* 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.

= 1.7.13 =
* 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)

= 1.7.12 =
* 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

= 1.7.11 =
* 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.

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

= 1.7.10.1 =
* 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 excerpts" 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.)

= 1.7.10 =
* 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)

= 1.7.9.1 =
* Firing activation hook on upgrade so menu doesn't disappear.

= 1.7.9 =
* 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/

= 1.7.8.2 =
* 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.

= 1.7.8.1 =
* 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.

= 1.7.8 =
* 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 <!-- comment --> 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.

= 1.7.7 =
* 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)

= 1.7.6 =
* 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.

= 1.7.5 =
* 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.

= 1.7.4 =
* 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.

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

= 1.7.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.

= 1.7.2.1 =
* 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.)

= 1.7.2 =
* 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.

= 1.7.1 =
* 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 updates.
* New users will now be set to the "default role" set in the General settings instead of specifically "subscriber". (Subscriber is the default default role though.) Thanks, Nabil Kadimi.
* Wrapped strings in login report for translation.
* Added indexes to the following columns in the pmpro_membership_orders table: status, payment_transaction_id, subscription_transaction_id, affiliate_id, affiliate_subid

= 1.7.0.4 =
* Another database fix for new installs.

= 1.7.0.3 =
* Fixed a performance issue added in 1.7.0.2.

= 1.7.0.2 =
* Fixed HUGE issue with the DB setup on fresh 1.7+ installs. If you installed version 1.7 or 1.7.0.1 fresh (not upgraded from earlier version) then PMPro will not work until you upgrade to version 1.7.0.2.
* Removed from old PHP short tag use
* Fixed generation of members only and non-logged in text on new installs.

= 1.7.0.1 =
* Added the redirect away from wp-login.php page (was accidentally removed in version 1.7).
* Added support for Theme My Login versions 6.3+
* Fixed CSV downloads.
* Fixed some warnings.
* Fixed generation of cost text when using built in tax.
* Added "pmpro_subscribe_order" filter.
* Added an index to the user_id column of pmpro_memberships_users table which will help with performance of the new logins report and other user search functions.

= 1.7 =
* Ready for localization efforts.
* Addons tab in PMPro Settings in the dashboard.
* Reports page in dashboard with login report.
* Webhook code for Braintree Payments gateway.
* If PayPal Standard is the active gateway, users without membership levels will be able to see the confirmation page with a message that PayPal is processing payment.
* Fixed bug where PayPal recurring orders were being attributed to the wrong user (if no subscriber id was attached to the IPN message).
* Fixed bug where users sometimes couldn't checkout with a discount code that made a level free.
* Cleaned up code in base paid-memberships-pro.php file.
* Updated the .pmpro_checkout tr.odd td line in frontend.css to use rgba with alpha transparency to work a bit better on dark background themes.
* Fixed bug where a user's first_name and last_name meta fields might be overwritten by the billing name fields at checkout. It will still set them if the user's first and last name fields are blank. (Thanks, John Hamlin.)
* Fixed bug where zipcode was shown instead of state in the members list CSV export. (Thanks, John Hamlin.)
* Fix to show discount codes on free trial confirmation emails if one was used.
* Added the pmpro_random_code filter so you can hook in and change invoice code/etc generation.
* Correctly padding zeroes on credit card expiration dates like 09/2013 when using Stripe. This SQL statement should fix broken entries in your orders table: NOTE (1) Backup your database first. NOTE (2) Make sure you change the table name to match your WP prefix,etc. >>> UPDATE wp_pmpro_membership_orders SET expirationyear = CONCAT(SUBSTRING(expirationmonth,2,1), expirationyear), expirationmonth= CONCAT('0', SUBSTRING(expirationmonth,1,1)) WHERE expirationmonth > 12;
* Wrapped some AJAX and service calls code in init() functions so they will more consistently work with hooks/filters. (Before if PMPro loaded before a plugin or bit of code that added filters/etc, the filters wouldn't get applied.)
* Fixed Stripe JS to also send city to Stripe. (This is important because Stripe doesn't seem to show the address at all if the city is missing.)
* Added 'pmpro_members_list_sql' hook to filter the SQL used on the members list page and CSV export.
* Added 'pmpro_members_list_csv_heading' and 'pmpro_members_list_csv_default_columns' hooks to filter the default columns in the members list CSV. (e.g. to check role and remove columns)
* Added 'pmpro_members_list_user_link' hook to filter the link and username displayed on the members list page. (e.g. to check role and remove link to edit user)
* Checking that "status='active'" when finding subscriptions to cancel when deleting a level. This will keep PMPro from trying to cancel someone more than once... or trying to cancel inactive subscriptions.
* Fixed bug where Sales Tax fields were hidden on the payment settings page if Stripe was chosen as the gateway.
* No longer logging IPN activity to logs/ipn.txt by default. (Uncomment the lines at the bottom of services/ipnhandler.php to use the log to debug.)

= 1.6.1 =
* Added recurring billing support to Payflow integration.
* Fixed bug where an order's code was shown instead of the subscription ID on the edit order page.
* Fixed some logic with determining if level settings are not compatible with the current gateway.
* On notice and one DB query fix in upgradecheck.php submitted by pranjithkumar on GitHub. Thanks!

= 1.6.0.1 =
* Fixed Braintree integration for production environments. Braintree needed to be told "production" instead of "live".
* Removed !!field!! lines from a couple of admin emails.
* Added login_link as data for the cancel_admin email template.

= 1.6 =
* Added Braintree payments as a gateway option. This should be considered in "beta". Please get in touch if you are using Braintree payments with PMPro. Everything should function except that we're still working out an issue with the webhook handler.
* Added a new dashboard page Orders to view all orders processed by PMPro with an option to export to CSV.
* Fixed bug where "Your membership level has changed" emails were being sent out the first time a user's profile was edited, even if the level wasn't changing.
* Removed the revenue estimate from the members list page. This causes performance issues on sites with many members. A new reports dashboard page is coming soon.
* Not showing payment settings warning now when Payflow is setup with all values filled in.
* Updated preheaders/billing.php to get the most recent successful order from the DB to use when updating. (ORDER BY id DESC in the query)
* Added pmpro_stripe_subscription_deleted hook in stripe-webhook.php for when subscriptions are cancelled on the Stripe side. Use this code to cancel on your site as well: https://gist.github.com/strangerstudios/5093710
* Now using $pmpro_currency_symbol when membership price is shown on the edit profile page in the dashboard/etc.
* Added pmpro_authorizenet_post_url filter to use Authorize.net gateway class with a different post url, e.g. if you have a gateway that offers an Authorize.net compatibility mode.
* Added pmpro_check_status_after_checkout filter so you can e.g. set the status to "pending" instead of "success" when a user checks out with the check gateway. They will still have access to the membership level, but you can update the status via the orders dashboard later.
* Added pmpro_confirmation_order_status filter so you change which status the confirmation page looks for. Can return an array as well since the getLastMemberOrder method call on MemberOrder has been updated to support $status as an array.
* Orders made via the check gateway now have PaymentType = "Check" and CardType = "".
* Added a notes column to orders.
* Fixed bug where discount codes were not showing up in checkout emails if the level was free.
* Added some wpdb->escape() wrappers to the saveOrder method of MemberOrder which will fix some bugs with orders with fields with apostrophe's in them, etc.
* Added checks for custom capabilities to the PMPro admin pages in case you want to give non-admins access. Caps are: pmpro_discountcodes, pmpro_emailsettings, pmpro_membershiplevels, pmpro_memberslist, pmpro_memberslist_csv, pmpro_orders, pmpro_orders_csv, pmpro_pagesettings, pmpro_paymentsettings
* Added pmpro_memberslist_extra_cols_header and pmpro_memberslist_extra_cols_body hooks to add extra columns to the members list page.
* Fixed pmpro_paypal_express_return_url_parameters filter to properly encode & and = so the params are properly added to the ReturnURL instead of being seen as extra params to the full PayPal Express URL. The PMPro Addon Packages plugin has been updated to take advantage of this to make that plugin more compatible with PayPal Express.
* Fixed bugs with Strip webook: now listening for charge.succeeded and charge.failed, other fixes.

= 1.5.9.2 =
* Fixed Members List bugs introduced in version 1.5.9.1.

= 1.5.9.1 =
* Revamped the ipnhandler code. It's much cleaner now and should be easier to support with all 3 PayPal APIs (Standard, Website Payments Pro, Express) working through the one handler.
* Added Payflow Pro as a gateway option. Currently, only one-time charges is supported.
* Added the pmpro_register_redirect filter to allow you to change the URL PMPro redirects wp-login.php?action=register to. Returning false or an empty string will result in no redirect from the register page.
* Added pmpro_subscription_payment_failed hook that runs if a failed payment comes in through the IPN Handler, Authorize.net silent post, or Stripe web hook. do_action("pmpro_subscription_payment_failed", $old_order); $old_order is a MemberOrder object.

= 1.5.9 =
* Fixed bug on Membership Billing page that was hiding the billing address fields.
* Changed all of the instances of "firstpayment" order statuses to "success". Also running query to fix statues in the DB. This caused issues for levels with only a one-time payment, where the invoice wouldn't show up in their account page.
* Fixed the PayPal Express gateway to correctly set the order transaction id to TRANSACTIONID instead of the PROFILEID.
* Updated the IPN handlers to accept recurring_payment_id or subscr_id when checking for recurring payment orders.
* Changed the site_url() in the javascript for discount codes on the checkout page to home_url(). home_url() is better to use in case users have their WP core files in a different directory.
* You can now place email templates in a paid-memberships-pro/email folder in your theme and PMPro will use these before using the built in email templates. Just copy the file out of the wp-plugins/paid-memberships-pro/email folder, use the same filenames, and edit the file.
* You can now place page templates in a paid-memberships-pro/pages folder in your theme and PMPro will use these before using the built in page templates. Just copy the file out of the wp-plugins/paid-memberships-pro/pages folder, use the same filename, and edit the file.
* You can now place css templates in a paid-memberships-pro/css folder in your theme and PMPro will use these before using the built in page templates. Just copy the file out of the wp-plugins/paid-memberships-pro/css folder, use the same filename, and edit the file.
* Fixed a bug where discount codes that reduced a level price to $0 were not being counted as "uses".
* Added a pmpro_email_data filter to make it easier to add variables to edited email templates.
* Added user_login to the data fields all of the emails for use by templates (use !!user_login!! in your template)
* Added $wp_version to globals set in preheaders/checkout.php to properly compare versions later in the script and avoid a notice.
* Added pmpro_email_filter hook to filter entire email object at once.
* Warning fix: Updated email class to check if the template file exists before trying to load the template into the body. (Useful if you are using the PMProEmail class for your own emails.)

= 1.5.8 =
* Fixed bugs with the Membership Billing page. (Thanks, adambware)
* The getMembershipLevelForUser function and getMembershipLevel method of the MemberOrders class will now include expiration_number and expiration_period properties on the returned level. These are needed to properly extend membership levels when checking out for the same level.
* Added pmpro_before_send_to_paypal_standard hook. This is executed at checkout before calling the sendToPayPal method on the order. The register helper plugin has been updated to update user meta fields during this hook in addition to the pmpro_after_checkout hook. (Because for PayPal Standard, when pmpro_after_checkout is called, the $_SESSION vars are unavailable to it. So other plugins relying on the pmpro_after_checkout hook may have issues with PayPal Standard.)
* Re-Added !class_exists("Stripe") check before loading Stripe library. This assumes that other plugins using the Stripe lib are loading compatible versions and/or also checking first before loading the Stripe lib. (*It's important that you test things if you are using multiple plugins loading Stripe. If the other plugins are loading old Stripe APIs first, PMPro may not work correctly.*) The alternative is to namespace the Stripe library for PMPro which would take some more effort.
* Now running email subject lines through html_entity_decode to avoid special characters for apostrophes/etc.
* pmpro_is_login_page() now also checks if is_page("login")
* The pmpro_login_redirect and pmpro_besecure functions, which handle HTTP/HTTPS logic have been updated. pmpro_besecure is now running on login_init instead of login_head to avoid a "cannot resend headers" error. pmpro_login_redirect will strip https from the URL if FORCE_SSL_LOGIN is set but FORCE_SSL_ADMIN is not set to avoid "need to login twice" bugs.
* Updated code to support auto-hiding ads with newer versions of Easy AdSense.
* Updated how the members list CSV is generated to avoid PHP notices when meta values are not found/etc. Also added a prefix to the enclose function in memberslist-csv.php (enclose => pmpro_enclose).
* Now using get_option("date_format") when outputting a date in the admin, frontend, or in an email.
* Proper trial support for Stripe. (We use the trial_period_days parameter of the Stripe plan object to push the first payment back - since the first payment is handled in its own transaction. We now also add days to this based on the # of trial subscriptions set for the level in the admin.
* Added a pmpro_require_billing javascript variable when using Stripe. If a discount code changes the membership level to free, pmpro_require_billing will be set to false and the Stripe JS checks won't fire.

= 1.5.7 =
* Ready for WordPress 3.5
* Fixed issues in the PayPal IPN Handler that were leading to errors when users would checkout using the PayPal standard gateway.

= 1.5.6.1 =
* Fixed "invalid gateway" bug when using PayPal Express option with the PayPal/PayPalExpress gateway.
* Fixed some warnings.

= 1.5.6 =
* Fixes in the new pmpro_getMemberStartdate and pmpro_getMemberDays functions.
* Fixes to SQL queries for the expiration and trial ending crons.
* Added a pmpro_required_user_fields filter similar to the pmpro_required_billing_fields filter.
* Added a function pmpro_setMessage($message, $type) that sets $pmpro_msg and $pmpro_msgt globals if they aren't set already.
* Added a function pmpro_getClassForField($field) that will return a string including "pmpro_error" or "pmpro_required" if applicable. You can filter the classes added to the fields via the pmpro_field_classes filter.
* Showing * on required fields via javascript on the checkout page.
* Updated checkout page to highlight in red fields that are related to the error message shown.
* Added headers property to the PMProEmail object. You can add headers (e.g. to add a cc or bcc) to PMPro emails using the pmpro_email_headers filter.
* Updated Stripe library to version 1.7.10. Updated PMPro to take advantage of new "interval_count" parameter in subscriptions, so you can now have subscriptions setup for "every 2 months", etc.
* Fix to pmpro_checkout_start_date_keep_startdate filter added in 1.5.5
* Added "Start Date" and "End Date" to emails sent to admins when a membership is cancelled.
* Now checks for CSS files in a paid-memberships-pro subfolder of your active theme and uses those admin.css, frontend.css, and print.css files instead if they exist. (Going to move email and page template checks to that subfolder in the future as well.)

= 1.5.5 =
* Updated pmpro_check_site_url_for_https function to cache the siteurl to limit DB queries.
* Added includes/filters.php to store hacks/filters/actions that were originally developed outside of the PMPro core and brought in later... or just things that are cleaner/easier to implement via hooks and filters.
* Added a "delay" property to the membership shortcode. E.g. [membership level="1" delay="7"]...[/membership] will show that content if a member has had level 1 for at least 7 days.
* If a member checks out for the same level again (extending their membership), the startdate added to pmpro_memberships_users will be their old startdate.
* If a member checks out for the same level again, the remaining days on their existing membership will be added to their new enddate. So e.g. if a user starts an annual membership in April 2013, then checks out again (extends) their membership in February 2014, their new enddate will be April 2015 instead of February 2015. (NOTE: if you were doing this through the custom code here - https://gist.github.com/3678054 - you should remove your custom code.)
* Fixed bug where you couldn't remove all required membership levels from a page/post. (Thanks, lisaleague)
* Updated the button CSS included in paid-memberships-pro/css/frontend.css. I added a pmpro_ prefix to these classes so they don't conflict with other .btn CSS rules. I also changed the rules a bit to show the buttons more consistently. If you relied on the old CSS rules, you may need to tweak your theme to get things looking right.

= 1.5.4 =
* Added a gateway check to preheaders/checkout.php. Mischivous users used to be able to bypass payment by passing &gateway=check or something similar to the checkout page. PMPro would then use the check gateway to checkout. Now only the active gateway option in the payments settings or gateways added via the new pmpro_valid_gateways filter (1 parameter is the array of gateways, add/edit the gateways and return the array). It is important that all PMPro users upgrade to keep mischivious users from accessing your site for free. Any site currently enabling multiple gateway options will need to add code to set the valid gateways. More info here: http://www.paidmembershipspro.com/2012/06/offering-multiple-gateway-options-at-checkout/
* Fixed bug where level restrictions would be deleted if a page were updated via quick edit.
* Added if(!class_exists("Stripe")) to the Stripe class definition. This should help with some conflicts if other plugins have their own Stripe library. (Going to update the Stripe library in the next version and work on supporting new Stripe functionality.)
* Fixed a bug where copying a level didn't properly set recurring billing settings. (Thanks, AtheistsUnited)
* Fixed some typos. (Thanks, AtheistsUnited)
* Fixed some warnings.

= 1.5.3.1 =
* Fixed bug in expiration warning cron query. (Backported to 1.5.3)

= 1.5.3 =
* Added PayPal Standard Gateway
* Added code to support using Stripe with the minimal billing fields. Use add_filter("pmpro_stripe_lite", "__return_true"); to enable this
* Added an Email setting to send the default WordPress new user email(wp_new_user_notification) or not. By default this was being sent along with the PMPro checkout confirmation email. Now only the checkout confirmation email will be sent unless you check the new setting. You can still override this with the pmpro_wp_new_user_notification filter.
* Fixed bug: Now re-hiding the "Processing..." message if there is a Stripe javascript error at checkout.
* Updated MemberOrder method saveOrder to check for gateway and gateway_environment properties when inserting. If none are found, it will use what is set in your payment settings. This allows you to set the gateway on a MemberOrder object and save the order with that gateway instead of the default.
* Now only showing the check instructions if the gateway is "check" AND the level is not free.
* Added a check to the notification code in the settings header so it wouldn't display NULL in the notification space if WP passes that back.
* Some warning fixes.
* Fixed a bug in the PayPal Express gateway class where the pre-tax amount was being passed to PayPal instead of the tax-computed amount.
* Added Canadian Dollars as a currency option for Stripe.
* Fixed typo/bug with saving trial amounts in the memberships_users table after checkout. (Thanks, Badfun)
* Fixed bug in initial and recurring revenue calculation on members list page.
* Fixed bug when setting membership_level of current user after checkout that could cause various issues. (Thanks, drrobotnik)
* Fixed bug in Stripe webhook that resulting in cancelation emails being sent to the 1st user in the DB vs. the user who cancelled. (Thanks, Kunjan of QuarkStudios.com)
* The getLastMemberOrder() method of the MemberOrder class now returns the last order with status = 'success' by default. You can override this via the second parameter of the function. So getLastMemberOrder($user_id, "cancelled") to get the last cancelled order or getLastMemberOrder($user_id, false) to get the last order no matter the status.
* Added pmpro_authnet_silent_post_fields filter and pmpro_before_authnet_silent_post and pmpro_after_authnet_silent_post hooks to the Authorize.net silent post handler. All hooks are passed the $fields variable built at the top of the script that mirrors the $_REQUEST array.

= 1.5.2.1 =
* Fixed bugs with pmpro_hasMembershipLevel.
* Added ability to use the 0 level (non-member) in arrays passed to pmpro_hasMembershipLevel. e.g. pmpro_hasMembershipLevel(0,1,2) = has no membership, level 1, or level 2.
* Fixed bug with the pmpro_after_change_membership_level hook, where a level object was passed instead of the id. The object would be nice to have, but we've been passing the id in the past. I changed it back for reverse compatibility. (You can always look up the level by level_id and user_id.

= 1.5.2 =
* Added "Pay by Check" as a gateway option. Users gain immediate access. You can show instructions for who to write the check out to, where to mail it, etc.
* Added uninstall.php script. (Thanks, badfun)
* Fixed bug where the "Use SSL" option reverted to "No" for Testing, Stripe, and PayPal Express gateways whenever the payments settings page was loaded.
* Fixed bug where the IPN Handler URL was not showing up when PayPal Express was selected.
* Fixed bug where PMPro was not sending the proper trial amount to PayPal when using Website Payments Pro or PayPal Express.
* Added id and status fields to the pmpro_memberships_users table and updated all code to use these fields. This is important for allowing multiple membership levels and tracking cancelled orders. (Thanks, Zookatron!)
* Appending ?level=# to the confirmation page URL after checkout to aid in analytics tracking.
* No longer filtering pages/posts from search results if "show excerpts" is set to YES.
* Showing tax on invoices if applicable.
* Sending tax amount to PayPal Express again.
* Added code to force HTTPS if the siteurl option starts with https:
* Hiding billing information box on Membership Account page if the last invoice was by check or paypal express.
* Added pmpro_email_days_til_expiration and pmpro_email_days_til_trial_end to change how many days before expiration/etc to send an email. The default is 7.
* Fixed typo/bug in preheader/checkout.php RE the pmpro_stripe_verify_address hook. (Thanks, Oniiru!)
* Updated the_excerpt filters to prevent PMPro messages from being added to an excerpt twice in some setups.
* the_content filter removes any class="more-link" class from the content if showing an excerpt.

= 1.5.1 =
* Fixed bug in getfile.php introduced in 1.5.
* Fixed bug in the saveOrder method of the Member Order class. When "updating" vs. "inserting" the $id property of the class was being wiped out. This sometimes caused problems if the id was needed later, e.g. with PayPal Express updating orders.
* Now checking if(!defined("WP_USE_THEMES")) instead of if(function_exists("get_userdata")) to see if WP is already loaded.
* Added initial payment to the fee column of the members list.
* Added initial payment as a column in the members list CSV export.
* Added the pmpro_members_list_csv_extra_columns filter to add columns to the Members List CSV export. Sample usage here: https://gist.github.com/3111715

= 1.5 =
* Very important security fix. Please upgrade to 1.5.
* The Members List CSV export is now executed through admin-ajax.php and will only work if you are logged in as an admin (can manage options).
* Fixed service scripts to work if logged in or logged out.
* Changed the applydiscountcode service to going through the site_url() instead of admin-ajax.php to avoid HTTP/HTTPS issues.

= 1.4.9 =
* Important: Fixed handling of services sent through admin-ajax.php. Your silent post/ipnhandler URLs, etc, may have been updated.
* Added stripslashes() to membership description output on the checkout page.
* The pmpro_getLevel() function may return the wrong level on the levels, checkout, or account page where another $pmpro_levels array was setup. (The array pmpro_getLevel uses used the level id as the array keys. The older $pmpro_levels used 0-n.) To fix this, I added a pmpro_getAllLevels($include_hidden = false) function and now use that function on the levels, checkout, and account pages. The function queries the database for all levels and then puts them into an array where the level ids are the keys.
* Fix for !!billing_country!! in emails. (Somehow a previous fix for this got overwritten. My bad.)
* Settings $pmpro_level->code_id to $discount_code_id if a valid discount code is applied to a level at checkout. This is
useful for determining if/what discount code was applied to the level when processing it in hooks.
* Added pmpro_getDomainFromURL() and using that to set PMPRO_URL.
* New hooks when orders are added/updated: pmpro_update_order (before update), pmpro_updated_order (after update), pmpro_add_order (before add), pmpro_added_order (after add). (Thanks, zookatron!)

= 1.4.8 =
* Fixed !!siteemail!! values for email templates.
* Adjusted display of "processing" message next to checkout button when clicked.
* Added billing_country to orders table in DB and the memberorder class. Handling countries better through the code.
* Removing closing ?> at the bottom of various files while working through. This can avoid errors on some setups.
* Using wp_enqueue_style to load plugin stylesheets now.
* Added the pmpro_getCheckoutButton($level_id, $button_text, $classes) function and [pmpro_button level="1"] shortcode to add buttons with links to more easily level checkout pages into your pages and themes. Copied over btn and btn-primary styles from Member Lite theme.
* Updated include/require statements to work if the wp-content folder has been renamed or moved.
* Added code to load scripts in the services folder via admin-ajax.php. (Helps when the plugins folder is not where PMPro expects it to be.)
* The discount code AJAX call is using the new service URL (/wp-admin/admin-ajax.php?action=applydiscountcode).
* Added IPN/Silent Post/Webhook instructions to payment settings page.

= 1.4.7 =
* Fixed some notices in the PayPal gateway code.
* No longer calling Stripe JS at checkout if the level is free.
* Fixed some HTTPS handling for ISS hosting. (IIS sets $_SERVER['HTTPS'] to "off" or "on" instead of TRUE or FALSE.)
* Added #pmpro_processing_message to checkout page which is shown when the submit button is clicked. You can override the message with the pmpro_processing_message filter. You can tweak the CSS to show this differently as well.

= 1.4.6 =
* No longer trying to setup a subscription with Stripe for levels with only an Initial Payment amount.
* Updated recaptchalib.php, which fixes issues with using recaptcha.
* Now setting the first_name and last_name meta fields at checkout to match the business first and last name. (Previous scripts to add additional first/last names to the checkout field should override these.)
* Updated the save profile code to only null out the expiration date for a membership if a blank expiration is explicitly passed through the form. If you had other plugins allowing users to edit their profile, etc, it might not have been passing the expiration date and thus updating users expiration dates. Admins and users would have gotten emails.
* Some updates to applydiscountcodes.php service to support plugging into how discount codes function. Added the pmpro_discount_code_level filter to applydiscountcodes.php.

= 1.4.5.1 =
* Removed debug calls to krumo() which would cause fatal errors in certain situations. Please upgrade. (Note that PMPro versions that go three dots deep are usually the most important ones :)

= 1.4.5 =
* Now setting a var "code_level" in javascript in applydiscountcode.php so it can be used to manipulate prices, etc after applying a discount code.
* Added the pmpro_cancel_previous_subscriptions filter, which is set to false will skip cancelling the old membership level/subscription at checkout. This is dangerous, but is used by the pmpro-addon-packages plugin to have an addon charge without affecting the old subscription. This works because the user is checking out for the same membership level. (So they don't really have > 1 membership level.)
* Trimming strings sent to the Authorize.net API in the subscribe and update calls.

= 1.4.4 =
* Using get_admin_url instead of home_url in various places so the links will work on sites installed in a subdirectory. (Notifications, admin bar, pagination in admin screens, etc.)
* Wrapping some XML fields in Authorize.net API calls in <![CDATA[ ]]> to avoid issues when non-text characters (e.g. &) are included in the level name, etc.

= 1.4.3 =
* Fixed a bunch of notices and warnings on discount codes page in admin.
* Added hooks for changing the discount code page: pmpro_save_discount_code_level, pmpro_save_discount_code, pmpro_discount_code_after_settings, pmpro_discount_code_after_level_settings. Look them up in discountcodes.php to see how they work.
* Updated pmpro_send_html(), which filters emails, to use wpautop instead of nl2br. This will fix any extra double spacing you may have noticed in your emails.
* Added a stripslashes around the membership level confirmation text on the confirmation page. Extra slashes were breaking links, etc.
* Added membership level to subj
