wp-code.ru wordpress WP-Codе

Как программно исключить методы оплаты в WooCommerce по условиям в 2024

Диагностика проблемы: необходимость исключения методов оплаты

В WooCommerce часто возникает задача ограничить доступные способы оплаты в зависимости от условий: геолокации покупателя, стоимости заказа, выбранных товаров, роли пользователя и других параметров. Например, нужно отключить оплату при получении (наложенный платеж) для удаленных регионов или убрать оплату картой при заказе с купонами на скидку.

Стандартные настройки WooCommerce позволяют задать ограничения по стране или валюте, но гибкая логика требует программного вмешательства.

Пошаговое решение: исключение методов оплаты с помощью фильтра woocommerce_available_payment_gateways

Шаг 1. Определение условий

Прежде чем писать код, четко определите, при каких условиях метод оплаты должен быть отключен. Например:

  • Исключить метод "наложенный платеж" для региона Москва
  • Исключить оплату картой при сумме заказа меньше 1000 руб.
  • Исключить "PayPal" для пользователей с ролью "подписчик"

Шаг 2. Добавление фильтра в functions.php или в кастомный плагин

Ниже пример кода с тремя разными условиями:

add_filter('woocommerce_available_payment_gateways', 'custom_disable_payment_gateways_by_conditions', 10, 1); 
function custom_disable_payment_gateways_by_conditions($available_gateways) {
    if (is_admin()) return $available_gateways; // Не трогаем админ панель

    $user = wp_get_current_user();
    $order_total = WC()->cart->total;
    $customer = WC()->customer;
    $billing_state = isset($customer) ? $customer->get_billing_state() : '';

    // Условие 1: отключить 'cod' в Москве (RU-MOW)
    if (isset($available_gateways['cod']) && ($billing_state === 'MOW' || $billing_state === 'Москва')) {
        unset($available_gateways['cod']);
    }

    // Условие 2: отключить 'bacs' если сумма заказа меньше 1000
    if (isset($available_gateways['bacs']) && $order_total < 1000) {
        unset($available_gateways['bacs']);
    }

    // Условие 3: отключить 'paypal' для пользователей с ролью subscriber
    if (isset($available_gateways['paypal']) && in_array('subscriber', (array) $user->roles)) {
        unset($available_gateways['paypal']);
    }

    return $available_gateways;
}

Объяснение кода

  • woocommerce_available_payment_gateways — фильтр, который позволяет изменить список доступных способов оплаты перед отображением.
  • В функции проверяем текущие условия: регион, сумма, роль пользователя.
  • Удаляем из массива $available_gateways ненужные методы.

Проверка результата после внедрения

Чтобы убедиться, что методы оплаты отключаются корректно:

  • Залогиньтесь под разными пользователями с разными ролями.
  • Измените адрес для биллинга, указав разные регионы, например, Москва и другие.
  • Проверьте корзину с суммой меньше и больше 1000 рублей.
  • На странице оформления заказа убедитесь, что нужные способы оплаты отсутствуют.
  • Используйте инструменты разработчика браузера, чтобы проверить, что соответствующие HTML-блоки методов оплаты не выводятся.

Частые ошибки и как их исправить

  • Методы оплаты не исчезают: возможно, код расположен в неправильном месте или кэш страницы нужно очистить. Проверьте, что фильтр добавлен в functions.php активной темы или в плагине, и что кэш (например, от плагинов кеширования) сброшен.
  • Ошибка undefined index: проверяйте существование ключа в $available_gateways перед удалением, как в примере выше.
  • Условия не срабатывают: убедитесь, что используете правильные идентификаторы региона (например, RU-MOW, MOW, или русские названия). Можно вывести var_dump(WC()->customer->get_billing_state()) для проверки.
  • Код влияет на админку: добавьте проверку if (is_admin()) return $available_gateways;, чтобы не ломать админ-панель.

Практические советы по безопасности и производительности

  • Не используйте тяжелые запросы внутри фильтра оплаты — это может замедлить загрузку страницы оформления заказа.
  • Кешируйте результаты, если условия сложные и требуют запросов к базе данных.
  • Тестируйте код на staging-сайте перед выводом в продакшен.
  • Избегайте прямого изменения файлов ядра WooCommerce — используйте хуки и фильтры.

Сравнение подходов: плагин vs код

СпособПлюсыМинусыКогда использовать
Плагин для условий оплатыПростота настройки, не требует кода, часто GUIМожет быть тяжеловесным, ограничен функционалЕсли условия простые и нет опыта программирования
Программный фильтр в functions.phpГибкость, контроль, легковесностьТребует навыков программирования, ошибки влияют на сайтЕсли нужны нестандартные условия и высокая кастомизация

Чек-лист для внедрения фильтра исключения методов оплаты

  • Определить точные условия исключения методов оплаты
  • Подключить фильтр woocommerce_available_payment_gateways
  • Проверить доступность ключей методов оплаты в массиве
  • Добавить условия и удалить методы из массива
  • Добавить защиту от выполнения в админке
  • Очистить кэш сайта и браузера
  • Протестировать в разных условиях и с разными пользователями
  • Протестировать в staging-среде перед продакшеном
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше