Проблема: Как автоматически отклонять заказы с неудачной оплатой в WooCommerce
В стандартной установке WooCommerce заказ создаётся сразу после оформления, но статус оплаты может оставаться «в ожидании» или «обработка» даже при неудачном платеже. Это приводит к накоплению «зависших» заказов, которые требуют ручного вмешательства. Задача — настроить автоматическое отклонение (отмена) таких заказов, чтобы очищать базу и избегать ошибок в учёте.
Диагностика проблемы
Для проверки проблемы обратите внимание на следующие моменты:
- В админке WooCommerce есть заказы со статусом «ожидает оплаты» или «обработка», но по факту платеж не прошёл.
- При попытке вручную отменить такие заказы вы замечаете, что они продолжают отображаться и мешают отчётам.
- Платёжный шлюз не всегда корректно меняет статус заказа после неудачи.
Для диагностики можно использовать плагин WooCommerce Status Checker или посмотреть логи платежного шлюза (чаще всего в /wp-content/uploads/wc-logs/).
Пошаговое решение: автоматическая отмена заказов с неудачными платежами
1. Добавляем WP-Cron задачу для проверки статуса заказов
В functions.php вашей темы или в кастомном плагине поставьте регулярную задачу, которая будет запускаться, например, раз в час:
if ( ! wp_next_scheduled( 'auto_cancel_failed_orders' ) ) {
wp_schedule_event( time(), 'hourly', 'auto_cancel_failed_orders' );
}
add_action( 'auto_cancel_failed_orders', 'cancel_failed_orders_function' );2. Реализуем функцию отмены заказов
Логика функции: найти заказы со статусом pending или on-hold, которые были созданы больше чем 1 час назад и не прошли оплату. Затем изменить их статус на cancelled.
function cancel_failed_orders_function() {
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . ( time() - HOUR_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
// Проверяем, что оплата не прошла
if ( ! $order->is_paid() ) {
$order->update_status( 'cancelled', 'Автоматическая отмена: неудачный платеж более 1 часа назад.' );
}
}
}Проверка результата после внедрения
После внедрения кода:
- Зайдите в WooCommerce → Заказы и отфильтруйте по статусу «Отменённые».
- Создайте тестовый заказ с имитацией неудачного платежа (например, выберите способ оплаты «Оплата при доставке» и не подтверждайте оплату).
- Подождите после создания заказа более часа или вручную запустите WP-Cron задачу через плагин WP Crontrol.
- Проверьте, что тестовый заказ автоматически поменял статус на «Отменённый».
Частые ошибки и причины неправильной работы
- WP-Cron не работает из-за отсутствия посещаемости сайта. Решение: настроить системный cron на сервере для вызова wp-cron.php.
- Функция
wc_get_ordersвозвращает пустой массив. Проверьте, что аргументdate_createdкорректно указан, и формат даты верен. Можно заменить на:
'date_created' => '<' . gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ),- Заказы не меняют статус, потому что платёж подтверждён. Функция
is_paid()возвращает true, поэтому отмена не происходит. - Проблемы с конфликтами плагинов, которые переопределяют статусы заказов. Отключите плагины, связанные с оплатой, и протестируйте.
Практические советы по безопасности и производительности
- Не запускайте задачу слишком часто: интервал в час — баланс между своевременной очисткой и нагрузкой.
- Записывайте логи в отдельный файл для отслеживания работы автоматизации.
- Ограничьте права пользователя, под которым запускается WP-Cron, чтобы избежать уязвимостей.
- Если много заказов, разбивайте обработку по партиям (параметр
limitи пагинация).
Сравнение вариантов реализации автоматической отмены заказов
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код с WP-Cron | Собственная функция с регулярной проверкой | Гибкость, контроль, нет зависимостей | Нужен правильный cron, может быть нагрузка |
| Плагин автоматизации | Готовые решения, например, Clearfy Pro | Простота настройки, поддержка | Меньше гибкости, возможны конфликты |
| Ручная проверка | Админ вручную отменяет заказы | Простота | Трудоёмко, неэффективно при большом количестве |
Итог
Автоматизация отмены заказов с неудачной оплатой в WooCommerce позволяет удерживать базу заказов в актуальном состоянии и снижать нагрузку на администраторов. Использование WP-Cron и функций WooCommerce даёт надёжное решение без сторонних плагинов, что повышает безопасность и управляемость.