隐藏特定运费的免费送货 类 仅在 Woocommerce 中

Hide free shipping for specific shipping classes exclusively in Woocommerce

我们在 WooCommerce 中有各种各样的产品,其中一些不是我们自己提供的。我正在尝试设置一项功能,如果购物车中的产品属于“额外”运费 class exclusively.

,则禁用免费送货

如果有任何其他产品不在运费范围内 class 'Extra',仍然适用免费送货。因此,如果购物车中有 5 件产品全部带运费 class 'Extra' 而没有其他产品,则需支付 5 美元的费用。如果有任何其他产品不在该运送范围内 class,则再次适用免费运送。

我在互联网上搜索了解决方案,这是我目前得到的:

function hide_shipping_methods( $available_shipping_methods, $package ) {
    $shipping_classes = array( 'Extra', 'some-shipping-class-2' );
    $excluded_methods = array( 'free_shipping' );
    $found = $others = false;
    $shipping_class_exists = false;
    
    foreach( $package['contents'] as $key => $value )
        if ( in_array( $value['data']->get_shipping_class(), $shipping_classes ) ) {
            $shipping_class_exists = true;
            break;
        }else {
            $others = true; // NOT the shipping class
            break;
        }
    if ( $shipping_class_exists && !others) {
        $methods_to_exclude = array();
        foreach( $available_shipping_methods as $method => $method_obj )
            if ( in_array( $method_obj->method_id, $excluded_methods ) )
                $methods_to_exclude[] = $method;
        if ( $methods_to_exclude )
            foreach ( $methods_to_exclude as $method )
                unset( $available_shipping_methods[$method] );
    }
    return $available_shipping_methods;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_methods', 10, 2 );

但是它似乎不起作用。我的产品已经在发货 class Extra,但是每当我将它们添加到购物车时仍然免费送货。

有一些错误,您的代码可以简化。要禁用特定送货 类 独家 的免费送货,请尝试以下重新访问的代码:

add_filter( 'woocommerce_package_rates', 'hide_free_shipping_conditionally', 10, 2 );
function hide_free_shipping_conditionally( $rates, $package ) {
    // Define the targeted shipping classes slugs (not names)
    $targeted_classes = array( 'extra' ); 
    
    $found = $others = false; // Initializing
    
    // Loop through cart items for current shipping package
    foreach( $package['contents'] as $item ) {
        if ( in_array( $item['data']->get_shipping_class(), $targeted_classes ) ) {
            $found = true;
        } else {
            $others = true;
        }
    }
    
    // When there are only items from specific shipping classes exclusively
    if ( $found && ! $others ) {
        // Loop through shipping methods for current shipping package
        foreach( $rates as $rate_key => $rate ) {
            // Targetting Free shipping methods
            if ( 'free_shipping' === $rate->method_id ) {
                unset($rates[$rate_key]); // Remove free shipping option(s)
            } 
        }
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。

别忘了清空购物车以刷新运输缓存数据。