Диагностика задачи: зачем ограничивать заказы по регионам в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость ограничить оформление заказов для покупателей из определённых регионов. Это может быть связано с логистическими ограничениями, юридическими требованиями или особенностями налогообложения. Например, магазин может не доставлять товары в отдельные области или страны.
Без правильной настройки такие ограничения могут привести к потерям из-за оформления неподдерживаемых заказов или необходимости вручную их отменять.
Способы реализовать ограничение заказов по регионам в WooCommerce
Использование плагина
Плагины вроде Clearfy Pro могут помочь в частичной автоматизации ограничений, но для точных региональных ограничений чаще требуется кастомный код.
Кастомный код на хуках WooCommerce
Самый гибкий способ — добавить проверку выбранного адреса доставки в момент оформления заказа и блокировать неподдерживаемые регионы.
Пошаговое решение: ограничение заказов по регионам через код
1. Определение регионов для ограничения
Для примера ограничим заказы из двух областей: «Москва» (регион RU-MOW) и «Санкт-Петербург» (RU-SPE).
2. Добавление проверки в процесс оформления заказа
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_checkout_process', 'wc_limit_orders_by_shipping_region');
function wc_limit_orders_by_shipping_region() {
// Получаем данные о доставке
$shipping_state = WC()->customer->get_shipping_state();
// Список запрещённых регионов (коды областей)
$restricted_regions = array('RU-MOW', 'RU-SPE');
if (in_array($shipping_state, $restricted_regions)) {
wc_add_notice(__('К сожалению, доставка в ваш регион временно недоступна.'), 'error');
}
}3. Проверка работы кода
Перейдите в оформление заказа и выберите адрес доставки, указав регион из списка ограничений. При попытке оформить заказ должна появиться ошибка и заказ не будет принят.
Проверка результата после внедрения
- Перейдите на страницу оформления заказа.
- Выберите адрес доставки с запрещённым регионом.
- Попытайтесь завершить заказ.
- Убедитесь, что выводится сообщение об ошибке, и заказ не проходит.
- Проверьте, что для разрешённых регионов заказ оформляется без проблем.
Частые ошибки и их устранение
- Ошибка: регион не проверяется корректно
Причина — неправильный формат кода региона. Для российских регионов используйте коды ISO 3166-2 (например, RU-MOW). Проверьте, что код совпадает с данными в полеshipping_state. - Ошибка: ошибка не отображается пользователю
Убедитесь, что используетеwc_add_noticeс типомerrorи хукwoocommerce_checkout_processне конфликтует с другими плагинами. - Ошибка: ограничение не действует при изменении адреса после оформления
Этот код проверяет ограничения только в момент оформления. Для пост-оформления нужно добавить дополнительные проверки в обработчики статусов заказа.
Практические советы по безопасности и производительности
- Добавляйте код проверки в минимально необходимых местах (например, только при оформлении заказа), чтобы не замедлять работу сайта.
- Храните список ограниченных регионов в настройках или отдельном файле, если он большой, чтобы облегчить администрирование.
- Если используете плагины, убедитесь в их совместимости с вашим кодом, чтобы избежать конфликтов.
Альтернативные варианты реализации: сравнение
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин Clearfy Pro | Готовое решение с некоторыми ограничениями | Простота установки, поддержка | Может не покрывать все кейсы, платный |
| Кастомный код на хуках | Полная кастомизация под любые регионы и условия | Гибкость, бесплатное решение | Требует навыков разработки, поддержка на вас |
| Использование функций WooCommerce Shipping zones | Настройка зон доставки с ограничением по регионам | Встроенный функционал, не требует кода | Может не блокировать оформление заказа полностью, только влияет на цены и методы доставки |
Дополнительный пример: блокировка по стране
Если нужно ограничить страну целиком, код будет проще:
add_action('woocommerce_checkout_process', 'wc_limit_orders_by_country');
function wc_limit_orders_by_country() {
$country = WC()->customer->get_shipping_country();
$restricted_countries = array('RU', 'BY');
if (in_array($country, $restricted_countries)) {
wc_add_notice(__('Доставка в вашу страну временно не осуществляется.'), 'error');
}
}