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

WooCommerce 0元购物车全虚拟商品时隐藏结账字段bug修复

问题根因

代码异常由三个错误写法导致:

  • 总金额判断逻辑的返回值错误:当前写法在总金额不等于0时直接执行无返回值的return,而woocommerce_checkout_fields过滤器要求必须返回结账字段数组,空返回会直接导致所有结账字段被清空
  • 总金额取值方式错误:get_cart_total()默认返回带货币符号、千位分隔符的格式化字符串,直接和数字0做比较会出现类型匹配偏差,判断结果不可靠
  • 判断逻辑顺序错误:原代码先判断总金额再判断商品类型,不符合两个条件同时生效的需求
修复后可直接使用的代码
add_filter( 'woocommerce_checkout_fields' , 'bbloomer_simplify_checkout_virtual' );
 
function bbloomer_simplify_checkout_virtual( $fields ) {
    $only_virtual = true;
    // 先遍历判断购物车是否全为虚拟商品
    foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( ! $cart_item['data']->is_virtual() ) {
            $only_virtual = false;
            // 发现非虚拟商品直接终止循环,减少性能消耗
            break;
        }
    }
    // 获取未格式化的原始总金额数值,避免格式干扰判断
    $cart_total = (float) WC()->cart->get_total( 'edit' );
    // 两个条件同时满足时才移除指定字段
    if( $only_virtual && 0 == $cart_total ) {
        unset($fields['billing']['billing_company']);
        unset($fields['billing']['billing_address_1']);
        unset($fields['billing']['billing_address_2']);
        unset($fields['billing']['billing_city']);
        unset($fields['billing']['billing_postcode']);
        unset($fields['billing']['billing_country']);
        unset($fields['billing']['billing_state']);
        unset($fields['billing']['billing_phone']);
        add_filter( 'woocommerce_enable_order_notes_field', '__return_false' );
    }
     
    return $fields;
}
关键调整说明
  • 删除了原逻辑中提前中断返回空值的写法,所有场景下都会返回完整的字段数组,不会再出现非0金额时所有字段消失的问题
  • 总金额取值改用WC()->cart->get_total( 'edit' )获取原始浮点数值,从根源避免格式化字符串和数字比较的类型错误
  • 调整判断顺序,先校验商品类型,发现非虚拟商品直接跳出循环减少不必要的计算
  • 严格遵循需求逻辑,只有「全虚拟商品」+「总金额为0」两个条件同时成立时,才会移除指定账单字段、关闭订单备注字段,其余场景结账页完全保持默认逻辑

内容的提问来源于stack exchange,提问作者Jordan Sponsler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:03:50