From e29b3a361e4a755ffb1424012de61c9fd800ebfe Mon Sep 17 00:00:00 2001 From: Rasmy Nguyen Date: Wed, 13 Nov 2024 17:42:19 -0500 Subject: [PATCH] fix: use my-renewals endpoint --- .../class-woocommerce-subscriptions.php | 121 +++++++++--------- .../class-reader-activation.php | 2 +- .../class-woocommerce-my-account.php | 4 +- 3 files changed, 65 insertions(+), 62 deletions(-) diff --git a/includes/plugins/class-woocommerce-subscriptions.php b/includes/plugins/class-woocommerce-subscriptions.php index b23b9c3a8f..162560e30c 100644 --- a/includes/plugins/class-woocommerce-subscriptions.php +++ b/includes/plugins/class-woocommerce-subscriptions.php @@ -15,101 +15,106 @@ */ class WooCommerce_Subscriptions { /** - * Renewal URL query parameter. + * Renewal endpoint. + * + * @var string */ - const RENEWAL_QUERY_PARAM = 'np_renewal'; + const RENEWAL_ENDPOINT = 'my-renewals'; /** * Initialize hooks and filters. */ public static function init() { - add_action( 'init', [ __CLASS__, 'maybe_redirect_to_renewals' ] ); + add_action( 'init', [ __CLASS__, 'add_renewals_endpoint' ] ); + add_filter( 'woocommerce_get_query_vars', [ __CLASS__, 'add_renewals_query_var' ] ); + add_action( 'woocommerce_account_' . self::RENEWAL_ENDPOINT . '_endpoint', [ __CLASS__, 'redirect_renewals_endpoint' ] ); + } + + /** + * Add renewals endpoint. + */ + public static function add_renewals_endpoint() { + if ( self::is_active() ) { + add_rewrite_endpoint( self::RENEWAL_ENDPOINT, EP_ROOT | EP_PAGES ); + } } /** - * Get my account subscriptions url. + * Add renewals query var. * - * @param bool $add_renewal_param Whether to add the renewal query parameter. Default false. + * @param array $query_vars Query vars. * - * @return string My account subscriptions URL. + * @return array */ - public static function get_subscriptions_url( $add_renewal_param = false ) { - $url = wc_get_account_endpoint_url( 'subscriptions' ); - if ( $add_renewal_param ) { - $url = add_query_arg( - [ - self::RENEWAL_QUERY_PARAM => is_user_logged_in() ? 1 : 0, - ], - $url - ); + public static function add_renewals_query_var( $query_vars ) { + if ( self::is_active() ) { + $query_vars[ self::RENEWAL_ENDPOINT ] = self::RENEWAL_ENDPOINT; } - return $url; + return $query_vars; + } + + /** + * Get the URL for the My Account > Subscriptions page. + * + * @return string + */ + public static function get_subscriptions_url() { + return wc_get_account_endpoint_url( 'subscriptions' ); } /** - * Determine whether WC and WC Subscriptions are active. + * Determine whether WC Subscriptions is active. * * @return bool */ public static function is_active() { - return function_exists( 'WC' ) && class_exists( 'WC_Subscriptions' ); + return class_exists( 'WC_Subscriptions' ); } /** - * Whether the request is a renewal request. - * - * @param bool $logged_in_only Whether to check for logged out renewal param value. Default false. + * Returns true when on the My Account > Subscriptions front end page. * - * @return bool True if the request is a renewal request. + * @return bool */ - public static function is_renewal_request( $logged_in_only = false ) { - $np_renewal = filter_input( INPUT_GET, self::RENEWAL_QUERY_PARAM, FILTER_SANITIZE_NUMBER_INT ); - if ( null === $np_renewal ) { + public static function is_subscriptions_page() { + if ( ! self::is_active() ) { return false; } - if ( $logged_in_only ) { - return ! is_numeric( $np_renewal ) || 1 === (int) $np_renewal; - } - return true; + return is_wc_endpoint_url( 'subscriptions' ); } /** - * Redirect to subscriptions pending renewals my account page. + * Redirect to checkout when there is one pending renewal, + * Subscriptions page if there are more than one pending renewal. + * Otherwise, redirect to my-account dashboard. */ - public static function maybe_redirect_to_renewals() { - if ( ! self::is_active() || ! self::is_renewal_request( true ) ) { - return; - } - $redirect_url = self::get_subscriptions_url( ! is_user_logged_in() ); - if ( is_user_logged_in() ) { - $subscriptions = wcs_get_subscriptions( - [ - 'customer_id' => get_current_user_id(), - 'subscription_status' => [ - 'pending', - 'on-hold', - ], - ] - ); - if ( empty( $subscriptions ) ) { - // Reset redirect url if there are no pending or on-hold subscriptions. - $redirect_url = ''; - } elseif ( count( $subscriptions ) === 1 ) { - foreach ( $subscriptions as $subscription ) { - $renewal_orders = $subscription->get_related_orders( 'all', 'renewal' ); - foreach ( $renewal_orders as $renewal_order ) { - if ( $renewal_order->needs_payment() ) { - $redirect_url = $renewal_order->get_checkout_payment_url(); + public static function redirect_renewals_endpoint() { + $redirect_url = wc_get_account_endpoint_url( 'dashboard' ); + if ( self::is_active() ) { + $redirect_url = wc_get_account_endpoint_url( 'subscriptions' ); + if ( is_user_logged_in() ) { + $pending_renewals = wcs_get_subscriptions( + [ + 'customer_id' => get_current_user_id(), + 'subscription_status' => [ + 'pending', + 'on-hold', + ], + ] + ); + if ( count( $pending_renewals ) === 1 ) { + $orders = $pending_renewals[0]->get_related_orders( 'all', 'renewal' ); + foreach ( $orders as $order ) { + if ( $order->needs_payment() ) { + $redirect_url = $order->get_checkout_payment_url(); break; } } } } } - if ( $redirect_url ) { - wp_safe_redirect( $redirect_url ); - exit; - } + wp_safe_redirect( $redirect_url ); + exit; } } WooCommerce_Subscriptions::init(); diff --git a/includes/reader-activation/class-reader-activation.php b/includes/reader-activation/class-reader-activation.php index aea20816cb..58b99feb89 100644 --- a/includes/reader-activation/class-reader-activation.php +++ b/includes/reader-activation/class-reader-activation.php @@ -1143,7 +1143,7 @@ public static function render_auth_form( $is_inline = false ) { $is_account_page = function_exists( '\wc_get_page_id' ) ? \get_the_ID() === \wc_get_page_id( 'myaccount' ) : false; $referer = \wp_parse_url( \wp_get_referer() ); $redirect = ''; - if ( WooCommerce_Subscriptions::is_renewal_request() ) { + if ( WooCommerce_Subscriptions::is_subscriptions_page() ) { $redirect = WooCommerce_Subscriptions::get_subscriptions_url(); } elseif ( $is_account_page ) { $redirect = \wc_get_account_endpoint_url( 'dashboard' ); diff --git a/includes/reader-revenue/my-account/class-woocommerce-my-account.php b/includes/reader-revenue/my-account/class-woocommerce-my-account.php index 0901ff916a..aef8a17b9d 100644 --- a/includes/reader-revenue/my-account/class-woocommerce-my-account.php +++ b/includes/reader-revenue/my-account/class-woocommerce-my-account.php @@ -367,7 +367,6 @@ public static function is_user_verified() { public static function redirect_to_account_details() { // phpcs:disable WordPress.Security.NonceVerification.Recommended $is_resubscribe_request = isset( $_REQUEST['resubscribe'] ) ? 'shop_subscription' === \get_post_type( absint( $_REQUEST['resubscribe'] ) ) : false; - $is_renewal_request = isset( $_REQUEST['subscription_renewal'] ) ? true : false; $is_cancel_membership_request = isset( $_REQUEST['cancel_membership'] ) ? true : false; $is_checkout_request = isset( $_REQUEST['my_account_checkout'] ) ? true : false; // phpcs:enable WordPress.Security.NonceVerification.Recommended @@ -377,10 +376,9 @@ public static function redirect_to_account_details() { Reader_Activation::is_enabled() && function_exists( 'wc_get_page_permalink' ) && ! $is_resubscribe_request && - ! $is_renewal_request && ! $is_cancel_membership_request && ! $is_checkout_request - ) { + ) { global $wp; $current_url = \home_url( $wp->request ); $my_account_page_permalink = \wc_get_page_permalink( 'myaccount' );