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

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

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

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

Пошаговое решение: исключаем оплату для выбранных товаров через код

1. Определяем ID товаров, для которых нужно отключить оплату

Создайте массив с ID продуктов, для которых оплата будет отключена:

function get_no_payment_product_ids() {
    return array(123, 456, 789); // замените на реальные ID товаров
}

2. Удаляем все доступные методы оплаты, если корзина содержит такой продукт

Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

add_filter('woocommerce_available_payment_gateways', 'disable_payment_for_specific_products');
function disable_payment_for_specific_products($available_gateways) {
    $no_payment_ids = get_no_payment_product_ids();
    $cart = WC()->cart->get_cart();
    foreach ($cart as $cart_item) {
        if (in_array($cart_item['product_id'], $no_payment_ids)) {
            // Удаляем все методы оплаты
            return array();
        }
    }
    return $available_gateways;
}

3. Автоматически переводим заказ в статус "завершён" для таких товаров

Чтобы не ждать оплаты, можно автоматически менять статус заказа при наличии таких продуктов:

add_action('woocommerce_thankyou', 'auto_complete_order_for_no_payment_products');
function auto_complete_order_for_no_payment_products($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    $no_payment_ids = get_no_payment_product_ids();
    foreach ($order->get_items() as $item) {
        if (in_array($item->get_product_id(), $no_payment_ids)) {
            if ($order->get_status() != 'completed') {
                $order->update_status('completed', 'Автоматическое завершение заказа для товаров без оплаты');
                break;
            }
        }
    }
}

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

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

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

Ошибка 1. Методы оплаты не исчезают

  • Возможно, кэшируются платежные методы — очистите кэш сайта и браузера.
  • Проверьте, что код добавлен правильно и нет синтаксических ошибок.
  • Убедитесь, что ID товаров совпадают с реальными.

Ошибка 2. Заказы не меняют статус автоматически

  • Проверьте, что хук woocommerce_thankyou срабатывает — иногда тема или плагины могут влиять.
  • Убедитесь, что функция вызывается и происходит вызов $order->update_status('completed').

Ошибка 3. Проблемы с совместимостью плагинов оплаты

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

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

  • Не храните ID товаров напрямую в коде, если их много — лучше вынести в настройки темы или использовать пользовательские мета-поля (custom fields) для метки "без оплаты".
  • При большом количестве товаров используйте кэширование результатов проверки, чтобы не нагружать сервер.
  • Всегда тестируйте изменения на тестовом сайте, чтобы избежать проблем с реальными заказами.
  • Логируйте действия изменения статуса заказа для последующего аудита и отладки.

Альтернативы: сравнение подходов

МетодПлюсыМинусы
Код в functions.phpПростота, гибкость, нет дополнительных плагиновТребует навыков, может сломаться при обновлении темы
Плагин с настройками (например, Conditional Payment Gateways)Удобство, интерфейс для выбора товаровПлатные решения, перегрузка сайта
Использование кастомных полей и хуковГибкость, масштабируемостьСложность реализации
Как создать проверку и валидацию платежей в WordPress
17.03.2026
Как создать автоплатёж в WordPress для увеличения конверсии
15.12.2025
Как отладить проблемы с платежными запросами в WordPress
07.01.2026
Как сделать подтверждение платежа в WordPress через вебхуки
23.01.2026
Автоматизация управления возвратами в WordPress для платежных систем
26.01.2026