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

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

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

Как реализовать автоматическое удаление заказов с неактивным статусом

Выбор статусов для удаления и временного интервала

Чаще всего удаляют заказы со статусами pending (ожидание оплаты), failed (неудачная оплата) и cancelled (отменён). Временной интервал — например, заказы старше 7 дней.

Пошаговое решение с примером кода

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

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('auto_delete_unpaid_orders_hook')) {
        wp_schedule_event(time(), 'daily', 'auto_delete_unpaid_orders_hook');
    }
});

add_action('auto_delete_unpaid_orders_hook', 'auto_delete_unpaid_orders');

function auto_delete_unpaid_orders() {
    $statuses = array('pending', 'failed', 'cancelled');
    $days = 7;
    
    $date_threshold = gmdate('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'status' => $statuses,
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

Этот код добавляет ежедневное задание, которое удаляет заказы со статусами, указанными в $statuses, старше 7 дней. Для изменения интервала достаточно поменять значение $days.

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

Для проверки корректности работы:

  • Создайте тестовые заказы с нужными статусами и датой создания старше 7 дней (можно вручную изменить дату в базе или через плагины для редактирования заказов).
  • Запустите событие Cron вручную через WP-CLI: wp cron event run auto_delete_unpaid_orders_hook или дождитесь выполнения по расписанию.
  • Проверьте, что заказы удалились из базы (в панели WooCommerce и через SELECT в базе).
  • Убедитесь, что заказы с другими статусами или моложе 7 дней не тронуты.

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

  • Крон не запускается: стандартный WP-Cron зависит от посещений сайта. Для надёжности настройте системный cron на сервере или используйте плагин WP Crontrol для управления задачами.
  • Заказы не удаляются полностью: функция wp_delete_post с параметром true удаляет заказ и все связанные данные. Если параметр опущен, заказ лишь в корзину удаляется. Проверьте, что указан true.
  • Фильтр статусов не работает: убедитесь, что используете правильные идентификаторы статусов WooCommerce (например, pending, failed, cancelled). Их можно посмотреть в админке или в коде WC.
  • Производительность падает при большом количестве заказов: добавьте лимит на количество удаляемых заказов за один запуск (например, 'limit' => 100) и запускайте крон чаще.

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

  • Резервное копирование базы данных перед внедрением автоматического удаления.
  • Ограничьте права пользователя, под которым выполняется скрипт.
  • Оптимизируйте запросы и избегайте удаления в пиковые часы работы сайта.
  • Логируйте удалённые заказы для аудита (например, через запись в файл или кастомный лог).

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

МетодПлюсыМинусыКомпромисс
WP Cron + пользовательский кодГибкость, контроль, без плагиновЗависит от посещаемости, требует навыков разработкиНастроить системный cron для надежности
Плагины (например, WP Crontrol + Delete Orders)Простота настройки, UI для управленияИзбыточность, нагрузка, риск конфликтовИспользовать на небольших сайтах
Ручная очистка базы через SQLБыстро и эффективноРиск потери данных, ошибки без резервовИспользовать только для разовых операций с резервом
Автоматическое создание и отправка PDF счетов в WordPress при оформлении заказа
02.03.2026
Автоматическое создание и отправка счетов (invoice) в WordPress при оформлении заказа
22.12.2025
WooCommerce: как автоматически отключать платёжные методы по расписанию
09.05.2026
Автоматическое создание задач и напоминаний в WordPress для управления заказами
15.03.2026
Как автоматизировать изменение статьи на основе статистики просмотров в WordPress
30.03.2026