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

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

В WooCommerce заказы накапливаются со временем, особенно если сайт работает долго и активно. Неактивные заказы — это обычно статусы pending (ожидание оплаты), failed (неудачный) или cancelled (отменённый), которые долго не меняются и не влияют на продажи. Их хранение увеличивает размер базы данных и замедляет работу административной панели.

Если сайт крупный, можно заметить, что страницы с заказами в админке загружаются медленнее, а резервные копии становятся тяжелее. Избавление от старых неактивных заказов по дате помогает держать базу в чистоте.

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

1. Определение критериев для удаления заказов

В нашем примере удаляем все заказы со статусами pending, failed, cancelled, которые старше 30 дней.

2. Создание функции для удаления заказов

function wpcore_delete_old_inactive_orders() {
    $days = 30;
    $statuses = array('pending', 'failed', 'cancelled');

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d', strtotime("-{$days} days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => array($date_query),
        'fields' => 'ids',
        'nopaging' => true,
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $order_id) {
            wp_trash_post($order_id); // перемещаем заказ в корзину
        }
    }
}

3. Настройка планировщика задач WP-Cron

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

add_action('wpcore_daily_delete_orders', 'wpcore_delete_old_inactive_orders');

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

4. Быстрая очистка через WP-CLI

Для больших сайтов ручное удаление через WP-Admin может быть неудобным. Используйте WP-CLI для выполнения скрипта:

wp eval 'wpcore_delete_old_inactive_orders();'

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусам pending, failed, cancelled. Заказы старше 30 дней должны отсутствовать.
  • Проверьте таблицу wp_posts в базе данных — старые заказы должны быть в статусе trash.
  • Для контроля можно добавить логирование, записывающее ID удалённых заказов в файл.

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

  • Заказы не удаляются: Проверьте, что хук wpcore_daily_delete_orders правильно регистрируется, и WP-Cron работает (например, через плагин WP Crontrol).
  • Удаляются не те заказы: Убедитесь, что правильные статусы и временные рамки указаны в WP_Query.
  • Проблемы с производительностью: Если заказов слишком много, разделите удаление на части, например, добавив параметр posts_per_page и пагинацию.
  • Заказы остаются в базе: Возможно, используется сторонний плагин, который предотвращает удаление заказов, или заказы защищены от удаления (например, плагином безопасности).

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

  • Перед удалением всегда делайте резервные копии базы данных.
  • Используйте функцию wp_trash_post(), чтобы заказы можно было восстановить из корзины, а не сразу удалять.
  • Для периодического удаления больших объёмов данных лучше использовать системный Cron на сервере с запуском WP-CLI, чтобы избежать таймаутов на сайте.
  • Если хотите полностью удалить заказы (без корзины), используйте wp_delete_post($order_id, true), но будьте осторожны — данные восстановить будет нельзя.
  • Добавьте в функцию логирование, чтобы отслеживать успешные и ошибочные удаления.

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

МетодПлюсыМинусы
WP-Cron с функцией в теме/плагинеАвтоматизация, простая реализация, работает без доступа к серверуЗависит от посещаемости сайта, может не сработать вовремя
WP-CLI скрипт с системным CronНадёжность, подходит для больших сайтов, не зависит от посещаемостиТребуется доступ к серверу и знания командной строки
Плагины очистки базы (например, WP-Sweep)Удобный интерфейс, дополнительные функции очисткиМогут удалять лишнее, меньше контроля, нагрузка при массовой очистке
Как удалить пустые meta-поля в WordPress
16.03.2026
Как создать автообновляемый кэш в WordPress: практическое руководство
04.11.2025
Оптимальные хуки для удаления и изменения контента в WordPress
07.01.2026
Автоматическое удаление старых записей в WordPress через Cron с примерами кода
29.03.2026
Как удалить заблокированные пользователи WordPress
18.02.2026