PAYATHON 2026

recurring amount 为 0 时隐藏 WooCommerce Subscription 信息

支付老李

结论

可以通过 woocommerce_subscriptions_is_recurring 过滤器读取 recurring cart 的总额。如果总额为 0,返回 false,WooCommerce Subscriptions 就不会再把这个购物车作为需要显示 recurring 信息的购物车处理。

add_filter(
    'woocommerce_subscriptions_is_recurring',
    'hide_zero_amount_subscription_recurring_info',
    10,
    2
);

function hide_zero_amount_subscription_recurring_info( $is_recurring, $cart ) {
    if ( ! $is_recurring || ! $cart instanceof WC_Cart ) {
        return $is_recurring;
    }

    // 获取下一周期实际需要支付的金额,包括税费、运费和折扣。
    $recurring_total = (float) $cart->get_total( 'edit' );

    if ( $recurring_total <= 0 ) {
        return false;
    }

    return $is_recurring;
}

原因

WooCommerce Subscriptions 会为订阅创建一个 recurring cart,用来计算下一次续费金额。购物车和结账页上的 recurring totals、下一次付款等信息,也以这个金额为依据。

过滤器中的 $cart 是当前正在判断的购物车对象,可以通过下面的方法获取总额:

$cart->get_total( 'edit' )

这个方法返回未经 HTML 或货币格式化的数值。回调返回 false 后,该 recurring cart 就不再被视为需要显示的 recurring 项目。

这里不应读取页面上已经格式化的金额。格式化后的值可能包含货币符号、千位分隔符和 HTML,无法可靠地用于数值比较,因此代码使用 get_total( 'edit' )。

如果只想检查商品的 recurring subtotal

上面的代码检查客户下一周期实际需要支付的完整金额,其中可能包含税费和运费。用它判断“下一次付款是否为 0”通常更合适。

如果业务规则只检查订阅商品本身的 recurring 金额,不计算税费和运费,可以改成:

$recurring_total = (float) $cart->get_cart_contents_total();

需要注意的是,即使商品金额为 0,下一周期仍可能产生运费或税费。此时隐藏付款信息可能误导客户,因此通常建议使用 get_total( 'edit' )。

注意事项

  • add_filter() 的最后一个参数应为 2,因为回调使用了 $is_recurring 和 $cart 两个参数。
  • 不要忽略原来的 $is_recurring 并直接返回 false,否则可能影响正常的月付订阅。
  • 这段代码应放在子主题的 functions.php 或自定义功能插件中,以免主题更新时丢失。
  • 这个过滤器会改变 WooCommerce Subscriptions 对 recurring cart 的判断,并非只修改 CSS。测试时要覆盖购物车页、结账页,以及使用优惠券、税费或 recurring 运费的订单。
  • WooCommerce Subscriptions 不同版本的内部展示逻辑可能有所调整。如果只想隐藏某一行文案,同时保留其他续费计算信息,应针对该行对应的 HTML 过滤器或模板处理,不要把整个 recurring cart 判定为 false。

备注:内容仅供参考。