Как отключить оплату при недоступности PayPal в WooCommerce

Если в магазине WooCommerce PayPal используется как один из основных способов оплаты, его временная недоступность быстро превращается в проблему на кассе: покупатель видит метод оплаты, выбирает его, а затем получает ошибку на последнем шаге. В итоге растут брошенные заказы и обращения в поддержку. В этой статье разберём рабочий вариант: как автоматически скрывать PayPal, когда он не отвечает, и как проверить, что логика действительно работает.

Когда это нужно и как выглядит проблема

Сценарий обычно один и тот же: шлюз PayPal внешне доступен в настройках WooCommerce, но в конкретный момент API отвечает с таймаутом, DNS не резолвится, либо на стороне провайдера идёт сбой. Для администратора магазин «вроде бы работает», а для клиента на checkout появляется ошибка или зависание.

Проверять это вручную неудобно. Если отключать способ оплаты руками, можно пропустить окно сбоя. Если не отключать вовсе, покупатели будут натыкаться на нерабочий метод оплаты. Поэтому практичнее делать это программно: перед показом способов оплаты проверять доступность PayPal и убирать его из списка, если сервис недоступен.

Что именно будем контролировать

  • доступность внешнего URL PayPal по HTTP-запросу;
  • кэширование результата проверки, чтобы не дергать внешний сервис на каждом открытии корзины;
  • скрытие способа оплаты только на витрине, без изменения настроек самого шлюза;
  • понятный fallback, если проверка не удалась.

Диагностика: как понять, что проблема именно в шлюзе

Прежде чем писать код, стоит убедиться, что сбой не связан с темой, кэшем или конфликтом плагинов. В WooCommerce откройте Статус → Журналы и посмотрите логи PayPal, если шлюз их пишет. Также полезно проверить, воспроизводится ли ошибка в режиме инкогнито и при отключённом кэше страницы оформления заказа.

Если ошибка появляется только у части пользователей, проверьте:

  • не кешируется ли страница корзины или checkout;
  • не ломает ли тему вывод кнопок оплаты;
  • не блокирует ли сервер исходящие HTTP-запросы;
  • не истёк ли токен или не изменились ли настройки PayPal в WooCommerce.

Для быстрой проверки доступности внешнего адреса можно использовать обычный запрос с сервера. Если у вас есть доступ к SSH, удобно проверить соединение отдельно от WordPress:

curl -I https://www.paypal.com

Если запрос зависает или возвращает сетевую ошибку, проблема действительно может быть во внешней доступности сервиса, а не в WooCommerce.

Решение: скрываем PayPal, если он недоступен

Ниже — вариант без сторонних плагинов. Он использует фильтр woocommerce_available_payment_gateways, который позволяет изменить список доступных способов оплаты перед выводом на checkout.

Логика простая: делаем короткую проверку доступности PayPal, сохраняем результат в transient на несколько минут и, если сервис недоступен, удаляем шлюз из массива.

Код для functions.php или мини-плагина

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wponline_hide_paypal_when_unavailable' );

function wponline_hide_paypal_when_unavailable( $gateways ) {
    if ( is_admin() ) {
        return $gateways;
    }

    // ID шлюза может отличаться в зависимости от плагина PayPal.
    // Для WooCommerce PayPal Payments часто встречается 'ppcp-gateway'.
    $paypal_gateway_ids = array( 'ppcp-gateway', 'paypal' );

    $is_paypal_up = get_transient( 'wponline_paypal_is_up' );

    if ( false === $is_paypal_up ) {
        $response = wp_remote_get( 'https://www.paypal.com', array(
            'timeout'     => 5,
            'redirection' => 3,
            'sslverify'   => true,
        ) );

        $is_paypal_up = ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) < 500;

        set_transient( 'wponline_paypal_is_up', $is_paypal_up ? '1' : '0', 5 * MINUTE_IN_SECONDS );
    }

    if ( '1' !== $is_paypal_up ) {
        foreach ( $paypal_gateway_ids as $gateway_id ) {
            if ( isset( $gateways[ $gateway_id ] ) ) {
                unset( $gateways[ $gateway_id ] );
            }
        }
    }

    return $gateways;
}

Этот код не отключает PayPal в настройках WooCommerce. Он только убирает способ оплаты из доступных на витрине, если проверка показывает проблему.

Почему здесь нужен transient

Без кэширования каждая загрузка checkout будет делать внешний HTTP-запрос. Это лишняя нагрузка и риск замедления оформления заказа. Transient на 5 минут уменьшает число проверок и делает поведение стабильнее. Интервал можно изменить, но не стоит ставить слишком маленькое значение, если сайт получает много трафика.

Если нужен более безопасный вариант: скрывать только на checkout

