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

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

При использовании отложенных платежей в WooCommerce часто возникает ситуация, когда пользователи оформляют заказы, но не завершают оплату. Такие заказы остаются в базе, занимая место и создавая путаницу в админке, что негативно влияет на производительность и статистику магазина. Автоматическое удаление или отмена таких заказов через заданный промежуток времени решает эту проблему.

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

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

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

Пример SQL-запроса для проверки заказов старше 7 дней с статусом 'on-hold'

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-on-hold' AND post_date < NOW() - INTERVAL 7 DAY;

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

Реализуем автоматическое удаление заказов, которые находятся в статусе on-hold или pending более 7 дней. Для этого добавим в файл functions.php вашей темы или в отдельный плагин следующий код:

function wptricks_delete_old_unpaid_orders() {
    $args = array(
        'status' => array('on-hold', 'pending'),
        'date_created' => '<' . ( new WC_DateTime() )->modify('-7 days')->format('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids'
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            // Можно добавить логику уведомления или резервного копирования перед удалением
            $order->delete(true); // true - удалить полностью
        }
    }
}

// Запускаем через WP-Cron ежедневно
add_action('wptricks_daily_delete_unpaid_orders', 'wptricks_delete_old_unpaid_orders');

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

Этот код создаёт ежедневное событие WordPress Cron, которое удаляет все заказы в статусах on-hold и pending, созданные более 7 дней назад.

Как адаптировать под другие статусы и сроки

  • Измените статусы в параметре 'status' => array('on-hold', 'pending') на нужные вам.
  • Измените срок из -7 days на нужное количество дней.

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

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

  1. Создайте тестовый заказ с нужным статусом (например, on-hold) и датой создания более 7 дней назад (можно вручную через базу или временно изменить дату сервера).
  2. Запустите задачу вручную, добавив в functions.php вызов wptricks_delete_old_unpaid_orders(); и обновите любую страницу сайта (чтобы запустить функцию).
  3. Проверьте в админке WooCommerce, что заказ удалён.
  4. Убедитесь, что cron-событие запланировано и выполняется с помощью плагинов типа WP Crontrol.

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

  • Заказы не удаляются: проверьте, что функция wc_get_orders возвращает заказы. Добавьте error_log для отладки.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает. На некоторых хостингах cron отключён, в таком случае настройте системный cron для вызова wp-cron.php.
  • Удаление приводит к потере данных: перед удалением сделайте резервную копию или измените логику удаления на смену статуса cancelled.

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

  • Удаляйте заказы не сразу, а меняйте статус на «отменённый» для сохранения истории и возможности восстановления.
  • Перед удалением логируйте ID удаляемых заказов в отдельный файл или таблицу для аудита.
  • Используйте пакетную обработку, если заказов много, чтобы не превышать лимиты памяти и времени выполнения.
  • Мониторьте выполнение WP-Cron через плагин WP Crontrol или аналогичные инструменты.
  • Согласуйте сроки удаления с бизнес-процессами, чтобы не потерять важные данные.

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

МетодОписаниеПлюсыМинусы
WP-Cron + программный кодУдаление через кастомный WP-Cron хукГибко, без сторонних плагинов, легко настраиваетсяЗависит от работы WP-Cron, возможны задержки
Плагины очистки заказов (например, Cancel Abandoned Order)Готовые решения для управления старыми заказамиПростота установки, GUI для управленияДополнительная нагрузка, возможный конфликт с кастомами
Ручное удаление через SQLУдаление напрямую из базы данныхМгновенно, без нагрузки на WordPressРиск ошибок, потеря данных, требует навыков
Как удалить плагин без удаления файлов в WordPress
19.01.2026
Автоматизация создания и удаления записей в WordPress через CRON
22.01.2026
Как создать автоматический редактор для WordPress с помощью AJAX
15.01.2026
Как отключить emoji в WordPress и улучшить производительность сайта
01.04.2026
WooCommerce: автоматическое возврат средств и смена статуса заказа через код
29.06.2026