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

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

В WooCommerce заказы со статусом «В обработке» (processing) означают, что заказ получен и ожидает дальнейших действий, например, отправки товара. Иногда такие заказы остаются в базе неоплаченные или забытые, что нагружает базу данных и усложняет администрирование. Автоматическое удаление старых заказов со статусом «В обработке» помогает очистить базу и поддержать производительность магазина.

Как определить заказы для удаления

Ключевой критерий — время, прошедшее с момента создания заказа. Например, удалить все заказы в статусе «В обработке», которые старше 30 дней. Это легко реализуемо, если использовать стандартные функции WooCommerce и WP-Cron для регулярного запуска задачи.

Проверка текущих заказов в базе

$args = [
    'status' => 'processing',
    'date_created' => '<' . ( new WC_DateTime( '-30 days' ) )->getTimestamp(),
    'limit' => -1,
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
    echo 'Order ID: ' . $order->get_id() . ' Date: ' . $order->get_date_created()->date('Y-m-d H:i:s') . "\n";
}

Этот код можно использовать для диагностики: получить список старых заказов в статусе processing.

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

1. Создаем функцию удаления старых заказов

function wpassist_delete_old_processing_orders() {
    $days = 30; // количество дней, старше которых удаляем
    $date_threshold = ( new WC_DateTime( "-{$days} days" ) )->getTimestamp();
    
    $orders = wc_get_orders([
        'status' => 'processing',
        'limit' => -1,
    ]);

    foreach ( $orders as $order ) {
        $created = $order->get_date_created();
        if ( $created && $created->getTimestamp() < $date_threshold ) {
            $order->delete( true ); // true - удаляет без возможности восстановления
        }
    }
}

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

add_action( 'wpassist_delete_processing_orders_cron', 'wpassist_delete_old_processing_orders' );

function wpassist_schedule_cron() {
    if ( ! wp_next_scheduled( 'wpassist_delete_processing_orders_cron' ) ) {
        wp_schedule_event( time(), 'daily', 'wpassist_delete_processing_orders_cron' );
    }
}
add_action( 'wp', 'wpassist_schedule_cron' );

3. Отмена задания при деактивации плагина или темы (если применимо)

function wpassist_clear_cron() {
    $timestamp = wp_next_scheduled( 'wpassist_delete_processing_orders_cron' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpassist_delete_processing_orders_cron' );
    }
}
register_deactivation_hook( __FILE__, 'wpassist_clear_cron' );

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

  • Запустите функцию вручную из консоли WP-CLI или временно вызовите wpassist_delete_old_processing_orders() из файла функций, чтобы проверить удаление.
  • Проверьте базу данных в таблице wp_posts с типом shop_order и статусом wc-processing — заказы старше 30 дней должны отсутствовать.
  • Убедитесь, что WP-Cron событие запланировано: wp cron event list (через WP-CLI), либо используйте плагин WP Crontrol.

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

  • Ошибка: заказы не удаляются — функция не вызывается.
    Причина: WP-Cron не запускается автоматически на некоторых хостингах без трафика.
    Решение: используйте системный cron или плагин WP Crontrol для запуска cron вручную.
  • Ошибка: удаляются не все старые заказы.
    Причина: неверное сравнение дат или лимит выборки.
    Решение: проверьте правильность сравнения с датой и убедитесь, что limit=-1 в запросе.
  • Ошибка: удаление приводит к ошибкам в заказах с зависимостями.
    Причина: удаление без проверки связанных данных.
    Решение: дополнительно очищайте метаданные и заказы с дочерними объектами, если нужно.

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

  • Удаляйте заказы с осторожностью: убедитесь, что бизнес-процесс допускает удаление, чтобы избежать потери важной информации.
  • Для крупных магазинов с тысячами заказов оптимизируйте запросы, обрабатывая заказы порциями, чтобы не перегружать память.
  • Используйте WP-CLI для массовых операций, если база очень большая.
  • Резервное копирование базы перед внедрением автоматического удаления — обязательный пункт.

Сравнение вариантов решения

РешениеПлюсыМинусыКомпромисс
Плагин для очистки заказовПростота, готовые настройкиИзбыточный функционал, нагрузкаИспользовать только проверенные плагины
Самописный код + WP-CronКонтроль, легковесностьТребуется навыки, поддержкаПисать читаемый код и комментировать
Ручное удаление через WP-CLIБыстро для разовых задачНе автоматизированоИспользовать для разовых чисток
Как автоматизировать удаление старого контента в WordPress
21.02.2026
Как настроить загрузку изображений Lazy Load в WordPress без плагинов
04.03.2026
Как отключить AJAX загрузку товаров в WooCommerce
06.12.2025
WooCommerce: автоматическое изменение стоимости товаров по расписанию
29.05.2026
Как изменить имя автора в сообщениях WordPress
27.03.2026