Перейти к содержимому
11 июля 2026 г.·4 мин чтения

Как включить оплату при доставке только для определённых регионов в WooCommerce

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

Оплата при доставке (наложенный платёж, COD) хорошо продаёт, но предлагать её везде обычно не нужно. Возможно, ваш курьер поддерживает COD только в некоторых зонах, возможно, в отдельных регионах у вас слишком много отказов от посылок, или вы хотите COD локально, а онлайн-оплату — везде остальном. Хорошая новость: WooCommerce позволяет сделать именно это.

Загвоздка в том, что в WooCommerce нет кнопки «принимать COD в регионе A и B, но не в остальных». Метод оплаты при доставке привязан к методам доставки, а не напрямую к региону. Как только это понятно, остальное просто. Покажу два чистых пути: один без кода, через Зоны доставки, и один с небольшим сниппетом, который фильтрует по региону адреса. Выбирайте тот, что подходит вашему магазину.

Почему нельзя просто отметить «COD по региону»

В WooCommerce у шлюза «Оплата при доставке» есть единственная важная для ограничения настройка: «Включить для методов доставки». Поля региона в настройках оплаты нет.

Поэтому реальная логика такова:

  • Регион клиента определяет, в какую Зону доставки попадёт заказ.
  • Зона доставки определяет, какие методы доставки видит клиент.
  • Метод доставки определяет, появится ли вообще COD.

Вы не включаете «COD по региону» напрямую — вы строите зоны по регионам и привязываете COD к методам внутри этих зон. Звучит окольно, но это стабильно, не зависит от плагинов и переживает обновления. Убедитесь, что в оформлении заказа действительно запрашивается поле региона/области в Настройки > Общие, иначе фильтру нечего читать.

Способ 1 (без кода): Зоны доставки + «Включить для методов доставки»

Самый чистый подход, рекомендуется, если не хотите трогать код.

  • Перейдите в WooCommerce > Настройки > Доставка > Зоны доставки.
  • Создайте зону «COD разрешён» и добавьте в неё только регионы, где принимаете COD. WooCommerce позволяет добавлять в зону отдельные области/регионы.
  • В этой зоне добавьте метод доставки, к которому привяжется COD (например, «Курьерская доставка»).
  • Создайте вторую зону (или используйте «Локации без покрытия») для остальной страны с теми же методами доставки, но там вы заблокируете COD.
  • Перейдите в WooCommerce > Настройки > Платежи > Оплата при доставке > «Включить для методов доставки» и выберите ТОЛЬКО метод из зоны «COD разрешён».

Результат: клиент из разрешённого региона видит COD, из остальных — нет. Без кода, без плагина.

Способ 2 (с кодом): сниппет, фильтрующий по региону

Если зоны слишком усложняют доставку (у вас уже есть тарифы по зонам и не хочется их дублировать), можно скрывать COD прямо по региону адреса. Поместите сниппет в functions.php дочерней темы или в плагин сниппетов (Code Snippets):

```php

add_filter( 'woocommerce_available_payment_gateways', 'mpo_cod_po_regionu' );

function mpo_cod_po_regionu( $gateways ) {

if ( is_admin() && ! wp_doing_ajax() ) {

return $gateways;

}

// Регионы, где вы ПРИНИМАЕТЕ COD (коды регионов WooCommerce)

$razresheno = array( 'CJ', 'TM', 'IF', 'B' );

$region = WC()->customer ? WC()->customer->get_shipping_state() : '';

if ( ! in_array( $region, $razresheno, true ) && isset( $gateways['cod'] ) ) {

unset( $gateways['cod'] );

}

return $gateways;

}

```

Коды — это коды областей/регионов WooCommerce для вашей страны. Меняете список — и готово. Чтобы перевернуть логику (COD везде, КРОМЕ нескольких регионов), поместите в массив запрещённые регионы и инвертируйте условие in_array.

Тестирование и частые ловушки

