WooCommerce:根据配送类批量禁用含特定后缀的配送方式
批量按后缀禁用WooCommerce配送方式的解决方案
嘿,手动写几十条unset确实太折磨人了!我们可以通过遍历配送方式键名+字符串后缀匹配的方式,一次性批量处理所有符合条件的配送方式,完美解决你的需求。
修改后的完整代码
add_filter( 'woocommerce_package_rates', 'businessbloomer_hide_shipping_methods_by_suffix', 10, 2 ); function businessbloomer_hide_shipping_methods_by_suffix( $rates, $package ) { $shipping_class_target = 35; // 你的印刷品配送类ID,保持不变 $in_cart = false; // 检查购物车是否包含印刷品类商品 foreach( WC()->cart->get_cart_contents() as $values ) { if( $values['data']->get_shipping_class_id() == $shipping_class_target ) { $in_cart = true; break; } } // 批量移除对应后缀的配送方式 foreach ( $rates as $rate_key => $rate ) { if ( $in_cart ) { // 购物车有印刷品:移除所有以_classique结尾的配送方式 if ( substr( $rate_key, -10 ) === '_classique' ) { unset( $rates[$rate_key] ); } } else { // 购物车无印刷品:移除所有以_print结尾的配送方式 if ( substr( $rate_key, -6 ) === '_print' ) { unset( $rates[$rate_key] ); } } } return $rates; }
代码关键点解释
- 批量匹配逻辑:
- 用
foreach遍历所有配送方式的键名(也就是你之前手动写的那些wbs:xxx字符串) substr($rate_key, -N)用来截取键名的最后N个字符,和目标后缀对比:_classique是10个字符,所以用-10_print是6个字符,所以用-6
- 用
- PHP 8.0+简化写法:
如果你的服务器PHP版本是8.0及以上,可以用更直观的str_ends_with函数替换substr,不用数字符长度:// 替换_classique的判断 if ( str_ends_with( $rate_key, '_classique' ) ) { ... } // 替换_print的判断 if ( str_ends_with( $rate_key, '_print' ) ) { ... } - 生效注意事项:
修改代码后,一定要去WooCommerce后台清除配送方式缓存(路径:WooCommerce > 设置 > 高级 > 系统状态 > 工具 > 清除配送方式缓存),否则旧的缓存会导致修改不生效。
这样不管你有86个还是更多_classique后缀的配送方式,都能一次性全部禁用,不用再手动一条条写unset啦!
内容的提问来源于stack exchange,提问作者Alexis Gautier
相关产品推荐
相关产品推荐

