Диагностика проблемы с платежными методами при отказе заказа в WooCommerce
В стандартном WooCommerce после отказа заказа (например, заказ отменён или оплата не прошла) платежные методы остаются активными и доступны для новых заказов. Это может привести к путанице и повторным попыткам оплаты тем методом, который вызвал проблемы.
Часто владельцы интернет-магазинов хотят автоматически отключать или скрывать проблемные платежные методы, чтобы избежать повторных ошибок и улучшить UX.
Как понять, что нужна автоматизация?
- Платежный метод вызывает частые отказы или технические сбои.
- Клиенты пытаются повторно использовать проблемный метод, что ведёт к ошибкам.
- Необходимо гибко управлять доступностью методов в зависимости от статуса заказов.
Пошаговое решение: автоматическое отключение платежных методов при отказанном заказе
Для реализации нам нужно динамически исключать определённые платежные методы из списка доступных на странице оформления заказа, если у пользователя есть отказанный заказ с этим методом.
Шаг 1. Получаем отказанные заказы клиента
function get_customer_failed_payment_methods( $user_id ) {
$failed_methods = array();
if ( ! $user_id ) {
return $failed_methods;
}
$args = array(
'customer_id' => $user_id,
'status' => array('failed', 'cancelled', 'refunded'),
'limit' => -1,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$payment_method = $order->get_payment_method();
if ( $payment_method ) {
$failed_methods[] = $payment_method;
}
}
return array_unique( $failed_methods );
}
Шаг 2. Фильтруем доступные методы оплаты на checkout
add_filter( 'woocommerce_available_payment_gateways', 'disable_payment_methods_for_failed_orders' );
function disable_payment_methods_for_failed_orders( $available_gateways ) {
if ( ! is_checkout() || empty( $available_gateways ) ) {
return $available_gateways;
}
$user_id = get_current_user_id();
$failed_methods = get_customer_failed_payment_methods( $user_id );
// Исключаем методы оплаты, которые были у отказанных заказов
foreach ( $failed_methods as $method ) {
if ( isset( $available_gateways[ $method ] ) ) {
unset( $available_gateways[ $method ] );
}
}
return $available_gateways;
}
Проверка результата после внедрения
- Зайдите под пользователем, у которого есть хотя бы один отказанный заказ с конкретным методом оплаты.
- Перейдите на страницу оформления заказа (checkout).
- Проверьте, что платежный метод, связанный с отказанным заказом, не отображается в списке доступных способов оплаты.
- Для теста создайте новый заказ с другим методом оплаты - он должен отображаться.
- Если пользователь не авторизован или отказанных заказов нет, отображаются все методы.
Частые ошибки и как их исправить
- Платежные методы не скрываются: Проверьте, что фильтр
woocommerce_available_payment_gatewaysдобавлен без ошибок и чтоget_current_user_id()возвращает корректный ID пользователя. - Отказы не учитываются корректно: Убедитесь, что статусы заказов, которые вы хотите считать отказанными, указаны в массиве статусов в
wc_get_orders. Например, если у вас кастомный статус, добавьте его. - Пользователи без заказов не видят методы оплаты: Проверьте логику условия - если нет отказанных заказов, не нужно убирать методы.
- Производительность страдает при большом количестве заказов: В этом случае можно кэшировать результат для пользователя с помощью Transients API.
Практические советы по производительности и безопасности
- Используйте Transients API для кэширования списка отказанных методов на 5–10 минут, чтобы уменьшить количество запросов к базе при частых переходах на страницу оформления заказа.
- Обязательно проверяйте, что
get_current_user_id()корректен, чтобы не раскрывать информацию о заказах других пользователей. - Если магазин поддерживает гостей, рассмотрите логику по cookie или сессиям, чтобы иметь возможность отключать методы для неавторизованных.
- Следите за обновлениями WooCommerce - API для заказов может меняться, корректируйте код при необходимости.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
Использование фильтра woocommerce_available_payment_gateways и проверка заказов | Гибко, можно кастомизировать под разные статусы | Нагрузка на базу при большом количестве заказов, требует кэширования |
| Плагин для управления платежными методами | Простота установки, готовый UI | Может не учитывать отказанные заказы, ограниченная гибкость |
| Ручная настройка статусов в платежных системах | Прямое управление в платёжных шлюзах | Не всегда доступно, требует отдельной админской работы |