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

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

В магазинах на WooCommerce со временем накапливается много заказов с различными статусами — отменённые, просроченные, неоплаченные. Это увеличивает нагрузку на базу данных и затрудняет администрирование. Ручное удаление неэффективно и занимает время, поэтому логично автоматизировать процесс удаления заказов, которые не актуальны после определённого времени.

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

1. Определяем критерии удаления

Обычно удаляют заказы со статусом cancelled, failed или pending, которые старше N дней. В примере возьмём 30 дней.

2. Используем WP-Cron для регулярного запуска задачи

Добавим кастомный хук, который будет проверять и удалять старые заказы. Для этого в functions.php темы или в собственном плагине добавьте следующий код:

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

add_action( 'wpkpi_delete_old_wc_orders', 'wpkpi_delete_old_wc_orders_callback' );

function wpkpi_delete_old_wc_orders_callback() {
    $days = 30; // количество дней
    $statuses = array( 'cancelled', 'failed', 'pending' );

    $args = array(
        'status' => $statuses,
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        wp_trash_post( $order_id ); // перемещаем в корзину
        // или wp_delete_post( $order_id, true ); // сразу удалять без корзины
    }
}

3. Регистрация кастомного интервала (если нужно)

По умолчанию в WP-Cron есть интервал 'daily'. Если хотите запускать чаще или реже, добавьте кастомный интервал:

add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['every_three_days'] = array(
        'interval' => DAY_IN_SECONDS * 3,
        'display' => 'Каждые 3 дня'
    );
    return $schedules;
} );

И замените в wp_schedule_event параметр 'daily' на 'every_three_days'.

Как проверить, что автоматическое удаление работает

  • Проверьте наличие запланированной задачи в админке WP в разделе Инструменты > Запланированные события с помощью плагина WP Crontrol.
  • Создайте тестовый заказ со статусом cancelled и датой создания более 30 дней назад (можно изменить дату напрямую в базе).
  • Принудительно запустите событие через WP Crontrol или дождитесь следующего запуска по расписанию.
  • Проверьте, что заказ либо перемещён в корзину, либо удалён (в зависимости от используемой функции).

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

  • Заказы не удаляются: убедитесь, что WP-Cron работает. На некоторых хостингах он отключён. Для проверки включите логирование или используйте плагин WP Crontrol.
  • Удаляются не те заказы: проверьте правильность списка статусов и параметров даты в wc_get_orders. Используйте дебаг, выводя количество найденных заказов.
  • Удаление приводит к ошибкам: избегайте одновременного удаления очень большого количества заказов. Можно добавить лимит и обрабатывать партиями.

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

  • Используйте wp_trash_post(), чтобы иметь возможность восстановить заказ при ошибке.
  • Не устанавливайте слишком частый запуск задачи — достаточно 1 раз в день или 1 раз в 3 дня.
  • Добавьте логирование удалённых заказов, чтобы иметь историю и контролировать процесс.
  • Если магазин большой, делайте удаление пакетами, например по 50 заказов за один запуск, чтобы не перегружать сервер.
  • Регулярно очищайте корзину заказов, так как WP хранит удалённые записи в корзине.

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

МетодПреимуществаНедостатки
wp_trash_post()Безопасно, можно восстановить удалённые заказыНакопление записей в корзине, требует дополнительной очистки
wp_delete_post( $order_id, true )Удаляет сразу, экономит место в базеНет возможности восстановления, риск потери данных
Плагины для очистки базыУдобный интерфейс, доп. функции оптимизацииМожет быть избыточно, риск ошибок, нагрузка на сервер
Как удалить текст из запроса поисковика в WordPress
10.11.2025
Как избежать конфликтов между плагинами WordPress: практические решения
06.12.2025
WooCommerce: как автоматически изменить статус заказа после оплаты через платежные системы
24.04.2026
WooCommerce: как автоматически отключить отправку писем по заказам без оплаты
21.06.2026
Как создать динамическую таблицу в WordPress с AJAX и методами оптимизации
23.12.2025