Минимальная сумма бесплатной доставки Woocommerce с конвертацией валюты - PullRequest
3 голосов
/ 06 августа 2020

Метод бесплатной доставки Woocommerce не работает с несколькими валютами. Я определяю минимальную сумму заказа 100 для бесплатной доставки в зоне Европы.

Основной валютой является евро, и все работает нормально, но затем я меняю страну (Норвегия), автоматически применяется бесплатная доставка (потому что валюта Норвегии KR очень низка в евро и бесплатную доставку учитывают только минимальное количество монтировок, а не валюту), это не зависит от валюты. конвертер.

add_filter('woocommerce_package_rates', function ($methods, $rates) {
    $currency = get_woocommerce_currency();
    foreach ((array)$methods as &$method) {
        if ($currency != 'USD' && $currency != 'GBP' && $currency != 'CHF') {
            // echo "Hello";
            // print_r($method->get_cost());
            $method->set_cost(round(get_exchanged_currency($currency, $method->get_cost(), true, 'EUR', '', true), 2));
        }
    }
    return $methods;
}, 10, 2);

Приведенный выше код отлично работает для расчета фиксированной стоимости доставки.

Я хочу реализовать бесплатную доставку на основе конвертера местной валюты пользователя (IE минимальный заказ бесплатной доставки value = 100 EURO, если пользователь выбирает страну Норвегия, тогда бесплатная доставка применяется, только если стоимость заказа составляет 1062,19 Kr).

Я признателен, если кто-то может мне помочь с этим.

1 Ответ

2 голосов
/ 06 августа 2020

Поскольку я действительно не знаю, как работает функция get_exchanged_currency(), я не уверен в использовании суммы конверсии, но лог c находится в приведенном ниже коде.

Для обработки бесплатной доставки для минимальной суммы с использованием конвертации валюты

  • Сначала вам нужно установить минимальную сумму ноль в настройках метода бесплатной доставки.
  • код будет обрабатывать бесплатную доставку для примененных купонов с включенной опцией
  • Вы укажете в коде минимальную сумму в валюте по умолчанию.

Также для обработки нескольких валют в качестве условия В операторах IF / ELSE вместо этого используется in_array().

Код:

add_filter('woocommerce_package_rates', 'filter_package_rates', 10, 2 );
function filter_package_rates( $rates, $package ) {
    $currency  = get_woocommerce_currency();
    $free = array();

    foreach ( $rates as $rate_key => $rate ) {
        // For "flat_rate" (or "local_pickup") and NOT for 'USD', 'GBP', 'CHF' currencies
        if ( ! in_array( $currency, array('USD', 'GBP', 'CHF') ) && 'free_shipping' !== $rate->method_id ) {
            $rates[$rate_key]->cost = round( get_exchanged_currency( $currency, $rate->cost, true, 'EUR', '', true ), 2 );
        }
        // For "free_shipping
        elseif ( 'free_shipping' === $rate->method_id ) {
            $cart_total = WC()->cart->subtotal; // (or WC()->cart->get_subtotal() without taxes)
            $min_amount = 100; // Free shipping min amount in EUR currency
            $min_amount = round( get_exchanged_currency( $currency, $min_amount, true, 'EUR', '', true ), 2 ); // Min amount convversion

            $free_shipping    = new \WC_Shipping_Free_Shipping( $rate->instance_id );
            $applied_coupons  = WC()->cart->get_applied_coupons();

            if ( 'either' === $free_shipping->requires && ! empty($applied_coupons) && $cart_total < $min_amount ) {
                foreach ( $applied_coupons as $coupon_code ) {
                    $coupon = new WC_Coupon( $coupon_code );
                    if( $coupon->get_free_shipping() ) {
                        $coupon_free_ship = true;
                        break;
                    }
                }
            }
            // Enable free shipping for a minimal cart amount or a coupon with free shipping option
            if( $cart_total < $min_amount && ! isset($coupon_free_ship) ) {
                unset($rates[$rate_key]);
            } else {
                $free[$rate_key] = $rate;
                break;
            }
        }
    }
    return ! empty( $free ) ? $free : $rates;
}

Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Должно работать.

Примененный купон с включенной опцией бесплатной доставки:

Когда промежуточная сумма заказа меньше минимально необходимой суммы и применяется купон с бесплатной доставкой, активируется метод бесплатной доставки, скрывая другие способы доставки.

enter image description here

Refresh the shipping caches:

  1. This code is already saved on your functions.php file.
  2. In a shipping zone settings, disable / save any shipping method, then enable back / save.

    You are done and you can test it.

Related: WooCommerce - Скрыть другие способы доставки, когда доступна БЕСПЛАТНАЯ ДОСТАВКА

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...