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

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

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

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

Пошаговое решение: как отключить оплату товаров по статусу

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

Для начала нужно понимать, в каком именно мета-поле или таксономии хранится статус товара. В WooCommerce по умолчанию статусы применяются к заказам, а для товаров чаще всего используются пользовательские поля (мета-поля) или кастомные таксономии.

Пример: у товара есть кастомное поле _custom_status со значением disabled — для таких товаров нужно запретить оплату.

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

Реализуем два уровня защиты: сначала скроем кнопку на фронтенде, затем предотвратим добавление товара в корзину через сервер.

add_filter('woocommerce_is_purchasable', 'disable_purchase_for_status', 10, 2);
function disable_purchase_for_status($is_purchasable, $product) {
    $status = get_post_meta($product->get_id(), '_custom_status', true);
    if ($status === 'disabled') {
        return false; // товар нельзя купить
    }
    return $is_purchasable;
}

add_filter('woocommerce_get_price_html', 'show_price_as_unavailable', 10, 2);
function show_price_as_unavailable($price_html, $product) {
    $status = get_post_meta($product->get_id(), '_custom_status', true);
    if ($status === 'disabled') {
        return '<span style="color:red;">Временно недоступен</span>';
    }
    return $price_html;
}

Данный код скрывает кнопку «Добавить в корзину» и меняет отображение цены. Однако, если добавить товар вручную или через прямой вызов, нужно ещё запретить добавление в корзину.

add_filter('woocommerce_add_to_cart_validation', 'prevent_add_to_cart_for_disabled', 10, 3);
function prevent_add_to_cart_for_disabled($passed, $product_id, $quantity) {
    $status = get_post_meta($product_id, '_custom_status', true);
    if ($status === 'disabled') {
        wc_add_notice('Оплата этого товара временно недоступна.', 'error');
        return false;
    }
    return $passed;
}

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

  • Откройте страницу товара с мета-полем _custom_status со значением disabled. Кнопка «Добавить в корзину» должна отсутствовать.
  • Цена товара должна отображаться как «Временно недоступен» красным цветом.
  • Попытка добавить товар в корзину через прямой POST-запрос или другие способы должна выдать сообщение об ошибке.
  • Товары без указанного статуса показываются и работают как обычно.

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

  • Неверное имя мета-поля: Проверьте точное имя мета-поля, используйте get_post_meta($product_id) через WP-CLI или в отладчике.
  • Кэширование мешает увидеть изменения: Очистите кэш сайта и браузера после внесения изменений.
  • Конфликты с плагинами: Другие плагины могут влиять на добавление в корзину — отключите их поочерёдно для поиска конфликтов.
  • Не все способы добавления в корзину блокируются: Убедитесь, что фильтр woocommerce_add_to_cart_validation срабатывает — при необходимости добавьте логи.

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

  • Используйте серверный запрет добавления в корзину, а не только скрытие кнопки, чтобы исключить обход на фронтенде.
  • Минимизируйте количество запросов к базе при проверках — кешируйте статус товара, если он редко меняется.
  • Размещайте код в дочерней теме или в кастомном плагине, чтобы избежать потери при обновлениях.
  • Для массового обновления статусов используйте WP-CLI команды или SQL-запросы, чтобы не нагружать сайт.

Таблица сравнения подходов отключения оплаты

МетодПреимуществаНедостатки
Скрыть кнопку через CSS/JSПросто и быстроЛегко обойти, не защищает от прямых запросов
Использовать хуки WooCommerce (как в статье)Защищает серверно, гибкоТребует навыков PHP, возможны конфликты
Плагины с ограничениями товаровГотовые решения, настройкиМогут быть тяжеловесными, не всегда точные
Как удалить множественные посты в WordPress через функции и плагины
04.03.2026
Как создать автоматическое отображение отзывов в WordPress
15.01.2026
WooCommerce: автоматическое отключение оплаты для товаров с определённым статусом
18.07.2026
WooCommerce: автоматическое изменение наличия товаров по условию
13.07.2026
Как удалить неиспользуемые теги в WordPress
05.01.2026