Проблема: отложенный платёж и неправильное отображение способов оплаты в WooCommerce
В интернет-магазинах на WooCommerce часто требуется реализовать отложенный платёж — когда пользователь оформляет заказ, но оплачивает его позже. Неправильная настройка может привести к тому, что способы оплаты остаются активными даже после оформления заказа, или наоборот, отключаются преждевременно. Это вызывает путаницу у покупателей и снижает конверсию.
Диагностика проблемы
Проверьте, как WooCommerce обрабатывает статусы заказов и способы оплаты:
- В настройках «Способы оплаты» посмотрите, какие из них активны для конкретных статусов заказов.
- Убедитесь, что в процессе оформления заказа статусы меняются корректно (например,
pending— ожидает оплаты,processing— оплачено). - Проверьте, не конфликтуют ли плагины, которые могут вмешиваться в логику оплаты (кэш, кастомные обработчики статусов).
Для диагностики можно включить логирование WooCommerce через WooCommerce → Статус → Логи и отследить, как меняются статусы и вызываются ли функции отключения способов оплаты.
Пошаговое решение: правильная настройка отложенного платежа
1. Проверка и настройка статусов заказов
По умолчанию WooCommerce использует следующие статусы:
pending— заказ создан, оплата не начата;on-hold— оплата ожидается (например, при банковском переводе);processing— оплата принята, заказ в обработке;completed— заказ выполнен.
Для отложенного платежа чаще используют статус on-hold или создают кастомный статус, чтобы чётко разделять неоплаченные заказы.
2. Отключение способов оплаты после оформления заказа
Чтобы способы оплаты автоматически отключались для оплаченных или в процессе оплаты заказов, нужно использовать хук woocommerce_available_payment_gateways. Ниже пример, который отключает все способы оплаты, если заказ уже оформлен и не имеет статус pending или on-hold:
add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateways_for_paid_orders');
function disable_payment_gateways_for_paid_orders($available_gateways) {
if (is_admin()) return $available_gateways; // В админке не трогаем
// Получаем текущий заказ через сессию или параметр
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
if (!$order_id) return $available_gateways;
$order = wc_get_order($order_id);
if (!$order) return $available_gateways;
$status = $order->get_status();
// Оставляем способы оплаты только для неоплаченных заказов
if (!in_array($status, array('pending', 'on-hold'))) {
return array(); // Отключаем все способы оплаты
}
return $available_gateways;
}
3. Автоматическое отключение определённых способов оплаты по статусу
Если нужно отключать не все, а определённые способы оплаты (например, отключить "Оплата при доставке" для неоплаченных заказов), можно использовать следующий код:
add_filter('woocommerce_available_payment_gateways', 'conditional_disable_payment_methods');
function conditional_disable_payment_methods($available_gateways) {
if (is_admin()) return $available_gateways;
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
if (!$order_id) return $available_gateways;
$order = wc_get_order($order_id);
if (!$order) return $available_gateways;
$status = $order->get_status();
if (!in_array($status, array('pending', 'on-hold'))) {
// Отключаем оплату при доставке
unset($available_gateways['cod']);
}
return $available_gateways;
}
Проверка результата после внедрения
- Оформите заказ с выбранным способом оплаты.
- После оформления попытайтесь перейти на страницу оплаты того же заказа с параметром
?order_id=ID_заказа. - Убедитесь, что способы оплаты отключены или ограничены согласно логике.
- Проверьте смену статусов в админке WooCommerce и соответствие поведения сайта.
Частые ошибки и как их исправить
- Неверное получение ID заказа: Очень часто разработчики пытаются получить заказ из сессии или cookie без проверки. В приведённом коде используется GET-параметр
order_id. Если он отсутствует — способы оплаты не меняются. - Отключение способов оплаты в админке: Не исключайте проверку
is_admin(), иначе администратор не сможет создавать заказы. - Конфликты с кешированием: Если вы используете плагины кеширования, убедитесь, что страницы оформления заказа и оплаты не кешируются.
- Неучёт кастомных статусов: Если на сайте добавлены кастомные статусы заказов, необходимо расширить массив статусов в проверках.
Практические советы по безопасности и производительности
- Используйте проверку nonce и права доступа при получении параметров
order_id, если внедряете код в публичные формы. - Минимизируйте логику в хуках, избегайте лишних запросов к базе внутри фильтров.
- Периодически очищайте старые неоплаченные заказы или архивируйте их, чтобы не создавать нагрузку на базу данных.
- Рассмотрите использование плагина Clearfy Pro для оптимизации WooCommerce и автоматического удаления мусора в базе — https://wpshop.ru/plugins/clearfy?utm_source=wpeducation.ru&utm_medium=article&utm_campaign=woocommerce-pravilnaya-nastrojka-otlozhennogo-platega
Сравнение вариантов реализации отключения способов оплаты
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
Через хук woocommerce_available_payment_gateways |
Гибко, позволяет настроить логику для любых статусов и способов оплаты | Требует программирования, можно ошибиться с логикой | Для кастомных решений и точного контроля |
| Плагины для отложенного платежа (например, WooCommerce Deposits) | Готовое решение с UI, поддержка платежей частями | Может быть избыточным, влияет на производительность | Для магазинов с большой клиентской базой и частичной оплатой |
| Кастомные статусы и правила в админке | Удобно для администраторов, простота использования | Ограниченная автоматизация, требует ручного контроля | Для небольших магазинов с ручным управлением заказами |