WooCommerce: как автоматически отключать товары после завершения продаж

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

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

Как определить окончание продаж товара в WooCommerce

Основной индикатор — количество товара на складе. WooCommerce хранит этот параметр в мета-данных товара (_stock). Если у товара включено управление запасами (manage_stock = yes), то при достижении _stock = 0 необходимо сменить статус товара.

Стандартно WooCommerce имеет статус "В наличии" и "Нет в наличии", но статус публикации товара (post_status) остается publish. Чтобы товар не отображался в каталоге, нужно изменить статус публикации на draft или private.

Пошаговое решение: автоматическое отключение товара при 0 на складе

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

1. Добавляем хук на сохранение товара

add_action('woocommerce_product_set_stock', 'auto_disable_product_when_out_of_stock', 10, 1);

2. Функция проверки и изменения статуса

function auto_disable_product_when_out_of_stock($product) {
    if (!$product instanceof WC_Product) {
        $product = wc_get_product($product);
    }

    if (!$product->managing_stock()) {
        return; // Управление запасами не включено
    }

    $stock_quantity = $product->get_stock_quantity();
    $post_id = $product->get_id();

    if ($stock_quantity === 0) {
        // Отключаем товар
        $post = get_post($post_id);
        if ($post && $post->post_status !== 'draft') {
            wp_update_post([
                'ID' => $post_id,
                'post_status' => 'draft',
            ]);
        }
    } elseif ($stock_quantity > 0) {
        // Включаем товар обратно, если он был отключен
        $post = get_post($post_id);
        if ($post && $post->post_status === 'draft') {
            wp_update_post([
                'ID' => $post_id,
                'post_status' => 'publish',
            ]);
        }
    }
}

3. Кэш и индексирование

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

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

  1. Создайте тестовый товар с включённым управлением запасами.
  2. Установите количество товара больше нуля и проверьте, что товар виден на сайте.
  3. Уменьшите количество товара до нуля через админку WooCommerce.
  4. Обновите страницу каталога — товар должен исчезнуть (статус изменился на draft).
  5. Увеличьте запас товара обратно — товар должен снова появиться.

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

  • Хук не срабатывает: Проверьте, что вы используете woocommerce_product_set_stock, который вызывается при изменении количества через админку или программно. Если изменение происходит другим способом, используйте save_post_product с проверкой _stock.
  • Товар не скрывается: Убедитесь, что управление запасами включено для товара (manage_stock = true).
  • Кэш не обновляется: Очистите кэш сайта и браузера после изменения статуса товара.
  • Неправильный статус публикации: Используйте draft или private, чтобы товар не отображался. Статус pending или trash могут привести к нежелательным эффектам.

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

  • Не выполняйте тяжелые операции внутри функции хука — изменение статуса товара должно быть максимально легким.
  • Проверяйте тип объекта $product и существование поста перед вызовом wp_update_post, чтобы избежать ошибок.
  • Если магазин большой, рассмотрите периодическую проверку запасов через WP-Cron вместо хука, чтобы снизить нагрузку.
  • Используйте плагины кэширования с возможностью автоматической очистки кэша при изменении контента.

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

СпособПлюсыМинусыРекомендации
Хук woocommerce_product_set_stockМгновенное срабатывание, простотаНе ловит все способы изменения запасаИспользовать для админских изменений
Хук save_post_product с проверкой _stockРаботает при любых сохранениях товараМожет срабатывать лишний раз, требует оптимизацииПодходит для комплексных проверок
WP-Cron периодический скриптСнижает нагрузку, контролируемые проверкиЗадержка обновления статусаДля больших магазинов с большим количеством товаров
Как создать собственный shortcode в WordPress
06.11.2025
WooCommerce: как автоматически отключать товары после завершения продаж
15.06.2026
Как создать фильтры для курсов в WordPress
15.01.2026
Как использовать хук WooCommerce order status change для автоматизации
26.04.2026
Как удалить все метаданные из изображений WordPress
05.12.2025