wp-code.ru wordpress WP-Codе

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

Диагностика задачи: зачем и когда нужно удалять методы оплаты в 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 скрытие элементов
×

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

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

пишет статьи

готовит SEO

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

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