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

Диагностика проблемы с отсутствием товара в WooCommerce

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

Задача — автоматически отключать товары при отсутствии стока и при этом позволять быстро их восстановить в интерфейсе администратора без ручного поиска товара.

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

1. Автоматическая смена статуса товара при нулевом или отрицательном остатке

Реализуем функцию, которая будет срабатывать при сохранении товара и проверять наличие на складе. Если запас равен или меньше нуля, товар меняет статус на "черновик" (draft), что отключит его из видимости на сайте.

add_action('save_post_product', 'auto_disable_out_of_stock_product', 20, 3);
function auto_disable_out_of_stock_product($post_ID, $post, $update) {
    // Проверяем, что это продукт
    if ($post->post_type !== 'product') return;

    // Получаем объект товара
    $product = wc_get_product($post_ID);
    if (!$product) return;

    // Проверяем управление запасами
    if (!$product->managing_stock()) return;

    $stock_quantity = $product->get_stock_quantity();

    // Если товара нет в наличии или запас <= 0, переводим в черновик
    if ($stock_quantity <= 0 && $product->is_purchasable()) {
        // Обновляем статус
        wp_update_post([
            'ID' => $post_ID,
            'post_status' => 'draft'
        ]);
    }
}

2. Восстановление товара при увеличении количества на складе

Добавим обработчик, который при увеличении количества товара выше 0 переводит его обратно в статус "опубликовано" (publish), если он был в черновиках.

add_action('woocommerce_update_product', 'auto_enable_product_if_in_stock', 20);
function auto_enable_product_if_in_stock($product) {
    if (!$product instanceof WC_Product) return;

    if (!$product->managing_stock()) return;

    $stock_quantity = $product->get_stock_quantity();

    $post_status = get_post_status($product->get_id());

    if ($stock_quantity > 0 && $post_status === 'draft') {
        wp_update_post([
            'ID' => $product->get_id(),
            'post_status' => 'publish'
        ]);
    }
}

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

  • Создайте тестовый товар с управлением запасами и установите количество в 5.
  • Проверьте, что товар опубликован и доступен на сайте.
  • Измените количество на 0 и сохраните товар.
  • Проверьте в админке, что статус товара автоматически сменился на "черновик" и товар исчез из каталога на фронтенде.
  • Увеличьте количество товара до 3 и сохраните.
  • Убедитесь, что статус товара вернулся в "опубликовано" и товар снова доступен покупателям.

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

  • Функция не срабатывает при обновлении товара: Проверьте, что хуки подключены правильно и что сохранение товара происходит через стандартный интерфейс WordPress. При массовом импорте или обновлении через API может потребоваться дополнительная логика.
  • Товар не меняет статус: Убедитесь, что у пользователя, выполняющего изменения, есть права на редактирование и изменение статуса товаров.
  • Продукт с вариациями не обрабатывается корректно: Для вариативных товаров нужно дополнительно обрабатывать вариации, так как у них собственные запасы. В код выше можно добавить цикл по вариациям.
  • Проблемы с кэшированием: Кэш страниц или плагинов может задерживать обновление статуса. Очистите кэш после изменений.

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

  • Используйте wp_update_post аккуратно, так как при сохранении товара этот хук может вызываться рекурсивно. В данном случае риски минимальны, но если добавите сложную логику, добавьте флаг предотвращения повторного выполнения.
  • Для больших магазинов с тысячами товаров лучше переносить подобные проверки в фоновые задачи (cron), чтобы не нагружать процесс сохранения.
  • Резервное копирование перед внедрением кода — обязательное условие. Рекомендуется использовать проверенные плагины, например, UpdraftPlus.

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

ВариантПлюсыМинусыПримечание
Код на хуках save_post и woocommerce_update_productБыстрая реакция, автоматизация, без плагиновРиск рекурсии, нагрузка при массовом обновленииПодходит для магазинов малого и среднего размера
Плагин для управления запасами и статусамиПростота использования, поддержкаМожет быть платным, нагрузка плагинаРекомендуется для крупных магазинов
Фоновый скрипт на cron для проверки остатковМинимальная нагрузка на сохранение товараЗадержка в обновлении статуса, сложность реализацииДля магазинов с большим количеством товаров
Как сделать динамические табуляции в Elementor для WordPress
18.02.2026
Как создать автоматические резервные копии WordPress с плагинами и кастомным кодом
23.11.2025
Как использовать Elementor для создания уникальных картинок из данных в WordPress
10.04.2026
Как добавить уникальные атрибуты HTML в Elementor для WordPress
27.03.2026
Как использовать Elementor для создания многоязычных сайтов в WordPress
09.02.2026