WooCommerce: автоматическое отключение оплаты при неподтверждённом заказе с помощью хука

Диагностика проблемы: почему нужно отключать оплату для неподтверждённых заказов

В стандартном 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Скрытие способов оплаты на фронтендеБыстрое решениеНенадежно, обходится, не влияет на серверную логику
Как создать автоматический импорт данных из Google Sheets в WordPress
29.01.2026
Оптимизация UА в WordPress: снижение затрат на оплату услуг провайдеров
20.05.2025
Автоматизация управления задачами в WordPress с WPTasks и Clearfy
20.03.2026
WooCommerce: автоматическое отключение оплаты при неподтверждении заказа
15.06.2026
Как автоматизировать отправку сообщений в Telegram из WordPress
17.04.2026