Диагностика проблемы: почему ограничение регионов доставки важно
Магазины на 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) | Гибкость, можно ограничить по городу, почтовому индексу | Требует навыков программирования, поддержка кода |
| Сторонние плагины для расширенного управления доставкой | Удобный интерфейс, дополнительные функции | Могут быть платными, влияют на производительность |