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

WooCommerce中针对smart_coupons类型优惠券禁用免运费及性能优化方案

优化代码:针对Smart Coupons类型禁用免运费(仅处理已应用的优惠券)

你的代码性能慢主要有两个核心问题:一是重复实例化优惠券对象(购物车其实已经保存了已应用优惠券的完整对象,不需要再重新创建);二是逻辑判断位置错误,导致只会检查最后一个优惠券,无法正确识别所有已应用的smart优惠券。

下面是优化后的高效代码,完全只针对用户结账时已经应用的优惠券,避免遍历全部优惠券:

add_filter( 'woocommerce_package_rates', 'hide_free_shipping_for_smart_coupons', 10, 2 );
function hide_free_shipping_for_smart_coupons( $rates, $package ) {
    // 直接获取购物车中已应用的优惠券对象集合,无需重复实例化
    $applied_coupons = WC()->cart->get_coupons();

    // 遍历每个已应用的优惠券
    foreach ( $applied_coupons as $coupon ) {
        // 检查当前优惠券是否为smart_coupon类型
        if ( 'smart_coupon' === $coupon->get_discount_type() ) {
            // 移除所有免运费方式
            foreach ( $rates as $rate_key => $rate ) {
                if ( 'free_shipping' === $rate->method_id ) {
                    unset( $rates[$rate_key] );
                }
            }
            // 找到符合条件的优惠券后直接跳出循环,无需继续检查
            break;
        }
    }

    return $rates;
}

代码改进说明:

  • 性能优化:WC()->cart->get_coupons()直接返回已应用优惠券的WC_Coupon对象,避免了原代码中重复调用new WC_Coupon()的性能开销,尤其适合优惠券数量多的站点
  • 逻辑修正:把优惠券类型检查放在循环内部,只要发现任意一个已应用的smart优惠券,就立即处理免运费选项并跳出循环,避免不必要的遍历
  • 精准处理:只针对用户实际应用的优惠券,完全不会涉及站点内的全部优惠券集合

使用这个代码后,你就不会再因为大量优惠券导致加载耗时的问题了,而且能准确实现“应用smart类型优惠券时禁用免运费”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:12:32