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

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

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

Цель: автоматически удалять товары, которые помечены как неактивные и не обновлялись длительное время, например, старше 6 месяцев.

Как определить неактивные товары

В WooCommerce статус товара может быть разным — опубликован, черновик, ожидает проверки и пр. Для удаления обычно выбирают товары со статусом draft или private, которые не обновлялись длительное время.

Проверить статус и дату изменения товара можно через SQL или WP_Query.

Пример запроса WP_Query для диагностики

$args = [
    'post_type' => 'product',
    'post_status' => ['draft', 'private'],
    'date_query' => [
        [
            'column' => 'post_modified',
            'before' => '6 months ago',
        ],
    ],
    'posts_per_page' => 10
];
$query = new WP_Query($args);
foreach ($query->posts as $post) {
    error_log('Неактивный товар: ' . $post->ID . ' - ' . $post->post_title);
}

Этот код выведет первые 10 неактивных товаров, не обновлявшихся более 6 месяцев.

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

1. Добавьте кастомную функцию, которая будет искать и удалять товары с нужными параметрами.

function wc_remove_inactive_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => ['draft', 'private'],
        'date_query' => [
            [
                'column' => 'post_modified',
                'before' => '6 months ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true — удалить без корзины
        }
    }
}

2. Зарегистрируйте событие WP-Cron для запуска функции автоматически (например, раз в сутки):

if (!wp_next_scheduled('wc_daily_remove_inactive_products')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_remove_inactive_products');
}
add_action('wc_daily_remove_inactive_products', 'wc_remove_inactive_products');

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

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

  • Через базу данных или админку проверьте наличие товаров со статусом draft или private, изменённых больше 6 месяцев назад — они должны исчезнуть.
  • Для отладки добавьте в функцию error_log() перед удалением, чтобы увидеть список удаляемых товаров.
  • Проверьте логи сервера на наличие ошибок при запуске WP-Cron.

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

  • WP-Cron не срабатывает: Если WP-Cron не запускается автоматически (например, из-за низкой посещаемости сайта), настройте системный cron на сервере для вызова wp-cron.php.
  • Удаление происходит не по плану: Проверьте, что событие wc_daily_remove_inactive_products зарегистрировано через wp_next_scheduled() и не дублируется.
  • Удаляются нужные товары: Убедитесь, что условие post_status и date_query правильно настроены. Желательно протестировать функцию на тестовом сайте.
  • Переполнение памяти или таймаут: Если много товаров под удаление, разбейте процесс на партии с параметром posts_per_page (например, 50).

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

  • Всегда делайте резервную копию базы данных перед автоматическим удалением.
  • Используйте wp_delete_post($id, true) с параметром true для полного удаления, но будьте осторожны — восстановить будет сложно.
  • Для больших магазинов оптимизируйте запрос с пагинацией и ограничением количества удаляемых товаров за один проход.
  • Логируйте удалённые товары в отдельный файл для возможного аудита.
  • Проверяйте, что не удаляются товары, которые могли быть временно сняты с публикации по другим причинам.

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

МетодПлюсыМинусы
WP-Cron с кастомным кодомГибкость, контроль, нет лишних плагиновЗависит от WP-Cron, требует навыков программирования
Плагин для очистки WooCommerceПростота установки, готовые функцииМогут быть избыточными, нагрузка, ограничения настроек
Ручное удаление через админкуПолный контроль, нет риска автоматических ошибокТрудоёмко, не подходит для больших каталогов
WooCommerce: установка и использование хуков для дополнительной обработки заказов
18.05.2026
Как отключить самовывоз в WooCommerce при наличии конкретного товара в корзине
12.08.2026
Как создать адаптивные таблицы в WordPress
10.04.2026
WooCommerce: как автоматически удалять неактивные товары через PHP-скрипт
23.05.2026
Автоподгрузка постов в WordPress без плагинов
25.02.2026