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 для очистки)Удобство, дополнительные функции оптимизацииПотенциальные конфликты, стоимость
Как создать собственный вид записей в WordPress
25.11.2025
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
04.05.2026
Как добавить дополнительные мета-поля в административную панель WordPress
22.12.2025
Оптимизация базы данных WordPress: как ускорить сайт и снизить нагрузку
14.11.2025
Как создать автоматические уведомления в WordPress с помощью WPRemark
17.02.2026