WooCommerce: как исключить определённые товары из способов оплаты

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

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

Чаще всего проблему выявляют при тестировании оформления заказа или после жалоб клиентов о невозможности корректного завершения покупки.

Пошаговое решение: исключаем товары из способов оплаты через фильтр

1. Определяем ID товаров или категории для исключения

Для начала нужно точно знать, для каких товаров отключать способы оплаты. Это могут быть конкретные ID товаров, категории или метки.

// Пример массива с ID товаров для исключения
$excluded_products = array(123, 456, 789);

2. Подключаем фильтр woocommerce_available_payment_gateways

Этот фильтр позволяет модифицировать список доступных способов оплаты в корзине и на странице оформления заказа.

add_filter('woocommerce_available_payment_gateways', 'exclude_payment_gateways_for_products');
function exclude_payment_gateways_for_products($gateways) {
    // Получаем текущие товары в корзине
    $cart_items = WC()->cart->get_cart();
    $excluded_products = array(123, 456, 789); // ID товаров для исключения

    foreach ($cart_items as $cart_item) {
        if (in_array($cart_item['product_id'], $excluded_products)) {
            // Удаляем нежелательные методы оплаты
            unset($gateways['cod']); // пример: отключить оплату при получении
            unset($gateways['bacs']); // пример: отключить банковский перевод
            break; // достаточно один раз найти товар
        }
    }
    return $gateways;
}

3. Кастомизация под категории товаров

Если нужно исключать способы оплаты по категории, а не по ID, меняем проверку:

add_filter('woocommerce_available_payment_gateways', 'exclude_payment_gateways_by_category');
function exclude_payment_gateways_by_category($gateways) {
    $cart_items = WC()->cart->get_cart();
    $excluded_category = 'pod-zakaz'; // слаг категории

    foreach ($cart_items as $cart_item) {
        $product_id = $cart_item['product_id'];
        $terms = get_the_terms($product_id, 'product_cat');
        if ($terms && !is_wp_error($terms)) {
            foreach ($terms as $term) {
                if ($term->slug === $excluded_category) {
                    unset($gateways['cod']);
                    unset($gateways['bacs']);
                    break 2;
                }
            }
        }
    }
    return $gateways;
}

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

  • Добавьте в корзину товар из списка исключённых (по ID или категории).
  • Перейдите на страницу оформления заказа.
  • Проверьте список доступных способов оплаты — запрещённые должны отсутствовать.
  • Добавьте в корзину товар, не попадающий под исключения, и убедитесь, что все способы оплаты доступны.

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

  • Ничего не меняется в способах оплаты: убедитесь, что код добавлен в файл functions.php активной темы или в плагин для кастомных функций. Проверьте, что корзина WooCommerce и сессия активны.
  • Ошибки PHP после добавления кода: проверьте правильность синтаксиса, особенно кавычек и скобок. Используйте отладку WP_DEBUG для выявления причин.
  • Не учитываются вариации товаров: если используются вариативные товары, проверяйте $cart_item['variation_id'] или $cart_item['product_id'] в зависимости от задачи.
  • Способы оплаты не отключаются полностью: убедитесь, что идентификаторы способов оплаты корректны. Например, 'cod' — оплата при получении, 'bacs' — банковский перевод.

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

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

Сравнение способов реализации

МетодПлюсыМинусы
Код в functions.phpБыстро, бесплатно, полный контрольТребует навыков, сложно менять без разработчика
Плагин для управления оплатой (например, WooCommerce Conditional Payment Gateways)Удобный интерфейс, гибкие условияПлатный, может влиять на скорость
Кастомный плагин с настройкамиЛучшее сочетание гибкости и удобстваТребует времени на разработку
Как создать динамические таблицы в WordPress с помощью шорткода и AJAX
11.03.2026
Как создать функционал для автоматического сохранения черновиков в WordPress
29.01.2026
Как создать собственный виджет в WordPress с примерами кода
06.01.2026
WooCommerce: как запретить повторное создание заказа при наличии активного
03.06.2026
WooCommerce: как исключить товары со скидкой из способов оплаты
30.04.2026