更改 WooCommerce 订阅结束日期

时间:2021-03-04 07:49:09

标签: php wordpress date woocommerce woocommerce-subscriptions

我对 WooCommerce 订阅的结束日期有疑问。我在这里找到了这个话题 Woocommerce Subscription change expiration date 然而,我们这里的案例有点不同,但这个话题很有帮助。

我们使用按比例分配(每月 10 日)设置,以便同时创建续订订单(每月)。这工作正常。 我们还使用 WooCommerce 会员资格,以便客户可以访问特定的会员内容。 WooCommerce 订阅会根据上次付款日期自动设置结束日期。我们有一个具有不同持续时间的订阅变体产品。 (3、6 和 12 个月)

因此,我们遇到了以下问题: 当客户今天在 04/03/2021 (d/m/y) 订购订阅时,系统将创建一个订阅,第一笔付款为 10/03/2021。在这种情况下,结束日期将是 10/06/2021。 (10/03/2021 + 3 个月) 但我们希望结束日期是 04/06/2021(开始日期 +3 个月)而不是 10/06/2021。

为此,我们尝试根据开始日期(订单日期)和特定订阅版本(3. 6 或 12 个月)计算订阅结束日期。

示例:

  • 04/03/2021(订单日期和初始父订单已创建)
  • 2021 年 3 月 10 日(第 1 批)
  • 2021 年 4 月 10 日(第 2 批)
  • 10/05/2021(第 3 批)

=> 结束日期应该是 04/06/2021 而不是 10/06/2021

其他示例:

  • 20/03/2021(订单日期和初始父订单已创建)
  • 2021 年 4 月 10 日(第 1 批)
  • 2021 年 5 月 10 日(第 2 批)
  • 10/06/2021(第 3 批货)

=> 结束日期应为 20/06/2021 而不是 10/07/2021

目前的方法 我们尝试在此处使用这些操作挂钩:https://docs.woocommerce.com/document/subscriptions/develop/action-reference/

在当前状态下,结束日期不会改变。我现在不确定是什么问题。我认为我以正确的方式访问结束日期,但在创建订阅后没有更改。

add_action( 'woocommerce_checkout_subscription_created', 'recalc_subscription_end_date' );

function recalc_subscription_end_date ($order, $subscription) {
    if ( function_exists( 'wcs_order_contains_subscription' ) ) {
        if ( wcs_order_contains_subscription( $order->ID ) ) {
            
            // Set subscription end date based on subscription variation
            $end_date = date('Y-m-d H:i:s',strtotime("+12 months", strtotime($start_date)));

            $dates_to_update = array();
            $dates_to_update['end'] = $end_date;

            $subscription->update_dates($dates_to_update);

            $subscription->update_dates( array(
                'end' => $end_date,
            ) );

            $subscription->save();
        }
        $return;
    } 
}

更新: 使用来自@LoicTheAztec 的新信息,我在日志中收到以下错误。 目前,+12 个月的计算对于每个变体都是硬编码的。我如何才能访问所有 3 个变体的数组?

我们的变体 ID:3 个月为 11903,6 个月为 11904,12 个月为 11905,

[04-Mar-2021 16:43:10 UTC] PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function recalc_subscription_end_date(), 1 passed in /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php on line 289 and exactly 2 expected in /home/testsystem/www/test887854.ch/cbctest/wp-content/plugins/code-snippets/php/snippet-ops.php(446) : eval()'d code:2
Stack trace:
#0 /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php(289): recalc_subscription_end_date(Object(WC_Subscription))
#1 /home/testsystem/www/test887854.ch/cbctest/wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters(NULL, Array)
#2 /home/testsystem/www/test887854.ch/cbctest/wp-includes/plugin.php(478): WP_Hook->do_action(Array)
#3 /home/testsystem/www/test887854.ch/cbctest/wp-content/plugins/woocommerce-subscriptions/includes/class-wc-subscriptions-checkout.php(103): do_action('woocommerce_che...', Object(WC_Subscription), Object(Automattic\WooCommerce\Admin\Overrides\Order), Object(WC_Cart))

1 个答案:

答案 0 :(得分:2)

已更新 - 您的代码中未定义变量 $start_date,并且存在其他错误。

尝试以下操作(未经测试):

add_action( 'woocommerce_checkout_subscription_created', 'recalc_subscription_end_date' );
function recalc_subscription_end_date ($order, $subscription) {
    if ( function_exists( 'wcs_order_contains_subscription' ) && wcs_order_contains_subscription( $order ) ) {
        // The array of subscriptions dates
        $date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end');
        $dates      = array(); // Initializing
        
        foreach( $suscription_date_types as $date_type ) {
            $dates[$date_type] = $subscription->get_date($date_type);
        }
        
        // Set subscription end date based on subscription variation
        $dates['end'] = date( 'Y-m-d H:i:s',strtotime( "+12 months", strtotime( $dates['start'] ) ) );

        $subscription->update_dates($dates);
        $subscription->save();
    } 
}

代码位于活动子主题(或活动主题)的functions.php 文件中。它可以工作。