Как автоматически удалять незавершённые заказы в WooCommerce

Диагностика проблемы с незавершёнными заказами в WooCommerce

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были завершены пользователями. Это влияет на отчёты, нагрузку на базу данных и может сбивать аналитику. Чтобы избежать этого, полезно настроить автоматическое удаление таких заказов спустя определённое время.

Какие статусы заказов нужно удалять

WooCommerce по умолчанию использует следующие статусы заказов, которые могут быть незавершёнными:

  • pending — заказ создан, но оплата не началась;
  • failed — оплата не прошла;
  • cancelled — отменён пользователем или администратором;
  • on-hold — временно поставлен на удержание (иногда тоже стоит очищать).

Рекомендуется удалять pending и failed, если они старше, например, 24 часов.

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

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

1. Добавление кода в functions.php или в плагин

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

function wpmarketing_delete_old_orders() {
    $days = 1; // Удалять заказы старше 1 дня
    $statuses = array( 'pending', 'failed' );

    $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 ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->delete( true ); // true — удалить без возможности восстановления
        }
    }
}
add_action( 'wpmarketing_delete_old_orders_hook', 'wpmarketing_delete_old_orders' );

2. Проверка, что событие запланировано

Выполните в консоли или добавьте временно этот код для отладки:

$timestamp = wp_next_scheduled( 'wpmarketing_delete_old_orders_hook' );
if ( $timestamp ) {
    echo 'Запланировано на: ' . date( 'Y-m-d H:i:s', $timestamp );
} else {
    echo 'Событие не запланировано';
}

Если событие не запланировано, вызовите wpmarketing_schedule_delete_old_orders() вручную.

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

1. Создайте тестовый заказ со статусом pending или failed.

2. Установите дату создания заказа на более чем 1 день назад через базу данных или с помощью WP CLI:

wp post update <order_id> --post_date='2023-01-01 00:00:00'

3. Запустите крон задание вручную:

do_action('wpmarketing_delete_old_orders_hook');

4. Проверьте, что заказ удалён. Можно сделать запрос к базе или проверить в админке WooCommerce.

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

  • Крон не запускается: Проверьте, работает ли WP Cron. Если сайт с низким трафиком, настройте системный cron для вызова wp-cron.php.
  • Заказы не удаляются: Убедитесь, что у функции есть права на удаление. Проверьте, что в запросе используются корректные статусы и формат даты.
  • Удаление не происходит вовремя: Проверьте, что событие запланировано и не конфликтует с другими задачами.
  • Удаляются лишние заказы: Проверьте аргументы wc_get_orders, особенно параметр date_created и статус.

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

  • Удаляйте заказы с подтверждённым статусом, не трогайте processing и completed.
  • Для больших магазинов используйте пакетное удаление, чтобы не перегружать базу:
$batch_size = 100;
$orders = wc_get_orders( array( 'status' => $statuses, 'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days ), 'limit' => $batch_size, 'return' => 'ids' ) );
  • Добавьте логирование удаления для аудита и отладки.
  • Рассмотрите использование плагина Clearfy Pro для оптимизации и управления WooCommerce, если нужно более гибкое управление очисткой.

Сравнение способов удаления незавершённых заказов

МетодПлюсыМинусыРекомендации
Ручное удаление в админкеПросто, не требует кодаТрудозатратно, подходит для малого объёмаИспользовать для единичных случаев
Пользовательский код с wp_cronАвтоматизация, гибкость, бесплатныйТребует навыков, зависит от WP CronЛучший вариант для большинства магазинов
Плагины для очистки WooCommerceПростота, дополнительные функцииМогут замедлять сайт, платныеДля больших магазинов с админскими требованиями
Оптимизация маркетинговых форм в WordPress для повышения конверсии
25.12.2025
Как создать автоматический маркетинговый Telegram-бот в WordPress с примерами кода
15.03.2026
Как автоматизировать управление кэшем в WordPress для маркетинговых сайтов
05.01.2026
Как ограничить отправку писем с сайта WordPress через SMTP и wp_mail
13.08.2026
Оптимизация изображений в WordPress для маркетинга: лучшие практики и примеры кода
14.12.2025