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

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

В магазинах на WooCommerce часто возникает ситуация, когда товары с нулевым остатком (или ниже минимального порога) продолжают отображаться в каталоге, что негативно сказывается на пользовательском опыте и конверсии. Это происходит из-за того, что WooCommerce по умолчанию не отключает товары автоматически при отсутствии запаса.

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

SELECT ID, post_title FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) <= 0
AND p.post_status = 'publish';

Если такие товары есть, но они по-прежнему активны, значит нужна автоматизация их статуса.

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

1. Использование WP-Cron для регулярной проверки

Добавим функцию в файл functions.php вашей темы или в кастомный плагин, которая будет запускаться по расписанию и менять статус товаров с нулевым остатком на draft (черновик).

function wprobot_auto_disable_out_of_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_update_post([
                'ID'          => get_the_ID(),
                'post_status' => 'draft',
            ]);
        }
        wp_reset_postdata();
    }
}

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

// Привязываем функцию к событию
add_action('wprobot_daily_disable_oos_products', 'wprobot_auto_disable_out_of_stock_products');

2. Автоматическое включение товара при появлении запаса

Чтобы автоматически активировать товар при обновлении запаса, используем хук woocommerce_product_set_stock:

add_action('woocommerce_product_set_stock', 'wprobot_auto_enable_in_stock_product', 10, 1);
function wprobot_auto_enable_in_stock_product($product) {
    if ($product->get_stock_quantity() > 0 && $product->is_type('simple')) {
        $post_id = $product->get_id();
        $post = get_post($post_id);
        if ($post->post_status === 'draft') {
            wp_update_post([
                'ID'          => $post_id,
                'post_status' => 'publish',
            ]);
        }
    }
}

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

  • Запустите вручную задачу с помощью do_action('wprobot_daily_disable_oos_products'); в консоли WP или временно добавьте вызов функции.
  • Проверьте, что товары с нулевым запасом изменили статус на draft и исчезли из каталога.
  • Обновите запас у отключенного товара — он должен автоматически стать активным.
  • Проверьте в админке WooCommerce в списке товаров статусы товаров.

Частые ошибки и способы исправления

  • Задача WP-Cron не запускается: Убедитесь, что на сервере есть трафик для триггера WP-Cron или настройте системный cron для запуска wp-cron.php.
  • Неправильный мета-ключ запасов: Значение _stock должно быть в метаполях товара. Если используется сторонний плагин для управления запасами, ключи могут отличаться.
  • Товары не меняют статус: Проверьте права пользователя, от имени которого работает скрипт, и корректность ID поста.
  • Статус товара меняется, но товар все равно виден: Проверьте настройки видимости товаров (например, отображение черновиков в магазине).

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

  • Не ставьте периодичность задачи чаще, чем раз в сутки, чтобы не перегружать базу.
  • Для магазинов с большим количеством товаров используйте постраничный обход ('posts_per_page' => 100) и делайте batch-обновления с сохранением последнего ID.
  • Сохраняйте бэкапы перед внедрением, особенно если меняете статусы большого количества товаров.
  • Логируйте изменения статусов товара в отдельный лог-файл для аудита.

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

МетодПлюсыМинусыКогда применять
WP-Cron + кастомный кодГибкость, без плагинов, можно кастомизироватьЗависит от WP-Cron; требует навыковСредние и большие магазины с уникальными требованиями
Плагины управления запасамиПростота настройки, готовые решенияМогут быть тяжелыми, платнымиМалые магазины, без разработчиков
Ручное отключениеПростое, без кодаТрудозатратно, риск ошибкиОчень маленькие магазины
Как автоматически создать XML Sitemap в WordPress с помощью кода
30.03.2026
Как автоматически отображать посты по тегам в WordPress с примерами кода
23.02.2026
Автоматическое изменение цен и наличия товаров WooCommerce через Webhook с примером кода
10.05.2026
Как настроить автоматическое отображение связанных записей в WordPress
16.12.2025
Как создать собственный виджет в WordPress с примерами кода
21.11.2025