自动重试失败后如何禁用WooCommerce订阅续费流程?
解决WooCommerce Subscriptions自定义重试规则后报错的问题
自定义WooCommerce Subscriptions支付重试规则时,最后一次重试将订阅状态设为cancelled,但插件默认会在所有重试失败后执行发送续费邮件、将订阅改为on-hold的操作,导致「订阅无法改为on-hold」的报错。需要在所有自定义重试执行完成后,禁用后续默认续费流程。
解决方案
通过两个核心钩子拦截默认行为:
wcs_should_process_payment_retry:阻止对已取消的订阅继续执行重试操作woocommerce_subscription_failed_payment_action:覆盖默认的失败支付后操作,跳过邮件发送和状态变更
完整代码实现
// 阻止对已取消的订阅执行任何重试操作 function pf_stop_retry_for_cancelled_subscriptions( $should_process, $subscription, $order ) { if ( $subscription->get_status() === 'cancelled' ) { return false; } return $should_process; } add_filter( 'wcs_should_process_payment_retry', 'pf_stop_retry_for_cancelled_subscriptions', 10, 3 ); // 覆盖默认失败支付操作,跳过邮件和状态变更 function pf_override_failed_payment_action( $action, $subscription, $order ) { $retry_count = get_post_meta( $order->get_id(), '_wcs_retry_count', true ); // 匹配自定义重试规则的总次数(此处为5次),达到次数则跳过默认操作 if ( $retry_count >= 5 || $subscription->get_status() === 'cancelled' ) { return 'none'; // 不执行任何默认操作 } return $action; } add_filter( 'woocommerce_subscription_failed_payment_action', 'pf_override_failed_payment_action', 10, 3 );
额外优化建议
可以修改自定义重试规则的最后一项,取消重试邮件发送(因为最终要取消订阅,无需再发重试通知):
// 修改后的最后一次重试规则 array( 'retry_after_interval' => 300, 'email_template_customer' => '', // 不发送客户重试邮件 'email_template_admin' => '', // 不发送管理员重试邮件 'status_to_apply_to_order' => 'failed', 'status_to_apply_to_subscription' => 'cancelled', ),
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

