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

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

В WooCommerce со временем база заказов может разрастаться, что влияет на производительность и удобство управления. Особенно это актуально для заказов с определёнными статусами, например, отменённые (cancelled) или неактивные (например, failed), которые уже не нужны для аналитики или поддержки. Автоматическое удаление таких заказов по дате поможет держать базу в чистоте без постоянного ручного контроля.

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

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

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

function wc_delete_old_orders_by_status() {
    // Настройки: статусы и возраст заказов (в днях)
    $statuses_to_delete = array('cancelled', 'failed');
    $days_old = 30; // удалять заказы старше 30 дней

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

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => 'wc-' . $status,
            'date_query' => array($date_query),
            'posts_per_page' => -1,
            'fields' => 'ids',
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true — принудительное удаление
            }
        }
    }
}

2. Запуск функции по расписанию WP-Cron

Чтобы функция запускалась автоматически, зарегистрируйте крон-задачу:

add_action('wc_delete_old_orders_event', 'wc_delete_old_orders_by_status');

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

3. Отмена расписания при деактивации темы/плагина

Чтобы избежать «зависших» крон-задач, добавьте функцию удаления расписания:

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

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

1. Убедитесь, что заказы со статусом cancelled и failed, созданные более 30 дней назад, удалены.
2. Для теста можно временно уменьшить значение $days_old до 0 или 1 и создать тестовые заказы с нужным статусом и датой.

3. Чтобы проверить, сработал ли WP-Cron, используйте плагин WP Crontrol — он покажет запланированные события и позволит запускать их вручную.

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

  • Заказы не удаляются: проверьте, что статусы указаны корректно с префиксом wc- в аргументах запроса, и что функция действительно вызывается (WP-Cron работает).
  • Крон-задача не запускается: убедитесь, что на сайте есть посещения — WP-Cron запускается при загрузке страниц. Для теста можно вызвать событие вручную через WP Crontrol.
  • Удаляются не те заказы: проверьте параметр post_status и date_query — дата должна быть в формате Y-m-d, а статус — с префиксом wc-.
  • Ошибка при удалении: убедитесь, что у пользователя, от имени которого запускается код, есть права на удаление постов.

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

  • Резервные копии: перед автоматическим удалением рекомендуется настраивать регулярное резервное копирование базы.
  • Пакетная обработка: если заказов много, можно ограничить количество удаляемых за один запуск, добавив параметр posts_per_page (например, 50) и запускать несколько раз.
  • Логирование: для контроля процесса полезно добавить логирование удалённых заказов через error_log или пользовательские записи в лог-файл.
  • Оптимизация запросов: используйте fields => 'ids' для экономии памяти при выборке заказов.

Сравнение вариантов удаления заказов

МетодПлюсыМинусыПримечания
Плагин для очистки WooCommerceПростота, UI для настройкиМожет быть тяжеловесным, нет гибкостиПодходит для непрофессионалов
Код с WP-Cron (наш метод)Гибкость, контроль, легковесностьТребует навыков, настройка вручнуюДля разработчиков, можно кастомизировать
Ручное удаление через админкуПростота, моментальный эффектРучная работа, риск пропустить заказыДля единичных случаев
Как создать автоматические уведомления о обновлениях в WordPress
03.01.2026
WooCommerce: как добавить поле для ввода серийного номера товара в корзине
06.05.2026
Как добавить настройку локализации в плагин WordPress
29.01.2026
Как удалить дубликаты постов в WordPress
30.11.2025
WooCommerce: как автоматически удалять заказы по статусу и дате
14.05.2026