WooCommerce按商品类别限制结账可选国家的代码问题解决
解决WooCommerce按商品类别隐藏结账/购物车页面配送国家的问题
问题背景
需要实现:当购物车中包含ID为195的「Canada Only」类别商品时,在购物车和结账页面隐藏美国(US)作为可选配送目的地,但原有代码未生效。
原代码问题分析
原代码尝试通过$item['product_cat']判断商品分类,但购物车项数组中并没有这个直接字段,导致无法正确识别商品所属分类,因此逻辑不生效。
修正后的代码
/* 当购物车包含"Canada Only"(ID195)类别商品时,隐藏美国作为配送目的地 */ add_filter( 'woocommerce_countries', 'products_disable_country', 10, 1 ); function products_disable_country( $countries ) { // 仅在购物车或结账页面执行 if( is_cart() || is_checkout() ) { $target_cat_id = 195; // 目标分类ID $has_target_cat = false; // 遍历购物车中的所有商品 foreach( WC()->cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; // 检查当前商品是否属于目标分类 if( has_term( $target_cat_id, 'product_cat', $product_id ) ) { $has_target_cat = true; break; // 找到符合条件的商品后停止遍历 } } // 如果存在目标分类商品,移除美国选项 if( $has_target_cat ) { unset( $countries["US"] ); } } return $countries; }
代码说明
- 分类检查逻辑:使用
has_term()函数,传入目标分类ID、商品分类的taxonomy(product_cat)和商品ID,准确判断商品是否属于指定分类。 - 遍历优化:一旦发现购物车中有符合条件的商品,立即终止遍历,提升效率。
- 条件判断:仅在购物车或结账页面执行逻辑,避免影响其他页面的国家选项。
内容的提问来源于stack exchange,提问作者Just Be Cooking
相关产品推荐
相关产品推荐

