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

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

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

Ручное удаление заказов неудобно и рискованно, поэтому нужна автоматизация. Однако WooCommerce по умолчанию не предлагает простой способ автоудаления заказов по истечении определённого срока.

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

Задача сводится к регулярной проверке заказов с определённым статусом (например, отменённые или ожидающие оплаты) и удалению тех, что старше заданного количества дней.

Основные критерии для удаления заказов

  • Статус заказа: например, cancelled, failed или pending
  • Возраст заказа: например, старше 30 дней

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

Ниже приведён пример кода, который необходимо добавить в файл functions.php вашей темы или в отдельный плагин.

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

add_action( 'wpkpi_delete_old_orders_event', 'wpkpi_delete_old_orders' );

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

    $args = array(
        'limit'        => -1,
        'status'       => array( 'cancelled', 'failed', 'pending' ),
        '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 ); // true = принудительное удаление без перемещения в корзину
    }
}

Объяснение кода

  • Регистрация ежедневного запуска события wpkpi_delete_old_orders_event через WP-Cron.
  • Функция wpkpi_delete_old_orders получает все заказы с нужными статусами и датой создания старше 30 дней.
  • Удаление заказов происходит через wp_delete_post с параметром принудительного удаления.

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

  1. Убедитесь, что в базе есть заказы с нужными статусами старше 30 дней.
  2. Запустите функцию вручную, добавив временно вызов wpkpi_delete_old_orders(); в functions.php или через консоль WP-CLI.
  3. Проверьте, что старые заказы удалились из базы (таблица wp_posts с типом shop_order).
  4. Для проверки работы WP-Cron используйте плагин WP Crontrol — там можно увидеть и запустить событие вручную.

Частые ошибки и их исправление при реализации автоматического удаления заказов

1. WP-Cron не срабатывает

Это распространенная проблема на многих хостингах. Проверьте, что на сайте есть посещения — WP-Cron запускается при загрузке страниц. Для критичных задач лучше настроить системный cron на сервере, который вызывает wp-cron.php регулярно.

2. Заказы не удаляются, потому что статус в запросе указан неверно

Проверьте, что используемые статусы заказа существуют и корректны. Для нестандартных статусов используйте точное имя. Вы можете вывести все статусы с помощью:

print_r( wc_get_order_statuses() );

3. Удаление не полное, остаются метаданные и данные в связанных таблицах

Функция wp_delete_post с параметром true удаляет все связанные данные, но если вы используете сторонние плагины, они могут создавать собственные таблицы. Проверяйте документацию плагинов.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Настраивайте удаление только для тех статусов заказов, которые действительно безопасно удалять.
  • Если заказов очень много, разбивайте удаление на партии — чтобы избежать тайм-аутов и нагрузки.
  • Используйте WP-CLI для запуска массовых операций и отладки.

Дополнительный пример: удаление заказов пакетами по 50 штук

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

    $args = array(
        'limit'        => 50,
        'status'       => array( 'cancelled', 'failed', 'pending' ),
        '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 );
    }
}

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

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуУдаление заказов вручную через раздел WooCommerce - ЗаказыПростотаНеэффективно при большом объёме, риск ошибок
Код с WP-Cron (как в статье)Автоматическое удаление заказов по расписаниюАвтоматизация, гибкость, не требует внешних плагиновЗависит от корректности WP-Cron, требует навыков разработки
Плагины очистки базыПлагины для массового удаления заказов и оптимизацииУдобный интерфейс, дополнительные функции оптимизацииМожет быть избыточным, возможны конфликты и нагрузка
Как создать список задач с отметкой выполнено в WordPress с примером кода
04.04.2026
WooCommerce: как автоматически изменить статус заказа после оплаты через платежные системы
24.04.2026
Как автоматизировать управление решениями в WordPress с помощью WPKPI
06.02.2026
Как создать собственный тип записей (Custom Post Type) в WordPress
09.02.2026
Как удалить текст из запроса поисковика в WordPress
10.11.2025