Диагностика проблемы с платежами в WooCommerce
В интернет-магазинах на WooCommerce часто возникают ситуации, когда платеж не проходит, но статус заказа остается прежним — обычно "обработка" или "в ожидании оплаты". Это приводит к путанице в админке и неудобствам при управлении заказами. Чтобы избежать ручного контроля каждого заказа, полезно настроить автоматическое изменение статуса в случае проблем с оплатой.
Причины такой проблемы:
- Отсутствие корректной обработки ошибок от платежного шлюза;
- Проблемы с возвратом статуса платежа через API;
- Конфликты плагинов, изменяющих логику заказа;
- Отсутствие дополнительных проверок таймаутов для неоплаченных заказов.
Как настроить автоматическое изменение статуса заказа при проблемах с оплатой
Рассмотрим практическое решение через добавление кода в functions.php вашей темы или в отдельный плагин. Цель — по истечении определенного времени менять статус заказа с "в ожидании оплаты" на "отменен" или "отклонен", если оплата так и не прошла.
Шаг 1: Добавить WP-Cron задачу для проверки статусов
Добавим функцию, которая будет запускаться регулярно и проверять заказы в статусе "pending" или "on-hold" старше определенного времени.
function wpkpi_schedule_check_failed_payments() {
if ( ! wp_next_scheduled( 'wpkpi_check_failed_orders_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpkpi_check_failed_orders_hook' );
}
}
add_action( 'wp', 'wpkpi_schedule_check_failed_payments' );
add_action( 'wpkpi_check_failed_orders_hook', 'wpkpi_process_failed_orders' );
function wpkpi_process_failed_orders() {
$args = array(
'limit' => -1,
'status' => array( 'pending', 'on-hold' ),
'date_created' => '<' . ( time() - 60 * 60 * 24 ), // 24 часа назад
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена заказа по причине неоплаты более 24 часов' );
}
}
В этом коде мы проверяем заказы старше 24 часов и меняем их статус на "отменен". По желанию, можно изменить период или статус, на который меняется заказ.
Шаг 2: Обработка ошибок от платежного шлюза
Если вы используете популярные платежные шлюзы (например, WooCommerce Stripe, PayPal), убедитесь, что они корректно вызывают хуки при ошибках. Можно подписаться на событие <gateway>_payment_failed для дополнительной обработки.
add_action( 'woocommerce_payment_failed', 'wpkpi_handle_payment_failure', 10, 2 );
function wpkpi_handle_payment_failure( $order_id, $payment_method ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Меняем статус на отменённый с комментарием
$order->update_status( 'cancelled', 'Оплата не прошла через ' . $payment_method );
}
Проверка результата после внедрения решения
После добавления кода и развертывания на сайте:
- Создайте тестовый заказ и не оплачивайте его, дождитесь 24 часов (можно временно уменьшить время в коде для теста);
- Убедитесь, что статус заказа поменялся на "отменен";
- Проверьте логи WooCommerce и комментарии к заказу, чтобы убедиться, что причина изменения статуса отображается;
- Попробуйте сымитировать отказ платежа и проверьте срабатывание хука
woocommerce_payment_failed.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически. Проверьте, что на сервере нет ограничений на запуск PHP скриптов, или настройте настоящий системный cron для вызова
wp-cron.php. Без этого задача не будет выполняться. - Заказы не меняют статус. Убедитесь, что функции обновления статуса вызываются с корректными объектами заказа, что нет конфликтов с другими плагинами, блокирующими изменение статуса.
- Платежные шлюзы не вызывают нужные хуки. Проверьте документацию платежного шлюза, возможно, потребуется использовать специфичные для него хуки или фильтры.
- Изменение статуса влияет на уведомления клиенту. Если уведомления отправляются автоматически, настройте их шаблоны или отключите, чтобы не рассылать лишние письма.
Практические советы по безопасности и производительности
- Не меняйте статус всех заказов подряд, используйте фильтры по дате, чтобы избежать излишней нагрузки.
- Для больших магазинов период запуска задачи стоит увеличить, например, до 2-3 часов.
- Проверяйте совместимость с платежными плагинами после обновлений WooCommerce.
- Используйте отладку WooCommerce и логи для мониторинга нестандартных ситуаций.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| WP-Cron + проверка даты | Простой, не требует сторонних плагинов, гибкий | Зависит от WP-Cron, возможны задержки |
| Хук платежного шлюза | Моментальная реакция на ошибку | Зависит от корректной реализации шлюза, не покрывает все случаи |
| Плагин автоматизации (например, Clearfy Pro) | Готовые решения, визуальная настройка | Платные, ограниченный контроль кода |