Как отключить платёжные методы по стране в WooCommerce

Сценарий типичный: магазин работает в нескольких странах, а часть платёжных методов доступна только локально. Если не ограничить их по стране, покупатель видит лишние варианты на checkout, а потом упирается в отказ платёжного шлюза или ручную отмену заказа. В WooCommerce это лучше решать на уровне фильтра, а не через CSS или скрытие элементов формы.

Когда это действительно нужно

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

Важно заранее понять, по какой стране вы принимаете решение: по стране биллинга, по стране доставки или по обеим. Для магазина с физической доставкой обычно логичнее ориентироваться на адрес доставки. Для цифровых товаров — на биллинг, потому что доставки как таковой нет.

Диагностика проблемы перед изменениями

Перед тем как писать код, проверьте, как WooCommerce сейчас определяет страну на checkout. Это поможет не гадать, почему метод оплаты не скрывается.

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

Если метод оплаты исчезает не там, где нужно, проблема обычно не в WooCommerce, а в том, что фильтр смотрит не на тот адрес или срабатывает слишком рано.

Что лучше: плагин, код или правила шлюза

Есть три рабочих подхода. Выбор зависит от того, насколько сложная логика нужна и кто будет её поддерживать.

ПодходКогда подходитОграничения
Настройки платёжного шлюзаЕсли сам плагин оплаты умеет ограничение по странамНе все шлюзы это поддерживают, логика часто разрозненная
Код через фильтр WooCommerceЕсли нужна единая логика для нескольких методовНужно аккуратно тестировать на checkout и в корзине
Отдельный плагин для условий оплатыЕсли правила сложные и их будет менять менеджерДополнительная зависимость и возможные конфликты

Если задача точечная и понятная, код обычно надёжнее: вы контролируете условие, список стран и список методов оплаты.

Пошаговое решение через фильтр WooCommerce

Ниже пример, который скрывает конкретный способ оплаты для выбранных стран биллинга. Код можно добавить в мини-плагин или в functions.php дочерней темы, но для продакшена мини-плагин безопаснее: обновление темы не затрёт логику.

add_filter( 'woocommerce_available_payment_gateways', 'wplesson_limit_payment_gateways_by_country' );

function wplesson_limit_payment_gateways_by_country( $gateways ) {
    if ( is_admin() ) {
        return $gateways;
    }

    if ( ! function_exists( 'WC' ) || ! WC()->customer ) {
        return $gateways;
    }

    $billing_country = WC()->customer->get_billing_country();

    if ( empty( $billing_country ) ) {
        return $gateways;
    }

    // Пример: отключаем наложенный платёж для Украины и Казахстана.
    $blocked_countries = array( 'UA', 'KZ' );
    $gateway_id        = 'cod';

    if ( in_array( $billing_country, $blocked_countries, true ) && isset( $gateways[ $gateway_id ] ) ) {
        unset( $gateways[ $gateway_id ] );
    }

    return $gateways;
}

Если нужно ограничивать не один метод, а сразу несколько, удобнее хранить правила в массиве. Тогда код проще поддерживать, когда список стран или шлюзов меняется.

add_filter( 'woocommerce_available_payment_gateways', 'wplesson_payment_gateways_by_country_rules' );

function wplesson_payment_gateways_by_country_rules( $gateways ) {
    if ( is_admin() || ! function_exists( 'WC' ) || ! WC()->customer ) {
        return $gateways;
    }

    $country = WC()->customer->get_billing_country();

    if ( ! $country ) {
        return $gateways;
    }

    $rules = array(
        'cod'      => array( 'UA', 'KZ' ),
        'bacs'     => array( 'US', 'CA' ),
        'cheque'   => array( 'RU', 'BY' ),
    );

    foreach ( $rules as $gateway_id => $countries ) {
        if ( isset( $gateways[ $gateway_id ] ) && in_array( $country, $countries, true ) ) {
            unset( $gateways[ $gateway_id ] );
        }
    }

    return $gateways;
}

Если нужно смотреть на страну доставки

Для физического магазина чаще полезнее ориентироваться на адрес доставки. Тогда меняется только источник данных:

