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

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

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

Если не очищать устаревшие заказы, это приводит к:

  • увеличению размера базы данных и замедлению запросов;
  • ошибкам в аналитике и отчётности;
  • засорению админ-панели, усложнению поиска нужных заказов.

Стандартных инструментов WooCommerce для автоматического удаления заказов с заданными сроками и статусами нет, поэтому приходится реализовывать это самостоятельно.

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

Определяем правила удаления

Чаще всего нужны такие условия:

  • Удалять неоплаченные заказы старше 7 дней;
  • Удалять отменённые заказы старше 30 дней;
  • Сохранять завершённые и обработанные заказы.

Реализация через WP-Cron и PHP

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

function wpall_delete_old_wc_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return; // WooCommerce не активен
    }

    $args = array(
        'status' => array('pending', 'cancelled'), // статусы для удаления
        'limit' => -1, // все подходящие заказы
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * 7 ), // для pending - 7 дней
        'return' => 'ids',
    );

    // Удаление неоплаченных (pending) старше 7 дней
    $pending_orders = wc_get_orders(array(
        'status' => 'pending',
        'limit' => -1,
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * 7 ),
        'return' => 'ids',
    ));

    foreach ( $pending_orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }

    // Удаление отменённых (cancelled) старше 30 дней
    $cancelled_orders = wc_get_orders(array(
        'status' => 'cancelled',
        'limit' => -1,
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * 30 ),
        'return' => 'ids',
    ));

    foreach ( $cancelled_orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

// Регистрация ежедневного события
add_action( 'wpall_daily_order_cleanup', 'wpall_delete_old_wc_orders' );

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

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

  • wc_get_orders с параметром date_created позволяет получить заказы до указанного времени.
  • wp_delete_post с true на втором параметре полностью удаляет заказ из базы.
  • Событие wpall_daily_order_cleanup запускается ежедневно через WP-Cron.

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

1. Добавьте в базу тестовые заказы с нужными статусами и датами (старше 7 и 30 дней).

2. Вручную запустите событие WP-Cron в коде:

do_action('wpall_daily_order_cleanup');

3. Проверьте в админке WooCommerce, что старые заказы удалены.

4. Через 24 часа проверьте, что событие запустилось автоматически (для этого можно использовать плагин WP Crontrol).

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

  • Заказы не удаляются: Проверьте, активен ли WooCommerce и корректно ли подключён хук.
  • WP-Cron не срабатывает автоматически: На некоторых хостингах WP-Cron работает только при посещении сайта. Настройте системный cron или плагин WP Crontrol.
  • Удаляются нужные заказы: Проверьте логику условий date_created и статусов, чтобы не удалить важные данные.
  • Ошибки в коде: Используйте отладку через error_log, проверяйте возвращаемые значения функций.

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

  • Удаление заказов лучше выполнять в ночное время, чтобы не влиять на работу магазина в пиковые часы.
  • Не используйте limit = -1 на очень больших базах — разбивайте удаление на части с пагинацией.
  • Резервное копирование базы данных перед автоматическим удалением — обязательная мера.
  • Для улучшения производительности используйте WP-Cron в связке с системным cron, чтобы гарантировать регулярное выполнение.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать очистку через админку вручную.

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

МетодПреимуществаНедостатки
Плагин (например, Advanced Order Cleanup)Легко настроить, не требует кодаМожет нагружать сайт, ограниченные условия удаления
Код в functions.php (как в статье)Гибкое управление, минимальная нагрузкаТребует навыков разработки, возможны ошибки
Внешний скрипт с WP-CLIМаксимальная производительность, контрольНужен доступ по SSH, не подходит для всех хостингов
Как удалить устаревшие записи и метаданные в WordPress по расписанию
16.02.2026
Автоматическое удаление неоплаченных заказов в WooCommerce по сроку
28.04.2026
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
08.05.2026
WordPress авторизация по одноразовому паролю (OTP) с практическим применением
30.01.2026
WooCommerce: автоматическое изменение цены продукта при изменении количества в корзине
16.06.2026