Как автоматически удалять незавершённые заказы в 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
08.01.2026
Как автоматизировать управление решением технических проблем на сайте WordPress
23.03.2026
Как добавить и удалить поля в оформлении заказа WooCommerce без плагинов
31.05.2026
Автоматизация маркетинговых переадресаций в WordPress
29.12.2025
Оптимизация WordPress для маркетинговых сайтов: уменьшение времени загрузки
07.02.2026