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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:36:17