Сообщение Payment gateway is not available обычно всплывает не из-за одной «поломанной» кнопки, а из-за несоответствия условий: валюта, страна, способ доставки, статус заказа, настройки самого шлюза или конфликт с плагином/темой. Важно не гадать, а быстро сузить круг причин.
Когда ошибка появляется и что именно она означает
В WooCommerce шлюз оплаты может скрываться намеренно. Например, если способ доступен только для конкретных стран, только при определённой валюте или только когда в корзине есть доставка. Поэтому сообщение не всегда означает баг. Чаще это сигнал, что WooCommerce не считает выбранный метод оплаты допустимым для текущего заказа.
Типичный сценарий: покупатель видит способ оплаты на странице оформления, но после выбора доставки или изменения адреса он исчезает. Второй сценарий — шлюз есть в админке, но не показывается вообще. Третий — ошибка возникает только для части заказов, например при самовывозе или при заказе из другой страны.
Диагностика проблемы: что проверить первым
Начинайте с условий, которые WooCommerce проверяет раньше всего. Это быстрее, чем сразу лезть в код.
Проверьте настройки самого способа оплаты
Откройте WooCommerce → Настройки → Платежи и посмотрите, не ограничен ли шлюз по странам, валюте или типу клиента. У некоторых плагинов для оплаты есть собственные поля доступности, и они могут конфликтовать с базовыми настройками магазина.
Проверьте валюту и страну магазина
Если шлюз поддерживает только определённые валюты, а магазин работает в другой, WooCommerce может скрыть его без явного предупреждения. То же самое касается страны магазина и страны доставки. Для международных магазинов это частая причина «пропавшей» оплаты.
Проверьте доставку и адрес
Некоторые способы оплаты доступны только если выбран метод доставки или если корзина не пустая по физическим товарам. Если в корзине только виртуальные товары, а шлюз рассчитан на доставку, он может не показываться.
Проверьте конфликты плагинов
Особенно часто мешают плагины кэширования, кастомные плагины доставки, мультивалютность и плагины, которые меняют checkout через AJAX. Если проблема появилась после обновления, сначала отключите всё, что влияет на корзину и оформление заказа, кроме WooCommerce.
Пошаговое решение без лишних рисков
Шаг 1. Включите логирование шлюза
Если у платёжного плагина есть логирование, включите его. В WooCommerce это обычно делается в настройках конкретного шлюза. Логи помогут понять, почему метод оплаты не прошёл проверку доступности.
Параллельно откройте WooCommerce → Статус → Журналы и посмотрите свежие записи. Если шлюз пишет причину отказа, это самый быстрый путь к решению.
Шаг 2. Проверьте доступность через тестовый заказ
Сделайте заказ с разными комбинациями:
- другая страна доставки;
- другая валюта, если магазин мультивалютный;
- физический товар и виртуальный товар;
- разные способы доставки;
- гость и авторизованный пользователь.
Так вы поймёте, на каком именно условии шлюз исчезает.
Шаг 3. Отключите кэш и оптимизацию checkout
Страницы корзины и оформления заказа не должны кэшироваться как обычные страницы. Если кэш-плагин или серверный кэш отдаёт старую версию checkout, WooCommerce может показать неактуальный список способов оплаты. Для проверки временно отключите кэширование checkout и очистите кэш сайта, браузера и CDN.
Шаг 4. Проверьте конфликт в безопасном режиме
Если у вас есть staging-копия, отключите все плагины кроме WooCommerce и платёжного шлюза. Затем переключите тему на стандартную, например Storefront, и повторите тест. Если ошибка исчезла, причина почти наверняка в конфликте плагина или темы.
Когда нужен код: точечная проверка доступности шлюза
Если проблема связана не с плагином оплаты, а с вашими условиями магазина, можно явно управлять доступностью метода через фильтр woocommerce_available_payment_gateways. Это полезно, когда нужно скрыть или оставить шлюз только для конкретных заказов.
add_filter( 'woocommerce_available_payment_gateways', function( $gateways ) {
if ( is_admin() ) {
return $gateways;
}
if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
return $gateways;
}
$chosen_shipping_methods = WC()->session ? WC()->session->get( 'chosen_shipping_methods' ) : array();
$shipping_method = ! empty( $chosen_shipping_methods[0] ) ? $chosen_shipping_methods[0] : '';
// Пример: скрываем cod, если выбран самовывоз.
if ( isset( $gateways['cod'] ) && $shipping_method === 'local_pickup' ) {
unset( $gateways['cod'] );
}
return $gateways;
} );Этот пример не «чинит» саму ошибку, но помогает быстро проверить, не ломает ли доступность шлюза ваша логика доставки. Если после временного отключения такого кода проблема исчезает, значит причина в условии, а не в платёжном плагине.
Пример: принудительно скрыть шлюз для виртуальных товаров
Иногда платёжный метод рассчитан только на физические заказы. Тогда лучше явно задать правило, чем надеяться на поведение плагина.
add_filter( 'woocommerce_available_payment_gateways', function( $gateways ) {
if ( ! WC()->cart ) {
return $gateways;
}
$has_physical_product = false;
foreach ( WC()->cart->get_cart() as $item ) {
if ( empty( $item['data'] ) ) {
continue;
}
if ( ! $item['data']->is_virtual() ) {
$has_physical_product = true;
break;
}
}
if ( ! $has_physical_product && isset( $gateways['banktransfer'] ) ) {
unset( $gateways['banktransfer'] );
}
return $gateways;
} );Сравнение подходов: плагин, код или настройка
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройки шлюза | Ограничения по странам, валюте, типу заказа | Быстро, без кода | Не помогает, если конфликт в теме или другом плагине |
| Код через фильтр | Нужна точная логика доступности | Контроль над условиями | Требует тестирования после обновлений |
| Отключение конфликтующих плагинов | Ошибка появилась после обновления | Находит источник проблемы | Нужно время и staging |
Как проверить, что решение сработало
Проверка должна быть не одной, а минимум в трёх сценариях:
- Оформление заказа с гостевого аккаунта.
- Оформление заказа после входа в учётную запись.
- Оформление заказа с другой доставкой или другой страной.
После исправления способ оплаты должен:
- появляться стабильно на checkout;
- не исчезать после смены доставки;
- сохраняться после обновления страницы;
- не ломать создание заказа в админке.
Дополнительно откройте журнал WooCommerce и убедитесь, что новых ошибок от платёжного шлюза нет. Если у плагина оплаты есть тестовый режим, прогоните тестовую транзакцию до конца, а не только до нажатия кнопки оплаты.
Частые ошибки и как их исправить
Шлюз скрыт из-за страны магазина
Проверьте, не ограничен ли метод оплаты только одной страной. Это особенно заметно после переноса магазина или смены целевой аудитории.
Кэш показывает старый checkout
Очистите кэш страницы оформления заказа, корзины и мини-корзины. Если используется CDN, убедитесь, что checkout исключён из кэширования.
Плагин оплаты конфликтует с плагином доставки
Некоторые плагины доставки меняют AJAX-обновление checkout. В результате WooCommerce не успевает пересчитать доступные шлюзы. Решение — тестировать по одному плагину и смотреть, на каком шаге метод оплаты исчезает.
Неправильный ID шлюза в коде
Если вы используете фильтр woocommerce_available_payment_gateways, проверьте ID метода оплаты. Он не всегда совпадает с названием на экране. Ошибка в ID приведёт к тому, что код просто не сработает.
Логика в коде завязана на пустую корзину
Иногда разработчики обращаются к WC()->cart слишком рано, до инициализации корзины. Тогда условие работает нестабильно. Для таких случаев лучше проверять наличие объекта и не рассчитывать на него в админке.
Практические советы по безопасности и производительности
Не правьте платёжный плагин напрямую в его файлах. После обновления изменения пропадут, а при ошибке в коде можно сломать checkout. Используйте дочернюю тему, mu-plugin или отдельный мини-плагин для кастомной логики.
Если вы добавляете собственные условия доступности шлюзов, держите код простым и предсказуемым. Чем больше запросов к базе на каждом обновлении checkout, тем выше шанс получить лишнюю нагрузку и трудноуловимые ошибки. Для логики «показывать/скрывать» достаточно данных корзины, сессии и заказа.
Для магазинов с регулярными проблемами checkout полезно отдельно проверить кэш-плагины. В некоторых случаях проще настроить исключения для корзины и оформления заказа, чем потом ловить случайные исчезновения способов оплаты у покупателей.
Если нужен более широкий контроль над SEO, дублями и технической чисткой сайта, такие задачи обычно решают отдельными инструментами вроде Clearfy Pro, но к самой ошибке Payment gateway is not available это относится только косвенно: сначала нужно восстановить корректную работу checkout, а уже потом оптимизировать сайт.