Диагностика проблемы: зачем отключать платежи при неуспешной оплате
В WooCommerce бывает ситуация, когда пользователь пытается оплатить заказ, но платеж не проходит (отказ банка, ошибка платежной системы). Если платежные методы остаются активными и доступны, клиент может несколько раз пытаться оплатить заказ, что приводит к путанице и возможным конфликтам в учете заказов.
Автоматическое отключение платежей при неуспешной оплате помогает предотвратить повторные попытки и позволяет администратору вовремя реагировать на проблемы с оплатой.
Как определить, что платеж не прошёл
WooCommerce фиксирует статусы заказов. Стандартные статусы для неуспешных оплат — failed и cancelled. Мы будем ориентироваться на них для автоматического отключения платежных методов.
Пошаговое решение: отключение платежей при неуспешных заказах
1. Добавляем проверку статуса заказа для отключения методов оплаты
Добавим в functions.php темы или в собственный плагин код, который будет проверять наличие заказов со статусом failed у пользователя и отключать методы оплаты, если такие есть.
function wpf_disable_payment_methods_on_failed_orders( $available_gateways ) {
if ( ! is_user_logged_in() ) {
return $available_gateways; // для гостей не меняем
}
$user_id = get_current_user_id();
// Получаем последние 5 заказов пользователя со статусом failed
$args = array(
'customer_id' => $user_id,
'limit' => 5,
'status' => 'failed',
);
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
// Отключаем все методы оплаты
$available_gateways = array();
}
return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'wpf_disable_payment_methods_on_failed_orders' );2. Добавляем уведомление для пользователя
Чтобы клиент понимал, почему методы оплаты отключены, выведем сообщение на странице оформления заказа.
function wpf_failed_order_notice() {
if ( ! is_user_logged_in() ) {
return;
}
$user_id = get_current_user_id();
$args = array(
'customer_id' => $user_id,
'limit' => 1,
'status' => 'failed',
);
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
wc_print_notice( 'Ваш последний платеж не прошёл. Пожалуйста, свяжитесь с поддержкой для решения проблемы.', 'error' );
}
}
add_action( 'woocommerce_before_checkout_form', 'wpf_failed_order_notice' );3. Разрешаем повторное включение платежей после решения проблемы
Это можно сделать вручную, изменив статус заказа на cancelled или processing, либо создав дополнительный интерфейс для администраторов. Для простоты — достаточно поменять статус заказа вручную.
Проверка результата
- Создайте тестовый заказ с неуспешной оплатой (статус
failed). - Залогиньтесь под пользователем, который сделал заказ.
- Перейдите на страницу оформления заказа — методы оплаты должны быть отключены, а сообщение об ошибке отображено.
- Измените статус заказа на
cancelledилиprocessingв админке. - Обновите страницу оформления заказа — методы оплаты должны восстановиться.
Частые ошибки и как их исправить
- Методы оплаты не отключаются: проверьте, что фильтр
woocommerce_available_payment_gatewaysдействительно срабатывает. Возможно, конфликтует другой плагин. - Сообщение об ошибке не выводится: убедитесь, что хук
woocommerce_before_checkout_formактивен и функцияwc_print_noticeне отключена. - Платежи отключаются всем пользователям: проверьте условие
is_user_logged_in()и корректность получения заказов текущего пользователя.
Практические советы по безопасности и производительности
- Не стоит отключать методы оплаты глобально — только для конкретных пользователей с неуспешными заказами.
- Используйте кэширование результатов запроса заказов, если нагрузка высокая, например, с помощью
transient API. - Обязательно проверяйте корректность данных, получаемых из заказов, чтобы избежать ошибок PHP.
- Периодически проверяйте и очищайте неактуальные заказы со статусом
failed, чтобы не накапливать лишние данные.
Сравнение вариантов отключения платежей
| Метод | Плюсы | Минусы |
|---|---|---|
Отключение через фильтр woocommerce_available_payment_gateways | Гибко, индивидуально для пользователя | Требует программирования, может конфликтовать с плагинами |
| Использование плагинов для управления оплатой | Простота настройки, готовые решения | Могут быть платными, ограниченная кастомизация |
| Ручное изменение статусов заказов | Просто, не требует кода | Не автоматизировано, требует админской работы |