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

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

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

Как проверить текущие настройки зон доставки в WooCommerce

Перейдите в админке WordPress в WooCommerce → Настройки → Доставка → Зоны доставки. Просмотрите существующие зоны, обратите внимание на регионы, для которых они заданы. Если зона охватывает слишком большой регион (например, вся страна), а доставка возможна только в отдельные города, это повод для корректировки.

Проверка через базу данных

Вы можете проверить зоны доставки и связанные методы через таблицу wp_woocommerce_shipping_zones и wp_woocommerce_shipping_zone_locations. Это полезно при отладке или автоматизации.

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

Если стандартных настроек зон недостаточно, можно ограничить доставку программно, используя хук woocommerce_package_rates. Ниже пример, который запрещает доставку, если город покупателя не входит в заданный список:

add_filter('woocommerce_package_rates', 'restrict_shipping_to_cities', 10, 2);
function restrict_shipping_to_cities($rates, $package) {
    // Список разрешенных городов (регистр учитывается)
    $allowed_cities = ['Москва', 'Санкт-Петербург', 'Казань'];

    // Получаем город из адреса доставки
    $shipping_city = isset($package['destination']['city']) ? $package['destination']['city'] : '';

    if (!in_array($shipping_city, $allowed_cities)) {
        // Удаляем все доступные методы доставки
        $rates = [];
    }

    return $rates;
}

Этот код добавьте в файл functions.php вашей дочерней темы или в кастомный плагин.

Как добавить разные зоны с разными городами

Можно расширить пример, указав набор городов для каждой зоны доставки:

add_filter('woocommerce_package_rates', 'restrict_shipping_by_multiple_cities', 10, 2);
function restrict_shipping_by_multiple_cities($rates, $package) {
    $zones_cities = [
        'zone_1' => ['Москва', 'Химки'],
        'zone_2' => ['Санкт-Петербург', 'Пушкин'],
    ];

    $shipping_city = isset($package['destination']['city']) ? $package['destination']['city'] : '';

    $allowed = false;
    foreach ($zones_cities as $zone => $cities) {
        if (in_array($shipping_city, $cities)) {
            $allowed = true;
            break;
        }
    }

    if (!$allowed) {
        $rates = [];
    }

    return $rates;
}

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

Для проверки:

  • Откройте страницу оформления заказа и введите адрес доставки с городом, который есть в списке разрешённых — должны отображаться доступные методы доставки.
  • Введите город, которого нет в списке — методы доставки должны исчезнуть, и обычно WooCommerce покажет сообщение о невозможности доставки.
  • Если методы доставки не исчезают — проверьте правильность ключа массива $package['destination']['city'] и совпадение названий городов (регистр, пробелы).

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

  • Неправильное имя города в списке: города в WooCommerce могут приходить с разным регистром или написанием. Используйте функцию mb_strtolower() для нормализации перед сравнениями.
  • Кэширование методов доставки: иногда кэш плагинов или WooCommerce мешает обновлению зон доставки. Очистите кэш и обновите страницу.
  • Конфликты с другими плагинами доставки: отключите сторонние плагины, чтобы убедиться, что код работает корректно.
  • Код добавлен в неправильное место: всегда добавляйте код в дочернюю тему или кастомный плагин, чтобы избежать потери изменений при обновлениях.

Альтернативный вариант: использование плагина для гибкой настройки зон доставки

Если вы предпочитаете визуальные инструменты, рассмотрите плагин WooCommerce Shipping Zones by District. Он позволяет создавать зоны доставки по более тонким географическим признакам.

ВариантПреимуществаНедостатки
Кодовое решениеПолный контроль, нет дополнительных затратТребует навыков кодирования, поддержка на вас
Плагин Shipping Zones by DistrictУдобный интерфейс, расширенная географияПлатный, может конфликтовать с другими плагинами

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

  • Используйте фильтры WooCommerce, которые вызываются на этапе расчёта доставки, чтобы не влиять на другие процессы.
  • Избегайте тяжелых запросов к базе данных в фильтрах доставки — лучше храните списки городов в виде массивов или кэшируйте.
  • Проверяйте ввод пользователя на стороне клиента и сервера, чтобы избежать ошибок и злоупотреблений.
  • Регулярно обновляйте WooCommerce и плагины для совместимости и безопасности.

Сервис определения шаблона и плагинов на сайте