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

Проблема: накопление незавершенных заказов в WooCommerce

Магазины на WooCommerce часто сталкиваются с тем, что в базе накапливается большое количество незавершенных или «висящих» заказов. Это может быть связано с тем, что пользователи бросают корзину, платежи не проходят или клиенты не завершают оплату. Такие заказы не удаляются автоматически и создают нагрузку на базу, затрудняют аналитику и управление заказами.

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

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

  • В админке WooCommerce откройте раздел Заказы и отфильтруйте заказы по статусу pending, failed, on-hold.
  • Посчитайте количество таких заказов и сравните с общим числом заказов.
  • Проверьте, есть ли заказы, которые висят несколько дней или недель без изменений.

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

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-on-hold');

Если количество таких заказов превышает несколько сотен, это признак необходимости автоматизации очистки.

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

1. Определяем критерии удаления

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

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpco_delete_old_unfinished_orders() {
    $days = 7; // количество дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-'. $days .' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            'before' => $date_threshold,
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // безвозвратное удаление
        }
    }
}

3. Добавляем задачу в WP-Cron для автоматизации

Чтобы функция запускалась регулярно, зарегистрируем событие и хук:

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

// Хук для удаления заказов
add_action('wpco_cleanup_unfinished_orders_hook', 'wpco_delete_old_unfinished_orders');

4. Очистка Cron при деактивации

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

function wpco_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpco_cleanup_unfinished_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpco_cleanup_unfinished_orders_hook');
    }
}

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

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

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

  • Заказы не удаляются: Проверьте, что статус заказа указан правильно с префиксом wc- (например, wc-pending), а не просто pending.
  • WP-Cron не срабатывает: Убедитесь, что на сайте посещения есть (WP-Cron работает при загрузке страниц). Для теста вызовите функцию вручную или настройте системный cron для wp-cron.php.
  • Удаляются не те заказы: Проверьте фильтр даты и статусы. При необходимости добавьте логирование в функцию для отладки.
  • Удаление не происходит без прав: Убедитесь, что PHP-процесс имеет права на удаление записей, и что нет конфликтов с другими плагинами или темой.

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

  • Перед удалением заказов стоит делать резервные копии базы данных, чтобы избежать потери важных данных.
  • Удаление большого количества заказов за раз может привести к нагрузке на сервер — разбивайте задачи на группы по 50-100 заказов.
  • Используйте WP-CLI для массовых операций на больших сайтах — это быстрее и надежнее.
  • Для улучшения безопасности убедитесь, что код выполняется только в админской части или с проверкой прав.

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

МетодПлюсыМинусыПример
WP-Cron с кастомной функциейГибкость, контроль, бесплатное решениеЗависит от посещаемости сайта, возможна нагрузкаКод из статьи
Плагин автоочистки заказов (например, WooCommerce Order Cleanup)Простота настройки, готовый интерфейсМожет не подходить для кастомных условий, влияет на производительностьПлагин на WordPress.org
Системный Cron + WP-CLIНадежно, не зависит от посещаемости, высокая производительностьТребует доступа к серверу и знаний командной строкиwp eval 'wpco_delete_old_unfinished_orders();'
Как сделать автоматический редирект в WordPress по условиям
04.01.2026
Как создать отслеживание активности пользователей в WordPress: практические примеры и код
25.12.2025
WooCommerce: как сделать возвраты товаров с автоматизацией
18.04.2026
WooCommerce: автоматическое удаление товаров при низком остатке
22.06.2026
Как удалить неиспользуемые метаданные в WordPress для ускорения сайта
10.11.2025