Что значит «неподтверждённый заказ» в WooCommerce и зачем отключать способы оплаты
В WooCommerce заказ считается неподтверждённым, когда он не прошёл полный цикл обработки: например, оплата не была завершена или заказ ожидает ручного подтверждения. Часто это приводит к тому, что клиенты видят способы оплаты, которые неактивны для текущего статуса заказа, или могут случайно создавать несколько заказов, что запутывает учет и приводит к проблемам с инвентарём.
Автоматическое отключение способов оплаты при наличии неподтверждённых заказов у пользователя помогает:
- Избежать дублирования заказов;
- Обеспечить корректную обработку платежей;
- Уменьшить нагрузку на службу поддержки;
- Улучшить UX, показывая только актуальные варианты оплаты.
Диагностика: как определить, что у пользователя есть неподтверждённые заказы
Для диагностики потребуется проверить статусы заказов, которые WooCommerce считает «неподтверждёнными». Обычно это статусы pending, on-hold или failed.
Пример запроса для получения неподтверждённых заказов текущего пользователя:
$user_id = get_current_user_id();
$args = [
'customer_id' => $user_id,
'status' => [ 'pending', 'on-hold', 'failed' ],
];
$orders = wc_get_orders($args);
if (count($orders) > 0) {
// Есть неподтверждённые заказы
} else {
// Нет неподтверждённых заказов
}
Если в результате этого запроса для пользователя возвращается один или несколько заказов, значит, есть неподтверждённые заказы.
Пошаговое решение: отключение способов оплаты с помощью фильтра WooCommerce
В WooCommerce список доступных способов оплаты можно фильтровать через хук woocommerce_available_payment_gateways. Мы напишем функцию, которая проверит наличие неподтверждённых заказов у пользователя и если таковые есть — отключит все или определённые способы оплаты.
Пример кода для functions.php или собственного плагина:
add_filter('woocommerce_available_payment_gateways', 'disable_payments_if_unconfirmed_orders');
function disable_payments_if_unconfirmed_orders($available_gateways) {
if (!is_user_logged_in()) {
return $available_gateways; // Для гостей не меняем
}
$user_id = get_current_user_id();
$args = [
'customer_id' => $user_id,
'status' => ['pending', 'on-hold', 'failed'],
'limit' => 1,
];
$orders = wc_get_orders($args);
if (!empty($orders)) {
// Отключаем все способы оплаты, кроме наличных (например)
foreach ($available_gateways as $gateway_id => $gateway) {
if ($gateway_id !== 'cod') { // cod - Cash on Delivery
unset($available_gateways[$gateway_id]);
}
}
}
return $available_gateways;
}
В этом примере если у пользователя есть неподтверждённые заказы, он сможет оплатить только наличными при доставке (если такой способ активен). Вы можете адаптировать логику под свои нужды, например, отключить все способы или только некоторые.
Как проверить, что решение работает
- Авторизуйтесь на сайте под пользователем с незавершённым заказом (статус pending/on-hold/failed).
- Перейдите в корзину и к оформлению заказа.
- Проверьте список доступных способов оплаты — там должны отображаться только разрешённые согласно логике (например, только «наличные»).
- Для пользователя без неподтверждённых заказов доступны все способы.
Для дополнительной проверки можно вызывать wc_get_orders в консоли браузера через AJAX или временно выводить количество неподтверждённых заказов в админке или на фронтенде.
Частые ошибки и как их исправить
- Пользователи-гости не видят способы оплаты. В коде выше мы игнорируем гостей, так как у них нет ID для проверки заказов. Если нужно, добавьте обработку по email или сессии.
- Фильтр не срабатывает — способы оплаты не изменяются. Проверьте, что хук
woocommerce_available_payment_gatewaysдобавлен правильно и код загружается. Можно добавитьerror_logдля отладки. - Некорректные статусы заказов. Убедитесь, что в массиве статусов именно те, которые вы считаете «неподтверждёнными».
- Способы оплаты не отображаются вообще. Возможно, в массиве
$available_gatewaysудалены все способы. Проверьте логику удаления.
Практические советы по безопасности и производительности
- Добавляйте
'limit' => 1в запросwc_get_ordersдля уменьшения нагрузки, если достаточно проверить наличие хотя бы одного неподтверждённого заказа. - Кэшируйте результат проверки в сессии или transient, чтобы не делать запрос при каждом обновлении страницы оформления.
- Не забудьте тестировать в разных сценариях (гости, разные роли, разные статусы заказов).
- Следите за обновлениями WooCommerce — иногда меняется API заказов.
Сравнение вариантов реализации
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Добавление фильтра вручную | Полный контроль, нет лишних плагинов | Нужно поддерживать код самостоятельно |
| Плагин для управления способами оплаты | Готовые решения с интерфейсом | Быстрое внедрение, настройки через админку | Может быть тяжеловесным, не всегда подходит под логику |
| WPShop Clearfy Pro | Плагин оптимизации с возможностью чистки и настройки WooCommerce | Интегрируется с другими инструментами WPShop | Платный, возможно избыточен для простой задачи |