Диагностика задачи: зачем и когда нужно удалять методы оплаты в WooCommerce
В стандартной ситуации WooCommerce показывает все активные методы оплаты на странице оформления заказа. Однако нередко возникает необходимость ограничить способы оплаты в зависимости от условий: страны покупателя, суммы заказа, роли пользователя, выбранного способа доставки и других параметров. Например, отключить оплату банковским переводом для заказов менее 1000 рублей или скрыть оплату при получении при доставке курьером.
Решение такой задачи помогает улучшить UX, снизить количество ошибок и повысить конверсию. В этом руководстве разберём, как программно удалять методы оплаты, используя штатные хуки WooCommerce, без плагинов.
Как WooCommerce загружает методы оплаты: разбор фильтра woocommerce_available_payment_gateways
Методы оплаты в WooCommerce можно отфильтровать через хук woocommerce_available_payment_gateways. Он получает массив объектов всех доступных платежных шлюзов, и мы можем удалять из него ненужные элементы по нужным условиям.
Ключи массива совпадают с ID методов оплаты, например, 'cod' — оплата при получении, 'bacs' — банковский перевод, 'paypal' — PayPal.
Пример базовой фильтрации
add_filter('woocommerce_available_payment_gateways', 'filter_payment_gateways_by_order_amount', 10, 1);
function filter_payment_gateways_by_order_amount($available_gateways) {
if (!is_checkout()) return $available_gateways;
$order_total = WC()->cart->total;
if ($order_total < 1000) {
unset($available_gateways['bacs']); // Убираем банковский перевод
}
return $available_gateways;
}
В этом примере метод «банковский перевод» отключается для заказов с суммой меньше 1000.
Пошаговая настройка удаления методов оплаты по разным условиям
1. Проверка страницы оформления заказа
Чтобы не влиять на административные страницы или другие части сайта, проверяйте, что код запускается только на странице оформления заказа:
if (!is_checkout()) return $available_gateways;2. Получение данных заказа и пользователя
Для условий используйте данные корзины и текущего пользователя:
$order_total = WC()->cart->total;
$user = wp_get_current_user();
$user_roles = $user->roles;3. Фильтрация методов оплаты по стране доставки
Пример исключения способа оплаты для страны России:
$shipping_country = WC()->customer->get_shipping_country();
if ($shipping_country === 'RU') {
unset($available_gateways['cod']); // исключаем оплату при получении для России
}4. Исключение по способу доставки
Если нужно убрать метод оплаты для определённого способа доставки:
$chosen_shipping_methods = WC()->session->get('chosen_shipping_methods');
if (in_array('flat_rate:10', (array) $chosen_shipping_methods)) {
unset($available_gateways['paypal']);
}Как проверить, что методы оплаты удалились корректно
- Перейдите на страницу оформления заказа в интерфейсе сайта.
- Измените условия (например, сумму корзины, адрес доставки).
- Убедитесь, что нужные методы оплаты пропали или остались.
- Проверьте в консоли браузера, что нет ошибок JavaScript, влияющих на отображение.
- Временно включите логирование через
error_log(print_r($available_gateways, true));для отладки.
Частые ошибки и как их исправить
Ошибка 1: Методы оплаты не изменяются
- Причина: фильтр подключён слишком рано или поздно, либо условие
is_checkout()не срабатывает. - Решение: подключайте фильтр в
functions.phpили плагине с приоритетом 10, убедитесь, что проверкаis_checkout()возвращает true.
Ошибка 2: Удаляется не тот метод оплаты
- Причина: неверный ключ массива.
- Решение: введите временный вывод
error_log(print_r(array_keys($available_gateways), true));для определения корректных ID методов оплаты.
Ошибка 3: Конфликты с плагинами оплаты
- Причина: плагины могут динамически менять методы оплаты.
- Решение: протестируйте код с отключенными сторонними плагинами, затем добавляйте по одному для выявления конфликта.
Практические советы по безопасности и производительности
- Не храните чувствительные данные внутри фильтра, используйте только доступные через API WooCommerce.
- Избегайте сложных запросов к базе данных внутри фильтра, чтобы не замедлять работу страницы оформления заказа.
- Для сложных условий используйте кэширование результатов внутри сессии или transient API.
- Проверяйте совместимость с обновлениями WooCommerce и PHP.
Сравнение способов удаления методов оплаты
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
Хук woocommerce_available_payment_gateways | Легко реализуется, гибкий | Зависит от правильности условий | unset($available_gateways['cod']); |
| Плагины фильтрации оплаты | Графический интерфейс, дополнительные функции | Нагрузка, зависимость от стороннего кода | WooCommerce Conditional Payment Methods |
| JS-скрипты скрытия | Простая визуальная настройка | Не защищает от выбора при сабмите | jQuery скрытие элементов |