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

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

В интернет-магазинах на WooCommerce со временем накапливается большое количество заказов в разных статусах (например, отменённые, ожидающие оплаты). Это увеличивает нагрузку на базу данных и усложняет администрирование. Ручное удаление неудобно, а стандартных инструментов для массового удаления заказов по статусу и дате в WooCommerce нет. Поэтому возникает необходимость автоматизировать процесс с помощью PHP-кода или плагина.

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

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

В файле functions.php вашей дочерней темы или в собственном плагине добавьте следующий код. Он удалит заказы с определённым статусом, которые старше указанного количества дней.

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

    $date_query = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));

    $args = array(
        'limit' => -1, // получить все подходящие заказы
        'status' => $status_to_delete,
        'date_created' => '<' . $date_query,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

2. Настройка WP-Cron для регулярного запуска

Чтобы функция запускалась автоматически, прикрепим её к событию WP-Cron. Например, запускаем раз в сутки.

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

add_action('wc_daily_delete_old_orders', 'wc_delete_orders_by_status_and_date');

3. Запуск функции вручную для первичной очистки

Для быстрого теста можно вызвать функцию вручную из временного обработчика или через WP-CLI:

wp eval 'wc_delete_orders_by_status_and_date();'

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

  • В административной панели WooCommerce перейдите в раздел «Заказы» и отфильтруйте по статусам, указанным в коде (cancelled, failed). Заказы старше 30 дней должны отсутствовать.
  • Проверьте базу данных, таблицу wp_posts, чтобы убедиться, что записи с типом shop_order и нужными статусами удалены.
  • Для проверки работы WP-Cron можно использовать плагин WP Crontrol, чтобы увидеть запланированные задачи и вручную запускать их.

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

  • Неверные статусы заказов: WooCommerce использует именно такие статусы, как cancelled, failed, completed. Убедитесь, что статусы в массиве $status_to_delete указаны правильно, иначе заказы не будут найдены.
  • Функция не запускается: Проверьте, запланировано ли событие WP-Cron через wp_next_scheduled, и запустите вручную с помощью плагина WP Crontrol или WP-CLI.
  • Заказы не удаляются полностью: Используйте wp_delete_post($order_id, true), где второй параметр true означает безвозвратное удаление. Если поставить false, пост попадёт в корзину (Trash).
  • Высокая нагрузка при большом количестве заказов: Добавьте пагинацию в запрос, например, удалить по 100 заказов за раз, чтобы избежать превышения лимита памяти.

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

  • Перед автоматическим удалением сделайте резервную копию базы данных. В случае ошибок можно быстро восстановить данные.
  • Чтобы минимизировать нагрузку, запускайте удаление в ночное время.
  • Добавьте логирование удалённых заказов для аудита, например, записывайте ID удалённых заказов в отдельный файл или таблицу.
  • Если на сайте много заказов, рассмотрите использование WP-CLI для пакетного удаления с прогрессом и без таймаутов.

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

МетодПлюсыМинусыПример кода/плагин
Собственный PHP-код + WP-CronПолный контроль, без сторонних плагиновТребует навыков программирования, возможна нагрузка при большом объёмеКод из статьи
Плагины типа "Bulk Delete" или "WooCommerce Order Delete"Удобный интерфейс, дополнительные настройкиМогут замедлять сайт, зависят от обновлений разработчикаBulk Delete
WP-CLI скриптыБыстро и эффективно, подходит для больших сайтовТребуется доступ к командной строке сервераwp post delete $(wp post list --post_type=shop_order --post_status=cancelled,failed --date_query_before='30 days ago' --field=ID)
Оптимизация загрузки библиотек в WordPress для ускорения сайта
07.02.2026
Как создать автоподгрузку постов в WordPress без плагинов
22.02.2026
Как удалить неактивных пользователей в WordPress с помощью PHP
03.04.2026
Как добавить авторизацию по телефонному номеру в WordPress
21.03.2026
WooCommerce: как добавить отложенную оплату для заказов
21.04.2026