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

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

По умолчанию WooCommerce не отключает товары, когда их запас на складе равен нулю. Это приводит к тому, что покупатели видят товары, которые фактически недоступны для заказа, что ухудшает пользовательский опыт и может привести к потерям продаж или негативным отзывам.

Чтобы убедиться, что на вашем сайте есть такая проблема, проверьте настройки WooCommerce в разделе Товары > Запасы. Если опция Разрешать заказы при отсутствии товара включена, товары с нулевым остатком будут доступны для покупки. Однако даже если она отключена, сами товары не деактивируются автоматически.

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

1. Создаем функцию для проверки остатков и отключения товаров

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

function wpexperts_auto_disable_out_of_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'instock',
            ],
        ],
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        return;
    }

    foreach ($query->posts as $product_id) {
        $stock_quantity = get_post_meta($product_id, '_stock', true);

        // Если остаток 0 или меньше, отключаем товар
        if (intval($stock_quantity) <= 0) {
            wp_update_post([
                'ID'          => $product_id,
                'post_status' => 'draft',
            ]);
        }
    }
}

2. Запускаем функцию по расписанию через Cron WordPress

Чтобы проверка остатков происходила автоматически, создайте кастомное событие Cron.

if (!wp_next_scheduled('wpexperts_daily_stock_check')) {
    wp_schedule_event(time(), 'daily', 'wpexperts_daily_stock_check');
}

add_action('wpexperts_daily_stock_check', 'wpexperts_auto_disable_out_of_stock_products');

3. Опционально: ручной запуск функции для тестирования

add_action('admin_init', function() {
    if (isset($_GET['run_stock_check']) && current_user_can('manage_options')) {
        wpexperts_auto_disable_out_of_stock_products();
        echo 'Проверка остатков и отключение товаров выполнена';
        exit;
    }
});

После добавления этого кода, вы сможете вручную запустить проверку, добавив в адресную строку админки ?run_stock_check=1.

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

  • Перейдите в админ-панель WooCommerce > Товары и отфильтруйте товары со статусом Черновик. Здесь должны появиться товары с нулевым остатком.
  • На фронтенде ранее доступные товары с нулевым запасом должны исчезнуть из каталога и не отображаться в поиске.
  • Для тестирования вручную измените запас любого товара на 0 и запустите ручной запуск функции (?run_stock_check=1).

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

  • Товары не отключаются после запуска функции
    Проверьте, правильно ли работает запрос WP_Query и возвращает ли он товары. Можно вывести результат var_dump($query->posts) для отладки.
  • Функция отключает все товары
    Ошибка в проверке остатка. Убедитесь, что intval($stock_quantity) корректно получает значение. Возможно, у товара нет мета _stock (например, для простых товаров с управлением запасами отключено).
  • Cron не срабатывает
    Убедитесь, что на сайте есть трафик, который запускает WP Cron, или настройте системный cron для вызова wp-cron.php.
  • Пользователи видят товары в кэше
    Очистите кэш сайта и браузера, если используется плагин кэширования.

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

  • Оптимизация запроса: если у вас тысячи товаров, оптимизируйте выборку, обрабатывая товары порционно (пагинация WP_Query с posts_per_page 100).
  • Безопасность доступа: ограничьте ручной запуск функции только администраторам.
  • Логирование: для отладки добавьте запись в лог отключенных товаров, чтобы отслеживать изменения.
  • Обработка вариативных товаров: для вариативных товаров проверяйте остаток каждой вариации через WC_Product_Variation.

Сравнение решений: код vs плагины

КритерийРеализация на кодеИспользование плагинаКомпромисс
ГибкостьПолный контроль, можно кастомизироватьГотовые настройки, но ограничены функционаломТребуется знание PHP для поддержки
ПроизводительностьЗависит от реализации, можно оптимизироватьМожет добавлять лишние запросыКод требует тестирования на нагрузку
БезопасностьПрозрачный код, легче контролироватьЗависит от качества плагинаПлагин может содержать уязвимости
Поддержка и обновленияЗависит от разработчика сайтаОбновления и поддержка от автора плагинаПлагин может перестать поддерживаться
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
20.05.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
08.05.2026
WooCommerce: Автоматическое изменение стоимости товара при определённых условиях
12.05.2026
Как автоматизировать удаление старого контента в WordPress
27.01.2026
WooCommerce: автоматическое отключение товаров с нулевым остатком без плагинов
09.06.2026