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

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

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

Основные признаки, что нужна автоматизация:

  • В магазине много товаров с нулевым или отрицательным запасом;
  • Отсутствует штатный механизм очистки каталога от неактуальных товаров;
  • Появляются заказы на товары, которых уже нет в наличии;
  • Администратор тратит много времени на ручное удаление товаров.

Как проверить текущий статус товаров по запасам в WooCommerce

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

SELECT p.ID, p.post_title, pm.meta_value AS stock_qty 
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';

Этот запрос покажет все опубликованные товары с остатком <= 0. Если таких товаров много, имеет смысл автоматизировать их удаление.

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

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

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

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

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_trash_post(get_the_ID());
        }
    }
    wp_reset_postdata();
}

2. Запуск функции с помощью WP-Cron

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

if (!wp_next_scheduled('wc_delete_zero_stock_products_daily')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_zero_stock_products_daily');
}
add_action('wc_delete_zero_stock_products_daily', 'wc_delete_products_with_zero_stock');

Этот код запустит проверку и удаление товаров с нулевым или отрицательным запасом один раз в сутки.

3. Ручной запуск для тестирования

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

// Временно для теста
// wc_delete_products_with_zero_stock();

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

Для подтверждения работоспособности:

  • Запустите функцию вручную (раскомментировав вызов) и проверьте, что товары с нулевым запасом оказываются в корзине (Trash) в админке WooCommerce;
  • После запуска WP-Cron убедитесь, что задания выполняются (можно использовать плагин WP Crontrol);
  • Проверьте список товаров в админке — товары с запасом <= 0 должны отсутствовать в опубликованных;
  • Проверьте, что не удаляются товары с положительным запасом.

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

  • Функция не удаляет товары: проверьте, что WP-Cron работает на хостинге и нет отключений в wp-config.php (DISABLE_WP_CRON должно быть false или не задано).
  • Удаляются товары с запасом больше 0: убедитесь, что в meta_query задан правильный оператор и тип, в коде должен быть 'compare' => '<=' и 'type' => 'NUMERIC'.
  • Товары не отображаются после восстановления: удаление происходит через корзину, убедитесь, что в админке не фильтруется отображение корзины.
  • Производительность падает при большом каталоге: разбивайте удаление на части или увеличьте интервал запуска WP-Cron.

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

  • Используйте wp_trash_post() вместо wp_delete_post() для безопасного удаления — товары можно восстановить при ошибке.
  • Для больших магазинов реализуйте удаление пакетами по 50-100 товаров за один запуск, чтобы избежать таймаутов.
  • Добавьте логирование действий удаления в файл или через error_log() для отладки.
  • Ограничьте права на запуск удаления только администраторам или автоматическим задачам, не давая пользователям запускать ее вручную.

Сравнение подходов к удалению товаров с нулевым запасом

МетодПреимуществаНедостатки
Ручное удаление через админку WooCommerceПростота, контрольТрудозатратно, риск пропуска
Автоматизация через WP-Cron и кодАвтоматизация, экономия времени, гибкостьНужно тестировать, требует контроля работы Cron
Плагины для очистки каталогаПростота настройки, интерфейсМожет быть платным, меньше гибкости
WooCommerce: автоматическое изменение статуса заказа при оплате
25.06.2026
Как удалить неиспользуемые таксономии в WordPress: практические методы и код
11.03.2026
Как создать динамические счетчики посещений в WordPress
19.03.2026
Как автоматически отвечать на часто задаваемые вопросы (FAQ) в WordPress
26.03.2026
Как автоматизировать удаление неактуальных значений опций в WordPress
20.02.2026