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

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

Магазины на WooCommerce часто сталкиваются с накоплением неоплаченных заказов, которые занимают ресурсы базы данных и влияют на аналитические отчёты. Стандартная функция WooCommerce автоматически отменяет неоплаченные заказы через 60 минут, но этот механизм не гибкий и не учитывает разные статусы заказов или разные сроки для товаров из разных категорий.

Чтобы улучшить бизнес-процессы, нужно реализовать автоматическое удаление неоплаченных заказов с учётом конкретных статусов и индивидуальных таймаутов, например:

  • Заказы в статусе pending удалять через 30 минут
  • Заказы в статусе on-hold удалять через 2 часа
  • Заказы в статусе failed удалять сразу

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

1. Отключение стандартного автоотмены WooCommerce

Для начала нужно отключить стандартную функцию отмены неоплаченных заказов:

remove_action( 'woocommerce_cancel_unpaid_orders', 'wc_cancel_unpaid_orders' );

2. Добавление собственного WP-Cron задания

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

add_action( 'init', function() {
    if ( ! wp_next_scheduled( 'custom_wc_auto_delete_unpaid_orders' ) ) {
        wp_schedule_event( time(), 'quarterhour', 'custom_wc_auto_delete_unpaid_orders' );
    }
});

add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['quarterhour'] = [
        'interval' => 900, // 15 минут
        'display'  => __( 'Every 15 Minutes' ),
    ];
    return $schedules;
});

3. Реализация функции удаления заказов по статусам и срокам

Основная логика — получать заказы с нужными статусами, проверять дату создания и удалять, если срок превышен:

add_action( 'custom_wc_auto_delete_unpaid_orders', function() {
    $statuses = [
        'pending' => 30 * MINUTE_IN_SECONDS, // 30 минут
        'on-hold' => 2 * HOUR_IN_SECONDS,    // 2 часа
        'failed' => 0,                       // сразу удалять
    ];

    foreach ( $statuses as $status => $expiration ) {
        $args = [
            'limit'        => -1,
            'status'       => $status,
            'date_created' => '<' . ( time() - $expiration ),
        ];

        $orders = wc_get_orders( $args );

        foreach ( $orders as $order ) {
            $order->delete( true ); // true — принудительное удаление
        }
    }
});

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

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

  • Создайте тестовые заказы с разными статусами (pending, on-hold, failed) и отметьте время создания
  • Подождите время, превышающее указанные интервалы (например, 35 минут для pending)
  • Запустите WP-Cron вручную через плагин WP Crontrol или дождитесь автозапуска
  • Проверьте в админке WooCommerce, что соответствующие заказы удалились

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

  • Код не выполняется — WP-Cron не запускается
    Проверьте, что WP-Cron включён и запускается. Для теста можно вызвать хук вручную через wp-cli:
    wp cron event run custom_wc_auto_delete_unpaid_orders
  • Заказы не удаляются, а только отменяются
    Метод $order->delete(true) удаляет заказ навсегда. Если используется $order->update_status('cancelled'), то заказ просто меняет статус, а не удаляется.
  • Удаляются не те заказы
    Проверьте правильность параметра date_created в wc_get_orders. Он должен быть в формате даты или сравнением с timestamp, как в примере.
  • Перегрузка базы данных при большом количестве заказов
    Добавьте ограничение 'limit' => 20 и обработку порциями с последующим повторным запуском.

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

  • Безопасность: Удаление заказов — необратимая операция. Перед внедрением сделайте резервную копию базы данных.
  • Производительность: Не запускайте очистку чаще, чем раз в 15 минут, чтобы не нагружать сервер.
  • Логирование: Для отладки добавьте запись действий удаления в отдельный лог-файл через error_log или системный лог.
  • Проверка прав: Убедитесь, что код выполняется с необходимыми правами на сервере, особенно если WP-Cron запускается не через HTTP.

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

МетодПлюсыМинусыПример
WP-Cron с кастомным кодом Гибкость настройки статусов и сроков; не требует плагинов Зависит от выполнения WP-Cron, возможна задержка Код из статьи
Плагин для автоотмены заказов Простота установки и настройки Меньше гибкости, может быть нагрузка от плагина Clearfy Pro — оптимизация WooCommerce
Внешний cron (через сервер) Надёжное выполнение по расписанию Требуется доступ к серверу и настройка curl вызов wp-cron.php или wp-cli команда
Как правильно использовать хуки (actions и filters) в WordPress с примерами кода
08.03.2026
Как удалить записи и метаданные в WordPress без плагинов
06.01.2026
Как удалить или заблокировать неиспользуемые плагины в WordPress
25.11.2025
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
06.06.2026
WooCommerce: автоматическое удаление неоплаченных заказов по срокам с помощью кода
05.05.2026