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

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

С ростом интернет-магазина на WooCommerce количество неоплаченных заказов может существенно увеличиться. Это замедляет работу административной панели, занимает лишнее место в базе данных и влияет на отчёты. Основная задача — автоматически удалять такие заказы через заданный период, не затрагивая оплаченные или находящиеся в работе заказы.

Как понять, что проблема есть?

  • В админке WooCommerce в разделе «Заказы» скопилось много заказов со статусом wc-pending или wc-on-hold, которые не меняются длительное время.
  • Замедление работы базы данных при выборке заказов.
  • Отчёты показывают завышенные данные по заказам из-за «мертвых» записей.

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

Реализуем задачу с помощью планировщика задач WordPress (WP-Cron). Скрипт будет запускаться ежедневно и удалять заказы со статусом pending или on-hold, которые старше заданного количества дней.

1. Добавляем функцию в файл functions.php вашей темы или в отдельный плагин

function wprus_delete_old_unpaid_orders() {
    $days = 30; // Срок в днях для удаления заказов
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Аргументы запроса для получения старых неоплаченных заказов
    $args = array(
        'status' => array('wc-pending', 'wc-on-hold'),
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Перемещаем заказ в корзину
            // Для полного удаления используйте wp_delete_post($order_id, true);
        }
    }
}

// Регистрируем событие cron, если еще не запущено
if (!wp_next_scheduled('wprus_daily_delete_unpaid_orders')) {
    wp_schedule_event(time(), 'daily', 'wprus_daily_delete_unpaid_orders');
}

// Хук для запуска функции
add_action('wprus_daily_delete_unpaid_orders', 'wprus_delete_old_unpaid_orders');

2. Как настроить интервал и статус заказов

В переменной $days указывайте количество дней, после которого заказы считаются устаревшими. Статусы в массиве 'status' => array('wc-pending', 'wc-on-hold') можно расширить, если требуется удалить и другие статусы.

3. Удаление заказов: корзина или полное удаление?

Функция wp_trash_post() перемещает заказ в корзину, откуда его можно восстановить. Для безвозвратного удаления используйте wp_delete_post($order_id, true). Будьте осторожны с полным удалением.

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

  • Подождите 24 часа после внедрения, чтобы сработал cron-задача.
  • Проверьте раздел «Заказы» на наличие заказов старше заданного срока со статусом pending и on-hold. Их должно стать меньше или они должны полностью исчезнуть.
  • В базе данных проверьте таблицу wp_posts с типом shop_order и датой создания — записи должны исчезнуть.
  • Для тестирования можно временно изменить интервал запуска cron на более частый (например, ежечасный) и проверить логи.

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

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

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

  • Не используйте wp_delete_post($order_id, true) без резервного копирования.
  • Ограничьте удаление только статусами, которые точно означают неоплаченные заказы.
  • Настройте системный cron на хостинге для запуска wp-cron.php раз в 15-30 минут, чтобы избежать пропуска задач.
  • Для больших магазинов используйте пакетное удаление, чтобы не перегружать сервер: разбивайте заказы на порции по 50-100 штук.

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

МетодПлюсыМинусыПример
Удаление через код и WP-Cron Полный контроль, без плагинов, легко настраивается Зависит от работы WP-Cron, требует навыков разработки Скрипт в functions.php (пример выше)
Плагины очистки заказов (например, "WooCommerce Bulk Delete") Простота использования, GUI Менее гибко, лишний плагин в системе Плагин из репозитория WP
Удаление вручную через админку Простота, не требует кода Не подходит для больших объёмов, риск пропуска Админка WooCommerce - Заказы
Как отключить REST API в WordPress без плагинов: практическое руководство
21.01.2026
WooCommerce: как изменить стиль кнопки «Добавить в корзину» при добавлении товара
07.06.2026
WooCommerce: как автоматически отключить отзывы для определённых ролей пользователей
19.07.2026
Как автоматизировать создание и удаление чисток в WordPress с помощью плагинов и кода
01.01.2026
Как использовать WP Cron в WordPress для автоматизации задач
27.03.2026
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