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' );
关键修改说明
- 修正判断逻辑:把
! wc_ninja_product_is_in_the_cart()改成wc_ninja_product_is_in_the_cart(),完全匹配需求逻辑 - 更新ID获取方法:用
$product->get_id()替代$cart_product->id,兼容WooCommerce 3.0+版本 - 优化变量命名:将模糊的
$ids、$cart_ids改为$target_product_ids、$cart_product_ids,提升代码可读性 - 变体兼容处理:如果需要让父产品的变体也触发隐藏效果,可以把
$product->get_id()替换为$product->get_parent_id() ?: $product->get_id() - 扩展配送字段支持:若需同时隐藏配送地址的邮编,取消注释代码中对应的
unset行
内容的提问来源于stack exchange,提问作者MohsenJames Amra
相关产品推荐
相关产品推荐

