You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自动重试失败后如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:10:31