首页 > 解决方案 > 是否需要在 Order 对象更新时调用 save 方法?

问题描述

在看到几个 @LoicTheAztec 答案包括调用 WC Order 对象方法save()后,我开始将它们添加到我的代码中,当我想做如下事情时:

function update_next_payment_date($subscription, $old_status, $new_status) {
    $new_date = array(
       'next_payment' => new DateTime('August 1, 2021');
    );
 
    $subscription->update_dates($new_date);

    $subscription->save();
}

我遇到了一个问题,我使用的是订单状态更新挂钩,但该save()方法导致了无限递归循环,因为save()调用status_transition也再次触发了挂钩。

我似乎能够在不调用该save方法的情况下更新日期,所以它是必需的吗?如果不是,那是为了什么?

标签: wordpresswoocommerce

解决方案


从这个问题来看,尚不清楚您使用哪个操作来调用您的钩子。让我们假设它被woocommerce_order_status_changed以下行所吸引:

add_action( 'woocommerce_order_status_changed', 'update_next_payment_date', 10, 3 );

然后,为了防止无限循环,您必须在回调开始时删除您的操作并在结束时恢复它:

function update_next_payment_date( $subscription, $old_status, $new_status ) {
    remove_action( 'woocommerce_order_status_changed', 'update_next_payment_date', 10 );

    $new_date = array(
        'next_payment' => new DateTime( 'August 1, 2021' )
    );

    $subscription->update_dates( $new_date );

    $subscription->save();

    add_action( 'woocommerce_order_status_changed', 'update_next_payment_date', 10, 3 );
}

您必须使用remove_action相同的优先级 (10),如add_action.


推荐阅读