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

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

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

Как определить товары без запаса в WooCommerce

WooCommerce хранит запасы в метаполе _stock. Товары с запасом <= 0 считаются отсутствующими на складе. Чтобы найти их вручную, можно выполнить SQL запрос:

SELECT post_id FROM wp_postmeta WHERE meta_key = '_stock' AND meta_value <= 0;

Но для автоматизации лучше использовать WP_Query с мета-запросом.

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

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

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

    $products = new WP_Query($args);

    if ($products->have_posts()) {
        foreach ($products->posts as $product_id) {
            wp_delete_post($product_id, true); // true - без перемещения в корзину
        }
    }
}

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

Чтобы не запускать удаление вручную, добавим событие, которое будет срабатывать, например, раз в сутки.

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

add_action('wc_delete_out_of_stock_daily_event', 'wc_delete_out_of_stock_products');

3. Добавляем код в functions.php вашей темы или в плагин

Рекомендуется создать дочернюю тему или собственный плагин для поддержки обновлений.

Как проверить, что удаление работает

  • Добавьте в магазин несколько товаров с запасом 0 или меньше, они должны быть опубликованы.
  • Запустите функцию вручную (через WP-CLI или временно вызвав wc_delete_out_of_stock_products()).
  • Проверьте, что эти товары удалены из базы (в админке и через запросы).
  • Убедитесь, что WP-Cron работает — можно проверить через плагин WP Crontrol.

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

Ошибка 1: товары не удаляются, хотя запас 0

  • Проверьте, что метаполе _stock действительно содержит нули, а не пустые строки.
  • Добавьте логирование для отладки, например error_log('Deleting product ID: ' . $product_id);.

Ошибка 2: WP-Cron не срабатывает

  • Проверьте, работает ли wp-cron на хостинге (иногда отключен).
  • Используйте системный cron с вызовом wp cron event run.

Ошибка 3: удаляются не те товары

  • Убедитесь, что post_type = 'product'.
  • Проверьте условия meta_query.

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

  • Удаление товаров с помощью wp_delete_post($id, true) — полностью удаляет записи, без возможности восстановления. Для безопасного удаления можно передавать false и перемещать в корзину.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для больших магазинов с тысячами товаров добавьте пагинацию в WP_Query, чтобы избежать превышения лимита памяти.
  • Регулярно проверяйте логи и состояние WP-Cron.

Сравнение вариантов автоматического удаления товаров без запаса

МетодПлюсыМинусыИспользование
Ручное удаление через админкуПросто, быстро для малого количества товаровТрудоемко при большом каталогеМалые магазины
Плагины (например, WP All Import + фильтры)Интерфейс, гибкие настройкиДоп. нагрузка, стоимость, могут конфликтоватьСредние и крупные магазины
Код на PHP + WP-Cron (как в статье)Легковесно, без сторонних зависимостей, гибкоТребует знаний, нужно следить за cronРазработчики, кастомные решения
Оптимизация кода в WordPresses: эффективное использование хуков и фильтров
02.11.2025
Как установить ограничения на подробное отображение пользователей в WordPress
29.01.2026
Как отключить Emoji в WordPress для ускорения загрузки сайта
15.03.2026
Как создать глобальный кеш для REST API и ускорить запросы
05.12.2025
Как создать внешний API для WordPress с поддержкой авторизации
23.12.2025