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

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

На сайтах с WooCommerce часто возникает ситуация, когда неоплаченные заказы остаются в базе длительное время. Это приводит к увеличению объема данных, замедлению работы админ-панели и некорректной статистике. Стандартно WooCommerce удаляет неоплаченные заказы через 60 дней, но этот срок не всегда подходит. Кроме того, иногда нужно учитывать разные статусы заказов (например, "on-hold", "pending", "failed") и устанавливать индивидуальные сроки удаления для каждого.

Чтобы понять, требуется ли автоматическое удаление, проверьте в админке WooCommerce — раздел «Заказы». Если вы видите много старых заказов со статусом «Ожидает оплаты» или «В ожидании», стоит настроить автоматизацию.

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

1. Подключение к WP-Cron для периодической проверки

Для автоматизации воспользуемся планировщиком задач WP-Cron. Ниже пример функции, которая удалит заказы в зависимости от статуса и возраста.

function wc_auto_delete_unpaid_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return;
    }

    $statuses = [
        'pending' => 7,   // Удалять заказы в статусе 'pending' старше 7 дней
        'on-hold' => 14,  // Удалять заказы в статусе 'on-hold' старше 14 дней
        'failed'  => 30   // Удалять заказы в статусе 'failed' старше 30 дней
    ];

    foreach ( $statuses as $status => $days ) {
        $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

        $args = [
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'limit' => -1,
            'return' => 'ids',
        ];

        $orders = wc_get_orders( $args );

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

// Регистрируем задачу в WP-Cron
add_action( 'wc_daily_delete_unpaid_orders', 'wc_auto_delete_unpaid_orders' );

// Планируем событие при активации темы или плагина
function wc_schedule_daily_delete() {
    if ( ! wp_next_scheduled( 'wc_daily_delete_unpaid_orders' ) ) {
        wp_schedule_event( time(), 'daily', 'wc_daily_delete_unpaid_orders' );
    }
}
add_action( 'wp', 'wc_schedule_daily_delete' );

2. Как отключить задачу при необходимости

function wc_unschedule_daily_delete() {
    $timestamp = wp_next_scheduled( 'wc_daily_delete_unpaid_orders' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wc_daily_delete_unpaid_orders' );
    }
}
// Используйте эту функцию для деактивации при необходимости
// wc_unschedule_daily_delete();

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

Чтобы убедиться, что автоматическое удаление работает:

  • Проверьте список заказов в WooCommerce с указанными статусами и датами старше пороговых значений.
  • Запустите функцию вручную в консоли WP-CLI (если доступно): wp eval 'wc_auto_delete_unpaid_orders();'
  • После запуска функция должна удалить заказанные ID заказов, соответствующие условиям.
  • Просмотрите лог ошибок сервера и WooCommerce на предмет возможных сбоев.

Для отладки можно добавить логирование:

function wc_auto_delete_unpaid_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return;
    }

    $statuses = [
        'pending' => 7,
        'on-hold' => 14,
        'failed'  => 30
    ];

    foreach ( $statuses as $status => $days ) {
        $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

        $args = [
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'limit' => -1,
            'return' => 'ids',
        ];

        $orders = wc_get_orders( $args );

        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
            error_log( "Удалён заказ ID: {$order_id} со статусом {$status}, старше {$days} дней" );
        }
    }
}

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

  • Функция не удаляет заказы: Проверьте, что WooCommerce активен и класс WooCommerce загружен. Убедитесь, что хуки WP-Cron срабатывают (проверьте через wp cron event list или плагины для мониторинга).
  • Заказы не удаляются полностью: В функции используется wp_delete_post($order_id, true) — параметр true гарантирует полное удаление. Если используете false, заказ попадёт в корзину.
  • Удаляются не те заказы: Проверьте условия выборки — правильность статусов и даты. Для отладки выводите через error_log или var_dump.
  • Повторное добавление задачи в WP-Cron: Иногда при каждом заходе в сайт событие добавляется заново. Используйте проверку wp_next_scheduled и регистрируйте задачу только один раз.

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

  • Безопасность: Никогда не запускайте автоматическое удаление через GET-запросы или без проверки прав пользователя. Запуск через WP-Cron безопасен и не требует вмешательства пользователя.
  • Производительность: При большом числе заказов используйте пакетную обработку, чтобы избежать таймаутов и перегрузок. Например, обрабатывать по 50-100 заказов за раз.
  • Логирование: Записывайте удалённые ID заказов в отдельный лог-файл для аудита и восстановления при ошибках.
  • Резервное копирование: Перед внедрением автоматического удаления сделайте резервную копию базы данных, чтобы можно было восстановить случайно удалённые данные.

Сравнение подходов: плагин vs кастомный код

КритерийПлагинКастомный кодКомпромисс
ГибкостьОграничена настройкамиМаксимальная, можно учесть любые условияПлагин с возможностью добавления хуков
ПроизводительностьИногда избыточенОптимизирован под задачуКод с кешированием и пакетной обработкой
Простота использованияДля неразработчиковТребует навыковИспользование сниппетов с инструкциями
ПоддержкаОбновления, поддержкаСамостоятельная поддержкаКомбинация: код + поддерживаемый плагин
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
12.05.2026
Как удалить старые изображения в WordPress: практическое руководство
20.02.2026
Как создать автоматическое удаление старых постов в WordPress
17.12.2025
Как удалить старые комментарии и их метаданные в WordPress
19.03.2026
Как создать автоматический экспорт постов в WordPress с примерами кода и плагинами
05.03.2026