WooCommerce: как разрешить отправку товаров только в определённые регионы

Диагностика проблемы: почему ограничение регионов доставки важно

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

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

Пошаговое решение: ограничение доставки по регионам с помощью кастомного кода

1. Определяем, на каком уровне ограничивать регионы

Чаще всего WooCommerce поддерживает ограничение по стране и штату (региону). Если нужно ограничить доставку по городам или почтовым индексам, придётся использовать фильтры и дополнительные проверки.

2. Фильтрация доступных зон доставки с помощью хука woocommerce_package_rates

Добавим в файл functions.php вашей темы или в кастомный плагин следующий код, который ограничит доступность доставки по конкретному списку почтовых индексов:

add_filter('woocommerce_package_rates', 'restrict_shipping_by_postcode', 10, 2);
function restrict_shipping_by_postcode($rates, $package) {
    // Список разрешённых почтовых индексов
    $allowed_postcodes = array('101000', '102000', '103000');

    // Получаем почтовый индекс из адреса доставки
    $postcode = isset($package['destination']['postcode']) ? $package['destination']['postcode'] : '';

    // Проверяем, входит ли индекс в разрешённый список
    if (!in_array($postcode, $allowed_postcodes)) {
        // Очищаем все доступные способы доставки
        $rates = array();
    }

    return $rates;
}

Этот код удалит все способы доставки, если почтовый индекс не входит в разрешённый список.

3. Добавление пользовательского сообщения об ошибке

Чтобы пользователь понимал причину отсутствия доставки, добавим сообщение при пустом списке способов доставки. Для этого используем фильтр woocommerce_no_shipping_available_html:

add_filter('woocommerce_no_shipping_available_html', 'custom_no_shipping_message');
function custom_no_shipping_message() {
    return '<p>Извините, доставка в ваш регион пока недоступна.</p>';
}

4. Ограничение доставки по городам

Если нужно ограничить доставку по названию города, код будет аналогичным, только проверяем поле city из адреса:

add_filter('woocommerce_package_rates', 'restrict_shipping_by_city', 10, 2);
function restrict_shipping_by_city($rates, $package) {
    $allowed_cities = array('Москва', 'Санкт-Петербург', 'Новосибирск');
    $city = isset($package['destination']['city']) ? $package['destination']['city'] : '';
    if (!in_array($city, $allowed_cities)) {
        $rates = array();
    }
    return $rates;
}

Проверка результата после внедрения

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

Частые ошибки и как их исправить

  • Пустой или неверный формат почтового индекса: убедитесь, что в адресе доставки почтовый индекс введён без пробелов и соответствует формату. При необходимости добавьте логирование error_log($postcode); для отладки.
  • Кэширование страниц оформления заказа: если изменения не видны, очистите кэш сайта и браузера, а также деактивируйте временно плагин кеширования.
  • Конфликты с другими плагинами доставки: проверьте, не переопределяют ли другие плагины хук woocommerce_package_rates. Отключите другие плагины и протестируйте повторно.
  • Неправильное место вставки кода: код должен быть в functions.php активной темы или в отдельном плагине. Не вставляйте код в файлы ядра WooCommerce.

Практические советы по безопасности и производительности

  • Для больших списков регионов или почтовых индексов используйте оптимизированные структуры данных, например, array_flip для ускорения проверки in_array.
  • Избегайте жесткого кодирования данных в файле functions.php. Лучше хранить список разрешённых регионов в настройках темы, отдельном файле JSON или использовать опции WordPress.
  • Тестируйте изменения на тестовом сайте, чтобы не нарушить работу реального магазина.
  • Если используете сторонние плагины доставки, сначала проверьте их возможности по ограничению зон — иногда они могут решить задачу без кода.

Сравнение методов ограничения доставки

МетодПреимуществаНедостатки
Стандартные зоны доставки WooCommerceПростая настройка, без кодаОграничено по странам и штатам
Кастомный код (фильтр woocommerce_package_rates)Гибкость, можно ограничить по городу, почтовому индексуТребует навыков программирования, поддержка кода
Сторонние плагины для расширенного управления доставкойУдобный интерфейс, дополнительные функцииМогут быть платными, влияют на производительность
WooCommerce: автоматическое отключение платёжных методов при определённых условиях
10.07.2026
Как установить и настроить OmniVideo в WordPress
25.02.2026
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
29.04.2026
WooCommerce: автоматическое изменение стоимости товара при выборе способа доставки
14.07.2026
WooCommerce: автоматическое обновление стоимости товара при акции
08.05.2026