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

В чем проблема с товарами при нулевом остатке в WooCommerce

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

Диагностика текущего состояния товаров с нулевым остатком

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

  • Проверить, включен ли учет остатков (Inventory Management) в настройках WooCommerce.
  • Выяснить, как настроено поведение при нулевом остатке — разрешены ли заказы при отсутствии товара.
  • Определить, какие товары имеют нулевой остаток и не отключены вручную.

Диагностика через админку:

WooCommerce → Товары → Фильтр → Наличие — "Нет в наличии"

Для проверки через базу данных можно использовать SQL-запрос:

SELECT p.ID, p.post_title, pm.meta_value as stock_quantity
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product' AND pm.meta_value <= 0 AND p.post_status = 'publish';

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

1. Отключаем возможность заказа при нулевом остатке

Для этого в WooCommerce в настройках управления запасами снимите галочку с "Разрешить заказы при отсутствии товара" (Allow backorders — установите значение "Нет"). Это предотвратит оформление заказов на отсутствующие товары.

2. Автоматически изменяем статус товара на «Черновик» или «В архиве» при достижении нулевого остатка

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

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

function auto_disable_out_of_stock_products( $order ) {
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( ! $product || $product->get_manage_stock() === false ) {
            continue;
        }
        $stock_quantity = $product->get_stock_quantity();
        if ( $stock_quantity <= 0 ) {
            // Меняем статус на черновик
            $post = [
                'ID' => $product->get_id(),
                'post_status' => 'draft',
            ];
            wp_update_post( $post );
        }
    }
}

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

3. Плановое обновление статуса товаров с нулевым остатком

Для надежности можно добавить CRON-задачу, которая раз в сутки проверяет запасы и отключает товары с 0 или меньше единиц на складе:

add_action('wp', function() {
    if (!wp_next_scheduled('auto_disable_out_of_stock_cron')) {
        wp_schedule_event(time(), 'daily', 'auto_disable_out_of_stock_cron');
    }
});

add_action('auto_disable_out_of_stock_cron', function() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish'
    ];
    $query = new WP_Query($args);
    foreach ($query->posts as $post) {
        $stock = (int) get_post_meta($post->ID, '_stock', true);
        $manage_stock = get_post_meta($post->ID, '_manage_stock', true);
        if ($manage_stock === 'yes' && $stock <= 0) {
            wp_update_post([
                'ID' => $post->ID,
                'post_status' => 'draft',
            ]);
        }
    }
});

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

  • Создайте тестовый заказ на товар с небольшим остатком, чтобы довести его до нуля.
  • После оформления заказа и обновления статуса проверьте, что товар стал черновиком и исчез из каталога.
  • Для CRON-проверки можно вручную запустить событие через WP-CLI или плагин WP Crontrol и убедиться, что товары с нулевым остатком отключаются.

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

  • Товар не отключается после достижения нулевого остатка: проверьте, что у товара включено управление запасами (_manage_stock = 'yes').
  • Товар остается видимым, но нельзя заказать: убедитесь, что в настройках WooCommerce не разрешены предзаказы (backorders).
  • CRON-задача не срабатывает: проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами кэширования или ограничениями хостинга.
  • Код вызывает ошибки PHP: проверьте совместимость с версией WooCommerce и активной темой, а также правильность синтаксиса.

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

  • Используйте кеширование запросов WP_Query при большом количестве товаров, чтобы снизить нагрузку на базу данных.
  • Отдавайте предпочтение изменению статуса товара на draft, а не удалению, чтобы сохранить историю и статистику.
  • Для контроля логики работы CRON-задачи используйте плагин WP Crontrol, чтобы отслеживать и запускать задачи вручную.
  • Регулярно делайте резервные копии базы данных перед внесением изменений или добавлением кастомного кода.

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

МетодПлюсыМинусы
Плагины (например, Stock Manager)Простота установки, готовый функционал, поддержка обновленийНагрузка на сайт, зависимость от стороннего кода, возможные конфликты
Код в functions.php (как в статье)Максимальный контроль, отсутствие лишних плагинов, оптимизация под задачиТребует навыков программирования, риск ошибок при неправильном коде
Ручное изменение статусовПолный контроль, никакого кодаТрудозатратно, легко забыть, не подходит для больших магазинов
Как использовать хуки для удаления CSS и JS в WordPress
08.12.2025
Как автоматизировать запросы к внешним API в WordPress
31.01.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
01.05.2026
Оценка производительности WordPress с помощью Query Monitor
09.04.2026
Как отключить XML-RPC в WordPress для повышения безопасности
04.02.2026