WooCommerce: установка ограничений на заказы по регионам

Диагностика задачи: зачем ограничивать заказы по регионам в 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');
    }
}
⭐⭐⭐⭐⭐