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

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

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

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

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

Подключение к хуку обновления запасов

Необходимо использовать хук WooCommerce woocommerce_product_set_stock, который вызывается при изменении количества товара на складе.

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

add_action('woocommerce_product_set_stock', 'auto_disable_product_if_out_of_stock', 10, 1);
function auto_disable_product_if_out_of_stock($product) {
    if (!$product instanceof WC_Product) {
        return;
    }
    $stock_quantity = $product->get_stock_quantity();
    if ($stock_quantity === 0) {
        $product->set_catalog_visibility('hidden');
        $product->set_status('draft');
        $product->save();
    } elseif ($stock_quantity > 0) {
        // Если товар снова в наличии, можно вернуть статус опубликованным
        if ($product->get_status() === 'draft') {
            $product->set_status('publish');
            $product->set_catalog_visibility('visible');
            $product->save();
        }
    }
}

Этот код автоматически переводит товар в черновик и скрывает его из каталога при достижении нулевого запаса, и возвращает товар в активное состояние при появлении запаса.

Добавление планового сканирования для массовой проверки

Если на сайте часто меняется склад или есть внешние импорты, полезно настроить периодическую проверку всех товаров:

add_action('wp', 'schedule_stock_check_event');
function schedule_stock_check_event() {
    if (!wp_next_scheduled('check_all_products_stock')) {
        wp_schedule_event(time(), 'hourly', 'check_all_products_stock');
    }
}

add_action('check_all_products_stock', 'check_and_disable_out_of_stock_products');
function check_and_disable_out_of_stock_products() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'draft'],
        'fields' => 'ids',
    ];
    $products = get_posts($args);

    foreach ($products as $product_id) {
        $product = wc_get_product($product_id);
        if (!$product) {
            continue;
        }
        $stock = $product->get_stock_quantity();
        if ($stock === 0) {
            if ($product->get_status() !== 'draft') {
                $product->set_status('draft');
                $product->set_catalog_visibility('hidden');
                $product->save();
            }
        } else {
            if ($product->get_status() === 'draft') {
                $product->set_status('publish');
                $product->set_catalog_visibility('visible');
                $product->save();
            }
        }
    }
}

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

  • Обновите запас любого товара до 0 через админку WooCommerce и проверьте, что товар автоматически стал недоступен на сайте (пропал из каталога и статус стал Draft).
  • Пополните запас товара — он должен автоматически вернуться в публикацию и отображаться в каталоге.
  • Для массовой проверки запустите wp_cron вручную или дождитесь планового запуска и проверьте, что все товары с нулевым запасом скрыты.

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

  • Хук не срабатывает при импорте товаров. Импортеры могут обновлять базу напрямую, минуя хуки WooCommerce. Для решения используйте плановое сканирование с WP-Cron.
  • Товар не скрывается, хотя запас 0. Проверьте, что у товара включён учёт запасов ($product->get_manage_stock() возвращает true). Если нет — код не сработает.
  • Статус товара меняется, но товар остаётся видимым. Убедитесь, что вы меняете и catalog_visibility, чтобы скрыть товар из каталога и поиска.
  • Проблемы с производительностью при массовой проверке. Если товаров много, разбейте выборку на партии (posts_per_page) и используйте пагинацию.

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

  • Добавляйте фильтрацию и проверку прав пользователя, если запускаете функции из админки.
  • Планируйте массовые операции на часы с минимальной нагрузкой.
  • Используйте transient API или кеширование для снижения нагрузки при частых проверках.
  • Тестируйте на staging-сайте перед применением на боевом.

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

СпособПреимуществаНедостатки
Использование хука woocommerce_product_set_stockМгновенное реагирование на изменения, минимальная нагрузкаНе срабатывает при массовом импорте или обновлении базы напрямую
Плановое сканирование через WP-CronОбрабатывает все товары, ловит изменения из любых источниковНагрузка при больших каталогах, задержка обновления до запуска cron
Использование плагинов для управления запасомГотовое решение, часто с дополнительными функциямиЗависимость от стороннего кода, возможные конфликты и нагрузка
Как удалить пустые термины в WordPress
21.03.2026
WooCommerce: как автоматически отключить товары без запаса
30.05.2026
Оптимизация кода в WordPresses: эффективное использование хуков и фильтров
02.11.2025
Как создать глобальный кеш для REST API и ускорить запросы
05.12.2025
Автоматическое удаление товаров с нулевым запасом в WooCommerce
19.04.2026