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

Почему важно автоматически отключать товары с нулевым остатком

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

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

  • Проверьте, доступны ли товары с остатком 0 для покупки на сайте.
  • Убедитесь, что в настройках WooCommerce включён контроль запасов (WooCommerce > Настройки > Товары > Управление запасами).
  • Запустите простой SQL-запрос в базе данных для проверки остатков:
    SELECT ID, post_title, meta_value FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE meta_key = '_stock' AND meta_value = '0';
  • Если товары с 0 на складе отображаются как активные и доступны, значит автоматическое отключение не настроено.

Пошаговое решение: отключение товаров с нулевым остатком через functions.php

Добавим код, который при обновлении запасов автоматически меняет статус товара на "черновик" (draft), если остаток равен нулю, и обратно на "опубликован" (publish), если запас появился.

add_action('woocommerce_update_product', 'auto_disable_out_of_stock_products', 10, 1);

function auto_disable_out_of_stock_products($product_id) {
    $product = wc_get_product($product_id);
    if (!$product) return;

    $stock_quantity = $product->get_stock_quantity();
    $manage_stock = $product->managing_stock();

    if ($manage_stock) {
        if ($stock_quantity === 0) {
            // Отключаем товар
            if ($product->get_status() !== 'draft') {
                $product->set_status('draft');
                $product->save();
            }
        } elseif ($stock_quantity > 0) {
            // Включаем товар
            if ($product->get_status() !== 'publish') {
                $product->set_status('publish');
                $product->save();
            }
        }
    }
}

Этот код автоматически изменяет статус товара при изменении его остатков. Он сработает при любом обновлении товара через административную панель или программно.

Альтернативный вариант: cron-задача для массовой проверки

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

add_action('auto_disable_out_of_stock_cron', 'auto_disable_out_of_stock_bulk');

function auto_disable_out_of_stock_bulk() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'draft'],
    ];

    $products = get_posts($args);

    foreach ($products as $post) {
        $product = wc_get_product($post->ID);
        if (!$product) continue;

        $stock_quantity = $product->get_stock_quantity();
        $manage_stock = $product->managing_stock();

        if ($manage_stock) {
            if ($stock_quantity === 0 && $product->get_status() !== 'draft') {
                $product->set_status('draft');
                $product->save();
            } elseif ($stock_quantity > 0 && $product->get_status() !== 'publish') {
                $product->set_status('publish');
                $product->save();
            }
        }
    }
}

// Регистрируем cron, если ещё не зарегистрирован
if (!wp_next_scheduled('auto_disable_out_of_stock_cron')) {
    wp_schedule_event(time(), 'hourly', 'auto_disable_out_of_stock_cron');
}

Как проверить, что автоматическое отключение работает

  • Обновите запас товара в админке: установите 0, сохраните, проверьте, что статус изменился на "черновик".
  • Установите положительное значение запаса, сохраните, убедитесь, что статус товара стал "опубликован".
  • Проверьте на сайте, что товары со статусом "черновик" не отображаются в каталоге.
  • Если работает cron, проверьте логи и статус планировщика WP-Cron (например, с помощью плагина WP Crontrol).

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

  • Код не срабатывает при импорте или массовом обновлении. В этом случае лучше использовать cron-задачу для регулярной проверки всех товаров.
  • Товары с вариациями. Для вариативных товаров нужно дополнительно проверять остатки каждой вариации, так как у вариативного товара нет собственного запаса.
  • Статус товара не меняется. Проверьте права пользователя и работу хуков. Убедитесь, что нет конфликтов с плагинами кэширования или оптимизации.
  • Продукт остаётся видимым в каталоге. Проверьте настройки видимости и индексации товаров со статусом "черновик".

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

  • Не добавляйте тяжелые операции в хуки, которые вызываются часто — используйте cron-задачи для массовых изменений.
  • Всегда проверяйте права пользователя, если добавляете интерфейс для включения/отключения товара.
  • При большом каталоге используйте пакетную обработку, чтобы избежать таймаутов.
  • Для вариативных товаров расширьте логику проверки остатков у вариаций, чтобы статус родительского товара соответствовал наличию хотя бы одного варианта в наличии.
  • Для улучшения SEO используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpexperts.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-otklyuchenie-tovarov-s-nulevym-ostatkom-bez-plaginov) для правильной индексации и удаления дублирующего контента товаров со статусом "черновик".

Таблица сравнения решений для отключения товаров с нулевым остатком

СпособПреимуществаНедостатки
Код на хуке woocommerce_update_productАвтоматическое срабатывание при обновлении, простота внедренияНе работает при массовом импорте, не для вариативных товаров
Cron-задача для массовой проверкиОбрабатывает все товары, подходит для больших каталоговЗадержка между проверками, нагрузка на сервер при большом количестве товаров
Плагины (например, WooCommerce Stock Manager)Готовое решение с UI, поддержка вариацийДополнительная нагрузка, возможные конфликты, лицензии
Как создать собственный шорткод в WordPress
01.11.2025
WooCommerce: автоматическое возврат и снятие резервов товаров при отмене заказов
23.05.2026
WooCommerce: автоматическое отключение заказов при отсутствии оплаты
31.05.2026
Как избежать конфликтов между темами WordPress
15.03.2026
Запрет на удаление главной страницы в WordPress
14.04.2026