WooCommerce: как отключить способы оплаты по условиям корзины

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

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

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

  • наложенный платеж только для конкретных способов доставки;
  • безналичная оплата только для юридических лиц или заказов от определённой суммы;
  • ограничения по странам, регионам или складам;
  • товары, которые нельзя оплачивать отдельными методами, например предзаказ или крупногабаритный товар;
  • скидочные купоны, после которых нужно убрать оплату при получении.

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

Прежде чем писать фильтр, проверьте, где именно ломается логика. В WooCommerce способы оплаты могут скрываться не только вашим кодом, но и плагинами доставки, мультивалютности, B2B-модулями и кастомными правилами чекаута.

Что проверить в админке и на фронтенде

  • Включён ли нужный способ оплаты в WooCommerce → Настройки → Платежи.
  • Не отключается ли метод сторонним плагином по стране, валюте или роли пользователя.
  • Меняется ли список методов после выбора доставки, адреса или купона.
  • Нет ли кэша на странице оформления заказа, особенно если используется оптимизация JS.

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

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

Для скрытия методов оплаты используется фильтр woocommerce_available_payment_gateways. Он получает массив доступных шлюзов, и вы можете удалить из него лишние элементы по условиям корзины.

Ниже пример, который отключает cod для заказов с доставкой, отличной от самовывоза, и скрывает bacs для корзины меньше 5000 рублей. Идентификаторы методов у вас могут отличаться — их нужно брать из настроек платежных шлюзов.

add_filter( 'woocommerce_available_payment_gateways', 'wpaddons_filter_payment_gateways_by_cart_conditions' );
function wpaddons_filter_payment_gateways_by_cart_conditions( $gateways ) {
    if ( is_admin() ) {
        return $gateways;
    }

    if ( ! WC()->cart || ! WC()->session ) {
        return $gateways;
    }

    $chosen_shipping_methods = (array) WC()->session->get( 'chosen_shipping_methods', array() );
    $chosen_shipping_method  = isset( $chosen_shipping_methods[0] ) ? $chosen_shipping_methods[0] : '';
    $cart_total              = (float) WC()->cart->get_cart_contents_total();

    // Наложенный платеж только для самовывоза.
    if ( isset( $gateways['cod'] ) && $chosen_shipping_method && strpos( $chosen_shipping_method, 'local_pickup' ) === false ) {
        unset( $gateways['cod'] );
    }

    // Банковский перевод только от 5000.
    if ( isset( $gateways['bacs'] ) && $cart_total < 5000 ) {
        unset( $gateways['bacs'] );
    }

    return $gateways;
}

Если нужно учитывать не только стоимость товаров, но и доставку, используйте WC()->cart->get_total( 'edit' ) аккуратно: там может быть строка с форматированием. Для сравнения лучше брать числовые значения из корзины и отдельно учитывать доставку, если это важно для вашей бизнес-логики.

Как добавить условие по купону

Иногда метод оплаты нужно скрывать после применения конкретного купона. Например, если скидка уже заложена в промо, вы не хотите оставлять оплату при получении.

add_filter( 'woocommerce_available_payment_gateways', 'wpaddons_disable_cod_with_coupon' );
function wpaddons_disable_cod_with_coupon( $gateways ) {
    if ( ! WC()->cart || ! WC()->cart->has_discount( 'pickup10' ) ) {
        return $gateways;
    }

    if ( isset( $gateways['cod'] ) ) {
        unset( $gateways['cod'] );
    }

    return $gateways;
}

Здесь pickup10 — это код купона. Если у вас несколько купонов, можно проверять массив применённых скидок через WC()->cart->get_applied_coupons().

Сравнение подходов: плагин, код или гибрид

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

ПодходПлюсыМинусы
Код через фильтрКонтроль, скорость, минимум зависимостейНужно тестировать и поддерживать
Плагин правилУдобно для менеджера, меньше ручной разработкиДополнительная нагрузка и риск конфликтов
ГибридБаланс между гибкостью и стабильностьюНужно следить, чтобы правила не дублировались

Если вы уже используете набор оптимизационных инструментов вроде Clearfy Pro, проверьте, не вмешивается ли он в чекаут через отключение скриптов или очистку кэша. Для страницы оформления заказа это критично: лишняя оптимизация иногда ломает обновление способов оплаты при смене доставки.

Проверка результата после внедрения

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

  • Добавьте в корзину товар на сумму ниже порога и проверьте, что bacs скрыт.
  • Смените способ доставки на самовывоз и убедитесь, что cod появляется.
  • Примените нужный купон и проверьте, что метод оплаты действительно исчезает.
  • Проверьте гостевой чекаут и авторизованного пользователя отдельно.
  • Откройте страницу в режиме инкогнито, чтобы исключить влияние сохранённой сессии.

Если метод не исчезает, откройте консоль браузера и посмотрите, не падает ли AJAX-обновление чекаута. В WooCommerce список платежей часто пересчитывается после изменения доставки, и если на странице есть JS-ошибка, фильтр на сервере может отработать, но интерфейс останется старым.

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

Неправильный ID способа оплаты

В коде нужно использовать не название на витрине, а ID шлюза. Например, cod, bacs, stripe. Если ID указан неверно, unset просто не сработает. Посмотреть ID можно в настройках платежного метода или в коде самого шлюза.

Проверка только в админке

Если забыть исключить is_admin(), можно случайно повлиять на служебные экраны и AJAX-запросы. Для чекаута это особенно неприятно: метод может исчезать в админке заказа или при обновлении корзины.

Использование строк вместо чисел

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

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

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

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

Не вставляйте такой код в файл темы, если тема часто обновляется. Лучше использовать дочернюю тему или небольшой mu-plugin. Тогда правило не потеряется после обновления и его проще отключить при отладке.

Если правил становится много, не раздувайте один фильтр до десятков вложенных if. Разбейте логику на отдельные функции: по способу доставки, по сумме, по купону, по стране. Это проще тестировать и безопаснее сопровождать.

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

Мини-чек-лист перед публикацией

  • Проверены реальные ID платёжных шлюзов.
  • Тест пройден для гостя и авторизованного пользователя.
  • Проверены минимум два способа доставки.
  • Проверен сценарий с купоном, если он участвует в логике.
  • Код вынесен в дочернюю тему или mu-plugin.
  • На странице чекаута нет JS-ошибок после обновления доставки.

Если нужна более гибкая логика без постоянного редактирования кода, можно рассмотреть плагин правил для WooCommerce. Но для точечного сценария вроде «скрыть оплату при наложенном платеже для конкретной доставки» фильтр woocommerce_available_payment_gateways обычно остаётся самым предсказуемым вариантом.

Как создать автоматический импорт продуктов в WooCommerce с примерами кода и плагинами
15.09.2026
WooCommerce: автоматическое отключение способов оплаты при неудачной оплате заказа
26.08.2026
Как отключить редактор Gutenberg для определённых ролей в WordPress
15.09.2026
WooCommerce: автоматическое отключение плагинов по условиям корзины
16.08.2026
WooCommerce: автоматическое изменение стоимости товаров при изменении опций вариативных продуктов
16.08.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше