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

基于产品变体属性隐藏WooCommerce配送方式

修复WooCommerce根据产品变体属性隐藏配送方式的代码

原代码无法正常工作,主要存在两个问题:一是未包含你需要隐藏的free_shipping:5配送方式,二是未处理WooCommerce配送方式的缓存机制。以下是修正后的完整代码:

add_filter( 'woocommerce_package_rates', 'hide_shipping_based_on_variation_attribute', 10, 2 );
function hide_shipping_based_on_variation_attribute( $rates, $package ) {
    // 后台非AJAX请求直接返回
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // 定义产品属性 taxonomy(必须以pa_开头)
    $taxonomy = 'pa_versione';

    // 配置:配送方式ID => 需要触发隐藏的属性别名数组
    $shipping_rules = array(
        'free_shipping:5' => array('digitale'),
        'flat_rate:3'     => array('digitale'),
        'free_shipping:4' => array('cartaceo'),
    );

    // 标记是否需要隐藏对应配送方式
    $to_remove = array();

    // 遍历购物车中的商品
    foreach( $package['contents'] as $cart_item ){
        // 检查当前商品是否是变体且包含目标属性
        if( isset($cart_item['variation']['attribute_'.$taxonomy]) ) {
            $term_slug = $cart_item['variation']['attribute_'.$taxonomy];
            
            // 匹配规则,收集需要移除的配送方式
            foreach( $shipping_rules as $rate_id => $target_slugs ) {
                if( in_array($term_slug, $target_slugs) ) {
                    $to_remove[] = $rate_id;
                }
            }
        }
    }

    // 移除匹配到的配送方式
    foreach( $to_remove as $rate_id ) {
        if( isset($rates[$rate_id]) ) {
            unset($rates[$rate_id]);
        }
    }

    return $rates;
}

// 清除配送方式缓存,确保修改立即生效
add_action( 'woocommerce_after_cart_item_quantity_update', 'clear_shipping_method_cache' );
add_action( 'woocommerce_cart_item_removed', 'clear_shipping_method_cache' );
function clear_shipping_method_cache() {
    if ( WC()->session ) {
        WC()->session->set( 'shipping_methods', null );
    }
}

关键修改说明:

  • 补充缺失的配送方式规则:在shipping_rules数组中添加了free_shipping:5与digitale的对应关系,完全匹配你的需求。
  • 优化逻辑结构:先收集所有需要移除的配送方式,再统一执行unset,避免重复遍历和操作。
  • 添加缓存清除机制:WooCommerce会缓存配送方式数据,新增的clear_shipping_method_cache函数会在购物车商品数量更新或商品移除时清除缓存,确保规则立即生效。

使用注意事项:

  1. 将代码添加到你的主题functions.php文件,或通过自定义代码插件(如Code Snippets)添加。
  2. 确认配送方式ID完全正确:你可以在WooCommerce后台的配送设置中,通过浏览器开发者工具查看配送方式的ID(通常在元素的data-rate-id属性中)。
  3. 测试前清空购物车,确保缓存被重置。

内容的提问来源于stack exchange,提问作者Simone Apicella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:54:57