diff --git a/changelog.txt b/changelog.txt index 8db75a9..5d6289d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,28 @@ *** Woo Subscriptions Changelog *** +2023-10-18 - version 5.6.0 +* Add: Introduce the "Subscription Relationship" column under the Orders list admin page when HPOS is enabled. +* Add: Use admin theme color and the correct WooCommerce colors. +* Fix: Resolved an issue that caused subscriptions to go on-hold when a customer fails or abandons an early renewal order payment. +* Fix: Resolved an issue that caused subscriptions with an unpaid early renewal order to be incorrectly considered as needing payment. +* Fix: When HPOS is enabled, make the orders_by_type_query filter box work in the WooCommerce orders screen. +* Fix: Ensure renewal orders paid via the Block Checkout are correctly linked to their subscription. +* Fix: Resolved an issue that caused paying for failed/pending parent orders that include Product Add-ons to not calculate the correct total. +* Fix: Ensure the order needs processing transient is deleted when a subscription order (eg renewal) is created. Fixes issues with renewal orders going straight to a completed status. +* Fix: Store the correct subscription start date in postmeta and ordermeta when HPOS and data syncing is being used. +* Fix: When HPOS is enabled, deleting a customer will now delete their subscriptions. +* Fix: Missing styles on the Edit Subscription page when HPOS is enabled. +* Fix: Resolve an issue that would cause additional subscriptions to be created when completing a switch via the Block Checkout. +* Fix: Resolve an issue that would cause 3rd party plugin edit product fields with the show_if_variable-subscription class to be incorrectly hidden. +* Fix: Allow gateways to execute action on payment method deletion before updating the subscription. +* Fix: Ensure subscriptions have a date created that correctly accounts for the site's timezone. Fixes issues with subscriptions having a date created double the site's UTC offset. +* Fix: When HPOS is enabled, fix quick-editing the subscription statuses on the admin list table. +* Dev: PHP 8.2: Fix "Creation of dynamic property" warnings. +* Dev: PHP 8.2: Fix "Automatic conversion of false to array is deprecated" warnings. +* Dev: PHP warnings from using debug_backtrace(). +* Dev: Updated subscriptions-core to 6.4.0 +* Dev: Updated the hooks for Checkout Blocks, replacing the deprecated `woocommerce_blocks_checkout_` prefixed hooks with `woocommerce_store_api_checkout`. + 2023-09-21 - version 5.5.0 * Tweak - Use admin theme color in selectors. * Tweak - Change plugin name to Woo Subscriptions. diff --git a/includes/admin/reports/class-wcs-report-dashboard.php b/includes/admin/reports/class-wcs-report-dashboard.php index 8e4a09d..211143d 100644 --- a/includes/admin/reports/class-wcs-report-dashboard.php +++ b/includes/admin/reports/class-wcs-report-dashboard.php @@ -52,6 +52,11 @@ class WCS_Report_Dashboard { $cached_results = get_transient( strtolower( __CLASS__ ) ); + // Set a default value for cached results for PHP 8.2+ compatibility. + if ( empty( $cached_results ) ) { + $cached_results = []; + } + // Subscription signups this month $query = $wpdb->prepare( "SELECT COUNT(DISTINCT wcsubs.ID) AS count @@ -69,7 +74,7 @@ class WCS_Report_Dashboard { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = $wpdb->get_var( apply_filters( 'woocommerce_subscription_dashboard_status_widget_signup_query', $query ) ); $update_cache = true; @@ -128,7 +133,7 @@ class WCS_Report_Dashboard { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = $wpdb->get_var( apply_filters( 'woocommerce_subscription_dashboard_status_widget_renewal_query', $query ) ); $update_cache = true; @@ -162,7 +167,7 @@ class WCS_Report_Dashboard { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = $wpdb->get_var( apply_filters( 'woocommerce_subscription_dashboard_status_widget_renewal_revenue_query', $query ) ); $update_cache = true; @@ -185,7 +190,7 @@ class WCS_Report_Dashboard { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = $wpdb->get_var( apply_filters( 'woocommerce_subscription_dashboard_status_widget_cancellation_query', $query ) ); $update_cache = true; diff --git a/includes/admin/reports/class-wcs-report-subscription-by-customer.php b/includes/admin/reports/class-wcs-report-subscription-by-customer.php index 2738b40..390504b 100644 --- a/includes/admin/reports/class-wcs-report-subscription-by-customer.php +++ b/includes/admin/reports/class-wcs-report-subscription-by-customer.php @@ -239,7 +239,12 @@ class WCS_Report_Subscription_By_Customer extends WP_List_Table { $cached_results = get_transient( strtolower( __CLASS__ ) ); $query_hash = md5( $total_query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + // Set a default value for cached results for PHP 8.2+ compatibility. + if ( empty( $cached_results ) ) { + $cached_results = []; + } + + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { // Enable big selects for reports $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_customer_total_data', $wpdb->get_row( $total_query ) ); @@ -268,7 +273,7 @@ class WCS_Report_Subscription_By_Customer extends WP_List_Table { $query_hash = md5( $renewal_switch_total_query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { // Enable big selects for reports $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_customer_total_renewal_switch_data', $wpdb->get_row( $renewal_switch_total_query ) ); diff --git a/includes/admin/reports/class-wcs-report-subscription-by-product.php b/includes/admin/reports/class-wcs-report-subscription-by-product.php index d315be7..59829f0 100644 --- a/includes/admin/reports/class-wcs-report-subscription-by-product.php +++ b/includes/admin/reports/class-wcs-report-subscription-by-product.php @@ -161,7 +161,12 @@ class WCS_Report_Subscription_By_Product extends WP_List_Table { $cached_results = get_transient( strtolower( __CLASS__ ) ); $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + // Set a default value for cached results for PHP 8.2+ compatibility. + if ( empty( $cached_results ) ) { + $cached_results = []; + } + + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_product_data', $wpdb->get_results( $query, OBJECT_K ), $args ); set_transient( strtolower( __CLASS__ ), $cached_results, WEEK_IN_SECONDS ); @@ -214,7 +219,7 @@ class WCS_Report_Subscription_By_Product extends WP_List_Table { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_product_lifetime_value_data', $wpdb->get_results( $query, OBJECT_K ), $args ); set_transient( strtolower( __CLASS__ ), $cached_results, WEEK_IN_SECONDS ); diff --git a/includes/admin/reports/class-wcs-report-subscription-events-by-date.php b/includes/admin/reports/class-wcs-report-subscription-events-by-date.php index 0800ca4..1d26e30 100644 --- a/includes/admin/reports/class-wcs-report-subscription-events-by-date.php +++ b/includes/admin/reports/class-wcs-report-subscription-events-by-date.php @@ -268,6 +268,11 @@ class WCS_Report_Subscription_Events_By_Date extends WC_Admin_Report { $cached_results = get_transient( strtolower( get_class( $this ) ) ); + // Set a default value for cached results for PHP 8.2+ compatibility. + if ( empty( $cached_results ) ) { + $cached_results = []; + } + // Check if we need to update the cache with the query results from the figures generated by get_order_report_data(). foreach ( array( 'new_subscriptions' => 'new_subscriptions', 'renewals' => 'renewal', 'resubscribes' => 'resubscribe', 'switches' => 'switch' ) as $report => $property_key ) { // phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound $query_hash = $this->report_data->{"{$report}_query_hash"}; @@ -314,7 +319,7 @@ class WCS_Report_Subscription_Events_By_Date extends WC_Admin_Report { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_subscription_events_sign_up_data', (array) $wpdb->get_results( $query ), $args ); $update_cache = true; @@ -379,7 +384,7 @@ class WCS_Report_Subscription_Events_By_Date extends WC_Admin_Report { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_subscription_events_subscriber_count_data', (array) $wpdb->get_results( $query ), $args ); $update_cache = true; @@ -408,7 +413,7 @@ class WCS_Report_Subscription_Events_By_Date extends WC_Admin_Report { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_subscription_events_cancel_count_data', (array) $wpdb->get_results( $query ), $args ); $update_cache = true; @@ -438,7 +443,7 @@ class WCS_Report_Subscription_Events_By_Date extends WC_Admin_Report { $query_hash = md5( $query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_subscription_events_ended_count_data', (array) $wpdb->get_results( $query ), $args ); $update_cache = true; diff --git a/includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php b/includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php index a2b0a35..6aace94 100644 --- a/includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php +++ b/includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php @@ -17,6 +17,8 @@ class WCS_Report_Upcoming_Recurring_Revenue extends WC_Admin_Report { public $order_ids_recurring_totals = null; + public $average_sales = 0; + /** * Get the legend for the main chart sidebar * @return array @@ -161,7 +163,12 @@ class WCS_Report_Upcoming_Recurring_Revenue extends WC_Admin_Report { $cached_results = get_transient( strtolower( get_class( $this ) ) ); $query_hash = md5( $base_query ); - if ( $args['no_cache'] || false === $cached_results || ! isset( $cached_results[ $query_hash ] ) ) { + // Set a default value for cached results for PHP 8.2+ compatibility. + if ( empty( $cached_results ) ) { + $cached_results = []; + } + + if ( $args['no_cache'] || ! isset( $cached_results[ $query_hash ] ) ) { $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' ); $cached_results[ $query_hash ] = apply_filters( 'wcs_reports_upcoming_recurring_revenue_data', $wpdb->get_results( $base_query, OBJECT_K ), $args ); set_transient( strtolower( get_class( $this ) ), $cached_results, WEEK_IN_SECONDS ); diff --git a/includes/early-renewal/class-wcs-cart-early-renewal.php b/includes/early-renewal/class-wcs-cart-early-renewal.php index a3d05b1..58121ed 100644 --- a/includes/early-renewal/class-wcs-cart-early-renewal.php +++ b/includes/early-renewal/class-wcs-cart-early-renewal.php @@ -14,6 +14,13 @@ if ( ! defined( 'ABSPATH' ) ) { class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { + /** + * The meta key used to store whether the subscription dates have been updated for an early renewal. + * + * @var string + */ + const SUBSCRIPTION_DATES_UPDATED_META_KEY = '_wcs_early_renewal_subscription_dates_updated'; + /** * Bootstraps the class and hooks required actions & filters. */ @@ -26,27 +33,14 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { add_action( 'template_redirect', array( $this, 'maybe_setup_cart' ), 100 ); add_action( 'woocommerce_checkout_create_order', array( $this, 'copy_subscription_meta_to_order' ), 90 ); + // Record early renewal payments. - if ( wcs_is_woocommerce_pre( '3.0' ) ) { - add_action( 'woocommerce_checkout_order_processed', array( $this, 'maybe_record_early_renewal' ), 100, 2 ); - } else { - add_action( 'woocommerce_checkout_create_order', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 2 ); - if ( class_exists( 'Automattic\WooCommerce\Blocks\Package' ) ) { - if ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '7.2.0', '>=' ) ) { - add_action( 'woocommerce_store_api_checkout_update_order_meta', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 1 ); - } elseif ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '6.3.0', '>=' ) ) { - add_action( 'woocommerce_blocks_checkout_update_order_meta', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 1 ); - } else { - add_action( '__experimental_woocommerce_blocks_checkout_update_order_meta', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 1 ); - } - } - } + add_action( 'woocommerce_checkout_create_order', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 2 ); - // Process early renewal by making sure subscription's dates are updated. - add_action( 'subscriptions_activated_for_order', array( $this, 'maybe_update_dates' ) ); + add_action( 'woocommerce_store_api_checkout_update_order_meta', array( $this, 'add_early_renewal_metadata_to_order' ), 100, 1 ); - // Handle early renewal orders that are cancelled. - add_action( 'woocommerce_order_status_cancelled', array( $this, 'maybe_reactivate_subscription' ), 100, 2 ); + // Handle early renewal orders status changes. + add_action( 'woocommerce_order_status_changed', array( $this, 'maybe_record_subscription_payment' ), 5, 4 ); // Add a subscription note to record early renewal order. add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'add_note_to_record_early_renewal' ) ); @@ -55,7 +49,7 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'set_cart_item_renewal_order_data' ), 5 ); // Allow customers to cancel early renewal orders from their my account page. - add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'add_cancel_order_action' ), 15, 2 ); + add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'filter_early_renewal_order_actions' ), 15, 2 ); add_action( 'wp_loaded', array( $this, 'allow_early_renewal_order_cancellation' ), 10, 3 ); // Handles early renew of password-protected products. @@ -128,37 +122,6 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { exit; } - /** - * Records an early renewal against order created on checkout (only for WooCommerce < 3.0). - * - * @param int $order_id The post_id of a shop_order post/WC_Order object. - * @param array $posted_data The data posted on checkout. - * @since 2.3.0 - */ - public function maybe_record_early_renewal( $order_id, $posted_data ) { - if ( ! wcs_is_woocommerce_pre( '3.0' ) ) { - wcs_deprecated_function( __METHOD__, '2.0', 'WCS_Cart_Early_Renewal::add_early_renewal_metadata_to_order( $order, $posted_data )' ); - } - - $cart_item = $this->cart_contains(); - - if ( ! $cart_item ) { - return; - } - - // Get the subscription. - $subscription = wcs_get_subscription( $cart_item[ $this->cart_item_key ]['subscription_id'] ); - - // Mark this order as a renewal. - update_post_meta( $order_id, '_subscription_renewal', $subscription->get_id() ); - - // Mark this order as an early renewal. - update_post_meta( $order_id, '_subscription_renewal_early', $subscription->get_id() ); - - // Put the subscription on hold until payment is complete. - $subscription->update_status( 'on-hold', _x( 'Customer requested to renew early:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions' ) ); - } - /** * Copies the metadata from the subscription to the order created on checkout. * @@ -188,8 +151,8 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { * @since 2.3.0 */ public function add_early_renewal_metadata_to_order( $order, $data = array() ) { - $cart_item = $this->cart_contains(); + if ( ! $cart_item ) { return; } @@ -202,65 +165,6 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { // Mark this order as an early renewal. $order->update_meta_data( '_subscription_renewal_early', $subscription->get_id() ); - - // Put the subscription on hold until payment is complete. - $subscription->update_status( 'on-hold', _x( 'Customer requested to renew early:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions' ) ); - } - - /** - * Update the next payment and end dates on a subscription to extend them and account - * for early renewal. - * - * @param int $order_id The WC Order ID which contains an early renewal. - * @since 2.3.0 - */ - public function maybe_update_dates( $order_id ) { - - $order = wc_get_order( $order_id ); - - if ( ! $order || ! wcs_order_contains_early_renewal( $order ) ) { - return; - } - - $subscription_id = wcs_get_objects_property( $order, 'subscription_renewal_early' ); - $subscription = wcs_get_subscription( $subscription_id ); - - if ( ! $subscription ) { - return; - } - - wcs_update_dates_after_early_renewal( $subscription, $order ); - } - - /** - * Reactivates an on hold subscription when an early renewal order - * is cancelled by the user. - * - * @param int $order_id The WC Order ID which contains an early renewal. - * @since 2.3.0 - */ - public function maybe_reactivate_subscription( $order_id ) { - - // Get the order and make sure we have one. - $order = wc_get_order( $order_id ); - - if ( wcs_order_contains_early_renewal( $order ) ) { - - // Get the subscription and make sure we have one. - $subscription = wcs_get_subscription( wcs_get_objects_property( $order, 'subscription_renewal_early' ) ); - - if ( ! $subscription || ! $subscription->has_status( 'on-hold' ) ) { - return; - } - - // Make sure the next payment date isn't in the past. - if ( strtotime( $subscription->get_date( 'next_payment' ) ) < time() ) { - return; - } - - // Reactivate the subscription. - $subscription->update_status( 'active' ); - } } /** @@ -346,19 +250,33 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { } /** - * Ensure customers can cancel early renewal orders. + * Filters the list of actions customers can make on an order from their My Account page. * - * Renewal orders are usually not cancellable because @see WCS_Cart_Renewal::filter_my_account_my_orders_actions() prevents it. - * In the case of early renewals, the customer has opted for early renewal and so should be able to cancel it in order to reactivate their subscription. + * Unlike standard renewal orders early renewal orders can be cancelled and cannot be paid. + * + * This function is intended to run after @see WCS_Cart_Renewal::filter_my_account_my_orders_actions() which removes the cancel and pay option. + * + * @param array $actions A list of actions customers can make on an order from their My Account page. + * @param WC_Order $order The order. * - * @param array $actions A list of actions customers can make on an order from their My Account page - * @param WC_Order $order The order the list of actions relate to. * @return array $actions - * @since 2.3.0 */ - public static function add_cancel_order_action( $actions, $order ) { + public static function filter_early_renewal_order_actions( $actions, $order ) { - if ( ! isset( $actions['cancel'] ) && wcs_order_contains_early_renewal( $order ) && in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( 'pending', 'failed' ), $order ) ) ) { + // Bail if the order can already be cancelled and cannot be paid. + if ( isset( $actions['cancel'] ) && ! isset( $actions['pay'] ) ) { + return $actions; + } + + if ( ! wcs_order_contains_early_renewal( $order ) ) { + return $actions; + } + + // Early renewal orders that failed, cannot be paid. The customer must retry by following the early renewal flow again. + unset( $actions['pay'] ); + + // Add the cancel action back if the order has a status that allows it to be cancelled. + if ( ! isset( $actions['cancel'] ) && in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( 'pending', 'failed' ), $order ) ) ) { $redirect = wc_get_page_permalink( 'myaccount' ); // Redirect the customer back to the view subscription page if that is where they cancel the order from. @@ -384,7 +302,7 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { * Allow customers to cancel early renewal orders from their account page. * * Renewal orders are usually not cancellable because @see WC_Subscriptions_Renewal_Order::prevent_cancelling_renewal_orders() prevents the request from being processed. - * In the case of early renewals, the customer has opted for early renewal and so should be able to cancel it in order to reactivate their subscription. + * In the case of early renewals, the customer has opted for early renewal and so should be able to cancel it. * * @since 2.3.0 */ @@ -519,4 +437,194 @@ class WCS_Cart_Early_Renewal extends WCS_Cart_Renewal { return $order_meta; } + + /** + * Records successful and unsuccessful subscription payments for early renewal orders. + * + * @param int $order_id The ID of the order transitioned. + * @param string $old_status The old order's status. + * @param string $new_status The new order's status. + * @param WC_Order $order The order object. Optional. Older versions of WC didn't provide this. Falls back to the order_id if not provided. + */ + public function maybe_record_subscription_payment( $order_id, $old_status, $new_status, $order = null ) { + + // We're only interested in order status transitions that involve payment. + if ( in_array( $new_status, [ 'cancelled', 'refunded' ] ) ) { + return; + } + + if ( ! $order ) { + $order = wc_get_order( $order_id ); + } + + // Only continue if this is an early renewal order. + if ( ! $order || ! wcs_order_contains_early_renewal( $order ) ) { + return; + } + + // Prevent the default renewal order status transitions from updating the subscription status. + // Early renewal orders are optional and should not affect the subscription status. + if ( remove_action( 'woocommerce_order_status_changed', 'WC_Subscriptions_Renewal_Order::maybe_record_subscription_payment', 10 ) ) { + + // Add a callback to reattach the function which handles renewal order payment status transitions, after the current request has finished. + add_action( 'woocommerce_order_status_changed', array( $this, 'reattach_renewal_order_status_handling' ), 11 ); + } + + // We're only interested in processing order transitions from a status that required payment. + if ( ! in_array( $old_status, apply_filters( 'woocommerce_valid_order_statuses_for_payment', array( 'pending', 'on-hold', 'failed' ), $order ) ) ) { + return; + } + + $subscription = wcs_get_subscription( absint( $order->get_meta( '_subscription_renewal_early' ) ) ); + + // Payment success - if payment was successful and dates haven't been updated for this order, update the subscription dates and store meta to prevent dates being updated multiple times for the same order. + if ( $subscription && $order->is_paid() && ! $order->meta_exists( self::SUBSCRIPTION_DATES_UPDATED_META_KEY ) ) { + wcs_update_dates_after_early_renewal( $subscription, $order ); + + $order->update_meta_data( self::SUBSCRIPTION_DATES_UPDATED_META_KEY, wc_bool_to_string( true ) ); + $order->save(); + } + } + + /** + * Reattaches the function which handles renewal order payment status transitions. + * + * The default renewal order status transition is detached when processing an early renewal + * order but needs to be reattached otherwise any renewal order status updates later in + * this request will not be processed. + * + * @see self::maybe_record_subscription_payment() + * + * @since 5.2.0 + */ + public function reattach_renewal_order_status_handling() { + add_action( 'woocommerce_order_status_changed', 'WC_Subscriptions_Renewal_Order::maybe_record_subscription_payment', 10, 3 ); + } + + // DEPRECATED FUNCTIONS. + + /** + * Update the next payment and end dates on a subscription to extend them and account + * for early renewal. + * + * @deprecated 5.2.0 + * + * @param int $order_id The WC Order ID which contains an early renewal. + * @since 2.3.0 + */ + public function maybe_update_dates( $order_id ) { + wcs_deprecated_function( __METHOD__, '5.2.0' ); + + $order = wc_get_order( $order_id ); + + if ( ! $order || ! wcs_order_contains_early_renewal( $order ) ) { + return; + } + + $subscription_id = wcs_get_objects_property( $order, 'subscription_renewal_early' ); + $subscription = wcs_get_subscription( $subscription_id ); + + if ( ! $subscription ) { + return; + } + + wcs_update_dates_after_early_renewal( $subscription, $order ); + } + + /** + * Reactivates an on hold subscription when an early renewal order + * is cancelled by the user. + * + * @param int $order_id The WC Order ID which contains an early renewal. + * @since 2.3.0 + */ + public function maybe_reactivate_subscription( $order_id ) { + wcs_deprecated_function( __METHOD__, '5.2.0' ); + + // Get the order and make sure we have one. + $order = wc_get_order( $order_id ); + + if ( wcs_order_contains_early_renewal( $order ) ) { + + // Get the subscription and make sure we have one. + $subscription = wcs_get_subscription( wcs_get_objects_property( $order, 'subscription_renewal_early' ) ); + + if ( ! $subscription || ! $subscription->has_status( 'on-hold' ) ) { + return; + } + + // Make sure the next payment date isn't in the past. + if ( strtotime( $subscription->get_date( 'next_payment' ) ) < time() ) { + return; + } + + // Reactivate the subscription. + $subscription->update_status( 'active' ); + } + } + + /** + * Records an early renewal against order created on checkout (only for WooCommerce < 3.0). + * + * @param int $order_id The post_id of a shop_order post/WC_Order object. + * @param array $posted_data The data posted on checkout. + * @since 2.3.0 + */ + public function maybe_record_early_renewal( $order_id, $posted_data ) { + wcs_deprecated_function( __METHOD__, '5.2.0', 'WCS_Cart_Early_Renewal::add_early_renewal_metadata_to_order( $order, $posted_data )' ); + + $cart_item = $this->cart_contains(); + + if ( ! $cart_item ) { + return; + } + + // Get the subscription. + $subscription = wcs_get_subscription( $cart_item[ $this->cart_item_key ]['subscription_id'] ); + + // Mark this order as a renewal. + update_post_meta( $order_id, '_subscription_renewal', $subscription->get_id() ); + + // Mark this order as an early renewal. + update_post_meta( $order_id, '_subscription_renewal_early', $subscription->get_id() ); + + // Put the subscription on hold until payment is complete. + $subscription->update_status( 'on-hold', _x( 'Customer requested to renew early:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions' ) ); + } + + /** + * Ensure customers can cancel early renewal orders. + * + * Renewal orders are usually not cancellable because @see WCS_Cart_Renewal::filter_my_account_my_orders_actions() prevents it. + * In the case of early renewals, the customer has opted for early renewal and so should be able to cancel it. + * + * @param array $actions A list of actions customers can make on an order from their My Account page + * @param WC_Order $order The order the list of actions relate to. + * @return array $actions + * @since 2.3.0 + */ + public static function add_cancel_order_action( $actions, $order ) { + wcs_deprecated_function( __METHOD__, '5.6.0', __CLASS__ . '::filter_early_renewal_order_actions()' ); + + if ( ! isset( $actions['cancel'] ) && wcs_order_contains_early_renewal( $order ) && in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( 'pending', 'failed' ), $order ) ) ) { + $redirect = wc_get_page_permalink( 'myaccount' ); + + // Redirect the customer back to the view subscription page if that is where they cancel the order from. + if ( wcs_is_view_subscription_page() ) { + global $wp; + $subscription = wcs_get_subscription( $wp->query_vars['view-subscription'] ); + + if ( wcs_is_subscription( $subscription ) ) { + $redirect = $subscription->get_view_order_url(); + } + } + + $actions['cancel'] = array( + 'url' => $order->get_cancel_order_url( $redirect ), + 'name' => __( 'Cancel', 'woocommerce-subscriptions' ), + ); + } + + return $actions; + } } diff --git a/includes/payment-retry/admin/class-wcs-retry-admin.php b/includes/payment-retry/admin/class-wcs-retry-admin.php index 8f0217a..b5c612a 100644 --- a/includes/payment-retry/admin/class-wcs-retry-admin.php +++ b/includes/payment-retry/admin/class-wcs-retry-admin.php @@ -14,6 +14,11 @@ if ( ! defined( 'ABSPATH' ) ) { class WCS_Retry_Admin { + /** + * @var string The ID of the setting to enable/disable the retry system. + */ + public $setting_id; + /** * Constructor */ diff --git a/includes/switching/class-wc-subscriptions-switcher.php b/includes/switching/class-wc-subscriptions-switcher.php index bfe58ee..be60c74 100644 --- a/includes/switching/class-wc-subscriptions-switcher.php +++ b/includes/switching/class-wc-subscriptions-switcher.php @@ -54,15 +54,7 @@ class WC_Subscriptions_Switcher { add_action( 'woocommerce_checkout_update_order_meta', array( __CLASS__, 'add_order_meta' ), 10, 2 ); // Same as above for WooCommerce Blocks. - if ( class_exists( 'Automattic\WooCommerce\Blocks\Package' ) ) { - if ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '7.2.0', '>=' ) ) { - add_action( 'woocommerce_store_api_checkout_update_order_meta', array( __CLASS__, 'add_order_meta' ), 10, 1 ); - } elseif ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '6.3.0', '>=' ) ) { - add_action( 'woocommerce_blocks_checkout_update_order_meta', array( __CLASS__, 'add_order_meta' ), 10, 1 ); - } else { - add_action( '__experimental_woocommerce_blocks_checkout_update_order_meta', array( __CLASS__, 'add_order_meta' ), 10, 1 ); - } - } + add_action( 'woocommerce_store_api_checkout_update_order_meta', array( __CLASS__, 'add_order_meta' ), 10, 1 ); // Don't allow switching to the same product add_filter( 'woocommerce_add_to_cart_validation', array( __CLASS__, 'validate_switch_request' ), 10, 4 ); @@ -1224,14 +1216,14 @@ class WC_Subscriptions_Switcher { * @return bool|array Returns cart items that modify subscription contents, or false if no such items exist. */ public static function cart_contains_switches( $item_action = 'switch' ) { - $subscription_switches = false; + $subscription_switches = []; if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || false == DOING_AJAX ) ) { - return $subscription_switches; + return false; } if ( ! isset( WC()->cart ) ) { - return $subscription_switches; + return false; } // We use WC()->cart->cart_contents instead of WC()->cart->get_cart() to prevent recursion caused when get_cart_from_session() is called too early ref: https://github.com/woocommerce/woocommerce/commit/1f3365f2066b1e9d7e84aca7b1d7e89a6989c213 @@ -1263,7 +1255,7 @@ class WC_Subscriptions_Switcher { } } - return $subscription_switches; + return ! empty( $subscription_switches ) ? $subscription_switches : false; } /** diff --git a/includes/switching/class-wcs-switch-cart-item.php b/includes/switching/class-wcs-switch-cart-item.php index 471a1ce..99edafe 100644 --- a/includes/switching/class-wcs-switch-cart-item.php +++ b/includes/switching/class-wcs-switch-cart-item.php @@ -106,6 +106,12 @@ class WCS_Switch_Cart_Item { */ public $switch_type; + /** + * Whether the last order was a switch and was a fully reduced pre-paid term. + * @var bool + */ + public $is_switch_after_fully_reduced_prepaid_term; + /** * Constructor. * diff --git a/languages/woocommerce-subscriptions.pot b/languages/woocommerce-subscriptions.pot index 8f24e70..8be5155 100644 --- a/languages/woocommerce-subscriptions.pot +++ b/languages/woocommerce-subscriptions.pot @@ -2,14 +2,14 @@ # This file is distributed under the same license as the Woo Subscriptions plugin. msgid "" msgstr "" -"Project-Id-Version: Woo Subscriptions 5.5.0\n" +"Project-Id-Version: Woo Subscriptions 5.6.0\n" "Report-Msgid-Bugs-To: https://woocommerce.com/contact-us\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2023-09-21T01:31:59+00:00\n" +"POT-Creation-Date: 2023-10-18T04:37:04+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.8.1\n" "X-Domain: woocommerce-subscriptions\n" @@ -47,7 +47,7 @@ msgid "Subscription reports are incompatible with the %1$sWooCommerce data stora msgstr "" #: includes/admin/class-wcs-admin-reports.php:81 -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:917 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:922 #: vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php:1030 #: vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php:1182 #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-system-status.php:59 @@ -120,31 +120,31 @@ msgstr[0] "" msgstr[1] "" #. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:216 +#: includes/admin/reports/class-wcs-report-dashboard.php:221 msgid "%2$s%1$s signup%3$s subscription signups this month" msgid_plural "%2$s%1$s signups%3$s subscription signups this month" msgstr[0] "" msgstr[1] "" #. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-dashboard.php:224 +#: includes/admin/reports/class-wcs-report-dashboard.php:229 msgid "%s signup revenue this month" msgstr "" #. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:232 +#: includes/admin/reports/class-wcs-report-dashboard.php:237 msgid "%2$s%1$s renewal%3$s subscription renewals this month" msgid_plural "%2$s%1$s renewals%3$s subscription renewals this month" msgstr[0] "" msgstr[1] "" #. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-dashboard.php:240 +#: includes/admin/reports/class-wcs-report-dashboard.php:245 msgid "%s renewal revenue this month" msgstr "" #. translators: 1$: count, 2$ and 3$ are opening and closing strong tags, respectively. -#: includes/admin/reports/class-wcs-report-dashboard.php:248 +#: includes/admin/reports/class-wcs-report-dashboard.php:253 msgid "%2$s%1$s cancellation%3$s subscription cancellations this month" msgid_plural "%2$s%1$s cancellations%3$s subscription cancellations this month" msgstr[0] "" @@ -312,209 +312,209 @@ msgstr "" msgid "The average line total on all orders for this product line item." msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:300 -#: includes/admin/reports/class-wcs-report-subscription-by-product.php:340 +#: includes/admin/reports/class-wcs-report-subscription-by-product.php:305 +#: includes/admin/reports/class-wcs-report-subscription-by-product.php:345 msgid "subscriptions" msgstr "" #. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:488 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:493 msgid "%s signup revenue in this period" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:489 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:494 msgid "The sum of all subscription parent orders, including other items, fees, tax and shipping." msgstr "" #. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:496 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:501 msgid "%s renewal revenue in this period" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:497 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:502 msgid "The sum of all renewal orders including tax and shipping." msgstr "" #. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:504 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:509 msgid "%s resubscribe revenue in this period" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:505 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:510 msgid "The sum of all resubscribe orders including tax and shipping." msgstr "" #. translators: %s: formatted total amount. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:512 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:517 msgid "%s switch revenue in this period" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:513 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:518 msgid "The sum of all switch orders including tax and shipping." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:521 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:526 msgid "%2$s %1$s new subscriptions" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:535 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:540 msgid "The number of subscriptions created during this period, either by being manually created, imported or a customer placing an order. This includes orders pending payment." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:543 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:548 msgid "%2$s %1$s subscription signups" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:557 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:562 msgid "The number of subscriptions purchased in parent orders created during this period. This represents the new subscriptions created by customers placing an order via checkout." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:565 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:570 msgid "%2$s %1$s subscription resubscribes" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:579 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:584 msgid "The number of resubscribe orders processed during this period." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:587 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:592 msgid "%2$s %1$s subscription renewals" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:601 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:606 msgid "The number of renewal orders processed during this period." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:609 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:614 msgid "%2$s %1$s subscription switches" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:623 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:628 msgid "The number of subscriptions upgraded, downgraded or cross-graded during this period." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:631 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:636 msgid "%2$s %1$s subscription cancellations" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:645 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:650 msgid "The number of subscriptions cancelled by the customer or store manager during this period. The pre-paid term may not yet have ended during this period." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:653 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:658 msgid "%2$s %1$s ended subscriptions" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:667 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:672 msgid "The number of subscriptions which have either expired or reached the end of the prepaid term if it was previously cancelled." msgstr "" #. translators: 2: link opening tag, 1: subscription count and closing tag. -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:678 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:683 msgid "%2$s %1$s current subscriptions" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:693 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:698 msgid "The number of subscriptions during this period with an end date in the future and a status other than pending." msgstr "" #. translators: %s: subscription net gain (with percentage). -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:710 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:715 msgid "%s net subscription gain" msgstr "" #. translators: %s: subscription net loss (with percentage). -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:713 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:718 msgid "%s net subscription loss" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:718 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:723 msgid "Change in subscriptions between the start and end of the period." msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:732 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:737 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:159 msgid "Year" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:733 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:738 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:160 msgid "Last Month" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:734 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:739 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:161 msgid "This Month" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:735 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:740 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:162 msgid "Last 7 Days" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:776 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:781 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:195 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:209 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:216 #: vendor/woocommerce/subscriptions-core/includes/admin/meta-boxes/views/html-related-orders-table.php:20 #: vendor/woocommerce/subscriptions-core/templates/myaccount/related-orders.php:23 #: vendor/woocommerce/subscriptions-core/templates/myaccount/related-orders.php:47 msgid "Date" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:780 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:785 #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:199 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:213 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:220 msgid "Export CSV" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:839 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:844 msgid "Switched subscriptions" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:855 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:860 msgid "New Subscriptions" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:871 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:876 msgid "Subscriptions signups" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:886 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:891 msgid "Number of resubscribes" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:901 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:906 msgid "Number of renewals" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:933 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:938 msgid "Subscriptions Ended" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:949 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:954 msgid "Cancellations" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:964 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:969 msgid "Signup Totals" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:984 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:989 msgid "Resubscribe Totals" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:1004 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:1009 msgid "Renewal Totals" msgstr "" -#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:1024 +#: includes/admin/reports/class-wcs-report-subscription-events-by-date.php:1029 msgid "Switch Totals" msgstr "" @@ -529,7 +529,7 @@ msgstr "" #. translators: %s: renewal count. #: includes/admin/reports/class-wcs-report-subscription-payment-retry.php:121 -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:96 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:98 msgid "%s renewal orders" msgstr "" @@ -581,44 +581,44 @@ msgid "Recovered Renewal Revenue" msgstr "" #. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:89 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:91 msgid "%s renewal income in this period" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:90 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:92 msgid "The sum of all the upcoming renewal orders, including items, fees, tax and shipping, for currently active subscriptions." msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:97 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:99 msgid "The number of upcoming renewal orders, for currently active subscriptions." msgstr "" #. translators: %s: formatted amount. -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:103 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:105 msgid "%s average renewal amount" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:179 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:186 msgid "Next 12 Months" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:180 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:187 msgid "Next 30 Days" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:181 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:188 msgid "Next Month" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:182 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:189 msgid "Next 7 Days" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:247 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:254 msgid "Renewals count" msgstr "" -#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:256 +#: includes/admin/reports/class-wcs-report-upcoming-recurring-revenue.php:263 msgid "Renewals amount" msgstr "" @@ -1046,7 +1046,7 @@ msgstr "" #: includes/class-wcs-call-to-action-button-text-manager.php:47 #: includes/class-wcs-call-to-action-button-text-manager.php:55 #: includes/class-wcs-call-to-action-button-text-manager.php:58 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:661 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:657 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-product.php:1204 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-product.php:1236 msgid "Sign up now" @@ -1074,7 +1074,7 @@ msgid "Set a maximum number of times a customer can suspend their account for ea msgstr "" #: includes/class-wcs-customer-suspension-manager.php:111 -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1333 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1334 msgid "Suspend" msgstr "" @@ -1240,16 +1240,16 @@ msgstr "" msgid "Allow a subscription product with a $0 initial payment to be purchased without providing a payment method. The customer will be required to provide a payment method at the end of the initial period to keep the subscription active." msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:80 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:74 msgid "Renew now" msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:100 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:94 #: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-resubscribe.php:74 msgid "That subscription does not exist. Has it been deleted?" msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:104 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:98 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-change-payment-gateway.php:232 #: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-resubscribe.php:78 #: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-resubscribe.php:129 @@ -1257,25 +1257,19 @@ msgstr "" msgid "That doesn't appear to be one of your subscriptions." msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:108 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:102 msgid "You can not renew this subscription early. Please contact us if you need assistance." msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:114 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:108 msgid "Complete checkout to renew now." msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:159 -#: includes/early-renewal/class-wcs-cart-early-renewal.php:207 -msgctxt "used in order note as reason for why subscription status changed" -msgid "Customer requested to renew early:" -msgstr "" - #. translators: %s: order ID. #. translators: placeholder is an order number. #. translators: placeholder is an order ID. #. translators: %s: order number. -#: includes/early-renewal/class-wcs-cart-early-renewal.php:318 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:222 #: includes/early-renewal/wcs-early-renewal-functions.php:136 #: vendor/woocommerce/subscriptions-core/includes/admin/meta-boxes/views/html-related-orders-row.php:17 #: vendor/woocommerce/subscriptions-core/includes/admin/meta-boxes/views/html-unknown-related-orders-row.php:18 @@ -1288,14 +1282,20 @@ msgid "#%s" msgstr "" #. translators: %s: order ID (linked to details page). -#: includes/early-renewal/class-wcs-cart-early-renewal.php:321 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:225 msgid "Order %s created to record early renewal." msgstr "" -#: includes/early-renewal/class-wcs-cart-early-renewal.php:376 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:294 +#: includes/early-renewal/class-wcs-cart-early-renewal.php:624 msgid "Cancel" msgstr "" +#: includes/early-renewal/class-wcs-cart-early-renewal.php:592 +msgctxt "used in order note as reason for why subscription status changed" +msgid "Customer requested to renew early:" +msgstr "" + #: includes/early-renewal/class-wcs-early-renewal-manager.php:53 msgid "Early Renewal" msgstr "" @@ -1377,79 +1377,79 @@ msgstr "" msgid "Find new gateways that %1$ssupport automatic subscription payments%2$s in the official %3$sWooCommerce Marketplace%4$s." msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:59 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:64 msgid "Automatic Failed Payment Retries" msgstr "" #. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:113 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:118 msgid "%d Pending Payment Retry" msgid_plural "%d Pending Payment Retries" msgstr[0] "" msgstr[1] "" #. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:117 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:122 msgid "%d Processing Payment Retry" msgid_plural "%d Processing Payment Retries" msgstr[0] "" msgstr[1] "" #. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:121 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:126 msgid "%d Failed Payment Retry" msgid_plural "%d Failed Payment Retries" msgstr[0] "" msgstr[1] "" #. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:125 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:130 msgid "%d Successful Payment Retry" msgid_plural "%d Successful Payment Retries" msgstr[0] "" msgstr[1] "" #. translators: %d: retry count. -#: includes/payment-retry/admin/class-wcs-retry-admin.php:129 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:134 msgid "%d Cancelled Payment Retry" msgid_plural "%d Cancelled Payment Retries" msgstr[0] "" msgstr[1] "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:157 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:162 msgid "Retry Failed Payments" msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:158 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:163 msgid "Enable automatic retry of failed recurring payments" msgstr "" #. translators: 1,2: opening/closing link tags (to documentation). -#: includes/payment-retry/admin/class-wcs-retry-admin.php:163 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:168 msgid "Attempt to recover recurring revenue that would otherwise be lost due to payment methods being declined only temporarily. %1$sLearn more%2$s." msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:185 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:190 msgctxt "label for the system status page" msgid "Custom Retry Rules" msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:193 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:198 msgctxt "label for the system status page" msgid "Custom Retry Rule Class" msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:201 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:206 msgctxt "label for the system status page" msgid "Custom Raw Retry Rule" msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:209 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:214 msgctxt "label for the system status page" msgid "Custom Retry Rule" msgstr "" -#: includes/payment-retry/admin/class-wcs-retry-admin.php:217 +#: includes/payment-retry/admin/class-wcs-retry-admin.php:222 msgctxt "label for the system status page" msgid "Retries Migration Status" msgstr "" @@ -1619,226 +1619,226 @@ msgstr "" msgid "[{site_title}] Automatic payment failed for {order_number}, retry scheduled to run {retry_time}" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:203 +#: includes/switching/class-wc-subscriptions-switcher.php:195 msgid "You have a subscription to this product. Choosing a new subscription will replace your existing subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:205 +#: includes/switching/class-wc-subscriptions-switcher.php:197 msgid "Choose a new subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:245 -#: includes/switching/class-wc-subscriptions-switcher.php:1246 +#: includes/switching/class-wc-subscriptions-switcher.php:237 +#: includes/switching/class-wc-subscriptions-switcher.php:1238 msgid "Your cart contained an invalid subscription switch request. It has been removed." msgid_plural "Your cart contained invalid subscription switch requests. They have been removed." msgstr[0] "" msgstr[1] "" -#: includes/switching/class-wc-subscriptions-switcher.php:287 +#: includes/switching/class-wc-subscriptions-switcher.php:279 msgid "You have already subscribed to this product and it is limited to one per customer. You can not purchase the product again." msgstr "" #. translators: 1$: is the "You have already subscribed to this product" notice, 2$-4$: opening/closing link tags, 3$: an order number -#: includes/switching/class-wc-subscriptions-switcher.php:296 +#: includes/switching/class-wc-subscriptions-switcher.php:288 msgid "%1$s Complete payment on %2$sOrder %3$s%4$s to be able to change your subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:390 +#: includes/switching/class-wc-subscriptions-switcher.php:382 msgid "Switching" msgstr "" #. translators: placeholders are opening and closing link tags -#: includes/switching/class-wc-subscriptions-switcher.php:393 +#: includes/switching/class-wc-subscriptions-switcher.php:385 msgid "Allow subscribers to switch (upgrade or downgrade) between different subscriptions. %1$sLearn more%2$s." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:401 +#: includes/switching/class-wc-subscriptions-switcher.php:393 msgid "Prorate Recurring Payment" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:402 +#: includes/switching/class-wc-subscriptions-switcher.php:394 msgid "When switching to a subscription with a different recurring payment or billing period, should the price paid for the existing billing period be prorated when switching to the new subscription?" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:410 -#: includes/switching/class-wc-subscriptions-switcher.php:444 +#: includes/switching/class-wc-subscriptions-switcher.php:402 +#: includes/switching/class-wc-subscriptions-switcher.php:436 msgctxt "when to allow a setting" msgid "Never" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:411 +#: includes/switching/class-wc-subscriptions-switcher.php:403 msgctxt "when to prorate recurring fee when switching" msgid "For Upgrades of Virtual Subscription Products Only" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:412 +#: includes/switching/class-wc-subscriptions-switcher.php:404 msgctxt "when to prorate recurring fee when switching" msgid "For Upgrades of All Subscription Products" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:413 +#: includes/switching/class-wc-subscriptions-switcher.php:405 msgctxt "when to prorate recurring fee when switching" msgid "For Upgrades & Downgrades of Virtual Subscription Products Only" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:414 +#: includes/switching/class-wc-subscriptions-switcher.php:406 msgctxt "when to prorate recurring fee when switching" msgid "For Upgrades & Downgrades of All Subscription Products" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:419 +#: includes/switching/class-wc-subscriptions-switcher.php:411 msgid "Prorate Sign up Fee" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:420 +#: includes/switching/class-wc-subscriptions-switcher.php:412 msgid "When switching to a subscription with a sign up fee, you can require the customer pay only the gap between the existing subscription's sign up fee and the new subscription's sign up fee (if any)." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:428 +#: includes/switching/class-wc-subscriptions-switcher.php:420 msgctxt "when to prorate signup fee when switching" msgid "Never (do not charge a sign up fee)" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:429 +#: includes/switching/class-wc-subscriptions-switcher.php:421 msgctxt "when to prorate signup fee when switching" msgid "Never (charge the full sign up fee)" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:430 +#: includes/switching/class-wc-subscriptions-switcher.php:422 msgctxt "when to prorate signup fee when switching" msgid "Always" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:435 +#: includes/switching/class-wc-subscriptions-switcher.php:427 msgid "Prorate Subscription Length" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:436 +#: includes/switching/class-wc-subscriptions-switcher.php:428 msgid "When switching to a subscription with a length, you can take into account the payments already completed by the customer when determining how many payments the subscriber needs to make for the new subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:445 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:224 +#: includes/switching/class-wc-subscriptions-switcher.php:437 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:225 msgctxt "when to prorate first payment / subscription length" msgid "For Virtual Subscription Products Only" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:446 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:225 +#: includes/switching/class-wc-subscriptions-switcher.php:438 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:226 msgctxt "when to prorate first payment / subscription length" msgid "For All Subscription Products" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:451 +#: includes/switching/class-wc-subscriptions-switcher.php:443 msgid "Switch Button Text" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:452 +#: includes/switching/class-wc-subscriptions-switcher.php:444 msgid "Customise the text displayed on the button next to the subscription on the subscriber's account page. The default is \"Switch Subscription\", but you may wish to change this to \"Upgrade\" or \"Change Subscription\"." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:456 -#: includes/switching/class-wc-subscriptions-switcher.php:558 -#: includes/switching/class-wc-subscriptions-switcher.php:2650 +#: includes/switching/class-wc-subscriptions-switcher.php:448 +#: includes/switching/class-wc-subscriptions-switcher.php:550 +#: includes/switching/class-wc-subscriptions-switcher.php:2642 msgid "Upgrade or Downgrade" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:495 +#: includes/switching/class-wc-subscriptions-switcher.php:487 msgid "Allow Switching" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:502 +#: includes/switching/class-wc-subscriptions-switcher.php:494 msgctxt "when to allow switching" msgid "Between Subscription Variations" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:506 +#: includes/switching/class-wc-subscriptions-switcher.php:498 msgctxt "when to allow switching" msgid "Between Grouped Subscriptions" msgstr "" #. translators: %s: order number. -#: includes/switching/class-wc-subscriptions-switcher.php:1155 +#: includes/switching/class-wc-subscriptions-switcher.php:1147 msgid "Switch order cancelled due to a new switch order being created #%s." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1374 +#: includes/switching/class-wc-subscriptions-switcher.php:1366 msgid "You can only switch to a subscription product." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1380 +#: includes/switching/class-wc-subscriptions-switcher.php:1372 msgid "We can not find your old subscription item." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1402 +#: includes/switching/class-wc-subscriptions-switcher.php:1394 msgid "You can not switch to the same subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1449 +#: includes/switching/class-wc-subscriptions-switcher.php:1441 msgid "You can not switch this subscription. It appears you do not own the subscription." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1490 +#: includes/switching/class-wc-subscriptions-switcher.php:1482 msgid "There was an error locating the switch details." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1871 +#: includes/switching/class-wc-subscriptions-switcher.php:1863 msgctxt "a switch type" msgid "Downgrade" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1874 +#: includes/switching/class-wc-subscriptions-switcher.php:1866 msgctxt "a switch type" msgid "Upgrade" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1877 +#: includes/switching/class-wc-subscriptions-switcher.php:1869 msgctxt "a switch type" msgid "Crossgrade" msgstr "" #. translators: %1: product subtotal, %2: HTML span tag, %3: direction (upgrade, downgrade, crossgrade), %4: closing HTML span tag -#: includes/switching/class-wc-subscriptions-switcher.php:1882 +#: includes/switching/class-wc-subscriptions-switcher.php:1874 msgctxt "product subtotal string" msgid "%1$s %2$s(%3$s)%4$s" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:1998 +#: includes/switching/class-wc-subscriptions-switcher.php:1990 msgid "The original subscription item being switched cannot be found." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:2000 +#: includes/switching/class-wc-subscriptions-switcher.php:1992 msgid "The item on the switch order cannot be found." msgstr "" #. translators: 1$: old item, 2$: new item when switching -#: includes/switching/class-wc-subscriptions-switcher.php:2011 +#: includes/switching/class-wc-subscriptions-switcher.php:2003 msgctxt "used in order notes" msgid "Customer switched from: %1$s to %2$s." msgstr "" #. translators: %s: new item name. -#: includes/switching/class-wc-subscriptions-switcher.php:2014 +#: includes/switching/class-wc-subscriptions-switcher.php:2006 msgctxt "used in order notes" msgid "Customer added %s." msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:2374 -#: includes/switching/class-wc-subscriptions-switcher.php:2927 +#: includes/switching/class-wc-subscriptions-switcher.php:2366 +#: includes/switching/class-wc-subscriptions-switcher.php:2919 msgid "Switch Order" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:2389 -#: includes/switching/class-wc-subscriptions-switcher.php:2942 +#: includes/switching/class-wc-subscriptions-switcher.php:2381 +#: includes/switching/class-wc-subscriptions-switcher.php:2934 msgid "Switched Subscription" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:2607 +#: includes/switching/class-wc-subscriptions-switcher.php:2599 msgctxt "add to cart button text while switching a subscription" msgid "Switch subscription" msgstr "" -#: includes/switching/class-wc-subscriptions-switcher.php:2791 +#: includes/switching/class-wc-subscriptions-switcher.php:2783 #: vendor/woocommerce/subscriptions-core/wcs-functions.php:224 msgctxt "Subscription status" msgid "Switched" @@ -1850,7 +1850,7 @@ msgid "Switch subscription" msgstr "" #. translators: placeholder is a switch type. -#: includes/switching/class-wcs-switch-cart-item.php:309 +#: includes/switching/class-wcs-switch-cart-item.php:315 msgid "Invalid switch type \"%s\". Switch must be one of: \"upgrade\", \"downgrade\" or \"crossgrade\"." msgstr "" @@ -2325,20 +2325,20 @@ msgid "Delete Permanently" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:326 -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1721 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1722 msgctxt "an action on a subscription" msgid "Activate" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:327 -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1722 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1723 msgctxt "an action on a subscription" msgid "Put on-hold" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:328 -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1334 -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1723 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1335 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1724 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php:1937 #: vendor/woocommerce/subscriptions-core/includes/wcs-user-functions.php:327 #: vendor/woocommerce/subscriptions-core/templates/myaccount/related-orders.php:78 @@ -2463,7 +2463,7 @@ msgstr[1] "" #. translators: placeholder is the display name of a payment gateway a subscription was paid by #. translators: %s: payment method. #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:646 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2048 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2047 msgid "Via %s" msgstr "" @@ -2531,7 +2531,7 @@ msgid "None" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1129 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2030 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2029 #: vendor/woocommerce/subscriptions-core/includes/class-wcs-change-payment-method-admin.php:170 msgid "Manual Renewal" msgstr "" @@ -2546,47 +2546,47 @@ msgstr "" msgid "Search for a customer…" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1332 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1333 #: vendor/woocommerce/subscriptions-core/includes/wcs-user-functions.php:311 msgid "Reactivate" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1335 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1336 msgid "Trash" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1336 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1337 msgid "Delete Permanently" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1355 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1356 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-product.php:768 msgid "Restore this item from the Trash" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1357 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1358 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-product.php:769 msgid "Restore" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1362 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1363 msgid "Move this item to the Trash" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1376 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1377 msgid "Delete this item permanently" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1387 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1388 msgid "Cancel Now" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1453 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1454 msgctxt "Used in order note. Reason why status changed." msgid "Subscription status changed by bulk edit:" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1571 +#: vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php:1572 msgid "All" msgstr "" @@ -2886,140 +2886,140 @@ msgid "Read more" msgstr "" #. translators: %s: subscription status. -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:426 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:425 msgid "Unable to change subscription status to \"%s\"." msgstr "" #. translators: 1: subscription status, 2: error message. -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:549 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:548 msgid "Unable to change subscription status to \"%1$s\". Exception: %2$s" msgstr "" #. translators: 1: old subscription status 2: new subscription status -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:579 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:578 msgid "Status changed from %1$s to %2$s." msgstr "" #. translators: %s: new order status -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:593 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:592 msgid "Status set to %s." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:607 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:606 msgid "Error during subscription status transition." msgstr "" #. translators: placeholder is human time diff (e.g. "3 weeks") -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1223 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1222 #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php:2387 msgid "In %s" msgstr "" #. translators: placeholder is human time diff (e.g. "3 weeks") -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1226 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1225 #: vendor/woocommerce/subscriptions-core/includes/wcs-formatting-functions.php:246 msgid "%s ago" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1233 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1232 msgid "Not yet ended" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1236 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1235 msgid "Not cancelled" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1241 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1240 msgctxt "original denotes there is no date to display" msgid "-" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1349 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1348 msgid "The creation date of a subscription can not be deleted, only updated." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1352 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1351 msgid "The start date of a subscription can not be deleted, only updated." msgstr "" #. translators: %s: date type (e.g. "trial_end"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1357 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1356 msgid "The %s date of a subscription can not be deleted. You must delete the order." msgstr "" #. translators: %d: subscription ID. #. translators: %d: order ID. -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1366 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2471 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1365 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2470 msgid "Subscription #%d: " msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1780 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1779 msgid "Payment status marked complete." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1808 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1807 msgid "Payment failed." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1813 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1812 msgid "Subscription Cancelled: maximum number of failed payments reached." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1923 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:1922 msgid "The \"all\" value for $order_type parameter is deprecated. It was a misnomer, as it did not return resubscribe orders. It was also inconsistent with order type values accepted by wcs_get_subscription_orders(). Use array( \"parent\", \"renewal\", \"switch\" ) to maintain previous behaviour, or \"any\" to receive all order types, including switch and resubscribe." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2127 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2126 #: vendor/woocommerce/subscriptions-core/wcs-functions.php:835 msgid "Payment method meta must be an array." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2363 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2362 msgid "Invalid format. First parameter needs to be an array." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2367 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2366 msgid "Invalid data. First parameter was empty when passed to update_dates()." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2374 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2373 msgid "Invalid data. First parameter has a date that is not in the registered date types." msgstr "" #. translators: placeholder is date type (e.g. "end", "next_payment"...) -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2401 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2400 msgctxt "appears in an error message if date is wrong format" msgid "Invalid %s date. The date must be of the format: \"Y-m-d H:i:s\"." msgstr "" #. translators: %s: date type (e.g. "end"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2439 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2438 msgid "The %s date must occur after the cancellation date." msgstr "" #. translators: %s: date type (e.g. "end"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2445 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2444 msgid "The %s date must occur after the last payment date." msgstr "" #. translators: %s: date type (e.g. "end"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2450 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2449 msgid "The %s date must occur after the next payment date." msgstr "" #. translators: %s: date type (e.g. "end"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2456 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2455 msgid "The %s date must occur after the trial end date." msgstr "" #. translators: %s: date type (e.g. "next_payment"). -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2461 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2460 msgid "The %s date must occur after the start date." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2491 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:352 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php:2490 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:348 msgid "Backordered" msgstr "" @@ -3183,7 +3183,7 @@ msgid "Choose a new payment method.%s" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-change-payment-gateway.php:229 -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php:105 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php:103 #: vendor/woocommerce/subscriptions-core/includes/wcs-helper-functions.php:286 msgid "Invalid Subscription." msgstr "" @@ -3249,28 +3249,28 @@ msgid "Please log in to your account below to choose a new payment method for yo msgstr "" #. translators: placeholder is an internal error number -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:208 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:396 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:204 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:392 msgid "Error %d: Unable to create subscription. Please try again." msgstr "" #. translators: placeholder is an internal error number -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:225 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:221 msgid "Error %d: Unable to add tax to subscription. Please try again." msgstr "" #. translators: placeholder is an internal error number -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:237 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:233 msgid "Error %d: Unable to create order. Please try again." msgstr "" #. Translators: Placeholders are opening and closing strong and link tags. -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:525 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:521 msgid "Purchasing a subscription product requires an account. Please go to the %1$sMy Account%2$s page to login or register." msgstr "" #. Translators: Placeholders are opening and closing strong and link tags. -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:528 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php:524 msgid "Purchasing a subscription product requires an account. Please go to the %1$sMy Account%2$s page to login or contact us if you need assistance." msgstr "" @@ -3772,76 +3772,76 @@ msgstr "" msgid "Date Changed" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:336 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:345 msgid "Your subscription will be activated when payment clears." msgid_plural "Your subscriptions will be activated when payment clears." msgstr[0] "" msgstr[1] "" #. translators: placeholders are opening and closing link tags -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:343 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:352 msgid "View the status of your subscription in %1$syour account%2$s." msgid_plural "View the status of your subscriptions in %1$syour account%2$s." msgstr[0] "" msgstr[1] "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:406 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:415 msgid "Subscription Relationship" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:426 -msgid "Renewal Order" -msgstr "" - -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:428 -msgid "Resubscribe Order" -msgstr "" - -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:430 -msgid "Parent Order" -msgstr "" - -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:479 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:498 msgid "Payment completed on order after subscription was cancelled." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:715 -msgid "All orders types" +#. translators: $1: opening link tag, $2: order number, $3: closing link tag +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:1060 +msgid "Subscription cancelled for refunded order %1$s#%2$s%3$s." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:718 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2327 msgctxt "An order type" msgid "Original" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:719 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2328 msgctxt "An order type" msgid "Subscription Parent" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:720 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2329 msgctxt "An order type" msgid "Subscription Renewal" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:721 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2330 msgctxt "An order type" msgid "Subscription Resubscribe" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:722 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2331 msgctxt "An order type" msgid "Subscription Switch" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:723 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2332 msgctxt "An order type" msgid "Non-subscription" msgstr "" -#. translators: $1: opening link tag, $2: order number, $3: closing link tag -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:1026 -msgid "Subscription cancelled for refunded order %1$s#%2$s%3$s." +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2341 +msgid "All orders types" +msgstr "" + +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2368 +msgid "Renewal Order" +msgstr "" + +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2370 +msgid "Resubscribe Order" +msgstr "" + +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php:2372 +msgid "Parent Order" msgstr "" #. translators: %1$s refers to the price. This string is meant to prefix another string below, e.g. "$5 now, and $5 on March 15th each year" @@ -3987,70 +3987,70 @@ msgstr "" msgid "If a subscription is synchronised to a specific day of the week, month or year, charge a prorated amount for the subscription at the time of sign up." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:222 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:223 msgctxt "when to prorate first payment / subscription length" msgid "Never (do not charge any recurring amount)" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:223 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:224 msgctxt "when to prorate first payment / subscription length" msgid "Never (charge the full recurring amount at sign-up)" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:231 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:232 msgid "Sign-up grace period" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:232 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:233 msgctxt "there's a number immediately in front of this text" msgid "days prior to Renewal Day" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:236 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:237 msgid "Subscriptions created within this many days prior to the Renewal Day will not be charged at sign-up. Set to zero for all new Subscriptions to be charged the full recurring amount. Must be a positive number." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:305 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:306 msgid "Month for Synchronisation" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:313 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:314 #: vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-synchronisation.php:36 #: vendor/woocommerce/subscriptions-core/templates/admin/html-variation-synchronisation.php:42 msgctxt "input field placeholder for day field for annual subscriptions" msgid "Day" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:744 -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:761 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:745 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:762 msgid "Do not synchronise" msgstr "" #. translators: placeholder is a day of the week -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:769 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:770 msgid "%s each week" msgstr "" #. translators: placeholder is a number of day with language specific suffix applied (e.g. "1st", "3rd", "5th", etc...) -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:775 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:776 msgid "%s day of the month" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:777 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:778 msgid "Last day of the month" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:825 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:826 msgid "Today!" msgstr "" #. translators: placeholder is a date -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:832 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:833 msgid "First payment prorated. Next payment: %s" msgstr "" #. translators: placeholder is a date -#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:835 +#: vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php:836 msgid "First payment: %s" msgstr "" @@ -4076,55 +4076,55 @@ msgid "Weekly" msgstr "" #: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-initial-payment.php:65 -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:205 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:199 msgid "That doesn't appear to be your order." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:220 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:214 msgid "This order can no longer be paid because the corresponding subscription does not require payment at this time." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:241 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:235 msgid "Complete checkout to renew your subscription." msgstr "" #. translators: placeholder is an item name -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:324 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:318 msgid "The %s product has been deleted and can no longer be renewed. Please choose a new product or contact us for assistance." msgstr "" #. translators: %s is subscription's number -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:359 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:353 msgid "Subscription #%s has not been added to the cart." msgstr "" #. translators: %s is order's number -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:362 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:356 msgid "Order #%s has not been added to the cart." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:401 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:395 msgid "We couldn't find the original subscription for an item in your cart. The item was removed." msgid_plural "We couldn't find the original subscriptions for items in your cart. The items were removed." msgstr[0] "" msgstr[1] "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:408 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:402 msgid "We couldn't find the original renewal order for an item in your cart. The item was removed." msgid_plural "We couldn't find the original renewal orders for items in your cart. The items were removed." msgstr[0] "" msgstr[1] "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:694 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:681 msgid "All linked subscription items have been removed from the cart." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:723 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:710 msgctxt "Used in WooCommerce by removed item notification: \"_All linked subscription items were_ removed. Undo?\" Filter for item title." msgid "All linked subscription items were" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:1529 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-cart-renewal.php:1526 msgctxt "The place order button text while renewing a subscription" msgid "Renew subscription" msgstr "" @@ -4160,24 +4160,24 @@ msgstr "" msgid "Ignore this error" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:46 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:47 msgid "Limit subscription" msgstr "" #. translators: placeholders are opening and closing link tags -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:48 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:49 msgid "Only allow a customer to have one subscription to this product. %1$sLearn more%2$s." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:50 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:51 msgid "Do not limit" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:51 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:52 msgid "Limit to one active subscription" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:52 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php:53 msgid "Limit to one of any status" msgstr "" @@ -4193,39 +4193,39 @@ msgstr "" msgid "Allow customers to turn on and off automatic renewals from their View Subscription page." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:110 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:112 msgid "The deleted payment method was used for automatic subscription payments, we couldn't find an alternative token payment method token to change your subscriptions to." msgstr "" #. translators: 1: deleted token, 2: new token. -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:128 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:130 msgctxt "used in subscription note" msgid "Payment method meta updated after customer deleted a token from their My Account page. Payment meta changed from %1$s to %2$s" msgstr "" #. translators: $1: the token/credit card label, 2$-3$: opening and closing strong and link tags -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:133 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:135 msgid "The deleted payment method was used for automatic subscription payments. To avoid failed renewal payments in future the subscriptions using this payment method have been updated to use your %1$s. To change the payment method of individual subscriptions go to your %2$sMy Account > Subscriptions%3$s page." msgstr "" #. translators: 1: token display name, 2: opening link tag, 4: closing link tag, 3: opening link tag. -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:188 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:190 msgid "Would you like to update your subscriptions to use this new payment method - %1$s?%2$sYes%4$s | %3$sNo%4$s" msgstr "" #. translators: 1: previous token, 2: new token. -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:229 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:231 msgctxt "used in subscription note" msgid "Payment method meta updated after customer changed their default token and opted to update their subscriptions. Payment meta changed from %1$s to %2$s" msgstr "" #. translators: %1$s opening strong HTML tag, %2$s closing strong HTML tag. -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:251 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:253 msgid "That payment method cannot be deleted because it is linked to an automatic subscription. Please %1$sadd a payment method%2$s, before trying again." msgstr "" #. translators: %1$s opening strong and em HTML tags, %2$s closing em HTML tag, %3$s closing strong HTML tag. -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:257 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php:259 msgid "That payment method cannot be deleted because it is linked to an automatic subscription. Please choose a %1$sdefault%2$s payment method%3$s, before trying again." msgstr "" @@ -4339,7 +4339,7 @@ msgstr "" msgid "Enable automatic payments" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php:105 +#: vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php:103 msgid "My Account" msgstr "" @@ -4443,12 +4443,12 @@ msgid "This will clear the persistent cache of all renewal, switch, resubscribe msgstr "" #. translators: %s: Order date -#: vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php:244 +#: vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php:248 msgid "Subscription – %s" msgstr "" #. translators: %s: Order date -#: vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php:244 +#: vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php:248 msgctxt "Order date parsed by DateTime::format" msgid "M d, Y @ h:i A" msgstr "" @@ -4589,38 +4589,38 @@ msgctxt "Default email subject for email to customer on completed renewal order" msgid "Your %1$s renewal order from %2$s is complete" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php:38 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php:177 msgctxt "Default email heading for email with downloadable files in it" msgid "Your subscription renewal order is complete - download your files" msgstr "" #. translators: $1: {blogname}, $2: {order_date}, variables will be substituted when email is sent out -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php:40 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php:182 msgctxt "Default email subject for email with downloadable files in it" msgid "Your %1$s subscription renewal order from %2$s is complete - download your files" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:26 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:31 msgid "Subscription Switch Complete" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:27 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:32 msgid "Subscription switch complete emails are sent to the customer when a subscription is switched successfully." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:30 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:35 msgid "Your subscription change is complete" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:31 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:36 msgid "Your {blogname} subscription change from {order_date} is complete" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:38 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:186 msgid "Your subscription change is complete - download your files" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:39 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php:190 msgid "Your {blogname} subscription change from {order_date} is complete - download your files" msgstr "" @@ -4701,16 +4701,16 @@ msgstr "" msgid "[{blogname}] New subscription renewal order ({order_number}) - {order_date}" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:22 -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:25 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:27 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:30 msgid "Subscription Switched" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:23 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:28 msgid "Subscription switched emails are sent when a customer switches a subscription." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:26 +#: vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php:31 msgid "[{blogname}] Subscription Switched ({order_number}) - {order_date}" msgstr "" @@ -5949,35 +5949,35 @@ msgid "Invalid data. Type of copy is not a string." msgstr "" #. translators: placeholders are strftime() strings. -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:250 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:253 msgctxt "Used in subscription post title. \"Subscription renewal order - \"" msgid "%b %d, %Y @ %I:%M %p" msgstr "" #. translators: placeholder is a date. -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:255 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:258 msgid "Subscription Renewal Order – %s" msgstr "" #. translators: placeholder is a date. -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:259 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:262 msgid "Resubscribe Order – %s" msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:278 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:281 msgid "$type passed to the function was not a string." msgstr "" #. translators: placeholder is an order type. -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:283 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:286 msgid "\"%s\" is not a valid new order type." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:534 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:537 msgid "Invalid data. No valid subscription / order was passed in." msgstr "" -#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:538 +#: vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php:541 msgid "Invalid data. No valid item id was passed in." msgstr "" diff --git a/vendor/autoload.php b/vendor/autoload.php index 4fabaf3..39bd684 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit06e38849db55c37d72e7daef1d52dece::getLoader(); +return ComposerAutoloaderInit59c7b20d3f201de5581a0bc09b6c2289::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 0cb80c8..be67390 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit06e38849db55c37d72e7daef1d52dece +class ComposerAutoloaderInit59c7b20d3f201de5581a0bc09b6c2289 { private static $loader; @@ -24,12 +24,12 @@ class ComposerAutoloaderInit06e38849db55c37d72e7daef1d52dece require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit06e38849db55c37d72e7daef1d52dece', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit59c7b20d3f201de5581a0bc09b6c2289', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit06e38849db55c37d72e7daef1d52dece', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit59c7b20d3f201de5581a0bc09b6c2289', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit06e38849db55c37d72e7daef1d52dece::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit59c7b20d3f201de5581a0bc09b6c2289::getInitializer($loader)); $loader->register(true); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 1aa5604..04f4f08 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit06e38849db55c37d72e7daef1d52dece +class ComposerStaticInit59c7b20d3f201de5581a0bc09b6c2289 { public static $prefixLengthsPsr4 = array ( 'C' => @@ -129,9 +129,9 @@ class ComposerStaticInit06e38849db55c37d72e7daef1d52dece public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit06e38849db55c37d72e7daef1d52dece::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit06e38849db55c37d72e7daef1d52dece::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit06e38849db55c37d72e7daef1d52dece::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit59c7b20d3f201de5581a0bc09b6c2289::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit59c7b20d3f201de5581a0bc09b6c2289::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit59c7b20d3f201de5581a0bc09b6c2289::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index f689bd4..896edf6 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -156,17 +156,17 @@ }, { "name": "woocommerce/subscriptions-core", - "version": "6.2.0", - "version_normalized": "6.2.0.0", + "version": "6.4.0", + "version_normalized": "6.4.0.0", "source": { "type": "git", "url": "https://github.com/Automattic/woocommerce-subscriptions-core.git", - "reference": "47cfe92d60239d1b8b12a5f640a3772b0e4e1272" + "reference": "a94c9aab6d47f32461974ed09a4d3cad590f25b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Automattic/woocommerce-subscriptions-core/zipball/47cfe92d60239d1b8b12a5f640a3772b0e4e1272", - "reference": "47cfe92d60239d1b8b12a5f640a3772b0e4e1272", + "url": "https://api.github.com/repos/Automattic/woocommerce-subscriptions-core/zipball/a94c9aab6d47f32461974ed09a4d3cad590f25b0", + "reference": "a94c9aab6d47f32461974ed09a4d3cad590f25b0", "shasum": "" }, "require": { @@ -179,7 +179,7 @@ "woocommerce/woocommerce-sniffs": "0.1.0", "yoast/phpunit-polyfills": "1.0.3" }, - "time": "2023-08-10T23:43:48+00:00", + "time": "2023-10-18T03:32:50+00:00", "type": "wordpress-plugin", "extra": { "phpcodesniffer-search-depth": 2 @@ -209,7 +209,7 @@ "description": "Sell products and services with recurring payments in your WooCommerce Store.", "homepage": "https://github.com/Automattic/woocommerce-subscriptions-core", "support": { - "source": "https://github.com/Automattic/woocommerce-subscriptions-core/tree/6.2.0", + "source": "https://github.com/Automattic/woocommerce-subscriptions-core/tree/6.4.0", "issues": "https://github.com/Automattic/woocommerce-subscriptions-core/issues" }, "install-path": "../woocommerce/subscriptions-core" diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index f30f995..e2b887e 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,9 +1,9 @@ array( 'name' => 'woocommerce/woocommerce-subscriptions', - 'pretty_version' => 'dev-release/5.5.0', - 'version' => 'dev-release/5.5.0', - 'reference' => '9c5944431141ef588b010663dd1539c41d12cf69', + 'pretty_version' => 'dev-release/5.6.0', + 'version' => 'dev-release/5.6.0', + 'reference' => '434da4e19c4fde75e431338fa82595320bd5b6c1', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -32,18 +32,18 @@ ), ), 'woocommerce/subscriptions-core' => array( - 'pretty_version' => '6.2.0', - 'version' => '6.2.0.0', - 'reference' => '47cfe92d60239d1b8b12a5f640a3772b0e4e1272', + 'pretty_version' => '6.4.0', + 'version' => '6.4.0.0', + 'reference' => 'a94c9aab6d47f32461974ed09a4d3cad590f25b0', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../woocommerce/subscriptions-core', 'aliases' => array(), 'dev_requirement' => false, ), 'woocommerce/woocommerce-subscriptions' => array( - 'pretty_version' => 'dev-release/5.5.0', - 'version' => 'dev-release/5.5.0', - 'reference' => '9c5944431141ef588b010663dd1539c41d12cf69', + 'pretty_version' => 'dev-release/5.6.0', + 'version' => 'dev-release/5.6.0', + 'reference' => '434da4e19c4fde75e431338fa82595320bd5b6c1', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/vendor/woocommerce/subscriptions-core/assets/css/about.css b/vendor/woocommerce/subscriptions-core/assets/css/about.css index 08915f7..5afb80f 100644 --- a/vendor/woocommerce/subscriptions-core/assets/css/about.css +++ b/vendor/woocommerce/subscriptions-core/assets/css/about.css @@ -27,7 +27,7 @@ ul { } .wcs-badge { position: relative; - background: #9c5d90; + background: #7F54B3; text-rendering: optimizeLegibility; padding-top: 150px; height: 52px; @@ -35,7 +35,7 @@ ul { font-weight: 600; font-size: 14px; text-align: center; - color: #ddc8d9; + color: #fff; margin: 5px 0 0 0; -webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.2 ); box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.2 ); @@ -92,44 +92,10 @@ ul { } .woocommerce-message { position: relative; - border-left-color: #cc99c2 !important; + border-left-color: #7F54B3 !important; overflow: hidden; } -.woocommerce-message a.button-primary, -p.woocommerce-actions a.button-primary, -.woocommerce-message a.button-primary:focus, -p.woocommerce-actions a.button-primary:focus, -.woocommerce-message a.button-primary:active, -p.woocommerce-actions a.button-primary:active { - background: #b366a4; - border-color: #b366a4; - -webkit-box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); - text-shadow: 0 -1px 1px #b366a4, 1px 0 1px #b366a4, 0 1px 1px #b366a4, - -1px 0 1px #b366a4; - color: #fff; - text-decoration: none; -} - -.woocommerce-message a.button-primary:hover, -p.woocommerce-actions a.button-primary:hover { - background: #bb77ae; - border-color: #aa559a; - -webkit-box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); -} - -.woocommerce-message a.button-primary:active, -p.woocommerce-actions a.button-primary:active { - background: #aa559a; - border-color: #aa559a; -} - .woocommerce-message a.skip, p.woocommerce-actions a.skip { opacity: 0.7; diff --git a/vendor/woocommerce/subscriptions-core/assets/css/admin.css b/vendor/woocommerce/subscriptions-core/assets/css/admin.css index 3918c76..1f30e6a 100644 --- a/vendor/woocommerce/subscriptions-core/assets/css/admin.css +++ b/vendor/woocommerce/subscriptions-core/assets/css/admin.css @@ -2,19 +2,6 @@ .woocommerce-subscriptions-activated p a.button-primary { display: inline-block; } -.woocommerce-subscriptions-activated a.button-primary:hover { - background: #bb77ae; - border-color: #aa559a; - -webkit-box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); -} -.woocommerce-subscriptions-activated a.button-primary:active, -.woocommerce-subscriptions-activated a.button-primary:active { - background: #aa559a; - border-color: #aa559a; -} /* Subscriptions Admin Page */ .woocommerce_page_wc-orders--shop_subscription .tablenav input, @@ -314,6 +301,25 @@ a.close-subscriptions-search { width: auto !important; } +.wc_input_subscription_payment_sync +.select2, +.wc_input_subscription_length +.select2, +#_subscription_limit +.select2 { + min-width: 180px; + width: 80% !important; + margin-bottom: 4px; +} + +.wc_input_subscription_period + .select2, +.wc_input_subscription_trial_period + .select2 { + width: 30.75% !important; + margin-top: 0; +} + +.wc_input_subscription_period_interval + .select2 { + margin-right: 3.8%; + width: 30.75% !important; +} + .variable_subscription_sync p._subscription_payment_sync_field { padding-left: 0 !important; } @@ -360,7 +366,32 @@ a.close-subscriptions-search { .wc_input_subscription_period_interval { max-width: 33%; float: left; + margin-right: 2px; } + +#variable_product_options .select2 { + margin: 2px 2px 0 0; +} + +#variable_product_options + .select2-container + .select2-selection--single { + min-height: 40px; +} + +#variable_product_options + .select2-container + .select2-selection--single + .select2-selection__rendered { + line-height: 36px; +} +#variable_product_options + .select2-container + .select2-selection--single + .select2-selection__arrow { + height: 36px; +} + .variable_subscription_pricing_2_3 .wc_input_subscription_price { clear: left; } @@ -735,7 +766,7 @@ table.wp-list-table .subscription_renewal_order::after { height: 100%; text-align: center; content: '\e018'; - color: #a46497; + color: var(--wp-admin-theme-color); } table.wc_gateways .renewals .tips { diff --git a/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js b/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js index b8c7956..b21a474 100644 --- a/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js +++ b/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js @@ -40,21 +40,14 @@ jQuery( function ( $ ) { 'hide_if_variable-subscription' ); - /** - * WC core will hide and show product specific fields in show_and_hide_panels(), however that function only runs on specific events, but not - * when variations are added or loaded. To make sure our subscription-related fields aren't shown by default when a variation is added, we set - * subscription pricing elements "base" cases here. - * - * Note: show() being called on the 'hide_if_' fields and vice versa is intentional. All fields are set in their inverse state first, and - * then shown/hidden by product type afterwards. - */ - $( '.hide_if_variable-subscription' ).show(); - $( '.show_if_variable-subscription' ).hide(); + var product_type = $( 'select#product-type' ).val(); - if ( $( 'select#product-type' ).val() == 'variable-subscription' ) { + if ( 'variable-subscription' === product_type ) { + // Hide and show subscription fields when variable subscription is selected $( 'input#_downloadable' ).prop( 'checked', false ); $( 'input#_virtual' ).prop( 'checked', false ); + // Variable subscriptions inherit fields from variable products. $( '.show_if_variable' ).show(); $( '.hide_if_variable' ).hide(); $( '.show_if_variable-subscription' ).show(); @@ -67,14 +60,7 @@ jQuery( function ( $ ) { .addClass( 'form-row-full' ) .removeClass( 'form-row-last' ); } else { - if ( 'variable' === $( 'select#product-type' ).val() ) { - $( '.show_if_variable-subscription' ).hide(); - $( '.show_if_variable' ).show(); - $( '.hide_if_variable' ).hide(); - $.showOrHideStockFields(); - } - - if ( 'subscription' === $( 'select#product-type' ).val() ) { + if ( 'subscription' === product_type ) { $( '.show_if_subscription' ).show(); $( '.hide_if_subscription' ).hide(); } diff --git a/vendor/woocommerce/subscriptions-core/build/index.asset.php b/vendor/woocommerce/subscriptions-core/build/index.asset.php index e0de4c8..9dbe71f 100644 --- a/vendor/woocommerce/subscriptions-core/build/index.asset.php +++ b/vendor/woocommerce/subscriptions-core/build/index.asset.php @@ -1 +1 @@ - array('wc-blocks-checkout', 'wc-price-format', 'wc-settings', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => '7855adadf2c3ec0499bc9a7854758556'); \ No newline at end of file + array('wc-blocks-checkout', 'wc-price-format', 'wc-settings', 'wp-element', 'wp-i18n', 'wp-plugins'), 'version' => '5386ce4810e198e8d50d4e1491067c34'); \ No newline at end of file diff --git a/vendor/woocommerce/subscriptions-core/build/index.js b/vendor/woocommerce/subscriptions-core/build/index.js index 6267c48..1b22236 100644 --- a/vendor/woocommerce/subscriptions-core/build/index.js +++ b/vendor/woocommerce/subscriptions-core/build/index.js @@ -14,7 +14,7 @@ Object(l.__)("Recurring total every 2nd %1$s","woocommerce-subscriptions"),n);ca /* Translators: %1$s is week, month, year */ Object(l.__)("Recurring total every 3rd %1$s","woocommerce-subscriptions"),n);default:return Object(l.sprintf)( /* Translators: %1$d is number of weeks, months, days, years. %2$s is week, month, year */ -Object(l.__)("Recurring total every %1$dth %2$s","woocommerce-subscriptions"),t,n)}}({billingInterval:n,billingPeriod:c});return Object(r.createElement)(i.TotalsItem,{className:"wcs-recurring-totals-panel__title",currency:t,label:u,value:a,description:Object(r.createElement)(f,{nextPaymentDate:o,subscriptionLength:s,billingInterval:n,billingPeriod:c})})},j=function(e){var t,n,c,o=e.subscription,s=e.needsShipping,u=e.calculatedShipping,p=o.totals,b=o.billing_interval,m=o.billing_period,f=o.next_payment_date,j=o.subscription_length,w=o.shipping_rates;if(!f)return null;var v=null==w||null===(t=w[0])||void 0===t||null===(n=t.shipping_rates)||void 0===n||null===(c=n.find((function(e){return e.selected})))||void 0===c?void 0:c.name,y=Object(a.getCurrencyFromPriceResponse)(p);return Object(r.createElement)("div",{className:"wcs-recurring-totals-panel"},Object(r.createElement)(O,{billingInterval:b,billingPeriod:m,nextPaymentDate:f,subscriptionLength:j,totals:parseInt(p.total_price,10),currency:y}),Object(r.createElement)(i.Panel,{className:"wcs-recurring-totals-panel__details",initialOpen:!1,title:Object(l.__)("Details","woocommerce-subscriptions")},Object(r.createElement)(i.TotalsWrapper,null,Object(r.createElement)(i.Subtotal,{currency:y,values:p}),Object(r.createElement)(d,{currency:y,values:p})),Object(r.createElement)(i.TotalsWrapper,null,Object(r.createElement)(_,{currency:y,needsShipping:s,calculatedShipping:u,values:p,selectedRate:v})),!g&&Object(r.createElement)(i.TotalsWrapper,null,Object(r.createElement)(i.TotalsTaxes,{currency:y,values:p})),Object(r.createElement)(i.TotalsWrapper,null,Object(r.createElement)(i.TotalsItem,{className:"wcs-recurring-totals-panel__details-total",currency:y,label:Object(l.__)("Total","woocommerce-subscriptions"),value:parseInt(p.total_price,10)}))))},w=function(e){var t=e.extensions,n=e.cart,c=t.subscriptions,i=n.cartNeedsShipping,o=n.cartHasCalculatedShipping;return c&&0!==c.length?c.map((function(e){var t=e.key,n=s()(e,["key"]);return Object(r.createElement)(j,{subscription:n,needsShipping:i,calculatedShipping:o,key:t})})):null},v=function(e){var t=e.extensions,n=e.collapsible,c=e.collapse,i=e.showItems,o=e.noResultsMessage,l=e.renderOption,a=e.components,u=t.subscriptions,p=void 0===u?[]:u,b=a.ShippingRatesControlPackage,m=Object(r.useMemo)((function(){return Object.values(p).map((function(e){return e.shipping_rates})).filter(Boolean).flat()}),[p]),g=Object(r.useMemo)((function(){return 1 Subscriptions list table. * Fix - Ensure subscription checkout and cart block integrations are loaded on store environments where WooPayments is not enabled. diff --git a/vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php b/vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php index 92f68bd..d25f02f 100644 --- a/vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php +++ b/vendor/woocommerce/subscriptions-core/includes/admin/class-wc-subscriptions-admin.php @@ -317,13 +317,13 @@ class WC_Subscriptions_Admin { - $label ) { ?> - $label ) { ?> @@ -337,7 +337,7 @@ class WC_Subscriptions_Admin { woocommerce_wp_select( array( 'id' => '_subscription_length', - 'class' => 'wc_input_subscription_length select short', + 'class' => 'wc_input_subscription_length select short wc-enhanced-select', 'label' => __( 'Expire after', 'woocommerce-subscriptions' ), 'options' => wcs_get_subscription_ranges( $chosen_period ), 'desc_tip' => true, @@ -372,7 +372,7 @@ class WC_Subscriptions_Admin { - $label ) { ?> @@ -943,7 +943,7 @@ class WC_Subscriptions_Admin { } if ( $is_woocommerce_screen || 'edit-product' == $screen->id || ( isset( $_GET['page'], $_GET['tab'] ) && 'wc-reports' === $_GET['page'] && 'subscriptions' === $_GET['tab'] ) ) { - wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_Subscriptions_Core_Plugin::instance()->get_library_version() ); + wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', [ 'wc-components' ], WC_Subscriptions_Core_Plugin::instance()->get_library_version() ); wp_enqueue_style( 'woocommerce_subscriptions_admin', WC_Subscriptions_Core_Plugin::instance()->get_subscriptions_core_directory_url( 'assets/css/admin.css' ), array( 'woocommerce_admin_styles' ), WC_Subscriptions_Core_Plugin::instance()->get_library_version() ); } } diff --git a/vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php b/vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php index bea8993..7ee883b 100644 --- a/vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php +++ b/vendor/woocommerce/subscriptions-core/includes/admin/class-wcs-admin-post-types.php @@ -1315,8 +1315,9 @@ class WCS_Admin_Post_Types { // On HPOS environments, WC expects a slightly different format for the bulk actions. if ( $is_hpos_enabled ) { + $id_key = wcs_is_woocommerce_pre( '8.1' ) ? 'order' : 'id'; $action_url_args = [ - 'order' => [ $subscription->get_id() ], + $id_key => [ $subscription->get_id() ], '_wpnonce' => wp_create_nonce( 'bulk-orders' ), ]; } else { diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php index a50ac7f..56c423f 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscription.php @@ -251,31 +251,30 @@ class WC_Subscription extends WC_Order { } /** - * Checks if the subscription has an unpaid order or renewal order (and therefore, needs payment). + * Checks if the subscription needs payment. + * + * A subscription requires payment if it: + * - is pending or failed, + * - has an unpaid parent order, or + * - has an unpaid order or renewal order (and therefore, needs payment) * - * @param string $subscription_key A subscription key of the form created by @see self::get_subscription_key() - * @param int $user_id The ID of the user who owns the subscriptions. Although this parameter is optional, if you have the User ID you should pass it to improve performance. - * @return bool True if the subscription has an unpaid renewal order, false if the subscription has no unpaid renewal orders. * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 + * + * @return bool True if the subscription requires payment, otherwise false. */ public function needs_payment() { - $needs_payment = false; + $parent_order = $this->get_parent(); - // First check if the subscription is pending or failed or is for $0 + // If the subscription is pending or failed and it has a total > 0, it needs payment. if ( parent::needs_payment() ) { - $needs_payment = true; - - // Now make sure the parent order doesn't need payment - } elseif ( ( $parent_order = $this->get_parent() ) && ( $parent_order->needs_payment() || $parent_order->has_status( array( 'on-hold', 'cancelled' ) ) ) ) { - + } elseif ( $parent_order && ( $parent_order->needs_payment() || $parent_order->has_status( array( 'on-hold', 'cancelled' ) ) ) ) { + // If the subscription has an unpaid parent order, it needs payment. $needs_payment = true; - - // And finally, check that the latest order (switch or renewal) doesn't need payment } else { - - $order = $this->get_last_order( 'all', array( 'renewal', 'switch' ) ); + // Lastly, check if the last non-early renewal order needs payment. + $order = wcs_get_last_non_early_renewal_order( $this ); if ( $order && ( $order->needs_payment() || $order->has_status( array( 'on-hold', 'failed', 'cancelled' ) ) ) ) { $needs_payment = true; diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php index 31d74df..393ddeb 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-checkout.php @@ -24,11 +24,7 @@ class WC_Subscriptions_Checkout { add_action( 'woocommerce_checkout_order_processed', array( __CLASS__, 'process_checkout' ), 100, 2 ); // Same as above, but this is for the Checkout block. - if ( class_exists( 'Automattic\WooCommerce\Blocks\Package' ) && ( version_compare( \Automattic\WooCommerce\Blocks\Package::get_version(), '6.3.0', '>=' ) || \Automattic\WooCommerce\Blocks\Package::is_experimental_build() ) ) { - add_action( 'woocommerce_blocks_checkout_order_processed', array( __CLASS__, 'process_checkout' ), 100, 1 ); - } else { - add_action( '__experimental_woocommerce_blocks_checkout_order_processed', array( __CLASS__, 'process_checkout' ), 100, 1 ); - } + add_action( 'woocommerce_store_api_checkout_order_processed', array( __CLASS__, 'process_checkout' ), 100, 1 ); // Some callbacks need to hooked after WC has loaded. add_action( 'woocommerce_loaded', array( __CLASS__, 'attach_dependant_hooks' ) ); diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-core-plugin.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-core-plugin.php index c6dd320..80adb87 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-core-plugin.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-core-plugin.php @@ -16,7 +16,7 @@ class WC_Subscriptions_Core_Plugin { * The version of subscriptions-core library. * @var string */ - protected $library_version = '6.2.0'; // WRCS: DEFINED_VERSION. + protected $library_version = '6.4.0'; // WRCS: DEFINED_VERSION. /** * The subscription scheduler instance. diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php index 4a3a204..d24a010 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php @@ -1001,7 +1001,7 @@ class WC_Subscriptions_Manager { } } - wp_delete_post( $subscription->get_id() ); + $subscription->delete( true ); } } } diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php index a8108d8..09c63e9 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-order.php @@ -32,6 +32,10 @@ class WC_Subscriptions_Order { add_filter( 'manage_edit-shop_order_columns', __CLASS__ . '::add_contains_subscription_column' ); add_action( 'manage_shop_order_posts_custom_column', __CLASS__ . '::add_contains_subscription_column_content', 10, 1 ); + // HPOS - Add column that indicates whether an order is parent or renewal for a subscription. + add_filter( 'woocommerce_shop_order_list_table_columns', __CLASS__ . '::add_contains_subscription_column' ); + add_action( 'woocommerce_shop_order_list_table_custom_column', __CLASS__ . '::add_contains_subscription_column_content_orders_table', 10, 2 ); + // Record initial payment against the subscription & set start date based on that payment add_action( 'woocommerce_order_status_changed', __CLASS__ . '::maybe_record_subscription_payment', 9, 3 ); @@ -44,8 +48,13 @@ class WC_Subscriptions_Order { // Add dropdown to admin orders screen to filter on order type add_action( 'restrict_manage_posts', __CLASS__ . '::restrict_manage_subscriptions', 50 ); + // For HPOS - Add dropdown to admin orders screen to filter on order type. + add_action( 'woocommerce_order_list_table_restrict_manage_orders', __CLASS__ . '::restrict_manage_subscriptions_hpos' ); + // Add filter to queries on admin orders screen to filter on order type. To avoid WC overriding our query args, we need to hook on after them on 10. add_filter( 'request', __CLASS__ . '::orders_by_type_query', 11 ); + // HPOS - Add filter to queries on admin orders screen to filter on order type. Only triggered for the shop_order order type. + add_filter( 'woocommerce_shop_order_list_table_prepare_items_query_args', __CLASS__ . '::maybe_modify_orders_by_type_query_from_request', 11 ); // Don't display migrated order item meta on the Edit Order screen add_filter( 'woocommerce_hidden_order_itemmeta', __CLASS__ . '::hide_order_itemmeta' ); @@ -411,26 +420,36 @@ class WC_Subscriptions_Order { } /** - * Add column content to the WooCommerce -> Orders admin screen to indicate whether an - * order is a parent of a subscription, a renewal order for a subscription, or a - * regular order. - * - * @param string $column The string of the current column - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.1 + * Add column content to the WooCommerce -> Orders admin screen to indicate whether an + * order is a parent of a subscription, a renewal order for a subscription, or a regular order. + * + * @see add_contains_subscription_column_content_orders_table For when HPOS is enabled. + * + * @param string $column The string of the current column + * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.1 */ public static function add_contains_subscription_column_content( $column ) { global $post; - if ( 'subscription_relationship' == $column ) { - if ( wcs_order_contains_subscription( $post->ID, 'renewal' ) ) { - echo ''; - } elseif ( wcs_order_contains_subscription( $post->ID, 'resubscribe' ) ) { - echo ''; - } elseif ( wcs_order_contains_subscription( $post->ID, 'parent' ) ) { - echo ''; - } else { - echo ''; - } + if ( 'subscription_relationship' === $column ) { + self::render_contains_subscription_column_content( $post->ID ); + } + } + + /** + * Add column content to the WooCommerce -> Orders admin screen to indicate whether an + * order is a parent of a subscription, a renewal order for a subscription, or a regular order. + * + * @see add_contains_subscription_column_content For when HPOS is disabled. + * + * @since 6.3.0 + * + * @param string $column_name Identifier for the custom column. + * @param WC_Order $order Current WooCommerce order object. + */ + public static function add_contains_subscription_column_content_orders_table( string $column_name, WC_Order $order ) { + if ( 'subscription_relationship' === $column_name ) { + self::render_contains_subscription_column_content( $order->get_id() ); } } @@ -708,33 +727,26 @@ class WC_Subscriptions_Order { public static function restrict_manage_subscriptions() { global $typenow; - if ( 'shop_order' != $typenow ) { + if ( 'shop_order' !== $typenow ) { return; - }?> - - '_subscription_renewal', - 'compare' => 'NOT EXISTS', - ); - - $vars['meta_query'][] = array( - 'key' => '_subscription_switch', - 'compare' => 'NOT EXISTS', - ); - - } elseif ( 'parent' == $_GET['shop_order_subtype'] ) { - - $vars['post__in'] = wcs_get_subscription_orders(); - - } else { - - switch ( $_GET['shop_order_subtype'] ) { - case 'renewal': - $meta_key = '_subscription_renewal'; - break; - case 'resubscribe': - $meta_key = '_subscription_resubscribe'; - break; - case 'switch': - $meta_key = '_subscription_switch'; - break; - default: - $meta_key = ''; - break; - } - - $meta_key = apply_filters( 'woocommerce_subscriptions_admin_order_type_filter_meta_key', $meta_key, $_GET['shop_order_subtype'] ); - - if ( ! empty( $meta_key ) ) { - $vars['meta_query'][] = array( - 'key' => $meta_key, - 'compare' => 'EXISTS', - ); - } - } - - // Also exclude parent orders from non-subscription query - if ( 'regular' == $_GET['shop_order_subtype'] ) { - $vars['post__not_in'] = wcs_get_subscription_orders(); - } + if ( 'shop_order' === $typenow ) { + return self::maybe_modify_orders_by_type_query_from_request( $vars ); } return $vars; } + /** + * Filters the arguments to be pased to `wc_get_orders()` under the Woocommerce -> Orders screen. + * + * @since 6.3.0 + * + * @param array $order_query_args Arguments to be passed to `wc_get_orders()`. + * + * @return array + */ + public static function maybe_modify_orders_by_type_query_from_request( array $order_query_args ): array { + // The order subtype selected by the user in the dropdown. + $selected_shop_order_subtype = isset( $_GET['shop_order_subtype'] ) ? wc_clean( wp_unslash( $_GET['shop_order_subtype'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + // Don't modify the query args if no order subtype was selected. + if ( empty( $selected_shop_order_subtype ) ) { + return $order_query_args; + } + + if ( 'original' === $selected_shop_order_subtype || 'regular' === $selected_shop_order_subtype ) { + + $order_query_args['meta_query']['relation'] = 'AND'; + + $order_query_args['meta_query'][] = array( + 'key' => '_subscription_renewal', + 'compare' => 'NOT EXISTS', + ); + + $order_query_args['meta_query'][] = array( + 'key' => '_subscription_switch', + 'compare' => 'NOT EXISTS', + ); + + } elseif ( 'parent' === $selected_shop_order_subtype ) { + + $order_query_args['post__in'] = wcs_get_subscription_orders(); + + } else { + + switch ( $selected_shop_order_subtype ) { + case 'renewal': + $meta_key = '_subscription_renewal'; + break; + case 'resubscribe': + $meta_key = '_subscription_resubscribe'; + break; + case 'switch': + $meta_key = '_subscription_switch'; + break; + default: + $meta_key = ''; + break; + } + + $meta_key = apply_filters( 'woocommerce_subscriptions_admin_order_type_filter_meta_key', $meta_key, $selected_shop_order_subtype ); + + if ( ! empty( $meta_key ) ) { + $order_query_args['meta_query'][] = array( + 'key' => $meta_key, + 'compare' => 'EXISTS', + ); + } + } + + // Also exclude parent orders from non-subscription query + if ( 'regular' === $selected_shop_order_subtype ) { + $order_query_args['post__not_in'] = wcs_get_subscription_orders(); + } + + return $order_query_args; + } + /** * Add related subscriptions below order details tables. * @@ -2280,4 +2314,64 @@ class WC_Subscriptions_Order { return $meta_value; } + + /** + * Prints the HTML for the admin dropdown for order types to Woocommerce -> Orders screen. + * + * @since 6.3.0 + */ + private static function render_restrict_manage_subscriptions_dropdown() { + $order_types = apply_filters( + 'woocommerce_subscriptions_order_type_dropdown', + array( + 'original' => _x( 'Original', 'An order type', 'woocommerce-subscriptions' ), + 'parent' => _x( 'Subscription Parent', 'An order type', 'woocommerce-subscriptions' ), + 'renewal' => _x( 'Subscription Renewal', 'An order type', 'woocommerce-subscriptions' ), + 'resubscribe' => _x( 'Subscription Resubscribe', 'An order type', 'woocommerce-subscriptions' ), + 'switch' => _x( 'Subscription Switch', 'An order type', 'woocommerce-subscriptions' ), + 'regular' => _x( 'Non-subscription', 'An order type', 'woocommerce-subscriptions' ), + ) + ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $selected_shop_order_subtype = isset( $_GET['shop_order_subtype'] ) ? wc_clean( wp_unslash( $_GET['shop_order_subtype'] ) ) : ''; + + ?> + + '; + } elseif ( wcs_order_contains_subscription( $order_id, 'resubscribe' ) ) { + echo ''; + } elseif ( wcs_order_contains_subscription( $order_id, 'parent' ) ) { + echo ''; + } else { + echo ''; + } + } } diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php index d0bfbb5..a9c785e 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-synchroniser.php @@ -218,6 +218,7 @@ class WC_Subscriptions_Synchroniser { 'css' => 'min-width:150px;', 'default' => 'no', 'type' => 'select', + 'class' => 'wc-enhanced-select', 'options' => array( 'no' => _x( 'Never (do not charge any recurring amount)', 'when to prorate first payment / subscription length', 'woocommerce-subscriptions' ), 'recurring' => _x( 'Never (charge the full recurring amount at sign-up)', 'when to prorate first payment / subscription length', 'woocommerce-subscriptions' ), @@ -285,7 +286,7 @@ class WC_Subscriptions_Synchroniser { woocommerce_wp_select( array( 'id' => self::$post_meta_key, - 'class' => 'wc_input_subscription_payment_sync select short', + 'class' => 'wc_input_subscription_payment_sync select short wc-enhanced-select', 'label' => self::$sync_field_label, 'options' => self::get_billing_period_ranges( $subscription_period ), 'description' => self::$sync_description, @@ -303,14 +304,14 @@ class WC_Subscriptions_Synchroniser { - $label ) { ?> - - /> + + />

=' ) ) { - add_action( 'woocommerce_store_api_checkout_update_order_meta', array( &$this, 'set_order_item_id' ) ); - } else { - add_action( 'woocommerce_blocks_checkout_update_order_meta', array( &$this, 'set_order_item_id' ) ); - } + add_action( 'woocommerce_store_api_checkout_update_order_meta', array( &$this, 'set_order_item_id' ) ); // Don't display cart item key meta stored above on the Edit Order screen add_action( 'woocommerce_hidden_order_itemmeta', array( &$this, 'hidden_order_itemmeta' ), 10 ); @@ -416,6 +410,10 @@ class WCS_Cart_Renewal { * Restore renewal flag when cart is reset and modify Product object with renewal order related info * * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 + * + * @param array $cart_item_session_data Cart item session data. + * @param array $cart_item Cart item data. + * @param string $key Cart item key. */ public function get_cart_item_from_session( $cart_item_session_data, $cart_item, $key ) { @@ -429,7 +427,23 @@ class WCS_Cart_Renewal { if ( $subscription ) { $subscription_items = $subscription->get_items(); - $item_to_renew = $subscription_items[ $cart_item_session_data[ $this->cart_item_key ]['line_item_id'] ]; + + /** + * Find the subscription or order line item that represents this cart item. + * + * If cart item data correctly records a valid line item ID, use that to find the line item. + * Otherwise, use the cart item key stored in line item meta. + */ + if ( isset( $subscription_items[ $cart_item_session_data[ $this->cart_item_key ]['line_item_id'] ] ) ) { + $item_to_renew = $subscription_items[ $cart_item_session_data[ $this->cart_item_key ]['line_item_id'] ]; + } else { + foreach ( $subscription_items as $item ) { + if ( $item->get_meta( '_cart_item_key_' . $this->cart_item_key, true ) === $key ) { + $item_to_renew = $item; + break; + } + } + } $price = $item_to_renew['line_subtotal']; @@ -635,33 +649,6 @@ class WCS_Cart_Renewal { return $actions; } - /** - * When a failed renewal order is being paid for via checkout, make sure WC_Checkout::create_order() preserves its - * status as 'failed' until it is paid. By default, it will always set it to 'pending', but we need it left as 'failed' - * so that we can correctly identify the status change in @see self::maybe_change_subscription_status(). - * - * @param string Default order status for orders paid for via checkout. Default 'pending' - * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 - */ - public function maybe_preserve_order_status( $order_status ) { - - if ( null !== WC()->session && 'failed' !== $order_status ) { - - $order_id = absint( WC()->session->order_awaiting_payment ); - - // Guard against infinite loops in WC 3.0+ where default order staus is set in WC_Abstract_Order::__construct() - remove_filter( 'woocommerce_default_order_status', array( &$this, __FUNCTION__ ), 10 ); - - if ( $order_id > 0 && ( $order = wc_get_order( $order_id ) ) && wcs_order_contains_renewal( $order ) && $order->has_status( 'failed' ) ) { - $order_status = 'failed'; - } - - add_filter( 'woocommerce_default_order_status', array( &$this, __FUNCTION__ ) ); - } - - return $order_status; - } - /** * Removes all the linked renewal/resubscribe items from the cart if a renewal/resubscribe item is removed. * @@ -946,7 +933,7 @@ class WCS_Cart_Renewal { */ public function product_addons_adjust_price( $adjust_price, $cart_item ) { - if ( true === $adjust_price && isset( $cart_item[ $this->cart_item_key ] ) ) { + if ( true === $adjust_price && isset( $cart_item[ $this->cart_item_key ] ) && $this->should_honor_subscription_prices( $cart_item ) ) { $adjust_price = false; } @@ -979,10 +966,19 @@ class WCS_Cart_Renewal { * order items haven't changed by checking for a cart hash on the order, so we need to set * that here. @see WC_Checkout::create_order() * + * @param WC_Order|int $order The order object or order ID. + * * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0.14 */ - protected function set_cart_hash( $order_id ) { - $order = wc_get_order( $order_id ); + protected function set_cart_hash( $order ) { + + if ( ! is_a( $order, 'WC_Abstract_Order' ) ) { + $order = wc_get_order( $order ); + + if ( ! $order ) { + return; + } + } // Use cart hash generator introduced in WooCommerce 3.6 if ( is_callable( array( WC()->cart, 'get_cart_hash' ) ) ) { @@ -991,7 +987,8 @@ class WCS_Cart_Renewal { $cart_hash = md5( json_encode( wc_clean( WC()->cart->get_cart_for_session() ) ) . WC()->cart->total ); } - wcs_set_objects_property( $order, 'cart_hash', $cart_hash ); + $order->set_cart_hash( $cart_hash ); + $order->save(); } /** @@ -1494,7 +1491,7 @@ class WCS_Cart_Renewal { /** - * Deteremines if the cart should honor the granfathered subscription/order line item total. + * Determines if the cart should honor the grandfathered subscription/order line item total. * * @since 1.0.0 - Migrated from WooCommerce Subscriptions v3.0.10 * @@ -1590,6 +1587,53 @@ class WCS_Cart_Renewal { return current_user_can( 'pay_for_order', $order->get_id() ); } + /** + * Sets the order cart hash when paying for a renewal order via the Block Checkout. + * + * This function is hooked onto the 'woocommerce_order_has_status' filter, is only applied during REST API requests, only applies to the + * 'checkout-draft' status (which only Block Checkout orders use) and to renewal orders that are currently being paid for in the cart. + * All other order statuses, orders and scenarios remain unaffected by this function. + * + * This function is necessary to override the default logic in @see DraftOrderTrait::is_valid_draft_order(). + * This function behaves similarly to @see WCS_Cart_Renewal::update_cart_hash() for the standard checkout and is hooked onto the 'woocommerce_create_order' filter. + * + * @param bool $has_status Whether the order has the status. + * @param WC_Order $order The order. + * @param string $status The status to check. + * + * @return bool Whether the order has the status. Unchanged by this function. + */ + public function set_renewal_order_cart_hash_on_block_checkout( $has_status, $order, $status ) { + /** + * We only need to update the order's cart hash when the has_status() check is for 'checkout-draft' (indicating + * this is the status check in DraftOrderTrait::is_valid_draft_order()) and the order doesn't have that status. Orders + * which already have the checkout-draft status don't need to be updated to bypass the checkout block logic. + */ + if ( $has_status || 'checkout-draft' !== $status ) { + return $has_status; + } + + /** + * This function is only concerned with updating the order cart hash during REST API requests - which is the request + * context where the Store API Checkout Block validates the order for payment resumption. + */ + if ( ! WC()->is_rest_api_request() ) { + return $has_status; + } + + // If the order being validated is the order in the cart, then we need to update the cart hash so it can be resumed. + if ( $order && $order->get_id() === WC()->session->get( 'store_api_draft_order', 0 ) ) { + $cart_order = $this->get_order(); + + if ( $cart_order && $cart_order->get_id() === $order->get_id() ) { + // Note: We need to pass the order object so the order instance WooCommerce uses will have the updated hash. + $this->set_cart_hash( $order ); + } + } + + return $has_status; + } + /* Deprecated */ /** @@ -1765,4 +1809,35 @@ class WCS_Cart_Renewal { } } } + + /** + * When a failed renewal order is being paid for via checkout, make sure WC_Checkout::create_order() preserves its + * status as 'failed' until it is paid. By default, it will always set it to 'pending', but we need it left as 'failed' + * so that we can correctly identify the status change in @see self::maybe_change_subscription_status(). + * + * @param string Default order status for orders paid for via checkout. Default 'pending' + * @since 1.0.0 - Migrated from WooCommerce Subscriptions v2.0 + * + * @deprecated 6.3.0 + */ + public function maybe_preserve_order_status( $order_status ) { + wcs_deprecated_function( __METHOD__, '6.3.0' ); + if ( null !== WC()->session && 'failed' !== $order_status ) { + + $order_id = absint( WC()->session->order_awaiting_payment ); + + // Guard against infinite loops in WC 3.0+ where default order staus is set in WC_Abstract_Order::__construct() + remove_filter( 'woocommerce_default_order_status', array( &$this, __FUNCTION__ ), 10 ); + + $order = $order_id > 0 ? wc_get_order( $order_id ) : null; + + if ( $order && wcs_order_contains_renewal( $order ) && $order->has_status( 'failed' ) ) { + $order_status = 'failed'; + } + + add_filter( 'woocommerce_default_order_status', array( &$this, __FUNCTION__ ) ); + } + + return $order_status; + } } diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php b/vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php index f5bcd22..df9c120 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wcs-limiter.php @@ -43,6 +43,7 @@ class WCS_Limiter { woocommerce_wp_select( array( 'id' => '_subscription_limit', + 'class' => 'wc-enhanced-select', 'label' => __( 'Limit subscription', 'woocommerce-subscriptions' ), // translators: placeholders are opening and closing link tags 'description' => sprintf( __( 'Only allow a customer to have one subscription to this product. %1$sLearn more%2$s.', 'woocommerce-subscriptions' ), '', '' ), diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php b/vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php index 330b4f0..6a4e174 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wcs-my-account-payment-methods.php @@ -21,7 +21,9 @@ class WCS_My_Account_Payment_Methods { } add_filter( 'woocommerce_payment_methods_list_item', array( __CLASS__, 'flag_subscription_payment_token_deletions' ), 10, 2 ); - add_action( 'woocommerce_payment_token_deleted', array( __CLASS__, 'maybe_update_subscriptions_payment_meta' ), 10, 2 ); + + // This needs to run after the payment plugins had a chance to execute their delete actions. + add_action( 'woocommerce_payment_token_deleted', array( __CLASS__, 'maybe_update_subscriptions_payment_meta' ), 11, 2 ); add_action( 'woocommerce_payment_token_set_default', array( __CLASS__, 'display_default_payment_token_change_notice' ), 10, 2 ); add_action( 'wp', array( __CLASS__, 'update_subscription_tokens' ) ); diff --git a/vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php b/vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php index f1c918f..b437e64 100644 --- a/vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php +++ b/vendor/woocommerce/subscriptions-core/includes/class-wcs-template-loader.php @@ -13,8 +13,6 @@ class WCS_Template_Loader { * @var array[] Array of file names and their directory found in templates/ */ private static $relocated_templates = [ - 'html-variation-price.php' => 'admin/deprecated/', - 'html-variation-synchronisation.php' => 'admin/deprecated/', 'order-shipping-html.php' => 'admin/deprecated/', 'order-tax-html.php' => 'admin/deprecated/', 'html-admin-notice.php' => 'admin/', diff --git a/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-orders-table-subscription-data-store.php b/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-orders-table-subscription-data-store.php index c66aa4a..666ed7c 100644 --- a/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-orders-table-subscription-data-store.php +++ b/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-orders-table-subscription-data-store.php @@ -609,6 +609,11 @@ class WCS_Orders_Table_Subscription_Data_Store extends \Automattic\WooCommerce\I ]; if ( empty( $existing_meta_data ) ) { + // If we're saving a start date for the first time and it's empty, set it to the created date as a default. + if ( '_schedule_start' === $new_meta_data['key'] && empty( $new_meta_data['value'] ) ) { + $new_meta_data['value'] = $subscription->get_date( 'date_created' ); + } + $this->data_store_meta->add_meta( $subscription, (object) $new_meta_data ); } elseif ( $existing_meta_data->meta_value !== $new_meta_data['value'] ) { $new_meta_data['id'] = $existing_meta_data->meta_id; @@ -649,7 +654,7 @@ class WCS_Orders_Table_Subscription_Data_Store extends \Automattic\WooCommerce\I continue; } - // If we're setting the start date and it's missing, we set it to the created date. + // If we're reading in the start date and it's missing, set it in memory to the created date. if ( 'schedule_start' === $prop_key && empty( $meta_data[ $meta_key ] ) ) { $meta_data[ $meta_key ] = $subscription->get_date( 'date_created' ); } diff --git a/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php b/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php index d29658b..ffa8414 100644 --- a/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php +++ b/vendor/woocommerce/subscriptions-core/includes/data-stores/class-wcs-subscription-data-store-cpt.php @@ -221,6 +221,10 @@ class WCS_Subscription_Data_Store_CPT extends WC_Order_Data_Store_CPT implements foreach ( $this->get_props_to_update( $subscription, $this->subscription_meta_keys_to_props ) as $meta_key => $prop ) { $meta_value = ( 'schedule_' == substr( $prop, 0, 9 ) ) ? $subscription->get_date( $prop ) : $subscription->{"get_$prop"}( 'edit' ); + if ( 'schedule_start' === $prop && ! $meta_value ) { + $meta_value = $subscription->get_date( 'date_created' ); + } + // Store as a string of the boolean for backward compatibility (yep, it's gross) if ( 'requires_manual_renewal' === $prop ) { $meta_value = $meta_value ? 'true' : 'false'; diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-cancelled-subscription.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-cancelled-subscription.php index e54f772..e4a181a 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-cancelled-subscription.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-cancelled-subscription.php @@ -174,7 +174,7 @@ class WCS_Email_Cancelled_Subscription extends WC_Email { 'type' => 'select', 'description' => __( 'Choose which format of email to send.', 'woocommerce-subscriptions' ), 'default' => 'html', - 'class' => 'email_type', + 'class' => 'email_type wc-enhanced-select', 'options' => array( 'plain' => _x( 'Plain text', 'email type', 'woocommerce-subscriptions' ), 'html' => _x( 'HTML', 'email type', 'woocommerce-subscriptions' ), diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php index 75ef069..880109c 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-renewal-order.php @@ -34,11 +34,6 @@ class WCS_Email_Completed_Renewal_Order extends WC_Email_Customer_Completed_Orde $this->template_plain = 'emails/plain/customer-completed-renewal-order.php'; $this->template_base = WC_Subscriptions_Core_Plugin::instance()->get_subscriptions_core_directory( 'templates/' ); - // Other settings - $this->heading_downloadable = $this->get_option( 'heading_downloadable', _x( 'Your subscription renewal order is complete - download your files', 'Default email heading for email with downloadable files in it', 'woocommerce-subscriptions' ) ); - // translators: $1: {blogname}, $2: {order_date}, variables will be substituted when email is sent out - $this->subject_downloadable = $this->get_option( 'subject_downloadable', sprintf( _x( 'Your %1$s subscription renewal order from %2$s is complete - download your files', 'Default email subject for email with downloadable files in it', 'woocommerce-subscriptions' ), '{blogname}', '{order_date}' ) ); - // Triggers for this email add_action( 'woocommerce_order_status_completed_renewal_notification', array( $this, 'trigger' ) ); @@ -168,4 +163,26 @@ class WCS_Email_Completed_Renewal_Order extends WC_Email_Customer_Completed_Orde $this->template_base ); } + + /** + * Gets the deprecated public variables for backwards compatibility. + * + * @param string $key Key. + * + * @return string|null + */ + public function __get( $key ) { + if ( 'heading_downloadable' === $key ) { + wcs_deprecated_argument( __CLASS__ . '::$' . $key, '5.6.0', 'The heading_downloadable property used for emails with downloadable files was removed in WooCommerce 3.1. Use the heading property instead.' ); + return $this->get_option( 'heading_downloadable', _x( 'Your subscription renewal order is complete - download your files', 'Default email heading for email with downloadable files in it', 'woocommerce-subscriptions' ) ); + + } elseif ( 'subject_downloadable' === $key ) { + wcs_deprecated_argument( __CLASS__ . '::$' . $key, '5.6.0', 'The subject_downloadabl property used for emails with downloadable files was removed in WooCommerce 3.1. Use the subject property instead.' ); + // translators: $1: {blogname}, $2: {order_date}, variables will be substituted when email is sent out + return $this->get_option( 'subject_downloadable', sprintf( _x( 'Your %1$s subscription renewal order from %2$s is complete - download your files', 'Default email subject for email with downloadable files in it', 'woocommerce-subscriptions' ), '{blogname}', '{order_date}' ) ); + + } else { + return; + } + } } diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php index 6ed4867..84f60ec 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-completed-switch-order.php @@ -16,6 +16,11 @@ if ( ! defined( 'ABSPATH' ) ) { */ class WCS_Email_Completed_Switch_Order extends WC_Email_Customer_Completed_Order { + /** + * @var array Subscriptions linked to the switch order. + */ + public $subscriptions; + /** * Constructor */ @@ -34,10 +39,6 @@ class WCS_Email_Completed_Switch_Order extends WC_Email_Customer_Completed_Order $this->template_plain = 'emails/plain/customer-completed-switch-order.php'; $this->template_base = WC_Subscriptions_Core_Plugin::instance()->get_subscriptions_core_directory( 'templates/' ); - // Other settings - $this->heading_downloadable = $this->get_option( 'heading_downloadable', __( 'Your subscription change is complete - download your files', 'woocommerce-subscriptions' ) ); - $this->subject_downloadable = $this->get_option( 'subject_downloadable', __( 'Your {blogname} subscription change from {order_date} is complete - download your files', 'woocommerce-subscriptions' ) ); - // Triggers for this email add_action( 'woocommerce_subscriptions_switch_completed_switch_notification', array( $this, 'trigger' ) ); @@ -171,4 +172,25 @@ class WCS_Email_Completed_Switch_Order extends WC_Email_Customer_Completed_Order $this->template_base ); } + + /** + * Gets the deprecated public variables for backwards compatibility. + * + * @param string $key Key. + * + * @return string|null + */ + public function __get( $key ) { + if ( 'heading_downloadable' === $key ) { + wcs_deprecated_argument( __CLASS__ . '::$' . $key, '5.6.0', 'The heading_downloadable property used for emails with downloadable files was removed in WooCommerce 3.1. Use the heading property instead.' ); + return $this->get_option( 'heading_downloadable', __( 'Your subscription change is complete - download your files', 'woocommerce-subscriptions' ) ); + + } elseif ( 'subject_downloadable' === $key ) { + wcs_deprecated_argument( __CLASS__ . '::$' . $key, '5.6.0', 'The subject_downloadable property used for emails with downloadable files was removed in WooCommerce 3.1. Use the subject property instead.' ); + return $this->get_option( 'subject_downloadable', __( 'Your {blogname} subscription change from {order_date} is complete - download your files', 'woocommerce-subscriptions' ) ); + + } else { + return; + } + } } diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-expired-subscription.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-expired-subscription.php index 8a6f2a9..44254fe 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-expired-subscription.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-expired-subscription.php @@ -172,7 +172,7 @@ class WCS_Email_Expired_Subscription extends WC_Email { 'type' => 'select', 'description' => __( 'Choose which format of email to send.', 'woocommerce-subscriptions' ), 'default' => 'html', - 'class' => 'email_type', + 'class' => 'email_type wc-enhanced-select', 'options' => array( 'plain' => _x( 'Plain text', 'email type', 'woocommerce-subscriptions' ), 'html' => _x( 'HTML', 'email type', 'woocommerce-subscriptions' ), diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php index 0572187..5dab4ab 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-new-switch-order.php @@ -13,6 +13,11 @@ if ( ! defined( 'ABSPATH' ) ) { */ class WCS_Email_New_Switch_Order extends WC_Email_New_Order { + /** + * @var array Subscriptions linked to the switch order. + */ + public $subscriptions; + /** * Constructor */ diff --git a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-on-hold-subscription.php b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-on-hold-subscription.php index 7e2006c..7387679 100644 --- a/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-on-hold-subscription.php +++ b/vendor/woocommerce/subscriptions-core/includes/emails/class-wcs-email-on-hold-subscription.php @@ -172,7 +172,7 @@ class WCS_Email_On_Hold_Subscription extends WC_Email { 'type' => 'select', 'description' => __( 'Choose which format of email to send.', 'woocommerce-subscriptions' ), 'default' => 'html', - 'class' => 'email_type', + 'class' => 'email_type wc-enhanced-select', 'options' => array( 'plain' => _x( 'Plain text', 'email type', 'woocommerce-subscriptions' ), 'html' => _x( 'HTML', 'email type', 'woocommerce-subscriptions' ), diff --git a/vendor/woocommerce/subscriptions-core/includes/legacy/class-wcs-array-property-post-meta-black-magic.php b/vendor/woocommerce/subscriptions-core/includes/legacy/class-wcs-array-property-post-meta-black-magic.php index 268ff3e..ed86263 100644 --- a/vendor/woocommerce/subscriptions-core/includes/legacy/class-wcs-array-property-post-meta-black-magic.php +++ b/vendor/woocommerce/subscriptions-core/includes/legacy/class-wcs-array-property-post-meta-black-magic.php @@ -44,6 +44,7 @@ class WCS_Array_Property_Post_Meta_Black_Magic implements ArrayAccess { * @param string $key * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $key ) { return get_post_meta( $this->product_id, $this->maybe_prefix_meta_key( $key ) ); } @@ -53,6 +54,7 @@ class WCS_Array_Property_Post_Meta_Black_Magic implements ArrayAccess { * @param string $key * @param mixed $value */ + #[\ReturnTypeWillChange] public function offsetSet( $key, $value ) { update_post_meta( $this->product_id, $this->maybe_prefix_meta_key( $key ), $value ); } @@ -62,6 +64,7 @@ class WCS_Array_Property_Post_Meta_Black_Magic implements ArrayAccess { * @param string $key * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $key ) { return metadata_exists( 'post', $this->product_id, $this->maybe_prefix_meta_key( $key ) ); } @@ -69,6 +72,7 @@ class WCS_Array_Property_Post_Meta_Black_Magic implements ArrayAccess { /** * Nothing to do here as we access post meta directly. */ + #[\ReturnTypeWillChange] public function offsetUnset( $key ) { } diff --git a/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php b/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php index b1cddd3..c14eda8 100644 --- a/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php +++ b/vendor/woocommerce/subscriptions-core/includes/wcs-order-functions.php @@ -215,6 +215,9 @@ function wcs_create_order_from_subscription( $subscription, $type ) { // If we got here, the subscription was created without problems $transaction->commit(); + // Delete the transient that caches whether the order needs processing. Because we've added line items, the order may now need processing. + delete_transient( 'wc_order_' . $new_order->get_id() . '_needs_processing' ); + /** * Filters the new order created from the subscription. * diff --git a/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-price.php b/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-price.php index f9f5f96..271082b 100644 --- a/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-price.php +++ b/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-price.php @@ -41,7 +41,7 @@ if ( ! defined( 'ABSPATH' ) ) { // Subscription Period Interval woocommerce_wp_select( array( 'id' => 'variable_subscription_period_interval[' . $loop . ']', - 'class' => 'wc_input_subscription_period_interval', + 'class' => 'wc_input_subscription_period_interval wc-enhanced-select', 'wrapper_class' => '_subscription_period_interval_field', 'label' => __( 'Subscription Periods', 'woocommerce-subscriptions' ), 'options' => wcs_get_subscription_period_interval_strings(), @@ -52,7 +52,7 @@ if ( ! defined( 'ABSPATH' ) ) { // Billing Period woocommerce_wp_select( array( 'id' => 'variable_subscription_period[' . $loop . ']', - 'class' => 'wc_input_subscription_period', + 'class' => 'wc_input_subscription_period wc-enhanced-select', 'wrapper_class' => '_subscription_period_field', 'label' => __( 'Billing Period', 'woocommerce-subscriptions' ), 'value' => $subscription_period, @@ -64,7 +64,7 @@ if ( ! defined( 'ABSPATH' ) ) { // Subscription Length woocommerce_wp_select( array( 'id' => 'variable_subscription_length[' . $loop . ']', - 'class' => 'wc_input_subscription_length', + 'class' => 'wc_input_subscription_length wc-enhanced-select', 'wrapper_class' => '_subscription_length_field', 'label' => __( 'Subscription Length', 'woocommerce-subscriptions' ), 'options' => wcs_get_subscription_ranges( $subscription_period ), @@ -110,7 +110,7 @@ if ( ! defined( 'ABSPATH' ) ) { // Trial Period woocommerce_wp_select( array( 'id' => 'variable_subscription_trial_period[' . $loop . ']', - 'class' => 'wc_input_subscription_trial_period', + 'class' => 'wc_input_subscription_trial_period wc-enhanced-select', 'wrapper_class' => '_subscription_trial_period_field', 'label' => __( 'Subscription Trial Period', 'woocommerce-subscriptions' ), 'options' => wcs_get_available_time_periods(), diff --git a/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-synchronisation.php b/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-synchronisation.php index ff40532..1daaa11 100644 --- a/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-synchronisation.php +++ b/vendor/woocommerce/subscriptions-core/templates/admin/deprecated/html-variation-synchronisation.php @@ -17,7 +17,7 @@ global $wp_locale; > 'variable' . WC_Subscriptions_Synchroniser::$post_meta_key . '[' . $loop . ']', - 'class' => 'wc_input_subscription_payment_sync', + 'class' => 'wc_input_subscription_payment_sync wc-enhanced-select', 'wrapper_class' => '_subscription_payment_sync_field', 'label' => WC_Subscriptions_Synchroniser::$sync_field_label, 'options' => WC_Subscriptions_Synchroniser::get_billing_period_ranges( $subscription_period ), @@ -30,7 +30,7 @@ global $wp_locale; 'variable' . WC_Subscriptions_Synchroniser::$post_meta_key_day . '[' . $loop . ']', - 'class' => 'wc_input_subscription_payment_sync', + 'class' => 'wc_input_subscription_payment_sync wc-enhanced-select', 'wrapper_class' => '_subscription_payment_sync_field', 'label' => WC_Subscriptions_Synchroniser::$sync_field_label, 'placeholder' => _x( 'Day', 'input field placeholder for day field for annual subscriptions', 'woocommerce-subscriptions' ), @@ -45,7 +45,7 @@ global $wp_locale; woocommerce_wp_select( array( 'id' => 'variable' . WC_Subscriptions_Synchroniser::$post_meta_key_month . '[' . $loop . ']', - 'class' => 'wc_input_subscription_payment_sync', + 'class' => 'wc_input_subscription_payment_sync wc-enhanced-select', 'wrapper_class' => '_subscription_payment_sync_field', 'label' => '', 'options' => $wp_locale->month, diff --git a/vendor/woocommerce/subscriptions-core/templates/admin/html-variation-price.php b/vendor/woocommerce/subscriptions-core/templates/admin/html-variation-price.php index 6bb0a18..290cbe5 100644 --- a/vendor/woocommerce/subscriptions-core/templates/admin/html-variation-price.php +++ b/vendor/woocommerce/subscriptions-core/templates/admin/html-variation-price.php @@ -15,7 +15,7 @@ if ( ! defined( 'ABSPATH' ) ) { } ?> -