Почему важно автоматически отключать платёжные системы в WooCommerce
В интернет-магазинах на WooCommerce бывают ситуации, когда необходимо ограничить методы оплаты в зависимости от условий заказа: суммы, категории товаров, страны доставки, статуса пользователя и других параметров. Это помогает избежать ошибок, снизить риски мошенничества и улучшить UX.
Диагностика проблемы: как понять, что платёжные системы не фильтруются
- Пользователи видят неподходящие способы оплаты, например, онлайн-оплату при выборе самовывоза.
- Невозможно ограничить оплату для отдельных категорий товаров.
- Нарушения бизнес-логики, когда метод оплаты не должен быть доступен для определённых клиентов или заказов.
Если вы столкнулись с этими симптомами, значит, нужна кастомизация.
Пошаговое решение: отключаем платёжные системы по условиям
1. Используем фильтр woocommerce_available_payment_gateways
Этот фильтр позволяет изменить массив доступных платёжных способов на странице оформления заказа. В нём можно реализовать любую бизнес-логику.
2. Пример кода для отключения метода "Оплата при доставке" (cod), если сумма заказа меньше 1000 рублей
add_filter('woocommerce_available_payment_gateways', 'custom_disable_payment_gateways_by_order_amount');
function custom_disable_payment_gateways_by_order_amount($available_gateways) {
if (is_admin()) return $available_gateways; // не менять в админке
$minimum_amount = 1000;
$order_total = WC()->cart->total;
if ($order_total < $minimum_amount) {
if (isset($available_gateways['cod'])) {
unset($available_gateways['cod']);
}
}
return $available_gateways;
}3. Отключение оплаты по предоплате для определённой категории товаров
add_filter('woocommerce_available_payment_gateways', 'disable_payment_for_category');
function disable_payment_for_category($available_gateways) {
if (is_admin()) return $available_gateways;
$target_category = 'vip-products';
$disable_gateway = 'bacs'; // банковский перевод
$has_target_category = false;
foreach (WC()->cart->get_cart() as $cart_item) {
if (has_term($target_category, 'product_cat', $cart_item['product_id'])) {
$has_target_category = true;
break;
}
}
if ($has_target_category && isset($available_gateways[$disable_gateway])) {
unset($available_gateways[$disable_gateway]);
}
return $available_gateways;
}Как проверить, что решение сработало
- Пройдите на страницу оформления заказа с суммой ниже заданного порога — метод оплаты должен исчезнуть.
- Добавьте в корзину товар из нужной категории — отключённый метод оплаты не должен отображаться.
- Проверьте в разных браузерах и с разными пользователями.
- Убедитесь, что в админке методы оплаты доступны без изменений.
Частые ошибки и как их исправить
- Код не срабатывает в админке: фильтр применяется и в админке — нужно проверять
is_admin()и возвращать без изменений. - Ошибки из-за кеширования: если включено кеширование страниц, изменения могут не применяться мгновенно — отключите кеш на страницах оформления заказа.
- Неверные ключи платёжных систем: используйте точные ID методов оплаты, которые можно посмотреть в настройках WooCommerce или через
var_dump($available_gateways). - Условия не учитывают все варианты: обязательно тестируйте разные комбинации товаров и сумм.
Практические советы по безопасности и производительности
- Не храните в сессии или куках результаты фильтрации — всегда рассчитывайте динамически на основе текущей корзины.
- Избегайте слишком сложных и ресурсоёмких условий в фильтре, чтобы не замедлять страницу оформления.
- Тестируйте совместимость с основными плагинами кеширования и оптимизации.
- Для сложных условий (например, интеграция с внешними сервисами) используйте AJAX и кеширование транзиентов.
Сравнение способов решения задачи
| Способ | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_available_payment_gateways в functions.php | Быстро, без плагинов, гибко | Требует навыков PHP, возможные ошибки в коде |
| Плагины фильтрации платежей (например, Conditional Payment Gateways) | Простой интерфейс, готовые правила | Может быть платным, нагрузка на сайт |
| Модификация шаблонов WooCommerce | Полный контроль над выводом | Сложнее поддерживать, не фильтрует методы, а только скрывает |