Диагностика проблемы с неподтверждёнными заказами и способами оплаты
В WooCommerce часто возникает ситуация, когда пользователь создаёт заказ, но не завершает оплату, а способы оплаты остаются активными для дальнейших попыток. Это может приводить к накоплению неподтверждённых заказов, путанице в статистике и нежелательным блокировкам платежных систем. Чтобы минимизировать влияние таких заказов на работу магазина, имеет смысл автоматически отключать способы оплаты для пользователей, у которых есть неподтверждённые заказы.
Проверить наличие проблемы можно, просмотрев список заказов в админке WooCommerce (WooCommerce > Заказы), отфильтровав по статусу on-hold или pending. Если их слишком много и они долго не меняются, значит, нужно автоматизировать процесс.
Пошаговое решение: как автоматически отключить способы оплаты при неподтверждённых заказах
1. Добавляем проверку наличия неподтверждённых заказов у пользователя
Для начала нужно написать функцию, которая проверяет, есть ли у текущего пользователя неподтверждённые заказы с определёнными статусами:
function user_has_unconfirmed_orders( $user_id ) {
if ( ! $user_id ) {
return false;
}
$args = array(
'customer_id' => $user_id,
'status' => array( 'pending', 'on-hold' ),
'limit' => -1,
);
$orders = wc_get_orders( $args );
return ! empty( $orders );
}2. Фильтруем доступные способы оплаты на основе проверки
Далее подключаемся к фильтру woocommerce_available_payment_gateways, чтобы отключать способы оплаты для таких пользователей:
add_filter( 'woocommerce_available_payment_gateways', 'disable_payment_gateways_for_unconfirmed_orders' );
function disable_payment_gateways_for_unconfirmed_orders( $available_gateways ) {
if ( ! is_user_logged_in() ) {
return $available_gateways;
}
$user_id = get_current_user_id();
if ( user_has_unconfirmed_orders( $user_id ) ) {
// Список способов оплаты, которые нужно отключить
$disabled_gateways = array( 'cod', 'paypal', 'stripe' );
foreach ( $disabled_gateways as $gateway_id ) {
if ( isset( $available_gateways[ $gateway_id ] ) ) {
unset( $available_gateways[ $gateway_id ] );
}
}
}
return $available_gateways;
}3. Тестируем решение на локальном или тестовом сервере
Создайте тестового пользователя, оформите заказ с любым из статусов pending или on-hold. После этого авторизуйтесь под этим пользователем и перейдите в корзину или на страницу оплаты — отключённые способы оплаты должны отсутствовать.
Проверка результата после внедрения
- Авторизуйтесь под пользователем с неподтверждённым заказом.
- Перейдите на страницу оформления заказа.
- Убедитесь, что указанные способы оплаты (например, PayPal, COD, Stripe) отсутствуют.
- Авторизуйтесь под пользователем без неподтверждённых заказов — способы оплаты должны быть доступны.
- Проверьте консоль разработчика на предмет ошибок JavaScript и лог WooCommerce на предмет ошибок.
Частые ошибки и как их исправить
- Неверные ID способов оплаты: Убедитесь, что в массиве
$disabled_gatewaysуказаны правильные идентификаторы платежных шлюзов. Их можно узнать в WooCommerce > Настройки > Платежи. - Кэширование: Если на сайте включено кэширование страниц, отключение способов оплаты может не применяться сразу для авторизованных пользователей. Настройте исключения для страниц оформления заказа и корзины.
- Неавторизованные пользователи: Код не отключает способы оплаты для гостей (неавторизованных), так как функция ориентирована на пользователей с заказами.
- Проблемы с WPML или мультиязычностью: Если сайт мультиязычный, убедитесь, что хуки и фильтры работают для всех языков.
Практические советы по безопасности и производительности
- Оптимизация запросов: Используйте
limit => 1вwc_get_orders, если достаточно знать только наличие хотя бы одного неподтверждённого заказа, чтобы снизить нагрузку. - Кэширование результата: Для уменьшения количества запросов можно использовать transient API, например, сохранять результат проверки на 5-10 минут.
- Безопасность данных: Никогда не отключайте способы оплаты глобально без проверки пользователя, чтобы не заблокировать оплату случайным клиентам.
- Логирование: При отладке добавляйте временный лог, чтобы убедиться, что функция срабатывает корректно.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки |
|---|---|---|
Фильтр woocommerce_available_payment_gateways с проверкой заказов | Гибкий, не требует сторонних плагинов, легко настраивается под нужды | Небольшая нагрузка на БД при большом числе пользователей |
| Плагин для управления способами оплаты | Простота настройки через интерфейс | Может быть избыточным, дополнительные зависимости, возможные конфликты |
| Отключение вручную через настройки WooCommerce | Нет необходимости в коде | Не автоматизирует процесс, не учитывает статус заказов |