Диагностика проблемы: почему нужно отключать оплату для неподтверждённых заказов
В стандартном WooCommerce оплата доступна сразу после создания заказа, даже если заказ ещё не подтверждён. Это может привести к ошибочной оплате, если заказ не будет обработан или отменён. Задача — автоматически отключать возможность оплаты для заказов, которые не подтверждены (например, статус "on-hold" или кастомный статус), чтобы избежать финансовых конфликтов и упростить управление заказами.
Пошаговое решение: как запретить оплату для неподтверждённых заказов через хук WooCommerce
Для решения задачи мы будем использовать фильтр woocommerce_payment_gateways и проверять статус текущего заказа. Если заказ неподтверждён, уберём все способы оплаты, чтобы клиент не мог оплатить.
1. Функция для проверки статуса заказа и отключения оплаты
add_filter('woocommerce_available_payment_gateways', 'disable_payment_for_unconfirmed_orders', 10, 1);
function disable_payment_for_unconfirmed_orders($available_gateways) {
if (is_admin()) {
return $available_gateways; // Не изменяем в админке
}
// Получаем текущий заказ из сессии или запроса
if (isset(WC()->session)) {
$order_id = WC()->session->get('order_awaiting_payment');
} else {
$order_id = false;
}
if (!$order_id) {
return $available_gateways; // Нет заказа, показываем методы оплаты
}
$order = wc_get_order($order_id);
if (!$order) {
return $available_gateways;
}
// Проверяем статус заказа
$unconfirmed_statuses = array('on-hold', 'pending'); // добавьте свои статусы
if (in_array($order->get_status(), $unconfirmed_statuses)) {
// Отключаем все методы оплаты
$available_gateways = array();
}
return $available_gateways;
}2. Регистрация кастомного статуса (при необходимости)
Если требуется отдельный статус, например "awaiting-confirmation", его нужно зарегистрировать и настроить. Для простоты рассмотрим стандартные статусы.
Как проверить, что решение сработало
- Создайте заказ с одним из указанных неподтверждённых статусов (например, "on-hold").
- Попробуйте перейти на страницу оплаты — методы оплаты не должны отображаться.
- Для заказа со статусом "processing" или "completed" методы оплаты должны отображаться нормально.
Частые ошибки и как их исправить
- Методы оплаты не скрываются: Проверьте, что
order_awaiting_paymentкорректно записан в сессию. Иногда сессия может быть пустой, если страница не на этапе оплаты. В таком случае можно использовать альтернативные методы получения ID заказа. - Отключается оплата для всех заказов: Проверьте правильность проверки статуса заказа и используемые статусы в массиве
$unconfirmed_statuses. - Ошибка в админке: Добавленная функция не должна влиять на админку — проверка
is_admin()важна.
Практические советы по безопасности и производительности
- Не храните ID заказа в некорректных местах — используйте стандартные методы WooCommerce для доступа к заказу на странице оплаты.
- Минимизируйте количество вызовов
wc_get_order()— кешируйте объект, если нужно несколько раз обращаться. - Тестируйте логику на разных статусах и ролях пользователей, чтобы избежать блокировки оплаты для администраторов и операторов.
Сравнение вариантов реализации отключения оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_available_payment_gateways | Удаление способов оплаты по статусу заказа | Простота, гибкость, не требует сторонних плагинов | Требует правильной логики получения заказа |
| Плагин с настройками | Использование готового плагина для ограничения оплаты | Удобный интерфейс, поддержка | Может быть избыточным, нагрузка, платные решения |
| Кастомный JavaScript | Скрытие способов оплаты на фронтенде | Быстрое решение | Ненадежно, обходится, не влияет на серверную логику |