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

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

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

Однако важно понимать, что удаление заказов — это необратимая операция, которая влияет на историю продаж и аналитику. Перед настройкой автоматического удаления необходимо убедиться, что:

  • Ваша учётная политика и законодательство позволяют удалять данные о заказах;
  • Вы сделали резервную копию базы данных;
  • Определён чёткий срок хранения заказов (например, 6 или 12 месяцев);
  • Удаление не затронет заказы в статусах, которые всё ещё актуальны (например, "обрабатывается").

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

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

В WooCommerce заказы — это кастомный тип записей shop_order. Для удаления мы используем WP_Query с фильтром по дате создания заказа.

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

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-completed', 'wc-cancelled', 'wc-failed'], // Статусы заказов для удаления
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => 50, // Пакетная обработка
        'fields'         => 'ids',
    ];

    $old_orders = new WP_Query($args);
    if ($old_orders->have_posts()) {
        foreach ($old_orders->posts as $order_id) {
            wp_delete_post($order_id, true); // true — полное удаление
        }
    }
}

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

Чтобы автоматизировать процесс, регистрируем событие WP-Cron, выполняющее удаление, например, раз в сутки.

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

add_action('wporders_delete_old_orders_event', 'wporders_delete_old_orders');

3. Отмена крон-задачи при деактивации темы или плагина

function wporders_clear_delete_old_orders_schedule() {
    $timestamp = wp_next_scheduled('wporders_delete_old_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wporders_delete_old_orders_event');
    }
}
register_deactivation_hook(__FILE__, 'wporders_clear_delete_old_orders_schedule');

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

Чтобы убедиться, что удаление работает корректно:

  • В административной панели WooCommerce проверьте количество заказов до и после запуска cron-задачи;
  • Запустите функцию вручную, временно вызвав wporders_delete_old_orders() из консоли WP-CLI или с помощью временного хука;
  • Проверьте логи ошибок сервера и PHP на предмет сбоев;
  • Убедитесь, что заказы с актуальными статусами (например, "в обработке") не удаляются;
  • Проверьте, что удалённые заказы не отображаются в базе данных (таблица wp_posts) и что метаданные заказов тоже удалены.

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

  • Удаление заказов с активным статусом: Проверьте список статусов в аргументе 'post_status'. Оставьте только те, которые можно удалять (например, wc-completed, wc-cancelled).
  • Функция не запускается по расписанию: Проверьте, активна ли WP-Cron и корректно ли зарегистрировано событие. В некоторых случаях нужно настроить системный cron для вызова wp-cron.php.
  • Удаление происходит слишком медленно: Уменьшите количество обрабатываемых заказов в одном запросе (posts_per_page), либо реализуйте пагинацию и последовательный вызов задачи.
  • Удалённые заказы всё ещё отображаются: Проверьте, нет ли плагинов кеширования или CDN, которые не обновляют данные.

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

  • Перед массовым удалением всегда делайте резервную копию базы данных.
  • Используйте полное удаление (wp_delete_post($id, true);), чтобы не оставлять метаданные и связанные данные.
  • Добавьте логирование действий удаления для отладки и аудита, например, с помощью error_log() или сторонних систем логирования.
  • Если заказов очень много, разбивайте удаление на пакеты и запускайте их по очереди, чтобы не превышать лимиты PHP и MySQL.
  • Регулярно проверяйте работоспособность WP-Cron или настройте системный cron для стабильности.

Таблица сравнения подходов к удалению старых заказов

МетодПреимуществаНедостаткиПример
Ручное удаление через админкуПросто, без кодаТрудозатратно при большом объёме заказовWooCommerce > Заказы > Выделить > Удалить
Плагин для очистки заказовУдобный интерфейс, дополнительные фильтрыЗависимость от стороннего ПО, нагрузкаAdvanced Order Cleanup
Кастомный PHP-скрипт с WP-Cron (предложенный способ)Гибкость, контроль, автоматизацияТребует навыков разработки, настройкаКод из статьи
Автоматическая отмена и возврат заказов в WooCommerce при проблемах с оплатой
22.04.2026
Как автоматически отменять заказы WooCommerce при проблемах с оплатой
12.03.2026
Создание автоматических заказов в WordPress без WooCommerce
26.03.2026
WooCommerce: отладка проблем со статусами заказов
30.06.2026
WooCommerce: автоматическое удаление неактивных заказов
12.07.2026