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

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

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

Задача: автоматизировать удаление заказов, которые находятся в определённых статусах и старше заданного периода. Например, автоматически удалять отменённые заказы старше 30 дней.

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

Используем системный планировщик WordPress (WP-Cron) для запуска нашей функции раз в сутки. Добавьте в файл functions.php вашей темы или в плагин следующий код:

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

Этот код зарегистрирует ежедневное событие wpcoder_delete_old_orders.

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

Добавим обработчик события, который будет искать заказы старше определённой даты и с нужным статусом, а затем удалять их.

add_action( 'wpcoder_delete_old_orders', 'wpcoder_delete_orders_by_status_and_age' );

function wpcoder_delete_orders_by_status_and_age() {
    $days_old = 30; // количество дней для удаления
    $statuses_to_delete = array( 'cancelled', 'failed', 'pending' ); // статусы для удаления

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    $args = array(
        'limit' => -1,
        'status' => $statuses_to_delete,
        'date_created' => '<' . $date_threshold,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

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

Объяснение параметров:

  • limit => -1 – получить все заказы без лимита.
  • status – массив статусов для фильтрации.
  • date_created – условие по дате создания заказа (старше 30 дней).
  • return => 'ids' – вернуть только ID заказов для экономии памяти.

Шаг 3. Проверка результата

Чтобы проверить работу функции без ожидания, временно вызовите её вручную:

add_action( 'init', function() {
    if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['test_delete_orders'] ) ) {
        wpcoder_delete_orders_by_status_and_age();
        echo 'Удаление выполнено';
        exit;
    }
});

После добавления этого кода в адресной строке сайта добавьте ?test_delete_orders=1 и обновите страницу. Если заказы подходящего возраста и статуса есть, они будут удалены. Убедитесь, что вы сделали резервную копию базы перед тестом.

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

  • Заказы не удаляются: проверьте, правильно ли указаны статусы и формат даты. Статусы должны соответствовать тем, что используются WooCommerce (например, cancelled, failed, pending).
  • WP-Cron не срабатывает: по умолчанию WP-Cron запускается при заходе на сайт. Если трафик мал, запланированные задачи могут не запускаться вовремя. Для решения настройте системный cron на сервере для вызова wp-cron.php.
  • Ошибка доступа: функция удаления привязана к событию, убедитесь, что код не вызывается в неподходящий момент (например, не вызывайте из фронтенда без проверки прав).
  • Проблемы с производительностью: при большом числе заказов делайте удаление пакетами, чтобы не перегружать базу.

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

  • Обязательно делайте резервные копии базы перед автоматическим удалением.
  • Для крупных магазинов разбивайте удаление на партии по 100-200 заказов с использованием пагинации.
  • Используйте системный cron для более надёжного запуска задач (crontab на Linux): wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1.
  • Добавьте логирование в файл, чтобы отслеживать, сколько заказов удалено и когда.

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

Метод Плюсы Минусы
Ручное удаление через админку WooCommerce Простота, не требует кода Трудозатратно при большом количестве
Плагин очистки заказов (например, WooCommerce Cleanup) Готовые интерфейсы, автоматизация Дополнительные плагины, нагрузка
Код на WP-Cron (описанный метод) Полный контроль, без лишних плагинов, легко адаптировать Требует навыков, настройка cron
Как создать и использовать собственные короткие функции в WordPress
28.01.2026
Как добавить поле в форму регистрации WordPress
26.11.2025
Как создать собственный плагин для автоматизации задач в WordPress
28.03.2026
Как массово удалить мета-ключи в WordPress
01.03.2026
Как использовать WP-Cron для автоматических задач в WordPress
27.04.2026