WooCommerce中仅针对礼品卡类商品隐藏Flat Rate配送的适配问题
WooCommerce礼品卡变体商品的配送选项定制方案
这是Stack Overflow问题《Remove shipping Flat Rate method for particular Category in WooCommerce 2.6 and 3+》的延伸内容,专门解决礼品卡变体商品的配送显示特殊场景。
场景背景
我们团队在用Woo Smart Coupons插件创建礼品卡商品,因为要给用户提供多个面额档位选择,这类商品必须设置成变体(Variation),没法标记为虚拟商品。礼品卡有独立的商品分类,店铺目前配置了Flat Rate(固定费率配送)和Local Pickup(自提)两种配送选项,但礼品卡是通过邮箱发送的,显示这些配送选项完全不合逻辑,所以一开始我们用了下面这段代码来过滤不必要的配送方式:
add_filter( 'woocommerce_package_rates', 'conditional_hide_shipping_methods', 100, 2 ); function conditional_hide_shipping_methods( $rates, $package ){ // 替换为你实际的礼品卡分类别名 $product_category = 'coupons-gift-cards'; $prod_cat = false; foreach ( WC()->cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; if ( has_term( $product_category, 'product_cat', $product_id ) ){ $prod_cat = true; } } $rates_arr = array(); if ( $prod_cat ) { foreach($rates as $key => $rate) { if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) { $rates_arr[ $key ] = $rate; // 修正原代码中$rate_id的笔误问题 break; } } } return !empty( $rates_arr ) ? $rates_arr : $rates; }
这段代码在购物车只有礼品卡时效果很好,但当购物车加入非礼品卡类的普通实体商品时,需要恢复原有的常规配送选项——经过实际验证,下面的优化方案可以完美处理这个混合场景的逻辑:
add_filter( 'woocommerce_package_rates', 'conditional_hide_shipping_methods', 100, 2 ); function conditional_hide_shipping_methods( $rates, $package ){ // 替换为你实际的礼品卡分类别名 $product_category = 'coupons-gift-cards'; $has_gift_card = false; $has_physical_product = false; // 遍历购物车,判断是否包含礼品卡和实体商品 foreach ( WC()->cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; if ( has_term( $product_category, 'product_cat', $product_id ) ){ $has_gift_card = true; } else { $product = wc_get_product($product_id); // 判断是否为需要配送的实体商品 if ( !$product->is_virtual() && !$product->is_downloadable() ) { $has_physical_product = true; } } } // 仅当购物车只有礼品卡时,过滤配送方式 if ( $has_gift_card && !$has_physical_product ) { $allowed_rates = array(); foreach($rates as $key => $rate) { if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) { $allowed_rates[ $key ] = $rate; } } return !empty( $allowed_rates ) ? $allowed_rates : $rates; } // 混合商品或仅实体商品时,返回所有原始配送选项 return $rates; }
额外优化:把自提标签改为“下载”
如果想在纯礼品卡的场景下,把Local Pickup的标签改成更符合礼品卡属性的“下载”,可以在上面的解决方案中,将以下代码插入到if ( $has_gift_card && !$has_physical_product ) {代码块的开头:
// 遍历配送方式,修改指定自提方式的标签 foreach( $rates as $rate_key => $rate ) { // 替换为你实际的自提配送方式ID(比如local_pickup:1) if ( 'local_pickup:1' == $rate_key){ $rates[$rate_key]->label = __( 'Download', 'woocommerce' ); } }
内容的提问来源于stack exchange,提问作者Nalakira
相关产品推荐
相关产品推荐

