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

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

В WooCommerce накопление неоплаченных заказов может привести к загромождению базы данных, замедлению работы сайта и затруднению анализа статистики продаж. Особенно это заметно при большом объеме заказов и активной рекламе. Если вы не удаляете такие заказы вручную, они будут накапливаться и занимать место.

Проверьте количество неоплаченных заказов в админке WooCommerce: Перейдите в WooCommerce → Заказы и отфильтруйте по статусу pending или on-hold. Если их слишком много и вы не планируете их обрабатывать, стоит автоматизировать их удаление.

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

Почему 7 дней?

Этот срок считается оптимальным, чтобы дать покупателю время на оплату и не удалять заказы слишком быстро.

Добавление кода в functions.php вашей темы или в кастомный плагин

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

function wpkpi_delete_old_unpaid_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return; // WooCommerce не активен
    }

    // Получаем дату 7 дней назад в формате Y-m-d H:i:s
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( '-7 days' ) );

    $args = array(
        'limit'        => -1,
        'status'       => array( 'pending', 'on-hold' ),
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return; // Заказов нет
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // Удаляем без корзины
    }
}

// Регистрируем ежедневное событие для удаления заказов
function wpkpi_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpkpi_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpkpi_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpkpi_schedule_order_cleanup' );

add_action( 'wpkpi_daily_order_cleanup', 'wpkpi_delete_old_unpaid_orders' );

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

function wpkpi_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled( 'wpkpi_daily_order_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpkpi_daily_order_cleanup' );
    }
}
// Для отключения вызовите эту функцию один раз, например, через admin_init
// add_action( 'admin_init', 'wpkpi_clear_order_cleanup_schedule' );

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

  • Через админку WooCommerce → Заказы проверьте, что заказы со статусом pending и on-hold, созданные более 7 дней назад, отсутствуют.
  • Для теста можно вручную создать заказ с датой создания более 7 дней назад (через базу или плагин для редактирования дат), а затем запустить функцию вручную:
add_action( 'admin_init', function() {
    wpkpi_delete_old_unpaid_orders();
} );

После выполнения обновите список заказов и убедитесь, что тестовый заказ удалён.

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

  • Функция не запускается автоматически: Проверьте, активен ли WP Cron (в файле wp-config.php нет define('DISABLE_WP_CRON', true);), либо настройте системный cron для вызова wp-cron.php.
  • Удаляются не те заказы: Убедитесь, что в фильтре статусов указаны только нужные (pending, on-hold), и дата сравнивается корректно. Для отладки добавьте логирование ID удаляемых заказов.
  • Ошибки из-за отсутствия WooCommerce: Добавлен проверочный класс WC_Order_Query – если WooCommerce не активен, функция просто не выполнится.
  • Заказы не удаляются полностью: Функция wp_delete_post( $order_id, true ) удаляет заказ без помещения в корзину. Не используйте false во втором параметре, чтобы избежать оставления в корзине.

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

  • Резервное копирование: Перед внедрением автоматического удаления настройте регулярное резервное копирование базы данных, чтобы избежать потери важных данных.
  • Ограничение нагрузки: Если заказов много, выполняйте удаление партиями, например, по 50 заказов за раз, чтобы избежать таймаутов.
  • Логирование: Добавьте логирование действий удаления в отдельный файл или системный лог для последующего аудита.
  • Использование плагинов: Если хотите готовое решение, можно рассмотреть плагины для очистки заказов, но код ниже более гибкий и легковесный.

Пример пакетного удаления (по 50 заказов за запуск)

function wpkpi_delete_old_unpaid_orders_batch() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( '-7 days' ) );

    $args = array(
        'limit'        => 50,
        'status'       => array( 'pending', 'on-hold' ),
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

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

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, не требует кодаТрудозатратно, риск пропуска заказов
Автоматизация через WP Cron и кодПолный контроль, без плагинов, гибкоТребует навыков PHP, настройка cron
Плагины очистки заказовГотовые решения, удобный интерфейсНагрузка на сайт, возможны конфликты
WooCommerce: как автоматически отменять заказы без оплаты через 24 часа
03.08.2026
WooCommerce: как автоматически отключить отправку писем по заказам без оплаты
21.06.2026
Отложенный запуск задач в WordPress без Cron: практическое руководство
12.01.2026
Как создать подробный отчет по KPI в WordPress
09.01.2026
WooCommerce: автоматическое удаление заказов по истечении срока
14.05.2026