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

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

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

WooCommerce по умолчанию не удаляет заказы со статусом pending или failed, что требует ручного вмешательства или автоматизации через код.

Диагностика: как определить, что заказы не удаляются

  • Зайдите в админ-панель WooCommerce → Заказы и отфильтруйте по статусам Ожидает оплаты или Неоплаченный.
  • Обратите внимание на дату создания заказов — если они старше нескольких дней и не оплачены, значит автоматического удаления нет.
  • Проверьте базу данных, выполнив запрос к таблице wp_posts c фильтром по post_type = 'shop_order' и статусу post_status = 'wc-pending' или wc-failed.

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

Реализуем удаление заказов старше заданного времени (например, 24 часа) со статусом pending или failed с помощью WP-Cron. Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин.

// Интервал запуска события - 1 раз в часadd_filter('cron_schedules', function($schedules) {    if (!isset($schedules['hourly'])) {        $schedules['hourly'] = array(            'interval' => 3600, // 1 час            'display' => 'Раз в час'        );    }    return $schedules;});if (!wp_next_scheduled('wpb_delete_old_unpaid_orders')) {    wp_schedule_event(time(), 'hourly', 'wpb_delete_old_unpaid_orders');}add_action('wpb_delete_old_unpaid_orders', function() {    global $wpdb;    $interval_hours = 24; // время жизни заказа в часах    $time_threshold = date('Y-m-d H:i:s', strtotime("-{$interval_hours} hours"));    // Получаем ID заказов статусом pending или failed старше порогового времени    $order_ids = $wpdb->get_col($wpdb->prepare("        SELECT ID FROM {$wpdb->posts}        WHERE post_type = 'shop_order'        AND post_status IN ('wc-pending','wc-failed')        AND post_date < %s    ", $time_threshold));    if (!empty($order_ids)) {        foreach ($order_ids as $order_id) {            // Безопасное удаление заказа через функцию WooCommerce            wp_trash_post($order_id);        }    }});

Этот код добавляет в WP-Cron задание, которое запускается каждый час и удаляет заказы старше 24 часов с указанными статусами.

Как изменить время удаления

Измените переменную $interval_hours в коде на нужное количество часов.

Проверка результата

  • Создайте тестовый заказ со статусом pending.
  • Измените дату создания заказа в базе данных на дату более 24 часов назад или уменьшите $interval_hours для теста.
  • Запустите вручную WP-Cron через плагин WP Crontrol или дождитесь автоматического запуска.
  • Проверьте, что заказ удалился и больше не отображается в списке заказов.

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

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

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

  • Для больших магазинов с тысячами заказов желательно ограничить количество удаляемых заказов за один запуск, чтобы избежать таймаутов. Например, добавить LIMIT 50 в SQL-запрос и обрабатывать по частям.
  • Используйте wp_trash_post вместо wp_delete_post, чтобы иметь возможность восстановить удалённые заказы при ошибках.
  • Регулярно проверяйте логи ошибок и работу cron, чтобы своевременно обнаружить сбои.

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

СпособПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудозатратно, неавтоматично
Плагин автоматического удаленияУдобство, настройкиЗависимость от стороннего кода, нагрузка
Кастомный WP-Cron код (пример выше)Полный контроль, легковесность, гибкостьНужно писать и тестировать, требует cron
Как создать автоматические уведомления в WordPress с помощью хуков и плагинов
07.02.2026
Как использовать WP-Cron для автоматизации задач в WordPress
24.06.2026
Как отключить автоматическое обновление плагинов в WordPress
08.12.2025
Как удалить захламление базы данных WordPress без подключения к phpMyAdmin
19.02.2026
WooCommerce: как автоматически изменять стоимость товара при изменении атрибутов
16.07.2026