Проблема: накопление неактивных заказов с отсрочкой платежа в 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на нужное количество дней.
Проверка результата после внедрения
Для проверки корректной работы:
- Создайте тестовый заказ с нужным статусом (например,
on-hold) и датой создания более 7 дней назад (можно вручную через базу или временно изменить дату сервера). - Запустите задачу вручную, добавив в
functions.phpвызовwptricks_delete_old_unpaid_orders();и обновите любую страницу сайта (чтобы запустить функцию). - Проверьте в админке WooCommerce, что заказ удалён.
- Убедитесь, что 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 | Риск ошибок, потеря данных, требует навыков |