Диагностика проблемы: зачем отключать методы оплаты программно
В WooCommerce часто возникает необходимость отключить определённые способы оплаты не через настройки в админке, а программно — например, на основании условий в коде: геолокация пользователя, сумма заказа, категории товаров или другие кастомные правила. Это помогает контролировать доступность платежей без установки дополнительных плагинов и сохраняет гибкость.
Проверить текущие активные методы оплаты можно через админку WooCommerce в разделе WooCommerce > Настройки > Оплата. Однако если вы хотите динамически менять доступные методы, нужно использовать фильтр woocommerce_available_payment_gateways.
Как отключить методы оплаты по условию через фильтр
Ниже приведён пример кода, который отключает метод оплаты «Чек» (check) и «Наличные» (cod) для заказов с суммой меньше 1000 рублей:
add_filter('woocommerce_available_payment_gateways', 'wpcode_disable_payment_gateways_conditionally');
function wpcode_disable_payment_gateways_conditionally($available_gateways) {
if (is_admin()) return $available_gateways; // Не трогаем админку
$minimum_amount = 1000; // Минимальная сумма заказа
$cart_total = WC()->cart->total;
if ($cart_total < $minimum_amount) {
if (isset($available_gateways['check'])) {
unset($available_gateways['check']);
}
if (isset($available_gateways['cod'])) {
unset($available_gateways['cod']);
}
}
return $available_gateways;
}Этот код нужно добавить в functions.php вашей темы или в отдельный сниппет через плагин типа Code Snippets.
Пример: отключение метода оплаты по геолокации
Если нужно отключить способ оплаты для определённой страны, например, отключить «Оплату при получении» (cod) для пользователей из России:
add_filter('woocommerce_available_payment_gateways', 'wpcode_disable_cod_for_russia');
function wpcode_disable_cod_for_russia($available_gateways) {
if (is_admin()) return $available_gateways;
$customer_country = WC()->customer->get_billing_country();
if ($customer_country === 'RU' && isset($available_gateways['cod'])) {
unset($available_gateways['cod']);
}
return $available_gateways;
}Проверка результата после внедрения
- Добавьте код в
functions.phpили через сниппет. - Обновите страницу оформления заказа.
- Проверьте список доступных методов оплаты в зависимости от условий (сумма корзины, страна и т.п.).
- Для проверки можно временно добавить
error_logилиvar_dumpвнутри функции.
Частые ошибки и как их исправить
- Методы оплаты не отключаются: проверьте, что используете правильные ID методов. Их можно увидеть в
WooCommerce > Настройки > Оплатав URL или в коде плагинов оплаты. - Код влияет на админку: всегда добавляйте проверку
is_admin(), чтобы не ломать админ-панель. - Ошибка при обращении к корзине вне фронта: фильтр срабатывает и в админке, поэтому нужна защита от вызова
WC()->cartпри отсутствии корзины.
Практические советы по безопасности и производительности
- Не используйте жёстко прописанные ID методов оплаты без проверки, так как они могут измениться при обновлениях WooCommerce или плагинов.
- Для сложных условий используйте кэширование результата или минимизируйте количество запросов к базе.
- Тестируйте код на staging-сайте, чтобы исключить конфликты с другими плагинами.
Сравнение вариантов отключения методов оплаты
| Метод | Гибкость | Простота | Зависимость от плагинов |
|---|---|---|---|
| Отключение через админку WooCommerce | Низкая (статично) | Очень просто | Нет |
Фильтр woocommerce_available_payment_gateways в коде | Высокая (динамически) | Средняя (требует программирования) | Нет |
| Плагины для управления методами оплаты | Очень высокая | Просто | Да |