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

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

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

Чтобы убедиться в наличии проблемы, проверьте следующие моменты:

  • В настройках WooCommerce в разделе «Товары» > «Запасы» опция «Скрыть товары без наличия» включена?
  • Товары действительно имеют запас 0 и статус "в наличии" или "нет в наличии"?
  • Кэш сайта и кэш плагинов очищен после изменения настроек?

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

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

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

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

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_trash_post($product_id); // Можно заменить на wp_delete_post для полного удаления
        }
    }
}

2. Запускаем функцию автоматически по расписанию

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

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

// Добавляем обработчик события
add_action('wc_daily_remove_out_of_stock', 'wc_remove_out_of_stock_products');

3. Как запустить удаление вручную для проверки

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

add_action('init', 'wc_remove_out_of_stock_products');

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

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

  • Подождите выполнение cron-задачи или вручную вызовите функцию.
  • Перейдите в админку WooCommerce > Товары и убедитесь, что товары с запасом 0 перемещены в корзину или удалены.
  • Проверьте фронтенд сайта — этих товаров не должно отображаться в каталоге и поиске.
  • Если используется кэширование, очистите кэш страницы и объектов.

Частые ошибки и способы их устранения

  • Функция не запускается по расписанию: Проверьте, активен ли WP-Cron (например, вызовите wp cron event list через WP-CLI), и не отключен ли он в wp-config.php.
  • Товары не удаляются: Возможно, статус товара не "outofstock". Проверьте в таблице wp_postmeta значение мета-поля _stock_status. Можно временно убрать условие по статусу для диагностики.
  • Удаление приводит к потере данных: Используйте wp_trash_post() вместо wp_delete_post(), чтобы иметь возможность восстановить товары.
  • Кэш мешает видеть изменения: Очистите кэш плагинов, CDN и браузера.

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

  • Не запускайте удаление при каждом запросе — используйте WP-Cron с интервалом не чаще одного раза в день.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • При большом количестве товаров разбивайте удаление на порции, чтобы избежать таймаутов:
function wc_remove_out_of_stock_products_batch() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => 50,  // порция по 50 товаров
        'meta_query'     => [
            [ 'key' => '_stock', 'value' => '0', 'compare' => '=', 'type' => 'NUMERIC' ],
            [ 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => '=' ]
        ],
        'fields'         => 'ids',
    ];

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_trash_post($product_id);
        }
    }

    return count($products);
}

Используйте такой подход с повторным вызовом, пока функция не вернет 0.

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

МетодОписаниеПреимуществаНедостатки
Плагин (например, Custom Stock Manager)Использование готового решения с настройкамиПростота установки, интерфейсЗависимость от стороннего кода, нагрузка
Код в functions.php с WP-CronАвтоматическое удаление через кастомный кодПолный контроль, отсутствие сторонних плагиновТребует навыков, возможны ошибки при реализации
Ручное удалениеУдаление товаров вручную в админкеПростота для небольших магазиновТрудоемко, не автоматично
Как удалить пустое меню в административной панели WordPress
31.03.2026
Обработка AJAX запросов в WordPress с примерами кода
21.11.2025
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
10.05.2026
WooCommerce: как отключить автоматическую загрузку стилей и скриптов для ускорения сайта
12.06.2026
Автоматическое удаление неиспользуемых шорткодов в WordPress
03.04.2026