Как настроить автоматическое удаление старого контента из WooCommerce

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

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

Основные категории, которые часто требуют автоматической очистки:

  • Продукты, не продававшиеся или не обновлявшиеся долгое время
  • Старые заказы с определённым статусом (например, отменённые, просроченные)
  • Черновики и авто-сохранения, которые уже не актуальны

Как определить, какой контент можно удалять автоматически

Перед настройкой автоматического удаления необходимо определить бизнес-логику. Например:

  • Продукты, которых не было в заказах последние 6 месяцев
  • Заказы со статусом "отменён" старше 3 месяцев
  • Черновики старше 30 дней

Для диагностики можно использовать SQL-запросы к базе данных или плагины аналитики, чтобы выявить такие записи.

Пошаговое решение: автоматизация удаления с помощью WP-CLI и пользовательского кода

1. Удаление старых продуктов без продаж

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

function wplite_delete_old_unsold_products() {
    // Период в днях
    $days = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

    // Получаем ID продуктов, не участвовавших в заказах
    global $wpdb;
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
         WHERE p.post_type = 'product'
           AND p.post_status = 'publish'
           AND p.post_date < %s
         GROUP BY p.ID
         HAVING COUNT(oi.order_item_id) = 0",
        $date_threshold
    ));

    if (!empty($product_ids)) {
        foreach ($product_ids as $product_id) {
            wp_delete_post($product_id, true);
        }
    }
}

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

2. Удаление старых отменённых заказов

Для удаления заказов со статусом cancelled, старше 90 дней:

function wplite_delete_old_cancelled_orders() {
    $days = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => 'wc-cancelled',
        'date_query' => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

3. Очистка старых черновиков

Удаляем черновики, созданные более 30 дней назад:

function wplite_delete_old_drafts() {
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

    $args = array(
        'post_status' => 'draft',
        'post_type' => 'any',
        'date_query' => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $drafts = get_posts($args);

    foreach ($drafts as $draft_id) {
        wp_delete_post($draft_id, true);
    }
}

4. Планирование автоматизации с помощью cron

Чтобы запускать эти функции автоматически, используйте WP-Cron:

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

add_action('wplite_cleanup_hook', 'wplite_cleanup_all');

function wplite_cleanup_all() {
    wplite_delete_old_unsold_products();
    wplite_delete_old_cancelled_orders();
    wplite_delete_old_drafts();
}

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

  • Зайдите в админку WooCommerce и проверьте количество продуктов и заказов до и после выполнения скриптов.
  • Используйте WP-CLI для подсчёта записей: wp post list --post_type=product --format=count и wp post list --post_type=shop_order --post_status=wc-cancelled --format=count.
  • Проверьте логи сервера и WP-Cron, чтобы убедиться, что задачи выполняются без ошибок.

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

  • Удаление нужных продуктов: Неправильно настроенный период времени или условия могут привести к удалению актуальных товаров. Всегда тестируйте на копии сайта.
  • Неправильно настроенный WP-Cron: Если WP-Cron не срабатывает, запланированные задачи не будут выполняться. Проверьте, что на хостинге разрешены cron-задачи, используйте системный cron для вызова wp-cron.php.
  • Отсутствие резервных копий: Перед массовым удалением обязательно делайте резервные копии базы данных.
  • Ошибка в SQL-запросах: Проверьте корректность запросов и используйте prepare для безопасности.

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

  • Используйте транзакции или batch-удаления, чтобы не перегружать базу при большом количестве записей.
  • Ограничьте количество удаляемых записей за один запуск, например по 100, чтобы избежать таймаутов.
  • Проверяйте права пользователя и запускайте удаление от имени администратора.
  • Логируйте удалённые ID для возможности аудита.

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

МетодПлюсыМинусыКогда использовать
Код в functions.php + WP-CronГибкость, контроль, без сторонних плагиновНеобходимы навыки программирования, риск ошибокДля опытных разработчиков, уникальные условия
WP-CLI командыБыстро, удобно для администрирования, подходит для больших сайтовТребуется доступ к серверу, командная строкаДля серверных администраторов, автоматизация задач
Плагины очистки (например WP-Optimize)Простота использования, готовое решениеМеньше гибкости, возможна нагрузкаДля новичков, небольших магазинов
Как удалить старые версии плагинов WordPress
08.11.2025
Как использовать AJAX в WordPress для динамического обновления контента
10.12.2025
Как удалить дубликаты записей в WordPress
23.02.2026
Использование хука WooCommerce customer_save_address для автоматической обработки адресов
20.06.2026
Как настроить автоматическое удаление старого контента из WooCommerce
23.06.2026