diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 23c9c8254..247c1c678 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,46 @@ == Changelog == += 3.1 RC1 - 2024-07-05 = +* 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: 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 "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 over-escaped HTML in the admin activity email. #2985 (@MaximilianoRicoTabo) +* 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) + = 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) diff --git a/adminpages/dashboard.php b/adminpages/dashboard.php index 2be13cd42..30d56e831 100644 --- a/adminpages/dashboard.php +++ b/adminpages/dashboard.php @@ -11,7 +11,7 @@ /** * Filter the meta boxes to display on the Paid Memberships Pro dashboard. * - * @since TBD + * @since 3.1 * * @param array $pmpro_dashboard_meta_boxes Array of meta boxes to display on the dashboard. Hint: Use the associative array key as the meta box ID. */ diff --git a/adminpages/emailtemplates.php b/adminpages/emailtemplates.php index 66539d78b..ea20e5497 100644 --- a/adminpages/emailtemplates.php +++ b/adminpages/emailtemplates.php @@ -44,7 +44,7 @@ /** * Filter to show the "default" email template in the dropdown. * - * @since TBD + * @since 3.1 * * @param bool $show_default_email_template Whether to show the default email template in the dropdown. */ diff --git a/adminpages/securitysettings.php b/adminpages/securitysettings.php index e8b269e66..01b95fe1e 100644 --- a/adminpages/securitysettings.php +++ b/adminpages/securitysettings.php @@ -60,7 +60,7 @@ /** * Check if plugin is active, installed, or not installed. * - * @since TBD + * @since 3.1 * * @param $plugin_file The plugin file to check. * @return string The status of the plugin (active, inactive, not installed). diff --git a/adminpages/templates/orders-print.php b/adminpages/templates/orders-print.php index 19715f85e..9741b7876 100644 --- a/adminpages/templates/orders-print.php +++ b/adminpages/templates/orders-print.php @@ -133,7 +133,7 @@ /** * Filter to add, edit, or remove information in the meta section of the single order frontend page. * - * @since TBD + * @since 3.1 * @param array $pmpro_order_single_meta Array of meta information. * @param object $order The PMPro Invoice/Order object. * @return array $pmpro_order_single_meta Array of meta information. diff --git a/blocks/build/account-invoices-section/block.json b/blocks/build/account-invoices-section/block.json index 66c678db8..912eea853 100644 --- a/blocks/build/account-invoices-section/block.json +++ b/blocks/build/account-invoices-section/block.json @@ -2,14 +2,14 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "pmpro/account-invoices-section", - "title": "PMPro Page: Account Invoices", + "title": "PMPro Page: Account Orders", "category": "pmpro-pages", - "description": "Dynamic page section that displays a list of the last 5 membership invoices for the active member.", + "description": "Dynamic page section that displays a list of the last 5 membership orders for the active member.", "keywords": [ "account", "member", "order", "purchases", "receipt", "user", "paid memberships pro", "pmpro" ], "attributes" : { "title" : { "type" : "string", - "default" : "Past Invoices" + "default" : "Past Orders" } }, "supports": { diff --git a/blocks/build/account-invoices-section/index.asset.php b/blocks/build/account-invoices-section/index.asset.php index 583cede8c..da796963c 100644 --- a/blocks/build/account-invoices-section/index.asset.php +++ b/blocks/build/account-invoices-section/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-element', 'wp-i18n'), 'version' => '25c7212afb1ce3342816'); + array('wp-block-editor', 'wp-blocks', 'wp-element', 'wp-i18n'), 'version' => '3f13f48f1e73cdfa5c02'); diff --git a/blocks/build/account-invoices-section/index.js b/blocks/build/account-invoices-section/index.js index dfe1935ea..5af375ba4 100644 --- a/blocks/build/account-invoices-section/index.js +++ b/blocks/build/account-invoices-section/index.js @@ -1 +1 @@ -(()=>{"use strict";const e=window.wp.blocks;function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t{n({title:e.target.value})}}))]}})})(); \ No newline at end of file +(()=>{"use strict";const e=window.wp.blocks;function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t{i({title:e.target.value})}}))]}})})(); \ No newline at end of file diff --git a/blocks/build/account-invoices-section/render.php b/blocks/build/account-invoices-section/render.php index 68f4c13f0..021c32a29 100644 --- a/blocks/build/account-invoices-section/render.php +++ b/blocks/build/account-invoices-section/render.php @@ -1,6 +1,6 @@ 'invoices', 'title' => $title ) ); diff --git a/blocks/build/account-page/block.json b/blocks/build/account-page/block.json index 5c905a9d0..df75f4248 100644 --- a/blocks/build/account-page/block.json +++ b/blocks/build/account-page/block.json @@ -4,7 +4,7 @@ "name": "pmpro/account-page", "title": "PMPro Page: Account (Full)", "category": "pmpro-pages", - "description": "Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Invoices, and Member Links. These sections can also be added via separate blocks.", + "description": "Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Orders, and Member Links. These sections can also be added via separate blocks.", "keywords": [ "account", "billing", "invoice", "links", "member", "order", "profile", "purchases", "quick link", "receipt", "user", "paid memberships pro", "pmpro" ], "attributes": { "membership": { diff --git a/blocks/build/account-page/index.asset.php b/blocks/build/account-page/index.asset.php index c9b0fa176..a2e204c83 100644 --- a/blocks/build/account-page/index.asset.php +++ b/blocks/build/account-page/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n'), 'version' => '73170a44cc5d2b528d16'); + array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n'), 'version' => '54ca176cf34baa45eb96'); diff --git a/blocks/build/account-page/index.js b/blocks/build/account-page/index.js index 73930cd7e..8d5838610 100644 --- a/blocks/build/account-page/index.js +++ b/blocks/build/account-page/index.js @@ -1 +1 @@ -(()=>{"use strict";const e=window.wp.blocks;function n(){return n=Object.assign?Object.assign.bind():function(e){for(var n=1;nc({membership:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,t.__)('Show "Profile" Section',"paid-memberships-pro"),checked:e.profile,onChange:e=>c({profile:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,t.__)('Show "Invoices" Section',"paid-memberships-pro"),checked:e.invoices,onChange:e=>c({invoices:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,t.__)('Show "Member Links" Section',"paid-memberships-pro"),checked:e.links,onChange:e=>c({links:e})}))),(0,o.createElement)("div",n({className:"pmpro-block-element"},s),(0,o.createElement)("span",{className:"pmpro-block-title"},(0,t.__)("Paid Memberships Pro","paid-memberships-pro")),(0,o.createElement)("span",{className:"pmpro-block-subtitle"},(0,t.__)("Membership Account Page","paid-memberships-pro"))))}})})(); \ No newline at end of file +(()=>{"use strict";const e=window.wp.blocks;function n(){return n=Object.assign?Object.assign.bind():function(e){for(var n=1;nc({membership:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,r.__)('Show "Profile" Section',"paid-memberships-pro"),checked:e.profile,onChange:e=>c({profile:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,r.__)('Show "Orders" Section',"paid-memberships-pro"),checked:e.invoices,onChange:e=>c({invoices:e})})),(0,o.createElement)(l.PanelBody,null,(0,o.createElement)(l.CheckboxControl,{label:(0,r.__)('Show "Member Links" Section',"paid-memberships-pro"),checked:e.links,onChange:e=>c({links:e})}))),(0,o.createElement)("div",n({className:"pmpro-block-element"},s),(0,o.createElement)("span",{className:"pmpro-block-title"},(0,r.__)("Paid Memberships Pro","paid-memberships-pro")),(0,o.createElement)("span",{className:"pmpro-block-subtitle"},(0,r.__)("Membership Account Page","paid-memberships-pro"))))}})})(); \ No newline at end of file diff --git a/blocks/build/invoice-page/block.json b/blocks/build/invoice-page/block.json index 841054614..d0566bda1 100644 --- a/blocks/build/invoice-page/block.json +++ b/blocks/build/invoice-page/block.json @@ -2,10 +2,10 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "pmpro/invoice-page", - "title": "PMPro Page: Invoice", + "title": "PMPro Page: Orders", "category": "pmpro-pages", - "description": "Dynamic page section that displays a list of all invoices (purchase history) for the active member. Each invoice can be selected and viewed in full detail.", - "keywords": [ "history", "order", "purchases", "receipt", "paid memberships pro", "pmpro" ], + "description": "Dynamic page section that displays a list of all orders (purchase history) for the active member. Each order can be selected and viewed in full detail.", + "keywords": [ "history", "order", "invoice", "purchases", "receipt", "paid memberships pro", "pmpro" ], "attributes" : { }, "supports": { diff --git a/blocks/build/invoice-page/index.asset.php b/blocks/build/invoice-page/index.asset.php index 8f9613423..1fad91170 100644 --- a/blocks/build/invoice-page/index.asset.php +++ b/blocks/build/invoice-page/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-element', 'wp-i18n'), 'version' => '39d2365afb87e37ad30b'); + array('wp-block-editor', 'wp-blocks', 'wp-element', 'wp-i18n'), 'version' => '66caba5420e3a53d5abf'); diff --git a/blocks/build/invoice-page/index.js b/blocks/build/invoice-page/index.js index ce49e4a24..71b5977c1 100644 --- a/blocks/build/invoice-page/index.js +++ b/blocks/build/invoice-page/index.js @@ -1 +1 @@ -(()=>{"use strict";const e=window.wp.blocks;function r(){return r=Object.assign?Object.assign.bind():function(e){for(var r=1;r{"use strict";const e=window.wp.blocks;function r(){return r=Object.assign?Object.assign.bind():function(e){for(var r=1;r diff --git a/classes/class-pmpro-field.php b/classes/class-pmpro-field.php index aa7c32c10..0e0851032 100755 --- a/classes/class-pmpro-field.php +++ b/classes/class-pmpro-field.php @@ -321,14 +321,14 @@ function set($name, $type, $attr = array()) /** * Legacy filter to define what field keys are saved to the wp_users table. * - * @deprecated TBD + * @deprecated 3.1 */ - $user_table_fields = apply_filters_deprecated( 'pmprorh_user_table_fields', array( array( 'user_url' ) ), 'TBD', 'pmpro_user_table_fields' ); + $user_table_fields = apply_filters_deprecated( 'pmprorh_user_table_fields', array( array( 'user_url' ) ), '3.1', 'pmpro_user_table_fields' ); /** * Filter to define what field keys are saved to the wp_users table. * - * @since TBD + * @since 3.1 * * @param array $user_table_fields Array of field keys saved to the wp_users table. * @return array $user_table_fields Array of field keys saved to the wp_users table. @@ -381,14 +381,14 @@ function set($name, $type, $attr = array()) /** * Legacy filter to repair non-associative options. * - * @deprecated TBD + * @deprecated 3.1 */ - $repair_non_associative_options = apply_filters_deprecated( 'pmprorh_repair_non_associative_options', array( true ), 'TBD', 'pmpro_field_repair_non_associative_options' ); + $repair_non_associative_options = apply_filters_deprecated( 'pmprorh_repair_non_associative_options', array( true ), '3.1', 'pmpro_field_repair_non_associative_options' ); /** * Filter to repair non-associative options. * - * @since TBD + * @since 3.1 * * @param bool $repair_non_associative_options Whether to repair non-associative options. * @return bool $repair_non_associative_options Whether to repair non-associative options. @@ -1019,17 +1019,17 @@ function getHTML($value = "") /** * Legacy filter to show a field as required on the profile page. * - * @deprecated TBD Use the pmpro_show_required_on_profile filter instead. + * @deprecated 3.1 Use the pmpro_show_required_on_profile filter instead. * * @param bool $showrequired Whether to show the field as required on the profile page. * @return bool Whether to show the field as required on the profile page. */ - $show_required_on_profile = apply_filters_deprecated( 'pmprorh_show_required_on_profile', array( false, $this ), 'TBD', 'pmpro_field_show_required_on_profile' ); + $show_required_on_profile = apply_filters_deprecated( 'pmprorh_show_required_on_profile', array( false, $this ), '3.1', 'pmpro_field_show_required_on_profile' ); /** * Filter to show a field as required on the profile page. * - * @since TBD + * @since 3.1 * * @param bool $showrequired Whether to show the field as required on the profile page. * @return bool Whether to show the field as required on the profile page. @@ -1050,17 +1050,17 @@ function getHTML($value = "") /** * Legacy filter to allow hooking into the generated field HTML. * - * @deprecated TBD + * @deprecated 3.1 * * @param string $r The field HTML. * @param PMPro_Field $field The field object. */ - $r = apply_filters_deprecated( 'pmprorh_get_html', array( $r, $this ), 'TBD', 'pmpro_field_get_html' ); + $r = apply_filters_deprecated( 'pmprorh_get_html', array( $r, $this ), '3.1', 'pmpro_field_get_html' ); /** * Filter to allow hooking into the generated field HTML. * - * @since TBD + * @since 3.1 * * @param string $r The field HTML. * @param PMPro_Field $field The field object. diff --git a/classes/class-pmpro-subscription.php b/classes/class-pmpro-subscription.php index 793587efa..eb8a0ab37 100644 --- a/classes/class-pmpro-subscription.php +++ b/classes/class-pmpro-subscription.php @@ -1013,7 +1013,7 @@ public function get_cost_text() { /** * Filter the cost text for this subscription. * - * @since TBD + * @since 3.1 * * @param string $cost_text The cost text for this subscription. * @param PMPro_Subscription $this The subscription object. diff --git a/classes/class.memberorder.php b/classes/class.memberorder.php index f17861442..066d330e7 100644 --- a/classes/class.memberorder.php +++ b/classes/class.memberorder.php @@ -1864,7 +1864,7 @@ function has_billing_address() { /** * Get the formatted total for this order. * - * @since TBD + * @since 3.1 * * @return string */ @@ -1874,7 +1874,7 @@ public function get_formatted_total() { /** * Filter the formatted total for this order. * - * @since TBD + * @since 3.1 * * @param string $formatted_total The formatted total for this order. * @param MemberOrder $this The order object. @@ -1885,7 +1885,7 @@ public function get_formatted_total() { /** * Get the formatted subtotal for this order. * - * @since TBD + * @since 3.1 * * @return string */ @@ -1895,7 +1895,7 @@ public function get_formatted_subtotal() { /** * Filter the formatted subtotal for this order. * - * @since TBD + * @since 3.1 * * @param string $formatted_subtotal The formatted subtotal for this order. * @param MemberOrder $this The order object. @@ -1906,7 +1906,7 @@ public function get_formatted_subtotal() { /** * Get the formatted tax for this order. * - * @since TBD + * @since 3.1 * * @return string */ @@ -1916,7 +1916,7 @@ public function get_formatted_tax() { /** * Filter the formatted tax for this order. * - * @since TBD + * @since 3.1 * * @param string $formatted_tax The formatted tax for this order. * @param MemberOrder $this The order object. diff --git a/classes/class.pmproemail.php b/classes/class.pmproemail.php index aaacea6f5..73a8cb218 100644 --- a/classes/class.pmproemail.php +++ b/classes/class.pmproemail.php @@ -447,7 +447,7 @@ function sendCancelOnNextPaymentDateEmail( $user, $level_id ) { * @param WP_User $user The WordPress user object. * @param int $level_id The level ID of the level that was cancelled. * @return bool True if the email was sent, false otherwise. - * @since TBD + * @since 3.1 */ function sendCancelOnNextPaymentDateAdminEmail( $user, $level_id ) { // If an array is passed for $level_id, throw doing it wrong warning. @@ -1328,7 +1328,7 @@ function sendTrialEndingEmail( $user = NULL, $membership_id = NULL ) { * @param object $user The WordPress user object. * @param int $membership_id The member's membership level ID. * @return bool Whether the email was sent successfully. - * @since TBD + * @since 3.1 */ function sendMembershipExpiredEmail( $user = NULL, $membership_id = NULL ) { global $current_user, $wpdb; diff --git a/classes/gateways/class.pmprogateway_check.php b/classes/gateways/class.pmprogateway_check.php index 1ae387407..30de42ece 100644 --- a/classes/gateways/class.pmprogateway_check.php +++ b/classes/gateways/class.pmprogateway_check.php @@ -180,7 +180,7 @@ static function pmpro_checkout_after_payment_information_fields() { /** * Show instructions on the single order frontend page. * - * @since TBD + * @since 3.1 */ static function pmpro_order_single_before_order_details( $order) { if ( $order->gateway == 'check' && ! pmpro_isLevelFree( $order->membership_level ) && $order->status == 'pending' ) { diff --git a/classes/gateways/class.pmprogateway_paypal.php b/classes/gateways/class.pmprogateway_paypal.php index 0fef2bd13..c754543d3 100644 --- a/classes/gateways/class.pmprogateway_paypal.php +++ b/classes/gateways/class.pmprogateway_paypal.php @@ -107,10 +107,10 @@ static function pmpro_payment_options($options) * Display fields for this gateway's options. * * @since 1.8 - * @deprecated TBD + * @deprecated 3.1 */ static function pmpro_payment_option_fields($values, $gateway) { - _deprecated_function( __FUNCTION__, 'TBD', 'PMProGateway_paypalexpress::pmpro_payment_option_fields()' ); + _deprecated_function( __FUNCTION__, '3.1', 'PMProGateway_paypalexpress::pmpro_payment_option_fields()' ); PMProGateway_paypalexpress::pmpro_payment_option_fields( $values, $gateway ); } diff --git a/classes/gateways/class.pmprogateway_paypalstandard.php b/classes/gateways/class.pmprogateway_paypalstandard.php index 8355ebae4..ad154f7e5 100644 --- a/classes/gateways/class.pmprogateway_paypalstandard.php +++ b/classes/gateways/class.pmprogateway_paypalstandard.php @@ -106,10 +106,10 @@ static function pmpro_payment_options($options) * Display fields for this gateway's options. * * @since 1.8 - * @deprecated TBD + * @deprecated 3.1 */ static function pmpro_payment_option_fields($values, $gateway) { - _deprecated_function( __FUNCTION__, 'TBD', 'PMProGateway_paypalexpress::pmpro_payment_option_fields()' ); + _deprecated_function( __FUNCTION__, '3.1', 'PMProGateway_paypalexpress::pmpro_payment_option_fields()' ); PMProGateway_paypalexpress::pmpro_payment_option_fields( $values, $gateway ); } diff --git a/includes/addons.php b/includes/addons.php index 133d13f73..cee5140d7 100644 --- a/includes/addons.php +++ b/includes/addons.php @@ -74,7 +74,7 @@ function pmpro_getAddons() { /** * Get a list of installed Add Ons with incorrect folder names. * - * @since TBD + * @since 3.1 * * @return array $incorrect_folder_names An array of Add Ons with incorrect folder names. The key is the installed folder name, the value is the Add On data. */ diff --git a/includes/blocks.php b/includes/blocks.php index d8d308ff7..891274360 100644 --- a/includes/blocks.php +++ b/includes/blocks.php @@ -203,7 +203,7 @@ function pmpro_filter_core_blocks( $block_content, $block ) { * * @param array $metadata The block metadata. * @return array The filtered block metadata. - * @since TBD + * @since 3.1 * */ function pmpro_block_type_metadata( $metadata ) { diff --git a/includes/checkout.php b/includes/checkout.php index 9debc6a24..8ceb63d60 100644 --- a/includes/checkout.php +++ b/includes/checkout.php @@ -165,7 +165,7 @@ function pmpro_pull_checkout_data_from_order( $order ) { /** * Complete a checkout. * - * @since TBD + * @since 3.1 * * @param MemberOrder $order The order to complete the checkout for. * @return bool True if the checkout was completed successfully, false otherwise. diff --git a/includes/compatibility/lifterlms.php b/includes/compatibility/lifterlms.php index 684ea91ca..b45fc13e7 100644 --- a/includes/compatibility/lifterlms.php +++ b/includes/compatibility/lifterlms.php @@ -463,7 +463,7 @@ function pmpro_lifter_install_get_pages( $pages ) { * * @param array $args The post type arguments. * @param string $post_type The post type name. - * @since TBD + * @since 3.1 */ function pmpro_lifter_unregister_membership_post_type( $args, $post_type ) { // Bail if streamline is not enabled. diff --git a/includes/deprecated.php b/includes/deprecated.php index 404fff877..7e1490498 100644 --- a/includes/deprecated.php +++ b/includes/deprecated.php @@ -1022,7 +1022,7 @@ function pmpro_get_plugin_duplicates() { * Show admin notice if site was using a custom-loaded frontend.css file. * We no longer enqueue the frontend.css override file by default. * - * @since TBD + * @since 3.1 */ function pmpro_was_loading_frontend_css_notice() { global $current_user; diff --git a/includes/email.php b/includes/email.php index 80b16cd98..eeda42a30 100644 --- a/includes/email.php +++ b/includes/email.php @@ -7,7 +7,7 @@ * * @param string $from_name The default from name. * @return string The from name. - * @since TBD + * @since 3.1 */ function pmpro_wp_mail_from_name( $from_name ) { $default_from_name = 'WordPress'; @@ -28,7 +28,7 @@ function pmpro_wp_mail_from_name( $from_name ) { * * @param string $from_email The default from email. * @return string The from email. - * @since TBD + * @since 3.1 */ function pmpro_wp_mail_from( $from_email ) { // default from email wordpress@sitename @@ -76,7 +76,7 @@ function pmpro_wp_mail_from( $from_email ) { * Add template files and change content type to HTML if using PHPMailer directly. * * @param object $phpmailer The PHPMailer object. - * @since TBD + * @since 3.1 */ function pmpro_send_html( $phpmailer ) { @@ -171,7 +171,7 @@ function pmpro_wp_mail_content_type( $content_type ) { * * @param string $message The message to be sent in the email. * @return string The message to be sent in the email. - * @since TBD + * @since 3.1 */ function pmpro_retrieve_password_message( $message ) { if ( has_filter( 'wp_mail_content_type', 'pmpro_wp_mail_content_type' ) ) { @@ -190,7 +190,7 @@ function pmpro_retrieve_password_message( $message ) { * Get template data. Ajax endpoint to get template data from the database and serve into the client side. * * @return void Despite it doesn't return anything, it echoes the template data. - * @since TBD + * @since 3.1 */ function pmpro_email_templates_get_template_data() { @@ -259,7 +259,7 @@ function pmpro_email_templates_save_template_data() { * Reset template data. Ajax endpoint to reset template data to the default values. * * @return void Despite it doesn't return anything, it echoes the template data. - * @since TBD + * @since 3.1 */ function pmpro_email_templates_reset_template_data() { @@ -289,7 +289,7 @@ function pmpro_email_templates_reset_template_data() { * Disable/Enable template. Ajax endpoint to disable or enable a template. * * @return void Despite it doesn't return anything, it echoes the template data. - * @since TBD + * @since 3.1 */ function pmpro_email_templates_disable_template() { @@ -312,7 +312,7 @@ function pmpro_email_templates_disable_template() { * Send test email. Ajax endpoint to send a test email. * * @return void Despite it doesn't return anything, it echoes the response. - * @since TBD + * @since 3.1 */ function pmpro_email_templates_send_test() { diff --git a/includes/functions.php b/includes/functions.php index 1b0122889..df980eac1 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -2138,7 +2138,7 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL /** * Filter the header message for the no access message. * - * @since TBD + * @since 3.1 * * @param string $header The header message for the no access message. * @param array $level_ids The array of level IDs this post is protected for. @@ -2148,7 +2148,7 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL /** * Filter the body message for the no access message. * - * @since TBD + * @since 3.1 * * @param string $body The body message for the no access message. * @param array $level_ids The array of level IDs this post is protected for. @@ -2158,12 +2158,12 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL /** * Legacy filter for logged-out message for non-members/logged-out visitors. * - * @deprecated TBD + * @deprecated 3.1 */ if ( ! is_user_logged_in() ) { - $body = apply_filters_deprecated( 'pmpro_not_logged_in_text_filter', array( $body ), 'TBD', 'pmpro_no_access_message_body' ); + $body = apply_filters_deprecated( 'pmpro_not_logged_in_text_filter', array( $body ), '3.1', 'pmpro_no_access_message_body' ); } else { - $body = apply_filters_deprecated( 'pmpro_non_member_text_filter', array( $body ), 'TBD', 'pmpro_no_access_message_body' ); + $body = apply_filters_deprecated( 'pmpro_non_member_text_filter', array( $body ), '3.1', 'pmpro_no_access_message_body' ); } // Build the content message. @@ -2187,7 +2187,7 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL /** * Filter the HTML of the no access message. * - * @since TBD + * @since 3.1 * * @param string $content_message The HTML of the no access message. * @param array $level_ids The array of level IDs this post is protected for. @@ -4886,7 +4886,7 @@ function pmpro_hex_to_hsl_parts( $hex ) { /** * Calculate the end date for the period of time this order covers in the subscription. * - * @since TBD + * @since 3.1 * * @param MemberOrder $order The order to calculate the end date date for. * @param string $date_format The format to use when formatting the profile start date. diff --git a/includes/updates/upgrade_3_1.php b/includes/updates/upgrade_3_1.php index 01f00d1b7..5c643a799 100644 --- a/includes/updates/upgrade_3_1.php +++ b/includes/updates/upgrade_3_1.php @@ -5,7 +5,7 @@ * We are eliminating the SSL Seal Code setting. * We are also changing the default text and adding a setting for protected content messages. * - * @since TBD + * @since 3.1 */ function pmpro_upgrade_3_1() { delete_option( 'pmpro_sslseal' ); diff --git a/package.json b/package.json index 999b114dd..68335a32f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paid-memberships-pro", - "version": "3.0.6", + "version": "3.0.99", "description": "WordPress Membership Plugin", "directories": { "test": "tests" diff --git a/pages/billing.php b/pages/billing.php index 75d24e4f9..18ed67c63 100644 --- a/pages/billing.php +++ b/pages/billing.php @@ -1,12 +1,12 @@ 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: 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 "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 over-escaped HTML in the admin activity email. #2985 (@MaximilianoRicoTabo) +* 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) + = 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)