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

Что такое зависшие заказы в WooCommerce и почему их нужно удалять

Зависшие заказы — это заказы со статусом, который не меняется длительное время (например, "в обработке", "ожидает оплаты"), но при этом клиент не завершил оплату или заказ не актуален. Наличие таких заказов загромождает базу данных, замедляет работу магазина и искажает статистику продаж.

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

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

  • Через админ-панель WooCommerce — перейти в раздел «Заказы» и отсортировать по дате или статусу, проверить заказы с длительно не меняющимся статусом.
  • Через SQL-запрос к базе данных:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') ORDER BY post_date ASC;

Здесь мы смотрим заказы в статусах «ожидает оплаты» и «на удержании». Если даты очень старые (например, больше 30 дней), это признаки зависших заказов.

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

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

function wplancer_delete_stale_orders() {
    global $wpdb;
    $days = 30; // Старше 30 дней
    $statuses = ['wc-pending', 'wc-on-hold'];

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

    foreach ($statuses as $status) {
        $orders = wc_get_orders([
            'limit' => -1,
            'status' => str_replace('wc-', '', $status),
            'date_created' => '<' . $date_threshold
        ]);

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

2. Добавляем вызов функции по расписанию (wp_cron)

if (!wp_next_scheduled('wplancer_daily_stale_orders_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wplancer_daily_stale_orders_cleanup');
}

add_action('wplancer_daily_stale_orders_cleanup', 'wplancer_delete_stale_orders');

Этот код запустит очистку один раз в сутки.

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

  • Перейдите в раздел WooCommerce => Заказы и убедитесь, что старые заказы со статусами «ожидает оплаты» и «на удержании» удалены.
  • Выполните SQL-запрос из раздела диагностики, чтобы проверить, что по дате и статусу таких заказов больше нет.
  • Проверьте журнал ошибок сервера и WooCommerce на предмет неожиданных ошибок после запуска скрипта.

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

  • Удаление заказов не происходит: Проверьте, что функция подключена в файле functions.php текущей активной темы или в плагине. Убедитесь, что wp_cron работает (можно использовать плагин WP Crontrol для проверки задач).
  • Удаляются не те заказы: Убедитесь, что в массиве $statuses указаны корректные статусы. Статусы WooCommerce всегда с префиксом wc- в базе, но при использовании wc_get_orders префикс нужно убирать.
  • Удаление вызывает ошибки прав доступа: Запускать код должен пользователь с необходимыми правами, или код должен выполняться на уровне сервера, без ограничения по правам.

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

  • Удаляйте заказы только старше определенного срока, чтобы не потерять актуальные данные.
  • Для больших магазинов с тысячами заказов используйте пакетную обработку, чтобы избежать превышения лимита памяти и времени выполнения.
  • Перед массовым удалением создайте резервную копию базы данных.
  • Можно расширить функционал, добавив отправку отчета на email о количестве удаленных заказов за день.

Сравнение вариантов реализации удаления зависших заказов

МетодПлюсыМинусы
Плагин (например, WP Clean Up)Простой в установке, настройки через UIМожет иметь ограниченный функционал, нагрузка на сайт
Код в functions.php (как в статье)Гибкость, полный контроль, минимальная нагрузкаТребует навыков разработки, риски при ошибках
SQL-запросы напрямую в БДОчень быстро и эффективноРиск потери данных, требует осторожности и прав доступа
Как удалить зависшие сеансы пользователей в WordPress
14.07.2026
Как автоматически удалять товар из корзины WooCommerce при установке количества в 0
26.04.2026
Как оптимизировать загрузку шаблонов в WordPress для ускорения сайта
30.12.2025
Как создать уникальные слаги для пользовательских типов записей в WordPress
04.03.2026
Как создать собственный виджет в WordPress с примерами кода
12.12.2025