Диагностика проблемы: когда и зачем отключать способы доставки по регионам
В интернет-магазинах на WooCommerce часто возникает необходимость ограничить способы доставки в зависимости от региона покупателя. Например, доставка курьером возможна только в городах-миллионниках, а в удалённые регионы — исключительно почтой. Без такой настройки пользователи могут видеть неподходящие варианты доставки, что ухудшает UX и приводит к ошибкам в заказах.
Если в вашем магазине используется несколько способов доставки, а WooCommerce по умолчанию не умеет гибко фильтровать их по региону без дополнительных настроек, значит эта статья для вас.
Как определить, что способы доставки не фильтруются по региону
- Проверьте корзину и оформление заказа с разными адресами доставки из нескольких регионов.
- Если все способы доставки доступны вне зависимости от региона, значит фильтрация не настроена.
- Включите отладку WooCommerce (в
wp-config.phpдобавитьdefine('WP_DEBUG', true);) и посмотрите логи, если есть кастомные фильтры, возможно, они конфликтуют.
Пошаговое решение: как отключить способы доставки по регионам через код
Мы будем использовать фильтр woocommerce_package_rates, чтобы программно отфильтровать способы доставки, учитывая регион покупателя, указанный в адресе доставки.
1. Определяем регион из адреса доставки
В WooCommerce регион — это штат, область или регион, который передаётся в параметре $package['destination']['state'] или $package['destination']['country'].
2. Функция фильтрации способов доставки
add_filter('woocommerce_package_rates', 'filter_shipping_methods_by_region', 10, 2); function filter_shipping_methods_by_region($rates, $package) { // Получаем регион и страну из адреса доставки $state = isset($package['destination']['state']) ? $package['destination']['state'] : ''; $country = isset($package['destination']['country']) ? $package['destination']['country'] : ''; // Пример: отключаем курьерскую доставку (ID 'flat_rate:3') для регионов, кроме Москвы и Московской области $allowed_states = ['MOW', 'MOS']; // коды регионов по ISO или slug, уточните в вашей базе foreach ($rates as $rate_id => $rate) { if ($rate->method_id === 'flat_rate' && $rate_id === 'flat_rate:3') { if (!in_array($state, $allowed_states)) { unset($rates[$rate_id]); } } } return $rates; }В этом коде:
flat_rate:3— ID метода доставки, который нужно отключить по условию (получить ID можно из настроек WooCommerce или отладчиком).- В массиве
$allowed_statesзадаются регионы, для которых доставка разрешена. - Метод доставки удаляется из списка, если регион не подходит.
Проверка результата после внедрения
- Перейдите в корзину или оформление заказа.
- В поле адреса доставки укажите регион, который не входит в
$allowed_states. Способ доставки с IDflat_rate:3должен отсутствовать. - В другом регионе, который есть в списке разрешённых, способ должен отображаться.
- Если способ доставки пропадает или появляется некорректно, проверьте ID методов и правильность регионов.
Частые ошибки и как их исправить
- Неправильный ID способа доставки. Используйте инструмент WooCommerce > Настройки > Доставка, включите отладку или плагин WooCommerce Shipping Debug для просмотра ID.
- Регион не совпадает с кодами в массиве. В WooCommerce коды регионов зависят от страны — для РФ это коды ISO 3166-2 (например, MOW — Москва). Уточните в базе WooCommerce или используйте
print_r($package['destination'])для отладки. - Конфликт с другими плагинами доставки. Отключите сторонние плагины и проверьте работу фильтра отдельно.
- Кэширование страниц. После изменений сбросьте кэш сайта и браузера, чтобы увидеть актуальный результат.
Практические советы по безопасности и производительности
- Не используйте тяжелые операции внутри фильтра
woocommerce_package_rates, чтобы не замедлять загрузку страницы оформления заказа. - Проверяйте входные данные — регион и страну — на валидность, чтобы избежать ошибок и уязвимостей.
- Для сложных правил доставки лучше использовать специализированные плагины, например Clearfy Pro с расширенными настройками доставки и SEO.
Сравнение подходов: код против плагинов
| Метод | Плюсы | Минусы |
|---|---|---|
Самописный код (фильтр woocommerce_package_rates) | Легко кастомизировать, бесплатно, контролируемая логика | Требует знаний PHP, может конфликтовать с обновлениями и плагинами |
| Плагины для управления доставкой | Удобный интерфейс, поддержка, много функций (условия, группы) | Стоимость, нагрузка на сайт, могут быть избыточны для простой задачи |