禁用WooCommerce中特定优惠券代码的免费送货

问题描述

当有人使用特定的优惠券代码时,我正在尝试删除Woocommerce中的免费送货选项。我发现this question与我的问题非常相关。下面的答案似乎真的很接近我在寻找什么。我是PHP的新手,试图弄清楚我要在其中添加要排除的优惠券代码的ID。

add_filter( 'woocommerce_shipping_packages',function( $packages ) {
  $applied_coupons = WC()->session->get('applied_coupons',array());

  if (!empty($applied_coupons)) {
    $free_shipping_id = 'free_shipping:2';
    unset($packages[0]['rates'][ $free_shipping_id ]);
  }

  return $packages;
});

这是我对堆栈溢出的第一个问题,但是这个站点在很多问题上给了我很大帮助。如果我要求太多,请原谅我。在此先感谢您的帮助/指导。

解决方法

使用woocommerce_package_rates过滤器挂钩。在下面的代码中,您将设置相关的优惠券代码,以隐藏免费送货方式:

add_filter( 'woocommerce_package_rates','hide_free_shipping_method_based_on_coupons',10,2 );
function hide_free_shipping_method_based_on_coupons( $rates,$package )
{
    $coupon_codes       = array('summer'); // <== HERE set your coupon codes
    $applied_coupons    = WC()->cart->get_applied_coupons(); // Applied coupons
    
    if( empty($applied_coupons) )
        return $rates;

    // For specific applied coupon codes
    if( array_intersect($coupon_codes,$applied_coupons) ) {
        foreach ( $rates as $rate_key => $rate ) {
            // Targetting "Free shipping"
            if ( 'free_shipping' === $rate->method_id ) {
                unset($rates[$rate_key]); // hide free shipping method
            }
        }
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。

清除运输缓存

  • 您将需要清空购物车,以清除缓存的运输数据
  • 或者在运输设置中,您可以禁用/保存任何运输方式,然后启用回退/保存。