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

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

В WooCommerce неоплаченные заказы (статус "pending", "failed" и др.) могут накапливаться и создавать нагрузку на базу данных, замедлять отчёты и делать админку менее удобной. Особенно актуально для магазинов с большим трафиком и частыми попытками оформления заказов, которые не завершаются оплатой.

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

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

1. Создаем функцию для удаления заказов по статусу и дате

В данном примере удаляем заказы со статусом pending, которым больше 3 дней, и failed старше 7 дней.

function wpall_delete_old_unpaid_orders() {
    // Массив статусов и сроков в днях
    $statuses = [
        'pending' => 3, 
        'failed' => 7
    ];

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

        $args = [
            'post_type' => 'shop_order',
            'post_status' => 'wc-' . $status,
            'date_query' => [
                [
                    'column' => 'post_date',
                    'before' => $date,
                ],
            ],
            'fields' => 'ids',
            'posts_per_page' => -1,
            'no_found_rows' => true,
        ];

        $orders = get_posts($args);

        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

2. Добавляем задачу в WP-Cron для регулярного запуска

Чтобы удаление выполнялось автоматически, добавим cron-задачу, которая будет запускать функцию, например, раз в сутки.

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

add_action('wpall_delete_old_unpaid_orders_hook', 'wpall_delete_old_unpaid_orders');

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

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

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

Для проверки:

  • Создайте тестовые заказы с разными статусами и датами старше заданных сроков.
  • Запустите вручную функцию wpall_delete_old_unpaid_orders() через админ-панель (например, вызов из временного плагина или WP-CLI).
  • Убедитесь, что заказы удалились (их нет в списке заказов).
  • Также проверьте по cron-записям с помощью плагина WP Crontrol, что задача запланирована и выполняется.

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

  • Заказы не удаляются — проверьте, что статусы указаны с префиксом wc- в параметре post_status. В WooCommerce статусы заказов хранятся с этим префиксом.
  • Функция wp_delete_post не удаляет заказ — убедитесь, что у пользователя, под которым выполняется скрипт, есть права на удаление заказов.
  • Задача cron не запускается — проверьте, что событие правильно запланировано через wp_schedule_event и не было отключено другими плагинами.
  • Удаляются важные заказы — внимательно проверьте условия фильтрации по дате и статусу, чтобы не удалить нужные данные.

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

  • Не используйте удаление заказов с помощью wp_delete_post в неограниченном количестве за один запуск — если заказов тысячи, разбивайте удаление на порции, чтобы избежать превышения времени выполнения скрипта.
  • Добавьте логирование удаленных заказов для аудита и возможности восстановления в случае ошибки.
  • Если магазин большой, рассмотрите использование WP-CLI для запуска удаления вне веб-запросов.
  • Регулярно делайте резервные копии базы данных перед автоматическими удалениями.

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

МетодПреимуществаНедостаткиРекомендуется для
Плагин (например, WooCommerce Cancel Abandoned Order)Простота настройки, готовый интерфейсМожет быть избыточным, нагрузка, ограниченная гибкостьМаленькие и средние магазины без навыков кода
Кастомный код с WP-Cron (описанный в статье)Максимальная гибкость, точная настройка по статусам и срокамТребуется базовые навыки разработки, нужно контролировать cronРазработчики и продвинутые пользователи
Запуск WP-CLI командой (ручное/автоматическое)Высокая производительность, не зависит от нагрузки веб-сервераТребует доступа к серверу и навыков командной строкиКрупные магазины и проекты с большим объемом данных
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
19.05.2026
Как создать фильтрованный список пользователей в WordPress с применением meta-запросов
05.04.2026
WooCommerce: автоматическое удаление неоплаченных заказов по срокам с помощью кода
05.05.2026
Автообновление статуса заказа в WooCommerce по срокам
25.04.2026
Как удалить старые комментарии и их метаданные в WordPress
19.03.2026