Диагностика проблемы: почему ограничение зон доставки важно
В интернет-магазинах на 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 и плагины для совместимости и безопасности.