Сделайте индивидуально рассчитанную стоимость методов доставки для конкретной страны в Woocommerce

Я ищу решение, которое позволяет мне изменять стоимость каждой зоны доставки, потому что мне нужно иметь округленное значение также во второй валюте (от евро до иены для Японии). Я использовал WC_Geolocation :: geolocate_ip () для динамического изменения валюты в зависимости от IP-адреса, но я не могу найти решение для изменения стоимости зон доставки. Пример для объяснения:

    $location = WC_Geolocation::geolocate_ip();
    $country = $location['country'];
    if($country === "JP"){
    //do some code to change every shipping zone cost with a custom value
    //(different for every shipping zone)
    } 

Надеюсь, мое объяснение было ясным.


person Alessio    schedule 11.10.2018    source источник


Ответы (1)


Обновлено

Возможно, вам придется «Включить режим отладки» в общих настройках доставки на вкладке «Параметры доставки», чтобы временно отключить кеши доставки.

Следующий код изменит стоимость способа доставки при пользовательских расчетах для конкретной страны (здесь Япония):

add_filter( 'woocommerce_package_rates', 'custom_shipping_rates_based_on_country', 20, 2 );
function custom_shipping_rates_based_on_country( $rates, $package ) {

    // ONLY for Japan
    if( $package['destination']['country'] !== 'JP' )
        return $rates;

    // Loop through shipping methods rates
    foreach( $rates as $rate_key => $rate ){

        // Excluding free shipping method
        if( $rate->method_id !== 'free_shipping') {

            // Get initial shipping rate cost
            $initial_cost = $rate->cost;

            ## ---- START ------------------------------------------- ##

            // Add your calculations and settings

            // Rounding decimal setting
            $rounding_decimals = 2;

            // Conversion rate
            $conversion_rate = 1.25;

            // New calculated cost
            $new_cost = $initial_cost * $conversion_rate;

            ## ----  END  ------------------------------------------- ##

            // Set the rate cost (rounded with 2 decimals)
            $rates[$rate_key]->cost = round( $new_cost, $rounding_decimals );

            // Taxes rate cost (if enabled)
            foreach ($rate->taxes as $key => $tax){
                if( $rate->taxes[$key] > 0 ){

                    // Calculating the tax rate unit
                    $tax_rate = $rate->taxes[$key] / $initial_cost;

                    // Calculating the new tax cost
                    $new_tax_cost = $tax_rate * $new_cost;

                    // set the new tax cost
                    $taxes[$key] = round( $new_tax_cost, $rounding_decimals );

                    $has_taxes = true;
                } else {
                    $has_taxes = false;
                }
            }
            if( $has_taxes )
                $rates[$rate_key]->taxes = $taxes;

        }
    }

    return $rates;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Не забудьте включить кеш обратной доставки.

person LoicTheAztec    schedule 11.10.2018
comment
Большое спасибо, но могу ли я использовать это, чтобы изменить цену в зоне доставки вместо способа доставки? Есть много стран, куда я отправляю товары, и я не могу повторить этот код для всех. Могу ли я получить настройки зон доставки по имени и изменить стоимость? - person Alessio; 11.10.2018
comment
@Alessio Нет цен (или затрат) в самих зонах доставки, но в методах доставки, которые разрешены для зоны доставки ... Этот крючок является правильным крючком для внесения изменений в стоимость зон доставки. Он будет нацелен только на Японию, как вы можете видеть в коде ответа. - person LoicTheAztec; 11.10.2018