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

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

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

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

1. Определение ID товаров

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

2. Отключение кнопки «Добавить в корзину» и платежей для этих товаров

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

add_filter('woocommerce_is_purchasable', 'disable_payment_for_specific_products', 10, 2);
function disable_payment_for_specific_products($purchasable, $product) {
    // Массив ID продуктов, для которых отключаем оплату
    $excluded_ids = array(123, 456); // замените на свои ID
    if (in_array($product->get_id(), $excluded_ids)) {
        return false; // товар нельзя купить
    }
    return $purchasable;
}

Этот фильтр отключит возможность добавлять указанные товары в корзину.

3. Исключение из оформления заказа, если товар уже есть в корзине

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

add_action('woocommerce_check_cart_items', 'remove_excluded_products_from_cart');
function remove_excluded_products_from_cart() {
    $excluded_ids = array(123, 456); // ваши ID
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        if (in_array($cart_item['product_id'], $excluded_ids)) {
            WC()->cart->remove_cart_item($cart_item_key);
            wc_add_notice('Товар "' . $cart_item['data']->get_name() . '" не доступен для покупки.', 'error');
        }
    }
}

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

  • Перейдите на страницу товара с ID из массива $excluded_ids — кнопка «Добавить в корзину» должна отсутствовать или быть неактивной.
  • Попробуйте добавить товар в корзину вручную по URL — товар не должен добавляться.
  • Если товар оказался в корзине, при попытке оформить заказ должен появиться уведомляющий об ошибке и товар должен быть удалён из корзины.

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

  • Ошибка: Кнопка «Добавить в корзину» отображается, но товар не удаляется из корзины.
    Причина: Фильтр woocommerce_is_purchasable не отключает добавление через AJAX или API.
    Решение: Добавьте проверку и удаление товара из корзины, как показано во втором хуке woocommerce_check_cart_items.
  • Ошибка: Товар отображается как purchasable, хотя должен быть заблокирован.
    Причина: ID товара указан неверно или массив $excluded_ids пуст.
    Решение: Проверьте правильность ID товаров и что массив заполнен.
  • Ошибка: Код не работает после обновления WooCommerce.
    Причина: Изменения в API WooCommerce.
    Решение: Проверьте документацию WooCommerce, обновите хуки и методы, например, используйте $product->get_id() вместо $product->id.

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

  • Не храните ID продуктов жестко в коде — лучше вынесите в настройки через Options API или в отдельный админский раздел.
  • Если нужно отключать оплату по условиям (категория, тег), используйте фильтр has_term() для динамического определения.
  • Кэшируйте результаты проверки, если проверяете большое количество товаров для уменьшения нагрузки.
  • Тестируйте на staging-сайте, чтобы не нарушить логику работы корзины и оформления заказа.

Сравнение решений: плагин vs кастомный код

МетодПреимуществаНедостатки
Готовый плагин (например, "WooCommerce Catalog Mode")Быстрая настройка, поддержка, обновленияМожет быть избыточным, загружать сайт, не всегда гибкий
Кастомный кодЛегковесный, точечный, оптимизированный под задачуТребует навыков, нужно поддерживать самостоятельно
Как сделать автоматическую проверку платежей в WordPress через CRON
11.04.2026
Как отладить проблемы с платежными запросами в WordPress
07.01.2026
Оптимизация платежных запросов и уход за базой данных в WordPress
07.03.2026
Как добавить поддержку криптовалют в платежные системы WordPress
05.02.2026
Как установить лимит на платежи в WordPress по суммам и пользователям
14.03.2026