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
23.12.2025
WooCommerce: автоматическое изменение стоимости товаров по расписанию с поддержкой вариаций
07.07.2026
Как динамически изменить класс в меню WordPress для конкретных условий
15.02.2026
WooCommerce: автоматическое изменение статуса заказа после успешной оплаты через хук
28.07.2026
Как изменить URL страницы без перенаправления в WordPress
15.12.2025