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

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

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

Пошаговое решение: удаление незавершённых заказов через WP-Cron

1. Создание функции для удаления заказов

Напишем функцию, которая удалит заказы со статусом pending и failed, старше определённого времени (например, 24 часа):

function wp_delete_old_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );
    if ( empty( $orders ) ) {
        return;
    }

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

2. Регистрация cron-задачи при инициализации

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

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

add_action( 'wp_delete_old_unpaid_orders_hook', 'wp_delete_old_unpaid_orders' );

3. Очистка cron при деактивации плагина или темы

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

function wp_clear_delete_old_orders_cron() {
    $timestamp = wp_next_scheduled( 'wp_delete_old_unpaid_orders_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wp_delete_old_unpaid_orders_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wp_clear_delete_old_orders_cron' );

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

  • Выполните команду wp cron event run wp_delete_old_unpaid_orders_hook через WP-CLI или дождитесь следующего запуска по расписанию.
  • Проверьте базу данных или раздел заказов WooCommerce — заказы со статусом pending и failed старше 24 часов должны быть удалены.
  • Для отладки можно добавить логирование, например, записывать ID удалённых заказов в отдельный файл.

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

  • Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (нет блокировок на сервере), или настройте системный cron для вызова wp-cron.php.
  • Заказы не удаляются: Проверьте, что статусы заказов указаны правильно и что есть заказы старше 24 часов. Для диагностики временно добавьте error_log() внутри цикла удаления.
  • Удаляются не те заказы: Проверьте параметры фильтрации в wc_get_orders(), особенно дату создания и статусы.
  • Ошибка при деактивации: Убедитесь, что __FILE__ в register_deactivation_hook корректно указывает на файл плагина.

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

  • Удаление заказов нельзя выполнять слишком часто — выбирайте интервал не реже раза в сутки, чтобы не перегружать базу.
  • Не используйте массовое удаление в пользовательском запросе — лучше удалять заказы по одному через wp_delete_post() с параметром $force_delete = true, чтобы удалить все связанные данные.
  • При большом количестве заказов добавьте лимит и делайте удаление по партиям, чтобы избежать таймаута.
  • Для сайтов с высокой нагрузкой лучше переключиться на системный cron, а не полагаться на WP-Cron.
  • Регулярно делайте резервные копии базы перед автоматическим удалением данных.

Сравнение вариантов реализации

МетодПреимуществаНедостатки
WP-Cron + PHP функцияПростота, не требует доступа к серверуЗависит от посещаемости сайта, может не сработать вовремя
Системный cron + WP-CLIНадёжность, точность выполненияТребует доступа к серверу и знаний CLI
Плагины для очистки заказовГотовые решения с интерфейсомМогут быть избыточными и влиять на производительность
Как автоматически удалять незавершённые заказы WooCommerce по cron
17.06.2026
Как удалить зависимые данные от удалённых плагинов в WooCommerce
30.04.2026
Как создать динамический маркетинговый календарь в WordPress
13.02.2026
Как корректно удалить зависимые данные от удалённых плагинов WooCommerce
07.05.2026
Как автоматизировать управление подписками в WordPress
11.01.2026