wordpress - 订单后设置下一个续订付款日期的最可靠挂钩
问题描述
我们在 Woocommerce 订阅设置中存在默认同步选项不起作用的情况。我创建了一个手动日历,我的functions.php
文件在订阅创建时引用它,但它只在订阅创建时检查,然后插件自动将下一次续订设置为此后每 4 周。
我需要在每次订阅创建和/或续订后触发我的续订日期检查器功能,以从我的日历中计算下一个续订日期。我知道我至少可以尝试两个钩子,分别是:
wcs_renewal_order_created
和woocommerce_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()
推送它即将处理的当前付款还是已经发生,因此设置下一个日期现在是安全的?
在为给定订阅处理当前期间后立即以编程方式设置下一个续订日期的最可靠方法是什么?
解决方案
免责声明:我分享我的推理和初步信息,我没有做任何实际检查。
根据描述,这两个钩子都与所需的事件无关: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);
推荐阅读
- yii2 - Yii2 使用 ActiveDataProviderRecord 中的计算进行排序
- java - 为什么我的请求没有将 json 转换为 Spring Boot 中的模型对象
- python - 从文本图像中删除非直线
- java - 自定义序列化器和杰克逊模式
- c# - 上传后从Image中获取图片源
- rule-engine - 基于 JSON 对象构建规则
- reactjs - setState 每隔一秒调用一次
- javascript - 在 fullPage.js 中使用“afterRender”回调来运行带有 jQuery 事件的代码
- simulator - tpm2 工具失败,因为 /dev/tpm0 虽然 tpm 服务器正在运行但丢失
- python - AWS boto3.session.Session() 和 boto3.Session() 之间的区别