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

Проблема: как убрать товары с нулевым остатком из каталога WooCommerce

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

Диагностика текущего поведения WooCommerce

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

  • Отключить продажи при отсутствии товара (WooCommerce > Настройки > Товары > Управление запасами) — товары со статусом "нет в наличии" нельзя купить.
  • Скрыть товары, которые нет в наличии — эта галочка скрывает товар из каталога.

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

Если же нужно именно автоматическое удаление таких товаров (а не просто скрытие), стандартных средств WooCommerce недостаточно — потребуется доработка.

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

1. Создаем WP-Cron задачу для регулярной проверки товаров

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

if (!wp_next_scheduled('wc_delete_out_of_stock_products')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_products');
}

add_action('wc_delete_out_of_stock_products', 'wc_remove_out_of_stock_products');

function wc_remove_out_of_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'fields'         => 'ids',
    ];

    $out_of_stock_products = get_posts($args);

    foreach ($out_of_stock_products as $product_id) {
        wp_trash_post($product_id); // перемещаем в корзину, чтобы была возможность восстановления
    }
}

2. Запуск задачи вручную для теста

Для проверки кода можно временно вызвать функцию вручную:

add_action('admin_init', function() {
    if (current_user_can('administrator') && isset($_GET['run_wc_delete'])) {
        wc_remove_out_of_stock_products();
        echo 'Удаление товаров с нулевым остатком выполнено';
        exit;
    }
});

Перейдите в админку WordPress и добавьте к URL ?run_wc_delete=1, например: https://example.com/wp-admin/?run_wc_delete=1. Функция удалит все товары со статусом "outofstock".

3. Автоматизация и настройка расписания

WP-Cron по умолчанию запускается при заходе на сайт, что может быть ненадежно на низкоскоростных или малопосещаемых сайтах. Для более точного расписания рекомендуем настроить системный cron (Linux) и отключить WP-Cron:

  • в wp-config.php добавить define('DISABLE_WP_CRON', true);
  • создать cron-задачу на сервере, например, запускать wget -q -O - https://example.com/wp-cron.php?doing_wp_cron раз в сутки

Проверка результата

Чтобы убедиться, что удаление работает:

  • Создайте тестовый товар с нулевым остатком.
  • Вызовите функцию вручную через ?run_wc_delete=1 или дождитесь запуска cron.
  • Проверьте, что товар перемещен в корзину (раздел "Корзина" в админке).
  • Проверьте фронтенд — товар не должен отображаться в каталоге.

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

  • Товары не удаляются: проверьте, что статус запаса действительно outofstock. Иногда у товаров может быть неправильный мета-ключ или статус instock, но с нулевым количеством на складе.
  • WP-Cron не запускается: проверьте, не отключен ли WP-Cron, или настройте системный cron для надежности.
  • Удаление окончательное, а не в корзину: используйте wp_trash_post(), а не wp_delete_post(), чтобы можно было восстановить товары при ошибке.
  • Пропадают товары с положительным остатком: проверьте meta_query, чтобы строго фильтровать только _stock_status = 'outofstock'.

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

  • Резервное копирование: перед автоматическим удалением товаров сделайте резервную копию базы, чтобы избежать потери данных.
  • Оптимизация запросов: при большом каталоге используйте постраничный запрос и пакетное удаление, чтобы избежать таймаутов.
  • Логирование: добавьте логирование действий для контроля выполнения задачи, например, через error_log или пользовательские записи в таблицу базы.
  • Проверка зависимостей: убедитесь, что автоматическое удаление не ломает связи с заказами и отчетами WooCommerce.

Альтернативные подходы: скрытие vs удаление товаров

МетодПлюсыМинусы
Скрытие товаров (опция WooCommerce)Простота, не теряются данные, можно вернутьТовар занимает место в базе, может быть виден в поиске
Автоматическое удаление (код)Чистый каталог, меньше нагрузки на фронтендРиск потери данных, сложнее восстановить, требует резервного копирования
Использование плагинов (например, Clearfy Pro для очистки)Удобство, дополнительные функции оптимизацииПотенциальные конфликты, стоимость
WooCommerce: как автоматически удалять товары из каталога при отсутствии на складе
08.06.2026
Как установить и настроить защиту от bruteforce-атак в WordPress без плагинов
21.04.2026
Как создать настройки темы в WordPress с примерами кода
18.11.2025
Автоматическое удаление корзины в WooCommerce после оплаты
01.05.2026
Как создать собственный вид записей в WordPress
25.11.2025