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

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

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

Определение «неактивных» товаров

Под неактивными товарами здесь понимаются продукты, которые:

  • В статусе draft или pending более 30 дней;
  • Отмечены как outofstock и не меняли статус в течение 60 дней;
  • Имеют статус private или trash более 7 дней.

Эти параметры можно настроить под свои нужды, изменив количество дней или критерии.

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

1. Добавление пользовательской функции в functions.php

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

function wpcatalog_delete_inactive_products() {
    if ( ! current_user_can('manage_woocommerce') ) return;

    $args = array(
        'post_type'      => 'product',
        'post_status'    => array('draft', 'pending', 'private', 'trash'),
        'date_query'     => array(
            array(
                'column' => 'post_modified_gmt',
                'before' => '30 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true - полностью удалить без корзины
    }

    // Удаление outofstock товаров старше 60 дней
    $outofstock_args = array(
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ),
        ),
        'date_query'     => array(
            array(
                'column' => 'post_modified_gmt',
                'before' => '60 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $outofstock_products = get_posts($outofstock_args);

    foreach ($outofstock_products as $product_id) {
        wp_delete_post($product_id, true);
    }
}

// Запуск через WP-Cron каждый день
if ( ! wp_next_scheduled('wpcatalog_daily_inactive_products_cleanup') ) {
    wp_schedule_event(time(), 'daily', 'wpcatalog_daily_inactive_products_cleanup');
}

add_action('wpcatalog_daily_inactive_products_cleanup', 'wpcatalog_delete_inactive_products');

2. Проверка и очистка WP-Cron

Убедитесь, что задачи WP-Cron работают корректно. Для этого можно использовать плагин Clearfy, который позволяет управлять кронами и оптимизировать сайт.

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

  • Зайдите в админку WooCommerce → Товары → Все товары.
  • Отфильтруйте товары по статусам draft, pending, private и trash. Они должны исчезнуть, если были старее 30 дней.
  • Проверьте товары со статусом outofstock — если они не менялись более 60 дней, их также не должно быть.
  • Для полной проверки можно временно заменить wp_delete_post($product_id, true); на error_log('Удаляем товар ID: ' . $product_id); и посмотреть логи, какие товары будут удалены.

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

  • Не срабатывает WP-Cron: Задача не запускается, если на сайте мало трафика или WP-Cron отключен. Решение — настроить системный cron на сервере, вызывающий wp-cron.php.
  • Удаление не тех товаров: Проверьте корректность условий date_query и meta_query, чтобы не удалить актуальные товары.
  • Отсутствие прав доступа: Функция запускается только если есть права manage_woocommerce. Проверьте, что cron запускается под админом.

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

  • Перед удалением добавьте резервное копирование базы, чтобы избежать потери данных.
  • Удаляйте товары пакетами по 50-100, если каталог большой, чтобы не перегружать сервер.
  • Используйте транзакции или логи для восстановления при ошибках.
  • Оптимизируйте WP-Cron, устанавливая системный cron вместо запуска при заходе посетителей.

Сравнение вариантов удаления неактивных товаров

МетодПлюсыМинусыКогда использовать
Код в functions.php с WP-CronПолный контроль, настраиваемые условия, бесплатноНужны базовые навыки, возможны ошибки при неправильном кодеДля опытных разработчиков и кастомных требований
Плагины очистки (например WP Sweep, Advanced Database Cleaner)Простота, интерфейс, много функцийМогут удалять лишнее, нагрузка при больших базахДля быстрой очистки и базовой оптимизации
Ручное удаление в админкеПростота, нет риска ошибок кодаТрудоемко при большом каталогеМаленькие магазины или единичные случаи
Как установить уникальные заголовки H1 для каждой страницы WordPress
18.02.2026
WooCommerce: автоматическое обновление остатков товаров в реальном времени
13.06.2026
Автоматизация создания и удаления черновиков в WordPress
24.03.2026
Оптимизация загрузки изображений в WordPress для повышения скорости сайта
11.12.2025
Автоматическое удаление товаров из WooCommerce при нулевом остатке
25.04.2026