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
相关产品推荐
相关产品推荐

