Вопрос или проблема
У меня есть пользовательское выпадающее поле на странице оформления заказа для выбора региона. Есть 2 тарифные ставки:
- Для региона X с стоимостью 5$ (фиксированная ставка:34)
- Вторая для всех остальных с стоимостью 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 в зависимости от выбранного региона из пользовательского выпадающего списка. Давайте разберем, как эффективно это реализовать, и поправим ваш код, чтобы он работал корректно.
Контекст проблемы
Вы имеете пользовательское поле для выбора региона на странице оформления заказа с двумя тарифами на доставку:
- Для региона X (например, Тбилиси) стоимость составляет 5 долларов (метод: flat_rate:34).
- Для всех остальных регионов стоимость составляет 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. Также стоит помнить о тестировании кода в разных браузерах и на мобильных устройствах для обеспечения полного функционала.
Таким образом, вы сможете динамически изменять тарифы доставки на странице оформления заказа, предоставляя пользователю удобный и эффективный процесс покупок.