仅在Woocommerce中对一个区域提供免费送货时,隐藏其他送货方式

时间:2018-07-24 02:38:26

标签: php wordpress woocommerce cart shipping-method

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

我找到了以下代码段:

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 );

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

2 个答案:

答案 0 :(得分:1)

当特定区域可以免费送货时,以下代码将隐藏所有其他送货方式(您将在功能中定义目标区域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文件中。经过测试和工作。

答案 1 :(得分:0)

/**
 * 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 );