Иногда лучше не трогать корзину и мини-корзину, а проверять PayPal только на странице оформления заказа. Это снижает количество неожиданных изменений интерфейса. Тогда добавьте проверку на is_checkout() и не применяйте фильтр в других контекстах.

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wponline_hide_paypal_checkout_only' );

function wponline_hide_paypal_checkout_only( $gateways ) {
    if ( ! function_exists( 'is_checkout' ) || ! is_checkout() ) {
        return $gateways;
    }

    $is_paypal_up = get_transient( 'wponline_paypal_is_up' );

    if ( false === $is_paypal_up ) {
        $response = wp_remote_get( 'https://www.paypal.com', array(
            'timeout'   => 5,
            'sslverify' => true,
        ) );

        $is_paypal_up = ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) < 500;
        set_transient( 'wponline_paypal_is_up', $is_paypal_up ? '1' : '0', 5 * MINUTE_IN_SECONDS );
    }

    if ( '1' !== $is_paypal_up && isset( $gateways['ppcp-gateway'] ) ) {
        unset( $gateways['ppcp-gateway'] );
    }

    return $gateways;
}

Сравнение подходов

ПодходПлюсыМинусы
Плагин для условий оплатыБыстро настраивается без кодаНе всегда умеет проверять доступность внешнего сервиса
Код через фильтр WooCommerceГибко, можно добавить кэш и свои правилаНужна аккуратная проверка ID шлюза
Ручное отключение в админкеПросто и понятноНе подходит для временных сбоев и требует постоянного контроля

Если у вас уже есть плагин для условной логики оплаты, проверьте, умеет ли он реагировать на внешний статус сервиса. Если нет — кодовый вариант обычно надёжнее.

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

После добавления кода не ограничивайтесь визуальной проверкой. Нужны три шага:

  1. Откройте checkout в обычном окне браузера и убедитесь, что PayPal отображается, когда сервис доступен.
  2. Временно подмените адрес проверки на заведомо недоступный URL или отключите исходящий доступ на тестовом стенде и проверьте, что PayPal исчезает из списка.
  3. Очистите transient и повторите проверку после истечения интервала кэша.

Если у вас включён объектный кэш, убедитесь, что transient не «залипает» дольше ожидаемого. В некоторых конфигурациях Redis/Memcached это влияет на скорость обновления статуса.

Что смотреть в логах

  • ошибки WP_Error от wp_remote_get();
  • таймауты соединения;
  • неверный ID шлюза в массиве $gateways;
  • конфликт с плагином, который тоже фильтрует доступные методы оплаты.

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

Неверный ID способа оплаты

У разных плагинов PayPal ID шлюза отличается. Если вы удаляете не тот ключ из массива, метод оплаты продолжит отображаться. Проверьте содержимое массива $gateways через временный error_log() или отладчик.

Слишком частые внешние запросы

Если не кэшировать результат, checkout начнёт зависеть от скорости ответа PayPal. Это плохая идея для магазина с трафиком. Используйте transient и не делайте проверку на каждом запросе.

Кэшируется сама страница оформления заказа

Если checkout попал под полный page cache, покупатели могут видеть устаревший список способов оплаты. Страницы корзины и оформления заказа обычно нужно исключать из кэша на уровне плагина или CDN.

Проверка идёт по слишком «тяжёлому» URL

Не стоит использовать адреса, которые отвечают медленно или редиректят несколько раз. Для проверки доступности нужен короткий и стабильный endpoint. Если ответ нестабилен, лучше проверять не HTML-страницу, а технический URL, который реально отражает доступность сервиса в вашей схеме.

Безопасность и производительность

Не храните в коде лишние секреты и не пытайтесь эмулировать авторизацию в PayPal без необходимости. Для задачи скрытия способа оплаты достаточно обычной HTTP-проверки. Также не увеличивайте timeout слишком сильно: если внешний сервис завис, checkout не должен ждать его десятки секунд.

Если магазин критично зависит от PayPal, имеет смысл заранее продумать резервный способ оплаты. Тогда временное скрытие шлюза не остановит продажи. Для магазинов на WooCommerce полезно держать под рукой и другие инструменты администрирования, например WP-CLI для быстрых проверок конфигурации, но саму логику скрытия лучше оставить в коде, а не в ручных действиях.

Если вам нужно не только скрывать PayPal, но и управлять набором способов оплаты по правилам, удобнее вынести это в отдельный мини-плагин. Так код не потеряется при смене темы и его проще сопровождать.

WooCommerce: автоматическое удаление неактивных заказов по срокам
13.06.2026
Как создать настройку в личном кабинете WordPress для пользователей
10.12.2025
Как отключить автоматические обновления в WordPress
30.01.2026
Как автоматически удалять старые пункты в меню WordPress по дате создания
01.03.2026
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
03.06.2026