下订单后设置下一个续订付款日期的最可靠挂钩

时间:2021-06-30 12:39:13

标签: wordpress woocommerce woocommerce-subscriptions

我们在 Woocommerce 订阅设置中遇到了默认同步选项不起作用的情况。我创建了一个手动日历,我的 functions.php 文件在订阅创建时引用它,但它只在订阅创建时检查,然后插件会自动将下一次续订设置为每 4 周一次。

我需要在每次订阅创建和/或续订后启动我的续订日期检查器功能,以从我的日历中计算下一个续订日期。我知道至少有两个钩子可以尝试,分别是: wcs_renewal_order_createdwoocommerce_subscription_payment_complete,但我不太了解何时触发它们以了解哪个最安全。

关于 woocommerce_subscription_payment_complete,WC 订阅文档说:

<块引用>

在订阅付款时触发。这可以是初始订单或续订订单的付款。但是,请务必注意,与提前续订相关的订阅日期更改的处理方式与其他续订不同,因此不应依赖此操作来获取订阅的下一个付款日期。

我不能 100% 确定他们在笔记中指的是什么情况,但这足以让我停下来。

关于wcs_renewal_order_created,我不清楚何时触发:

<块引用>

这些订单始终通过 wcs_create_renewal_order() 函数创建,无论它们是为预定的续订事件创建的,还是通过 WooCommerce > 编辑订阅管理屏幕手动创建的,或者通过 WooCommerce REST API 的订阅端点创建的。因此,可以使用此过滤器添加、删除或更新续订订单上任何内容的值。

<块引用>

例如,这可用于为特定续订订单添加折扣,例如每年的第 12 个订单。它还可用于为某个续订订单添加一次性费用,例如按月订阅的特殊年度额外费用。

在此挂钩期间尝试通过 next_date 设置 update_dates() 键是否会推送它即将处理的当前付款,还是已经发生,因此设置下一个日期现在是安全的?

在处理给定订阅的当前期间后立即以编程方式设置下一个续订日期的最可靠方法是什么?

1 个答案:

答案 0 :(得分:2)

免责声明:我分享了我的推理和初步信息,我没有做任何实际检查。

根据描述,两个钩子都与所需的事件无关:wcs_renewal_order_created 响应订阅订单的创建,woocommerce_subscription_payment_complete 响应此类订单的付款。但这两点都对创建或续订订阅的“记账原理”负责,而不是创建或续订本身。

我建议测试 woocommerce_helper_subscription_activate_success 钩子,它可以在 class-wc-helper.php 中找到:

/**
 * Active a product subscription.
 */
private static function _helper_subscription_activate() {

    // ...

    if ( $activated ) {
        /**
         * Fires when the Helper activates a product successfully.
         *
         * @param int    $product_id Product ID being activated.
         * @param string $product_key Subscription product key.
         * @param array  $activation_response The response object from wp_safe_remote_request().
         */
        do_action( 'woocommerce_helper_subscription_activate_success', $product_id, $product_key, $activation_response );
    } else {

    // ...

看起来这个钩子响应订阅成功的那一刻。并且有可能这不仅意味着订阅的初始激活时刻,还意味着其后续续订。

这可以通过以下代码完成,例如:

function test_woocommerce_helper_subscription_activate_success( $product_id, $product_key, $activation_response ) { 
   // your code here
} 
add_action('woocommerce_helper_subscription_activate_success', 'test_woocommerce_helper_subscription_activate_success', 10, 3);