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

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

В WooCommerce иногда возникает необходимость запретить покупку конкретных товаров — например, если они предназначены только для показа, или требуется отдельное согласование перед заказом. Просто скрыть кнопку «Добавить в корзину» бывает недостаточно, так как пользователь может перейти в корзину и оформить заказ вручную. Задача — полностью отключить процесс оформления для выбранных продуктов без удаления их из каталога.

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

1. Определяем товары, для которых нужен запрет оформления

Лучший способ — использовать пользовательское поле (мета-данные) или категорию. Например, добавим мета-ключ disable_checkout со значением yes для таких продуктов.

2. Блокируем добавление товара в корзину

Добавим фильтр woocommerce_is_purchasable, чтобы запретить добавление в корзину для товаров с мета-ключом disable_checkout=yes.

add_filter('woocommerce_is_purchasable', 'disable_checkout_for_specific_products', 10, 2);
function disable_checkout_for_specific_products($purchasable, $product) {
    if (get_post_meta($product->get_id(), 'disable_checkout', true) === 'yes') {
        return false; // Отключаем возможность покупки
    }
    return $purchasable;
}

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

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

add_action('woocommerce_check_cart_items', 'remove_disabled_products_from_cart');
function remove_disabled_products_from_cart() {
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product_id = $cart_item['product_id'];
        if (get_post_meta($product_id, 'disable_checkout', true) === 'yes') {
            WC()->cart->remove_cart_item($cart_item_key);
            wc_add_notice(sprintf('Товар "%s" нельзя оформить и он был удалён из корзины.', get_the_title($product_id)), 'error');
        }
    }
}

4. Скрываем кнопку «Добавить в корзину» на страницах товаров

Для чистоты интерфейса уберём кнопку для запрещённых товаров, используя фильтр woocommerce_is_purchasable (см. шаг 2) или CSS-правила. Но лучше программно:

add_filter('woocommerce_is_purchasable', 'hide_add_to_cart_button_for_disabled', 10, 2);
function hide_add_to_cart_button_for_disabled($purchasable, $product) {
    if (get_post_meta($product->get_id(), 'disable_checkout', true) === 'yes') {
        return false;
    }
    return $purchasable;
}

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

  • Откройте страницу товара с мета-ключом disable_checkout=yes — кнопка «Добавить в корзину» должна отсутствовать.
  • Попытайтесь вручную добавить такой товар через URL ?add-to-cart=ID — товар не добавится.
  • Если товар каким-то образом попал в корзину, при переходе к оформлению он будет удалён, а пользователь увидит предупреждение.
  • Товары без мета-ключа должны работать как обычно.

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

  • Ошибка: Товары с запретом всё равно отображают кнопку «Добавить в корзину».
    Причина: Кэширование страниц или неправильное добавление мета-поля.
    Решение: Очистите кэш, проверьте правильность ключа и значения мета-данных.
  • Ошибка: Товары не удаляются из корзины при оформлении.
    Причина: Хук woocommerce_check_cart_items не срабатывает из-за конфликта с плагинами.
    Решение: Проверьте конфликтующие плагины, попробуйте добавить приоритет выше в add_action, например 20.
  • Ошибка: Уведомление об удалении товара не отображается.
    Причина: Ошибки в шаблонах темы или кастомные сообщения могут блокировать стандартные уведомления WooCommerce.
    Решение: Проверьте шаблоны оформления и убедитесь, что вызывается wc_print_notices().

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

  • Используйте мета-поля, а не категории, чтобы точно контролировать поведение отдельных товаров без риска ошибочного отключения.
  • Добавляйте проверки на стороне сервера (фильтр woocommerce_is_purchasable и хук woocommerce_check_cart_items), так как клиентские методы легко обходятся.
  • Минимизируйте нагрузку, кешируя результаты проверки, если каталог большой (например, через объектный кеш).
  • Если используете плагины, которые влияют на корзину или процесс оформления, тестируйте совместимость с данным кодом.

Сравнение вариантов реализации запрета оформления для товаров

СпособОписаниеПреимуществаНедостатки
Мета-поле + кодДобавление кастомного поля и проверка через хукиТочно контролирует отдельные товары, гибкоТребуется базовые знания PHP, возможны конфликты с плагинами
Использование категорииГруппировка товаров в категорию и проверка по нейПросто администрироватьМожет затронуть лишние товары, менее точный контроль
Плагины для ограничения продажГотовые решения типа WooCommerce Catalog ModeПростота, дополнительные функции (например, скрытие цен)Зависимость от стороннего кода, ограниченная кастомизация
Как удалить или заблокировать временно неактивных пользователей в WordPress
05.03.2026
Как установить и настроить автоматическое создание резервных копий в WordPress
15.11.2025
WooCommerce: как отключить оформление заказа для определённых продуктов
05.05.2026
Автоматизация создания контента в WordPress с помощью WPGPT
30.12.2025
Создание уникального типа записи с уникальным цветом в WordPress
04.02.2026