WooCommerce: как автоматически отключать товар после продажи

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

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

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

Используем хук WooCommerce для изменения статуса товара

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

Ниже пример кода, который отключает все товары из заказа сразу после смены статуса заказа на "завершённый":

add_action('woocommerce_order_status_completed', 'wc_disable_products_after_sale', 10, 1); 
function wc_disable_products_after_sale($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if ($product_id) {
            // Смена статуса товара на черновик
            $post = array(
                'ID' => $product_id,
                'post_status' => 'draft'
            );
            wp_update_post($post);
        }
    }
}

Если нужно не полностью отключать товар, а просто менять его наличие, можно использовать изменение мета-поля _stock_status:

add_action('woocommerce_order_status_completed', 'wc_set_product_out_of_stock_after_sale', 10, 1);
function wc_set_product_out_of_stock_after_sale($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->managing_stock()) {
            $product->set_stock_quantity(0);
            $product->set_stock_status('outofstock');
            $product->save();
        }
    }
}

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

  • Создайте тестовый заказ с нужным товаром и оплатите его (через тестовый режим платежа или вручную смените статус заказа на "завершённый").
  • Проверьте в админке, что статус товара изменился на "черновик" или товар стал отсутствовать на складе.
  • Убедитесь, что товар не отображается на сайте для покупателей.
  • Если используется изменение статуса "outofstock", проверьте, что на странице товара отображается сообщение о его отсутствии.

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

  • Неверно указанный хук: Используйте именно woocommerce_order_status_completed для действия после оплаты, а не woocommerce_payment_complete, если нужны именно завершённые заказы.
  • Пропуск проверки объекта заказа и товаров: Добавляйте проверки на существование заказа и товаров, чтобы избежать ошибок PHP.
  • Не учитывается тип товара: Для вариативных товаров нужно работать с вариациями, а не с основным товаром. Используйте $item->get_variation_id(), если применимо.
  • Кэширование и задержки: При использовании плагинов кеширования изменения могут отображаться с задержкой. Очищайте кеш после тестов.

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

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

Варианты реализации: код vs плагины

МетодПреимуществаНедостатки
Код в functions.php или плагин-сниппетПолный контроль, отсутствие дополнительных плагинов, легкость кастомизацииТребует навыков программирования, возможны ошибки без тестов
Плагины управления запасамиГотовые решения, удобный интерфейс, поддержкаЗависимость от разработчика, нагрузка на сайт, возможные конфликты
Как отключить автосохранение в WordPress
14.01.2026
WooCommerce: автоматическое отключение товара после продажи
10.06.2026
WooCommerce: как автоматически удалять товар после успешной оплаты без плагинов
28.04.2026
Как создать динамическую регистрацию пользователей в WordPress с проверкой и защитой
23.03.2026
Как удалить ненужные meta-теги в WordPress для оптимизации сайта
04.12.2025