$shipping_country = WC()->customer->get_shipping_country();
$country = $shipping_country ? $shipping_country : WC()->customer->get_billing_country();

Такой fallback полезен, если покупатель ещё не заполнил доставку, но уже выбрал страну в биллинге. Однако если у вас строгая логика, лучше явно выбрать один источник и не смешивать правила.

Как проверить, что ограничение работает

После внедрения не ограничивайтесь визуальной проверкой одной страницы. На checkout WooCommerce может кэшировать часть состояния клиента, а методы оплаты пересчитываются не всегда так, как ожидается.

  1. Откройте checkout в режиме инкогнито.
  2. Выберите страну из списка, которая должна попадать под ограничение.
  3. Проверьте, исчез ли нужный способ оплаты.
  4. Смените страну на разрешённую и убедитесь, что метод снова появился.
  5. Создайте тестовый заказ и проверьте, что заказ не проходит с запрещённым методом.

Если метод не пропадает сразу, обновите checkout после смены страны. В некоторых темах и плагинах это происходит только после AJAX-обновления формы. Если обновления нет, проблема может быть в кастомной теме или в конфликте скриптов.

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

Фильтр добавили, но ничего не изменилось

Чаще всего причина в том, что код вставили не туда или он не выполняется. Проверьте, что это именно дочерняя тема или мини-плагин, а не файл, который потом перезаписывается обновлением. Ещё одна причина — опечатка в ID шлюза. У WooCommerce ID метода оплаты должен совпадать с реальным идентификатором, например cod, bacs, cheque.

Скрывается не тот метод оплаты

Проверьте, по какой стране вы фильтруете: billing или shipping. Если магазин продаёт физические товары, а вы смотрите на billing, логика может выглядеть «сломавшейся», хотя код работает корректно.

Метод оплаты исчезает у администратора

Такое бывает, если не добавить проверку is_admin() или если тестируете заказ из админки. Для отладки это неудобно, поэтому лучше проверять на фронтенде в отдельной сессии.

Конфликт с плагином доставки или оплаты

Некоторые плагины тоже фильтруют доступные методы на checkout. Если ваш код работает нестабильно, временно отключите сторонние плагины и проверьте поведение на чистом WooCommerce. Это быстрее, чем искать проблему в темноте.

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

Сам фильтр лёгкий, но есть несколько моментов, которые стоит учесть. Не храните длинные списки правил прямо в шаблоне, если ими будет пользоваться менеджер. Для часто меняющихся ограничений лучше вынести массив в отдельный файл конфигурации или в небольшой собственный плагин.

Если у вас много условий по странам, не усложняйте код лишними запросами к базе на каждом рендере checkout. В примере выше используется только объект клиента WooCommerce, и этого достаточно для большинства сценариев. Также не стоит прятать методы оплаты через JavaScript: пользователь может увидеть их в исходной логике checkout, а сервер всё равно примет заказ, если не будет серверной проверки.

Если вам нужно не только скрывать, но и объяснять причину, можно добавить уведомление на checkout через стандартные уведомления WooCommerce. Это лучше, чем молча убирать способ оплаты и оставлять покупателя в недоумении.

Когда стоит выбрать готовое решение

Если правила оплаты завязаны не только на страну, но и на роль пользователя, сумму корзины, способ доставки и тип товара, вручную поддерживать код становится неудобно. В таком случае разумнее смотреть в сторону плагина с условиями для checkout или в сторону более гибкой темы и набора инструментов. Например, если вы уже используете Clearfy Pro для чистки и базовой оптимизации сайта, часть технических задач можно держать в одном месте, но саму логику оплаты всё равно лучше оставлять в отдельном слое.

Главный критерий простой: если правило одно и оно понятно бизнесу, код надёжнее. Если правил много и ими будут управлять без разработчика, нужен интерфейс настроек.

Как автоматизировать удаление старых записей в WordPress
21.02.2026
Оптимизация базы данных WordPress: удаление старых и неиспользуемых данных
17.02.2026
Как отключить автовоспроизведение видео в WordPress
12.02.2026
Как избежать конфликтов между AJAX-запросами в WooCommerce
03.08.2026
Как автоматически удалять неактивные варианты товаров WooCommerce
09.07.2026