代码之家  ›  专栏  ›  技术社区  ›  warm__tape

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

  •  1
  • warm__tape  · 技术社区  · 6 年前

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

    我发现了这个片段:

    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 回复  |  直到 6 年前
        1
  •  1
  •   LoicTheAztec    6 年前

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

        2
  •  0
  •   Karan Trivedi    6 年前
    /**
     * 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 );