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

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

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

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

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

Шаг 1: Создание пользовательской функции для удаления заказов

Основная идея — писать WP-Cron задачу, которая раз в сутки (или по другому расписанию) удаляет заказы со статусом completed, дата окончания которых старше заданного срока (например, 90 дней).

function wpreset_delete_old_completed_orders() {
    $days = 90; // количество дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-completed',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => 100, // лимит на обработку за раз
        'fields'         => 'ids',
    ];

    $old_orders = get_posts($args);
    if (empty($old_orders)) {
        return;
    }

    foreach ($old_orders as $order_id) {
        wp_delete_post($order_id, true); // полное удаление без корзины
    }
}

Шаг 2: Создание Cron задачи для автоматизации удаления

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

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

add_action('wpreset_daily_order_cleanup', 'wpreset_delete_old_completed_orders');

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

1. Убедитесь, что в админке WooCommerce остались только заказы новее 90 дней или со статусом, отличным от completed.

2. Запустите задачу вручную через WP-CLI для проверки (если доступен):

wp cron event run wpreset_daily_order_cleanup

3. Проверьте логи сервера или добавьте временный лог в функцию удаления, чтобы убедиться, что она работает корректно.

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

  • Функция не запускается по расписанию: проверьте, активен ли WP-Cron (включена настройка DISABLE_WP_CRON должна быть отключена или настроена внешняя cron-задача).
  • Заказы не удаляются: убедитесь, что статус заказа указан правильно — WooCommerce использует префикс wc- для статусов, например wc-completed.
  • Удаление затрагивает не те заказы: проверьте, что условие date_query правильно фильтрует по дате создания заказа (post_date).
  • Удаление медленное или вызывает таймаут: уменьшите posts_per_page и настройте многократный запуск задачи, чтобы обрабатывать заказы пакетами.

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

  • Безопасность: выполняйте удаление только после полной проверки условий, чтобы не потерять важные данные. Рекомендуется создавать резервные копии базы данных перед автоматическими удалениями.
  • Производительность: используйте пакеты по 50-100 заказов, чтобы не перегружать сервер.
  • Логирование: добавьте запись в лог для контроля количества удаленных заказов и времени выполнения.

Альтернативные методы: плагин vs код

МетодПлюсыМинусыПример
Ручное удаление через админкуПросто, не требует кодаНепрактично при большом объемеWooCommerce > Заказы > Фильтр по статусу/дате > Массовые действия
Плагин (например, Clearfy)Удобный интерфейс, дополнительные настройкиЗависимость от стороннего кода, нагрузкаНастройки очистки заказов по дате и статусу
Код на PHP с WP-Cron (как в статье)Гибкость, контроль, отсутствие лишних плагиновТребует навыков, нужно тестироватьСмотри код выше
Как удалить или обновить плагин WordPress без доступа к админке
20.03.2026
Как автоматически удалять старые записи в WordPress через шорткод
11.04.2026
Как создать и использовать собственные REST API эндпоинты в WordPress
03.04.2026
Как устранить ошибку 429 Too Many Requests в WordPress
13.03.2026
Как избежать конфликтов между плагинами WordPress: практические советы и примеры
16.02.2026