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。
备注:内容仅供参考。
