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

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

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

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

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

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

function wpb_delete_out_of_stock_products() {
    // Параметры запроса для поиска товаров без наличия
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '='
            )
        ),
        'fields'         => 'ids', // Получаем только ID
        'post_status'    => 'publish',
    );

    $out_of_stock_ids = get_posts($args);

    if (!empty($out_of_stock_ids)) {
        foreach ($out_of_stock_ids as $product_id) {
            wp_delete_post($product_id, true); // Полное удаление без перемещения в корзину
        }
    }
}

2. Автоматизация запуска функции по расписанию (WP-Cron)

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

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

// Хук для запуска нашей функции
add_action('wpb_delete_oos_products_cron', 'wpb_delete_out_of_stock_products');

// Для отмены расписания (при деактивации темы/плагина)
function wpb_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpb_delete_oos_products_cron');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpb_delete_oos_products_cron');
    }
}
// Не забудьте вызвать wpb_deactivate_cleanup() при деактивации

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

  • Перейдите в админку WooCommerce → Товары и отфильтруйте товары по статусу «Нет в наличии».
  • После запуска функции (вручную или по расписанию) таких товаров не должно остаться.
  • Можно вручную вызвать функцию с помощью wpb_delete_out_of_stock_products(); в админке через плагин типа Code Snippets или напрямую, чтобы проверить работоспособность.
  • Проверьте логи ошибок и успешных вызовов WP-Cron (через плагин WP Crontrol) для подтверждения запуска задачи.

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

  • Функция не удаляет товары: проверьте, что у товаров действительно статус _stock_status равен outofstock. Если используется другое поле или плагин управления запасами, нужно адаптировать meta_query.
  • Функция не запускается по расписанию: WP-Cron работает только при посещении сайта. Для стабильности настройте системный cron на вызов wp-cron.php или воспользуйтесь плагином WP Crontrol.
  • Удаление происходит не полностью: параметр wp_delete_post с true во втором аргументе гарантирует полное удаление, проверьте, не вызывается ли где-то отмена.
  • Проблемы с производительностью при большом количестве товаров: разбейте удаление на пакеты, например, по 50 товаров за вызов, чтобы избежать таймаутов.

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

  • Перед автоматическим удалением обязательно делайте резервное копирование базы данных.
  • Добавьте логирование удалённых товаров в отдельный файл или в системный лог для аудита.
  • Если магазин большой, реализуйте удаление пакетами с помощью array_chunk и планируйте повторные WP-Cron задачи.
  • Перед удалением можно отправлять уведомление администратору с количеством товаров для удаления.
  • Проверяйте совместимость с плагинами управления складом, чтобы не удалить нужные товары по ошибке.

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

МетодОписаниеПлюсыМинусы
Код в functions.php с WP-CronСамостоятельное удаление через WP-Cron и кастомный кодПолный контроль, бесплатно, гибкоТребует навыков, возможны ошибки, нужно тестировать
Плагины для управления складомИспользуют встроенные функции плагинов для очисткиПростота, поддержка, интеграция с другими функциямиПлатные, могут быть избыточными, нагрузка
Ручное удаление через админкуФильтрация и массовое удаление вручнуюПростота, без кодаТрудозатратно, не автоматично
Автоматическое отключение неиспользуемых тем в WordPress
08.02.2026
Как создать фильтрованные запросы WordPress с поддержкой пагинации
24.03.2026
Как запретить индексацию категорий в WordPress
17.01.2026
WooCommerce: как использовать хук для изменения количества товаров в корзине
29.05.2026
Как защитить WordPress от взломов: практические методы и примеры кода
29.11.2025