Как скрыть способы оплаты в WooCommerce для отдельных товаров и категорий

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

Ниже — рабочий способ без выдуманных API: через стандартный фильтр WooCommerce woocommerce_available_payment_gateways. Он позволяет убрать ненужные платёжные методы уже на этапе формирования доступных вариантов в checkout.

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

Обычно задача всплывает в одном из таких сценариев:

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

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

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

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

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

Зайдите в WooCommerce → Настройки → Платежи и убедитесь, что нужные методы включены. Если способ оплаты выключен здесь, код его не вернёт — это частая причина ложной диагностики.

Посмотрите, на каком этапе пропадает метод

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

Уточните, по какому признаку нужно скрывать платёж

Условие должно быть конкретным: категория, ID товара, наличие товара в корзине, выбранный способ доставки. Чем точнее правило, тем меньше побочных эффектов.

Решение через фильтр WooCommerce

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

Пример: скрыть наложенный платёж для определённой категории

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wproot_hide_cod_for_category' );

function wproot_hide_cod_for_category( $available_gateways ) {
    if ( is_admin() ) {
        return $available_gateways;
    }

    if ( ! is_checkout() || ! WC()->cart ) {
        return $available_gateways;
    }

    $target_category = 'fragile-goods'; // slug категории
    $cod_gateway_id  = 'cod';

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];

        if ( has_term( $target_category, 'product_cat', $product_id ) ) {
            if ( isset( $available_gateways[ $cod_gateway_id ] ) ) {
                unset( $available_gateways[ $cod_gateway_id ] );
            }
            break;
        }
    }

    return $available_gateways;
}

Здесь логика простая: если в корзине есть товар из категории fragile-goods, метод cod скрывается. ID шлюза может отличаться в зависимости от плагина оплаты, но у стандартного наложенного платежа WooCommerce это обычно cod.

Пример: скрыть банковский перевод для конкретного товара

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wproot_hide_bacs_for_product' );

function wproot_hide_bacs_for_product( $available_gateways ) {
    if ( is_admin() || ! is_checkout() || ! WC()->cart ) {
        return $available_gateways;
    }

    $restricted_product_id = 123;
    $bacs_gateway_id       = 'bacs';

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( (int) $cart_item['product_id'] === $restricted_product_id ) {
            unset( $available_gateways[ $bacs_gateway_id ] );
            break;
        }
    }

    return $available_gateways;
}

Такой подход удобен, если один товар продаётся по особой схеме: предзаказ, B2B-условия, отдельная логистика или ручное подтверждение.

Если нужно сравнить подходы

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

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

Как проверить, что решение сработало

После внедрения не ограничивайтесь визуальной проверкой на одной корзине. Проверьте несколько сценариев:

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

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

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

Неверный ID платёжного метода

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

Проверка только по product_id, когда нужен variation_id

Если в корзину добавляют вариацию, а условие написано только на родительский товар, логика может не сработать. В таких случаях смотрите и на variation_id, и на product_id.

Код вставлен в неподходящее место

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

Нет проверки на WC()->cart

На некоторых запросах объект корзины может быть недоступен. Без проверки можно получить предупреждения PHP или поломать AJAX-обновление checkout.

Скрывается слишком много способов оплаты

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

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

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

Для безопасности не доверяйте данным из корзины без проверки типов. Приводите ID к целым числам, а slug категорий задавайте явно. Если логика зависит от роли пользователя, проверяйте её через wp_get_current_user() или current_user_can(), но не подменяйте доступ к оплате только по роли, если это может нарушить бизнес-процесс.

Если на сайте уже используется плагин оптимизации вроде Clearfy Pro, не пытайтесь решать эту задачу через общую «чистку» checkout. Здесь нужен именно бизнес-правилом управляемый фильтр, а не отключение лишних скриптов наугад.

Что стоит сделать после внедрения

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

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

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: автоматическое удаление неактивных заказов по статусу и дате
12.06.2026
Как создать собственный REST API endpoint в WordPress: подробное руководство
01.12.2025
Как создать собственный шорткод в WordPress: подробное руководство
17.11.2025
Как создать собственный виджет с поддержкой AJAX в WordPress
08.04.2026
Как установить ограничение на число публикаций в WordPress
16.03.2026
×
до 3225₽

WPShop - честная партнерка!

Зарабатывай с каждой продажи

Подключиться ⋙