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

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

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

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

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

  • Включено управление запасами (Inventory management) в карточке товара.
  • Поле Stock quantity соответствует реальному количеству.
  • Параметр Allow backorders отключён, если не планируется продажа товаров в минус.

Если эти условия не соблюдены, WooCommerce не сможет корректно определять отсутствие товара.

Проверка текущих настроек товара

function check_product_stock_settings( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product->managing_stock() ) {
        return 'Не включено управление запасами';
    }
    if ( $product->get_stock_quantity() > 0 ) {
        return 'Товар в наличии';
    }
    if ( $product->backorders_allowed() ) {
        return 'Разрешены бэкордеры';
    }
    return 'Товара нет в наличии и бэкордеры запрещены';
}

Выведите результат для тестового товара и проверьте настройки.

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

Для автоматического отключения товаров, у которых stock_quantity равен 0 и бэкордеры запрещены, добавим хук, который при проверке видимости товара переводит его в статус draft.

add_action('woocommerce_product_set_stock_status', 'auto_draft_out_of_stock_products', 10, 3);
function auto_draft_out_of_stock_products( $product_id, $stock_status, $product ) {
    if ( $stock_status === 'outofstock' && ! $product->backorders_allowed() ) {
        // Переводим товар в черновики
        if ( get_post_status( $product_id ) !== 'draft' ) {
            wp_update_post( [
                'ID' => $product_id,
                'post_status' => 'draft'
            ] );
        }
    }
}

Этот код срабатывает при изменении статуса запаса товара. Если товар становится отсутствующим и бэкордеры запрещены, он автоматически скрывается с сайта.

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

Если у вас много товаров, можно настроить регулярный WP-Cron, который проверяет запасы и отключает отсутствующие товары раз в сутки.

add_action( 'auto_draft_out_of_stock_cron', 'auto_draft_out_of_stock_products_cron' );
function auto_draft_out_of_stock_products_cron() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock_status',
                'value' => 'outofstock'
            ]
        ]
    ];
    $query = new WP_Query( $args );

    foreach ( $query->posts as $post ) {
        $product = wc_get_product( $post->ID );
        if ( ! $product->backorders_allowed() ) {
            wp_update_post( [ 'ID' => $post->ID, 'post_status' => 'draft' ] );
        }
    }
}

// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'auto_draft_out_of_stock_cron' ) ) {
    wp_schedule_event( time(), 'daily', 'auto_draft_out_of_stock_cron' );
}

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

1. Создайте тестовый товар с включённым управлением запасами, количеством 1 и без разрешения бэкордеров.

2. Уменьшите количество до 0 — товар должен автоматически перейти в статус «черновик».

3. Проверьте, что товар исчез с витрины и не доступен для покупки.

4. Для WP-Cron проверьте, что событие запланировано wp cron event list или с помощью плагина WP Crontrol.

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

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

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

  • При использовании WP-Cron для массовых операций добавьте лимиты по количеству товаров за одну итерацию, чтобы избежать таймаутов.
  • Используйте транзиенты или кэширование при регулярных проверках для снижения нагрузки.
  • Перед массовыми изменениями статуса товаров сделайте резервную копию базы данных.
  • Включите логирование действий по изменению статуса для аудита и быстрой диагностики.

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Хук woocommerce_product_set_stock_statusАвтоматическое переключение статуса товара при смене запасаРаботает сразу, не требует дополнительной нагрузкиНе срабатывает для массового обновления без триггера
WP-Cron с регулярной проверкойПериодическая проверка всех товаров и отключение отсутствующихОбрабатывает все товары, работает при обновлениях вне WooCommerceНагрузка на сервер, задержка до выполнения задачи
Плагин стороннийГотовое решение с настройками и интерфейсомПростота настройки, поддержкаДополнительная нагрузка, может конфликтовать, цена
Как автоматизировать удаление старых просмотров в WordPress
01.02.2026
Как автоматизировать удаление старого контента в WordPress
25.02.2026
WooCommerce: как удалить товар из корзины через хук и AJAX без перезагрузки страницы
18.04.2026
Как создать динамические отзывы с оценками в WordPress без плагинов
09.01.2026
WooCommerce: как избежать повторной оплаты при проблемах с samesite cookie
23.05.2026

На оформлении, скоро здесь появится полноценный ресурс