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

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

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

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

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

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

function wc_disable_out_of_stock_products() {
    // Запрос товаров с нулевым или отрицательным запасом
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            // Меняем статус товара на 'draft' (черновик) для отключения
            $post = array(
                'ID' => $product_id,
                'post_status' => 'draft',
            );
            wp_update_post($post);
        }
    }
}

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

Добавьте код для регистрации события, чтобы функция запускалась ежедневно:

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

3. Очистка расписания при деактивации

Если вы реализуете данное решение в виде плагина, добавьте очистку расписания при деактивации плагина:

function wc_clear_schedule_disable_out_of_stock() {
    $timestamp = wp_next_scheduled('wc_disable_out_of_stock_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_disable_out_of_stock_hook');
    }
}
register_deactivation_hook(__FILE__, 'wc_clear_schedule_disable_out_of_stock');

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

  • Убедитесь, что в админке WooCommerce товары с нулевым запасом автоматически переводятся в статус Черновик (draft) после запуска крон-задачи.
  • Для тестирования можно принудительно вызвать функцию wc_disable_out_of_stock_products() в консоли PHP или временно добавить вызов при загрузке страницы, чтобы проверить логику.
  • Проверьте фронтенд сайта: отключенные товары не должны отображаться в каталоге.

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

  • Товары не отключаются автоматически: проверьте, что WP-Cron активен и событие wc_disable_out_of_stock_hook запланировано (используйте плагин WP Crontrol для проверки).
  • Статус товара не меняется: убедитесь, что у пользователя, под которым выполняется код, есть права на изменение постов; при необходимости используйте wp_update_post с правильными параметрами.
  • Выключенные товары все еще видны на сайте: проверьте, что тема и плагины правильно фильтруют товары по статусу publish. Иногда кэширование может мешать отображению актуальных данных.

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

  • Для магазинов с большим количеством товаров лучше реализовать пакетную обработку, чтобы избежать превышения лимита памяти или таймаута. Например, обрабатывать по 100 товаров за один вызов.
  • Используйте транзиенты или опции для хранения состояния, чтобы не запускать тяжелые запросы слишком часто.
  • Проверяйте права доступа и не запускайте функцию из публичных хуков, где возможен доступ от неавторизованных пользователей.

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

МетодРеализацияПлюсыМинусы
Отключение через статус draftКод с wp_update_postТовары полностью скрыты, минимальный риск ошибокТребуется повторное включение вручную
Изменение мета _stock_status на instockИзменение только статуса запасаТовары остаются опубликованнымиПользователи могут видеть товар с недостоверным статусом
Использование плагиновПлагины управления запасамиГотовые решения, поддержкаЗависимость от стороннего кода, нагрузка
Как создать глобальный кеш для REST API и ускорить запросы
05.12.2025
WooCommerce: как автоматически отключить отгрузку товаров без запаса
22.04.2026
Как создать внешний API для WordPress с поддержкой авторизации
23.12.2025
Как отключить XML-RPC в WordPress без плагинов
10.05.2026
WooCommerce: как автоматически удалять просроченные заказы
16.05.2026