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

WooCommerce中根据特定商品显示/隐藏结账页邮编字段

WooCommerce 购物车含特定商品时隐藏结账邮编字段的代码修正

原代码存在的问题

  • 逻辑判断颠倒:需求是存在特定商品时隐藏字段,但原代码写反成了「不存在时隐藏」
  • 产品ID获取方式过时:新版WooCommerce中,直接调用$cart_product->id已被废弃,需使用官方推荐的get_id()方法
  • 语法冗余:$ids数组定义末尾多了一个无效分号
  • 未覆盖变体场景:如果购物车里是变体商品,原代码可能无法正确识别父产品ID

修正后的完整代码

/**
 * 检查购物车中是否存在指定商品
 */
function wc_ninja_product_is_in_the_cart() {
    // 填入需要触发隐藏字段的商品ID
    $target_product_ids = array( '9531', '9072', '9035' );

    $cart_product_ids = array();

    // 遍历购物车所有商品
    foreach( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        // 获取当前商品ID(包含变体,若需仅判断父产品可改用$product->get_parent_id())
        $cart_product_ids[] = $product->get_id();
    }

    // 检查是否有交集,即购物车存在目标商品
    return ! empty( array_intersect( $target_product_ids, $cart_product_ids ) );
}

/**
 * 条件性移除结账字段
 */
function wc_ninja_remove_checkout_field( $fields ) {
    // 当购物车存在目标商品时,移除邮编字段
    if ( wc_ninja_product_is_in_the_cart() ) {
        unset( $fields['billing']['billing_postcode'] );
        // 如果需要同时移除配送地址的邮编,取消下面这行注释
        // unset( $fields['shipping']['shipping_postcode'] );
    }

    return $fields;
}
add_filter( 'woocommerce_checkout_fields' , 'wc_ninja_remove_checkout_field' );

关键修改说明

  1. 修正判断逻辑:把! wc_ninja_product_is_in_the_cart()改成wc_ninja_product_is_in_the_cart(),完全匹配需求逻辑
  2. 更新ID获取方法:用$product->get_id()替代$cart_product->id,兼容WooCommerce 3.0+版本
  3. 优化变量命名:将模糊的$ids、$cart_ids改为$target_product_ids、$cart_product_ids,提升代码可读性
  4. 变体兼容处理:如果需要让父产品的变体也触发隐藏效果,可以把$product->get_id()替换为$product->get_parent_id() ?: $product->get_id()
  5. 扩展配送字段支持:若需同时隐藏配送地址的邮编,取消注释代码中对应的unset行

内容的提问来源于stack exchange,提问作者MohsenJames Amra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:33