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

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

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

Классический сценарий — товары со статусом draft, pending или private, которые не обновлялись и не публиковались в течение нескольких месяцев, должны автоматически удаляться, чтобы оптимизировать работу магазина.

Как выявить неактивные товары

  • Статус товара отличен от publish (например, draft, private, pending)
  • Дата последнего обновления или создания товара старше заданного порога (например, 180 дней)
  • Отсутствие продаж или просмотров (если есть мета-данные)

Реальная задача — автоматизировать удаление таких товаров без ручного контроля.

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

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

function wpteam_delete_inactive_products() {
    $days_threshold = 180; // количество дней неактивности
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    // Параметры запроса для товаров с нужным статусом и датой
    $args = array(
        'post_type'      => 'product',
        'post_status'    => array('draft', 'pending', 'private'),
        'date_query'     => array(
            'column' => 'post_modified',
            'before' => $date_threshold,
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $query = new WP_Query($args);
    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // полное удаление
        }
    }
}

2. Регистрируем WP-Cron задачу для регулярного запуска

function wpteam_register_delete_inactive_products_cron() {
    if (!wp_next_scheduled('wpteam_delete_inactive_products_event')) {
        wp_schedule_event(time(), 'daily', 'wpteam_delete_inactive_products_event');
    }
}
add_action('wp', 'wpteam_register_delete_inactive_products_cron');

add_action('wpteam_delete_inactive_products_event', 'wpteam_delete_inactive_products');

3. Опционально: функция для отмены Cron задачи

function wpteam_clear_delete_inactive_products_cron() {
    $timestamp = wp_next_scheduled('wpteam_delete_inactive_products_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpteam_delete_inactive_products_event');
    }
}

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

  • Проверьте наличие Cron задачи через плагин Cron Manager или WP-CLI команду wp cron event list.
  • Создайте тестовый товар с статусом draft и датой обновления старше 180 дней (можно отредактировать напрямую в базе или с помощью плагина WP phpMyAdmin).
  • Выполните вручную функцию через WP-CLI или временно добавьте вызов функции в шаблон (например, в functions.php) для проверки удаления.
  • Убедитесь, что товар удалился без ошибок и не затронул опубликованные товары.

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

  • WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron зависит от посещений сайта. Для стабильности настройте системный cron на вызов wp-cron.php.
  • Удаление не происходит: Проверьте, что функция вызывается и параметры WP_Query корректны. Логи PHP и WordPress помогут найти ошибки.
  • Удаляются нужные товары: Будьте осторожны с датами и статусами. Лучше сначала использовать wp_trash_post() вместо полного удаления для теста.
  • Большая нагрузка при выборке: Для магазинов с тысячами товаров разбивайте удаление на партии с помощью posts_per_page и циклов.

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

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

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

МетодПлюсыМинусыРекомендации
Удаление вручную через админку Простота, контроль Трудоемко, риск пропуска Подходит для малого каталога
Плагины очистки (например, WP Sweep) Автоматизация, готовые настройки Могут не учитывать кастомные статусы Использовать с осторожностью и тестировать
Код на WP-Cron (описанный в статье) Гибкость, точечное управление, без лишних плагинов Требует навыков, настройка cron Оптимальный для средних и крупных магазинов
Как автоматизировать удаление старого контента в WordPress с помощью WP-Cron и кода
21.03.2026
Как удалить удалённых пользователей из базы данных WordPress
10.12.2025
WooCommerce: автоматическое удаление товаров по неактивности и дате обновления
21.05.2026
Как использовать хук filter pre_get_posts для автоматической фильтрации записей в WordPress
02.03.2026
Исключение товаров из корзины WooCommerce по атрибутам (цвет, размер)
23.04.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.