Прежде чем радоваться, проверьте:

  • Тестируйте реальными адресами из разных регионов. Добавьте товар в корзину, перейдите к оформлению и смените регион доставки — методы оплаты обновляются через AJAX, так что COD должен появляться и исчезать в реальном времени.
  • Следите за регионом оплаты и доставки. Сниппет выше читает регион доставки (shipping_state). Если магазин использует только адрес выставления счёта, замените на get_billing_state().
  • Кэш может обмануть. Если у вас плагин кэша или CDN, очистите его после изменений, иначе увидите старую версию оформления.
  • Не забудьте о комиссии за COD. Ограничение по региону решает, кто может платить наличными, но добавление наценки за COD — отдельная настройка (комиссия на метод оплаты или через сниппет woocommerce_cart_calculate_fees).

Всегда тестируйте на промежуточной среде перед публикацией, особенно если трогаете functions.php.

Когда стоит попросить помощи (и как работаем мы)

Если у вас одно простое правило — несколько регионов с COD, онлайн-оплата для остальных — вы справитесь сами за пару минут способами выше. Помощь окупается, когда логика запутывается: COD только выше определённой суммы, другое правило по категориям товаров, плюс переменная комиссия за COD по зонам. Тут плагин условных платежей или код под задачу экономит часы и предотвращает потерю заказов из-за конфликтующих правил.

В MPO Web Studio мы строим и обслуживаем магазины WooCommerce удалённо, для клиентов по всей стране. Мы можем правильно настроить зоны, COD по регионам и комиссии или показать на демо, как это будет выглядеть, прежде чем вы что-то заплатите. Нужна рука помощи — напишите нам в WhatsApp, и мы честно скажем, это ли 10-минутная самоделка или действительно стоит полноценной работы.

Частые вопросы

Могу ли я принимать COD везде, кроме нескольких регионов?+

Да. Проще со сниппетом: поместите ЗАПРЕЩЁННЫЕ регионы в массив и инвертируйте условие — если регион клиента в списке, удалите шлюз cod. С зонами наоборот: вынесите исключения в отдельную зону без метода доставки, привязанного к COD.

Какие коды регионов использует WooCommerce?+

Короткие коды по стране. У каждой области/региона есть код, который можно найти в файле областей страны или посмотрев значение в выпадающем списке региона при оформлении. Используйте именно эти коды в списке разрешённых, иначе совпадение не сработает.

Фильтр читает адрес выставления счёта или доставки?+

Тот, что выберете. В сниппете get_shipping_state() использует адрес доставки, а get_billing_state() — адрес счёта. Для COD логичен адрес доставки, ведь именно туда идёт посылка. Выбирайте по тому, какие поля запрашиваете при оформлении.

Нужен ли плагин?+

Для простых случаев — нет. Способ с Зонами доставки полностью встроен в WooCommerce, а сниппету нужен лишь доступ к functions.php или бесплатный плагин сниппетов. Отдельный плагин условных платежей оправдан только при комбинированных правилах (сумма + категория + регион).

Почему COD вообще не появляется, хотя всё настроено?+

Чаще всего: кэш оформления не очищен, регион клиента не совпадает точно с кодом в списке, или поле региона/области отключено в Настройках. Очистите кэш и протестируйте оформление, меняя регион, чтобы убедиться, что методы оплаты обновляются.

Бесплатный гид

7 ошибок, которые отпугивают клиентов с вашего сайта

Оставьте email и получите гид прямо здесь, сразу. Без спама.

Отправляя, вы соглашаетесь с Политикой конфиденциальности.
MКоманда MPOОтвечаем лично

Хотите увидеть, как мог бы выглядеть сайт вашего бизнеса?

Напишите нам в WhatsApp — и мы бесплатно подготовим демо-сайт с названием вашего бизнеса. Сначала смотрите, потом решаете — без обязательств.

Запросить бесплатный демо-сайтОбычно отвечаем за пару минут