基于产品变体属性隐藏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函数会在购物车商品数量更新或商品移除时清除缓存,确保规则立即生效。
使用注意事项:
- 将代码添加到你的主题
functions.php文件,或通过自定义代码插件(如Code Snippets)添加。 - 确认配送方式ID完全正确:你可以在WooCommerce后台的配送设置中,通过浏览器开发者工具查看配送方式的ID(通常在元素的
data-rate-id属性中)。 - 测试前清空购物车,确保缓存被重置。
内容的提问来源于stack exchange,提问作者Simone Apicella
相关产品推荐
相关产品推荐

