当仅在 Woocommerce 中的一个区域提供免费送货时,隐藏其他送货选项

Hide other shipping options when Free shipping is available for one zone only in Woocommerce

我需要一种方法来实现以下目标:如果可以免费送货,并且订单正在运送到特定区域,请隐藏所有其他运送方式。

我找到了这个片段:

function hide_shipping_when_free_is_available( $rates ) {
    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 100 );

我如何向其中添加条件以仅将其应用于去往一个区域的订单?

当特定区域可以免费送货时,以下代码将隐藏所有其他送货方式(您将在函数中定义目标区域 ID 或区域名称):

add_filter( 'woocommerce_package_rates', 'free_shipping_hide_others_by_zone', 100, 2 );
function free_shipping_hide_others_by_zone( $rates, $package ) {

    // HERE define your shipping zone ID OR the shipping zone name
    $defined_zone_id   = '';
    $defined_zone_name = 'Europe';

    // Get The current WC_Shipping_Zone Object
    $zone      = WC_Shipping_Zones::get_zone_matching_package( $package );
    $zone_id   = $zone->get_id(); // The zone ID
    $zone_name = $zone->get_zone_name(); // The zone name

    $free      = array(); // Initializing

    // Loop through shipping rates
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id && ( $zone_id == $defined_zone_id || $zone_name == $defined_zone_name ) ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}

代码进入活动子主题(或活动主题)的 function.php 文件。测试和工作。

/**
 * Hide shipping rates when free shipping is available.
 * Updated to support WooCommerce 2.6 Shipping Zones.
 *
 * @param array $rates Array of rates found for the package.
 * @return array
 */
function my_hide_shipping_when_free_is_available( $rates ) {
    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );