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

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

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

Как отключить кнопку «Добавить в корзину» и оформление заказа

Первый шаг — убрать возможность добавить товар в корзину. Без товара в корзине оформление заказа становится невозможным. Для этого используется фильтр woocommerce_is_purchasable, который определяет, доступен ли товар для покупки.

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

add_filter('woocommerce_is_purchasable', 'disable_purchase_for_specific_products', 10, 2);
function disable_purchase_for_specific_products($purchasable, $product) {
    // Массив ID товаров, для которых отключаем покупку
    $disabled_ids = array(123, 456, 789);

    if (in_array($product->get_id(), $disabled_ids)) {
        return false;
    }
    return $purchasable;
}

Этот код можно добавить в functions.php вашей темы или в кастомный плагин.

Отключение кнопки «В корзину» на страницах архивов и товара

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

add_filter('woocommerce_loop_add_to_cart_link', 'remove_add_to_cart_button_for_disabled_products', 10, 2);
function remove_add_to_cart_button_for_disabled_products($button, $product) {
    $disabled_ids = array(123, 456, 789);
    if (in_array($product->get_id(), $disabled_ids)) {
        return '';
    }
    return $button;
}

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

Если вы хотите контролировать эту логику через админку, лучше использовать кастомное мета-поле для продуктов, например disable_checkout.

  1. Добавьте мета-поле (например, чекбокс) на страницу редактирования товара. Можно использовать ACF или добавить вручную:
add_action('woocommerce_product_options_general_product_data', 'add_disable_checkout_field');
function add_disable_checkout_field() {
    woocommerce_wp_checkbox(
        array(
            'id' => '_disable_checkout',
            'label' => 'Отключить оформление заказа',
            'description' => 'Если включено, этот товар нельзя добавить в корзину и оформить заказ.'
        )
    );
}

add_action('woocommerce_process_product_meta', 'save_disable_checkout_field');
function save_disable_checkout_field($post_id) {
    $disable = isset($_POST['_disable_checkout']) ? 'yes' : 'no';
    update_post_meta($post_id, '_disable_checkout', $disable);
}
  1. Используйте мета-поле для отключения покупки:
add_filter('woocommerce_is_purchasable', 'disable_purchase_by_meta_field', 10, 2);
function disable_purchase_by_meta_field($purchasable, $product) {
    $disable = get_post_meta($product->get_id(), '_disable_checkout', true);
    if ($disable === 'yes') {
        return false;
    }
    return $purchasable;
}
  1. Уберите кнопку «Добавить в корзину» там же:
add_filter('woocommerce_loop_add_to_cart_link', 'remove_add_to_cart_button_by_meta', 10, 2);
function remove_add_to_cart_button_by_meta($button, $product) {
    $disable = get_post_meta($product->get_id(), '_disable_checkout', true);
    if ($disable === 'yes') {
        return '';
    }
    return $button;
}

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

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

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

  • Код не работает на кастомных типах товаров: убедитесь, что хуки применяются именно к нужному типу продукта. Для кастомных типов может понадобиться дополнительная проверка.
  • Кнопка «Добавить в корзину» отображается, хотя товар отключён: возможно, кеш браузера или плагина кэширования. Очистите кеш и проверьте.
  • Добавление товара в корзину происходит через ajax: убедитесь, что обработчики ajax тоже учитывают логику отключения.
  • При отключении покупки на страницах товара остаётся кнопка «Купить»: дополнительно используйте фильтр woocommerce_get_availability для изменения статуса товара.

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

  • Не храните логику отключения покупки в опциях, лучше использовать мета-поля — это локализует настройки и ускоряет выборки.
  • Для большого каталога товаров избегайте вызова get_post_meta в циклах без кеширования. Используйте transient API или Object Cache для оптимизации.
  • Всегда проверяйте пользовательские данные при сохранении мета-полей, чтобы избежать уязвимостей.
  • Для массового отключения товаров используйте WP CLI для обновления мета-полей, это быстрее и безопаснее через админку.

Сравнение вариантов реализации отключения оформления заказа

МетодПлюсыМинусыПодходит для
Жёсткий список ID в кодеПросто и быстроНеудобно масштабировать, требует редактирования кодаНебольшое число товаров, редко меняется
Мета-поле для каждого товараГибко, доступно из админки, масштабируемоНужно добавить интерфейс и обработчикиСредние и большие магазины, частые изменения
Плагин для управления доступомМного функций, готовые решенияМожет быть избыточно, нагрузка на сайтБольшие магазины, комплексное управление
Как создать автоматический импорт пользовательского контента в WordPress
05.04.2026
Двойная авторизация в WordPress: настройка двухфакторной аутентификации с плагином PHTMLMFA
11.02.2026
Как удалить временно сохраняющиеся черновики в WordPress
27.01.2026
WooCommerce: решение проблемы с неправильной отправкой писем подтверждения заказа
23.04.2026
WooCommerce: как настроить авторизацию через социальные сети без плагинов
20.04.2026