WooCommerce: автоматическое отключение платежей при неуспешной оплате

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

В интернет-магазинах на WooCommerce часто возникают ситуации, когда пользователь пытается оплатить заказ, но транзакция не проходит (например, из-за ошибок платежного шлюза, недостатка средств или технических сбоев). При этом заказ может оставаться в статусе "в ожидании оплаты" или "обрабатывается", а платежные методы продолжают отображаться и предлагаться клиенту. Это создает риск дублирования попыток оплаты и путаницы в админке.

Автоматическое отключение доступных способов оплаты для таких заказов позволяет:

  • Избежать повторных неудачных платежей;
  • Облегчить администрирование заказов;
  • Повысить удобство для клиента, исключая бесполезные варианты оплаты.

Пошаговое решение: как реализовать автоматическое отключение платежей

1. Определяем триггер для отключения платежей

В WooCommerce статус заказа failed или pending обычно означает неуспешную или незавершенную оплату. Мы будем проверять статус текущего заказа и отключать способы оплаты, если он не оплачен.

2. Используем фильтр woocommerce_available_payment_gateways

Этот фильтр позволяет изменять список доступных платежных шлюзов на странице оформления заказа. Добавим проверку статуса заказа и отключим все способы оплаты, если заказ не оплачен.

add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateways_for_failed_orders', 10, 1);
function disable_payment_gateways_for_failed_orders($available_gateways) {
    if (is_admin()) {
        return $available_gateways; // Не изменяем в админке
    }
    
    if (is_checkout()) {
        $order_id = isset(WC()->session) ? WC()->session->get('order_awaiting_payment') : 0;
        if (!$order_id) {
            return $available_gateways; // Заказ не найден, ничего не меняем
        }
        $order = wc_get_order($order_id);
        if (!$order) {
            return $available_gateways;
        }
        // Проверяем статус заказа
        if (in_array($order->get_status(), array('failed', 'pending'))) {
            // Отключаем все способы оплаты
            return array();
        }
    }
    return $available_gateways;
}

3. Улучшение UX: вывод сообщения клиенту

Если все платежные методы отключены, нужно уведомить пользователя причину. Добавим показ сообщения на странице оформления заказа.

add_action('woocommerce_checkout_before_customer_details', 'show_payment_disabled_message');
function show_payment_disabled_message() {
    $order_id = isset(WC()->session) ? WC()->session->get('order_awaiting_payment') : 0;
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }
    if (in_array($order->get_status(), array('failed', 'pending'))) {
        wc_print_notice('Оплата для вашего заказа временно недоступна. Пожалуйста, свяжитесь с поддержкой для уточнения.', 'error');
    }
}

Проверка результата после внедрения

  • Создайте тестовый заказ и переведите его в статус failed или pending через админку или программно.
  • Перейдите на страницу оформления оплаты для этого заказа (например, через ссылку "Оплатить заказ" в письме).
  • Убедитесь, что список способов оплаты пуст и отображается уведомление о недоступности оплаты.
  • Для заказов со статусом processing или completed способы оплаты должны быть доступны, как обычно.

Частые ошибки и как их исправить

1. Способы оплаты не отключаются

  • Проверьте, что хук woocommerce_available_payment_gateways подключен и код выполняется.
  • Убедитесь, что в сессии корректно хранится ID заказа order_awaiting_payment. В некоторых случаях он может отсутствовать — тогда потребуется уточнить логику получения заказа.

2. Сообщение не отображается

  • Проверьте, что функция wc_print_notice вызывается в правильном хуке woocommerce_checkout_before_customer_details.
  • Проверьте, что шаблон оформления заказа не переопределен и поддерживает отображение уведомлений.

3. Клиенты не понимают причину

  • Расширьте текст сообщения, добавьте ссылку на страницу поддержки или контакты.

Практические советы по производительности и безопасности

  • Не используйте отключение методов оплаты на глобальном уровне — всегда проверяйте статус конкретного заказа.
  • Обрабатывайте возможные ошибки получения заказа, чтобы не допустить сбоев на странице оформления.
  • Кэширование страницы оформления заказов может препятствовать динамическому изменению способов оплаты. Отключайте кэширование для таких страниц.

Сравнение вариантов реализации отключения платежей

СпособПлюсыМинусы
Фильтр woocommerce_available_payment_gatewaysПростота, гибкость, не требует плагиновНеобходимо корректно получать заказ, зависит от сессии
Плагин с настройкамиУдобство для неразработчиков, готовые UIДополнительная нагрузка, ограниченная кастомизация
Изменение статусов вручнуюКонтроль админаРучная работа, не автоматизировано
Оптимизация базы данных WordPress: как ускорить сайт и снизить нагрузку
15.11.2025
Как запретить доступ к REST API в WordPress для неавторизованных пользователей
16.04.2026
Запрет доступа к административной панели WordPress по IP
19.03.2026
Как использовать REST API в WordPress для автоматизации задач
30.11.2025
Как автоматизировать удаление нерабочих ссылок в WordPress
09.01.2026