Фиксированная стоимость доставки на основе выбранного региона из выпадающего списка

Вопрос или проблема

У меня есть пользовательское выпадающее поле на странице оформления заказа для выбора региона. Есть 2 тарифные ставки:

  1. Для региона X с стоимостью 5$ (фиксированная ставка:34)
  2. Вторая для всех остальных с стоимостью 10$ (фиксированная ставка:35)

Я хочу установить тарифы при изменении поля.

// Подключить пользовательский JavaScript для отслеживания изменения региона
add_action('wp_footer', 'add_inline_region_shipping_js');
function add_inline_region_shipping_js() {
    // Добавлять скрипт только на странице оформления заказа
    if (is_checkout()) {
        ?>
        <script type="text/javascript">
            jQuery(function($) {
                // Слушать изменения в выпадающем списке региона
                $('#easyway_region').change(function() {
                    // Запустить обновление оформления заказа WooCommerce после изменения региона
                    $('body').trigger('update_checkout');
                });
            });
        </script>
        <?php
    }
}

// Настроить доступные тарифы доставки в зависимости от выбранного региона в форме оформления заказа
add_filter('woocommerce_package_rates', 'adjust_shipping_methods_based_on_region', 10, 2);
function adjust_shipping_methods_based_on_region($rates, $package) {
    // Получить выбранный регион из формы оформления заказа
    $region = isset($_POST['easyway_region']) ? sanitize_text_field($_POST['easyway_region']) : '';

    // ID региона Тбилиси (ID 24, обновите при необходимости)
    if ($region == '24') {
        // Разрешить только тариф доставки Тбилиси (фиксированная ставка:34)
        foreach ($rates as $rate_key => $rate) {
            if ($rate->method_id !== 'flat_rate' || $rate->id !== 'flat_rate:34') {
                unset($rates[$rate_key]); // Удалить тарифы не для Тбилиси
            }
        }
    } else {
        // Разрешить только тариф доставки для других регионов (фиксированная ставка:35)
        foreach ($rates as $rate_key => $rate) {
            if ($rate->method_id !== 'flat_rate' || $rate->id !== 'flat_rate:35') {
                unset($rates[$rate_key]); // Удалить тарифы не для других регионов
            }
        }
    }

    return $rates;
}

Нужно это исправить

Ответ или решение

Вопрос, который вы задали, касается настройки флат-рейт (фиксированного).shipping на странице оформления заказа в WooCommerce в зависимости от выбранного региона из пользовательского выпадающего списка. Давайте разберем, как эффективно это реализовать, и поправим ваш код, чтобы он работал корректно.

Контекст проблемы

Вы имеете пользовательское поле для выбора региона на странице оформления заказа с двумя тарифами на доставку:

  1. Для региона X (например, Тбилиси) стоимость составляет 5 долларов (метод: flat_rate:34).
  2. Для всех остальных регионов стоимость составляет 10 долларов (метод: flat_rate:35).

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

Решение

Шаг 1: Подключение JavaScript

Первым шагом является добавление JavaScript, который отслеживает изменения в выпадающем списке региона. Ваш код в целом правильный, но я внесу несколько улучшений для предотвращения ошибок. Обратите внимание на правильное использование jQuery и улучшение чистоты функции:

// Подключаем пользовательский JavaScript для отслеживания изменений региона
add_action('wp_footer', 'add_inline_region_shipping_js');
function add_inline_region_shipping_js() {
    // Проверяем, что это страница оформления заказа
    if (is_checkout()) {
        ?>
        <script type="text/javascript">
            jQuery(function($) {
                // Слушаем изменения в выпадающем списке региона
                $('#easyway_region').change(function() {
                    // Запускаем обновление оформления заказа WooCommerce
                    $('body').trigger('update_checkout');
                });
            });
        </script>
        <?php
    }
}

Шаг 2: Настройка методов доставки

В этом шаге мы исправим функцию, которая будет изменять доступные методы доставки в зависимости от выбранного региона. Я внесу дополнительные комментарии и небольшие исправления:

// Настройка доступных методов доставки в зависимости от выбранного региона в форме оформления заказа
add_filter('woocommerce_package_rates', 'adjust_shipping_methods_based_on_region', 10, 2);
function adjust_shipping_methods_based_on_region($rates, $package) {
    // Получаем выбранный регион из формы оформления заказа
    $region = isset($_POST['easyway_region']) ? sanitize_text_field($_POST['easyway_region']) : '';

    // Проверка на регион Тбилиси
    if ($region == '24') { // '24' - это ID региона Тбилиси
        // Удаляем все методы доставки, кроме Тбилиси
        foreach ($rates as $rate_key => $rate) {
            if ($rate->method_id !== 'flat_rate' || $rate->id !== 'flat_rate:34') {
                unset($rates[$rate_key]); // Удаляем все, кроме Тбилиси
            }
        }
    } else {
        // Удаляем все методы доставки, кроме остальных регионов
        foreach ($rates as $rate_key => $rate) {
            if ($rate->method_id !== 'flat_rate' || $rate->id !== 'flat_rate:35') {
                unset($rates[$rate_key]); // Удаляем все, кроме других регионов
            }
        }
    }

    return $rates; // Возвращаем отфильтрованные методы доставки
}

Заключение

После внесения вышеописанных правок ваш код должен корректно настроить методы доставки в зависимости от выбранного региона. Убедитесь, что ID региона Тбилиси соответствует реальному значению в вашей базе данных WooCommerce. Также стоит помнить о тестировании кода в разных браузерах и на мобильных устройствах для обеспечения полного функционала.

Таким образом, вы сможете динамически изменять тарифы доставки на странице оформления заказа, предоставляя пользователю удобный и эффективный процесс покупок.

Оцените материал
Добавить комментарий

Капча загружается...