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

Проблема: товары остаются активными при отсутствии остатков на складе

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

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

  • Проверьте настройки управления запасами: WooCommerce > Настройки > Запасы. Включена ли опция "Включить управление запасами"?
  • Убедитесь, что для товаров включено управление запасами и установлены корректные остатки.
  • Проверьте, какие статусы у товаров с нулевым запасом: опубликованы ли они?

Если товары с 0 в запасе остаются опубликованными, значит автоматического перехода в статус "Черновик" или "Скрытый" не происходит.

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

1. Включите управление запасами в WooCommerce

Перейдите в WooCommerce > Настройки > Запасы и убедитесь, что включена опция "Включить управление запасами". Без этого WooCommerce не будет отслеживать остатки.

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

Добавьте следующий код в файл functions.php вашей активной темы или в плагин для пользовательских функций:

add_action('woocommerce_product_set_stock', 'auto_unpublish_out_of_stock_products', 10, 1); 
function auto_unpublish_out_of_stock_products($product) {
    if (!$product instanceof WC_Product) return;

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

    if ($stock_quantity !== null && $stock_quantity <= 0 && $post_status === 'publish') {
        // Снимаем с публикации товар без остатков
        wp_update_post(array(
            'ID' => $product->get_id(),
            'post_status' => 'draft'
        ));
    } elseif ($stock_quantity > 0 && $post_status === 'draft') {
        // Восстанавливаем публикацию, если товар появился в наличии
        wp_update_post(array(
            'ID' => $product->get_id(),
            'post_status' => 'publish'
        ));
    }
}

Этот код автоматически переводит товар в статус "Черновик", если остаток ≤ 0, и обратно в "Опубликовано", если запас появился.

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

Если у вас много товаров, после добавления кода выполните однократный запуск проверки остатков и статусов через WP-CLI или кастомный скрипт.

function batch_unpublish_out_of_stock_products() {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => array('publish', 'draft')
    );

    $products = get_posts($args);
    foreach ($products as $post) {
        $product = wc_get_product($post->ID);
        if (!$product) continue;
        $stock = $product->get_stock_quantity();
        $status = $post->post_status;

        if ($stock !== null && $stock <= 0 && $status === 'publish') {
            wp_update_post(array('ID' => $post->ID, 'post_status' => 'draft'));
        } elseif ($stock > 0 && $status === 'draft') {
            wp_update_post(array('ID' => $post->ID, 'post_status' => 'publish'));
        }
    }
}
// batch_unpublish_out_of_stock_products(); // Запустите вручную один раз

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

  • Обновите остаток товара в админке WooCommerce > Товары. Установите 0 и сохраните.
  • Убедитесь, что товар автоматически стал черновиком (статус изменился).
  • Поставьте положительный запас и проверьте, что товар вновь стал опубликованным.
  • Проверьте на фронтенде, что товары с 0 запасом не отображаются в каталоге.

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

  • Код не срабатывает при изменении остатков — возможно, другой плагин перезаписывает статус товара после вашего кода. Проверьте приоритет хука или используйте woocommerce_product_set_stock_status.
  • Не включено управление запасами — без этой опции WooCommerce не отслеживает остатки.
  • Товары с вариациями — для вариативных товаров может потребоваться отдельная логика проверки остатков всех вариаций.
  • Кэширование — если кэш страниц не очищается, изменения статусов могут отображаться с задержкой.

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

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

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

МетодПреимуществаНедостатки
Код на хуке woocommerce_product_set_stockАвтоматическая реакция на изменение остатков, нет сторонних плагиновНе учитывает вариации без доработки, требует навыков PHP
Плагины управления запасамиГотовое решение с интерфейсом, часто поддерживают вариацииМогут замедлять сайт, могут быть платными
Ручное управление статусомПолный контроль, простоВысокий риск ошибок и забывания, не подходит для больших магазинов
Как добавить динамические значки в меню Elementor для WordPress
25.02.2026
Как сделать динамические табуляции в Elementor для WordPress
18.02.2026
Как удалить пустые теги в HTML, созданном Elementor в WordPress
03.03.2026
Как добавить автоматическое сохранение просмотра в Elementor для WordPress
18.02.2026
Как добавить динамические картинки в Elementor для WordPress
20.03.2026