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

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;
}

代码关键点解释

  1. 批量匹配逻辑:
    • 用foreach遍历所有配送方式的键名(也就是你之前手动写的那些wbs:xxx字符串)
    • substr($rate_key, -N)用来截取键名的最后N个字符,和目标后缀对比:
      • _classique是10个字符,所以用-10
      • _print是6个字符,所以用-6
  2. 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' ) ) { ... }
    
  3. 生效注意事项:
    修改代码后,一定要去WooCommerce后台清除配送方式缓存(路径:WooCommerce > 设置 > 高级 > 系统状态 > 工具 > 清除配送方式缓存),否则旧的缓存会导致修改不生效。

这样不管你有86个还是更多_classique后缀的配送方式,都能一次性全部禁用,不用再手动一条条写unset啦!

内容的提问来源于stack exchange,提问作者Alexis Gautier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:23:13