Диагностика проблемы: зачем отключать платёжные системы автоматически
В интернет-магазинах на WooCommerce часто требуется ограничить доступность платёжных методов в зависимости от условий — например, валюты, страны покупателя, суммы заказа или типа товара. Без автоматизации приходится вручную менять настройки, что неудобно и рискованно.
Типичные сценарии:
- Отключить "Оплату при получении" для товаров с цифровой доставкой.
- Отключить платёжные системы, не поддерживающие валюту корзины.
- Отключить метод оплаты, если сумма заказа меньше минимального порога.
Как проверить, какие платёжные методы активны и доступны
Для диагностики полезно вывести текущие доступные платёжные методы в корзине и на странице оформления заказа. В файл functions.php темы или в плагин добавьте код:
add_action('woocommerce_review_order_before_payment', function() {
$available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
echo '<pre>';
print_r(array_keys($available_gateways));
echo '</pre>';
});После этого на странице оформления заказа увидите список идентификаторов платёжных методов, доступных в текущих условиях.
Пошаговое решение: отключение платёжных систем по условиям
WooCommerce позволяет фильтровать доступные платёжные методы с помощью фильтра woocommerce_available_payment_gateways. На его основе можно реализовать любую условную логику.
Пример отключения метода оплаты cod (Оплата при получении), если в корзине есть цифровой товар:
add_filter('woocommerce_available_payment_gateways', 'disable_cod_for_digital_products');
function disable_cod_for_digital_products($gateways) {
if (is_admin()) return $gateways; // не трогаем админку
$has_digital = false;
foreach (WC()->cart->get_cart() as $cart_item) {
if (has_term('digital', 'product_type', $cart_item['product_id'])) {
$has_digital = true;
break;
}
}
if ($has_digital && isset($gateways['cod'])) {
unset($gateways['cod']);
}
return $gateways;
}Если у вас нет таксономии product_type с термином digital, лучше ориентироваться на тип WooCommerce:
if ($cart_item['data']->is_downloadable()) {
// товар цифровой
}Другой пример — отключение метода оплаты, если сумма корзины меньше 1000 рублей:
add_filter('woocommerce_available_payment_gateways', 'disable_gateway_min_amount');
function disable_gateway_min_amount($gateways) {
$minimum = 1000; // порог в рублях
if (WC()->cart->total < $minimum) {
if (isset($gateways['bacs'])) { // банковский перевод
unset($gateways['bacs']);
}
}
return $gateways;
}Проверка результата после внедрения
- Очистите кэш браузера и кеш плагинов, если есть.
- Добавьте в корзину товары, соответствующие условию (например, цифровой товар) и перейдите к оформлению заказа — проверьте, что платёжный метод исчез.
- Добавьте товар с другим типом, проверьте доступность метода.
- Проверьте разные суммы заказа для условий с порогами.
- Для отладки можно временно вывести в шаблон или логи список доступных методов перед фильтрацией.
Частые ошибки и как их исправить
- Метод оплаты не отключается: убедитесь, что фильтр
woocommerce_available_payment_gatewaysне перезаписывается другими плагинами. Проверьте приоритет фильтра (можно увеличить, например, до 99). - Условия проверки товаров неверные: используйте методы WooCommerce для проверки типа товара (
is_downloadable(),is_virtual()), а не только таксономии. - Изменения не видны в админке: фильтр работает только на фронтенде, для админки его отключают через
is_admin(). - Не учитывается валюта: используйте
get_woocommerce_currency()для проверки валюты и отключайте неподдерживаемые методы.
Практические советы по производительности и безопасности
- Проверяйте условия и отключайте методы без лишних циклов — например, кешируйте результат проверки товаров в сессии или transient при сложных условиях.
- Не отключайте методы оплаты в админке, чтобы не создавать проблем при создании заказов вручную.
- Для сложных условий можно использовать класс-обертку с методами для читаемого и удобного кода.
- При работе с валютами и геолокацией используйте проверенные сервисы, чтобы избежать ошибок в отображении доступных методов.
Сравнение способов реализации отключения платёжных систем
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
Фильтр woocommerce_available_payment_gateways |
Гибкость, можно реализовать любые условия, без сторонних плагинов | Требует программирования, нужно тестировать | |
| Плагины по условному отображению оплаты | Простота настройки без кода | Могут влиять на производительность, ограничены функционалом | WooCommerce Conditional Shipping and Payments |
| Использование специализированных кастомных полей или мета для товаров | Удобно для сложных правил (например, по атрибутам) | Сложнее поддерживать, требует настройки интерфейса | Код с проверкой мета-данных товаров |