WooCommerce特定配送方式存在时隐藏其他方式代码排查求助
问题排查与修正
你的代码核心逻辑错误:你在检查商品的配送分类是否为alg_wc_shipping:31,但实际需求是检查当前可用的配送方式中是否存在alg_wc_shipping:31。
修正后的代码
function hide_shipping_when_alg_wc_shipping_31_is_present( $rates, $package ) { // 检查可用配送方式中是否存在 alg_wc_shipping:31 $has_target_rate = false; foreach ( $rates as $rate ) { if ( $rate->get_method_id() === 'alg_wc_shipping:31' ) { $has_target_rate = true; break; } } // 如果存在,隐藏指定配送方式 if ( $has_target_rate ) { foreach ( $rates as $key => $rate ) { $method_id = $rate->get_method_id(); if ( $method_id === 'alg_wc_shipping:30' || $method_id === 'alg_wc_shipping:29' ) { unset( $rates[$key] ); } } } return $rates; } add_filter( 'woocommerce_package_rates', 'hide_shipping_when_alg_wc_shipping_31_is_present', 99, 2 );
关键修正点
- 把检查对象从商品配送分类改成了可用配送方式,直接遍历
$rates数组判断目标配送方式是否存在 - 提高钩子优先级到99,确保你的代码在其他可能修改配送方式的插件之后执行
- 简化判断逻辑,直接对比method_id,避免数组查询的多余开销
额外注意事项
- 保存代码后,必须清空WooCommerce的配送缓存:进入WooCommerce设置→配送→点击"清除缓存"按钮,否则旧的配送方式数据会被缓存,新代码不会立即生效
- 确认你的配送方式ID确实是
alg_wc_shipping:31/30/29,可以通过开启WooCommerce调试模式,打印$rates数组来确认真实ID
内容的提问来源于stack exchange,提问作者Theranger
相关产品推荐
相关产品推荐

