Диагностика задачи: почему нужно менять способы оплаты по ролям
В интернет-магазинах на WooCommerce часто возникает необходимость ограничить или расширить доступные методы оплаты для разных групп пользователей. Например, оптовым клиентам можно разрешить оплату по счету, а розничным — только через онлайн-платежи. Без кастомных настроек WooCommerce предлагает единую схему оплаты для всех. Чтобы реализовать гибкую логику, требуется вмешательство в код.
Пошаговое решение: фильтрация способов оплаты по ролям
1. Получение роли текущего пользователя
Первым делом необходимо определить, под какой ролью зашел пользователь. Если пользователь не авторизован, роль будет отсутствовать.
function get_current_user_role() {
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
$roles = (array) $user->roles;
return array_shift( $roles ); // возвращает первую роль
}
return false; // гость
}2. Фильтрация доступных методов оплаты
Далее используем фильтр WooCommerce woocommerce_available_payment_gateways для удаления или добавления методов оплаты в зависимости от роли. В примере ниже:
- Оптовые покупатели (роль
wholesale_customer) видят только оплату по счету (codдля примера). - Розничные покупатели (
customer) — только онлайн-оплата (stripe). - Гости видят все способы оплаты.
add_filter( 'woocommerce_available_payment_gateways', 'filter_payment_gateways_by_user_role' );
function filter_payment_gateways_by_user_role( $available_gateways ) {
$role = get_current_user_role();
if ( ! $role ) {
// Гости — не ограничиваем
return $available_gateways;
}
switch ( $role ) {
case 'wholesale_customer':
// Разрешаем только оплату при получении (cod)
foreach ( $available_gateways as $gateway_id => $gateway ) {
if ( $gateway_id !== 'cod' ) {
unset( $available_gateways[ $gateway_id ] );
}
}
break;
case 'customer':
// Разрешаем только Stripe
foreach ( $available_gateways as $gateway_id => $gateway ) {
if ( $gateway_id !== 'stripe' ) {
unset( $available_gateways[ $gateway_id ] );
}
}
break;
default:
// Другие роли — без ограничений
break;
}
return $available_gateways;
}3. Добавление кастомной роли (если нужно)
Если у вас нет нужной роли, ее можно добавить через код или плагин. Пример кода для добавления роли:
function add_wholesale_customer_role() {
add_role( 'wholesale_customer', 'Оптовый покупатель', array(
'read' => true,
'level_0' => true
));
}
add_action( 'init', 'add_wholesale_customer_role' );Как проверить, что решение сработало
- Авторизуйтесь под пользователем с ролью
wholesale_customerи перейдите в корзину к оплате — должны остаться только способы оплаты, разрешённые для этой роли. - Авторизуйтесь под ролью
customer— должны отображаться другие методы оплаты. - Выйдите из аккаунта и проверьте страницу оплаты как гость — все способы должны быть доступны.
- Для дополнительной проверки используйте инструменты разработчика браузера, чтобы убедиться, что в списке
inputс методами оплаты отображаются только нужные.
Частые ошибки и способы их устранения
- Методы оплаты не меняются
Проверьте, что ID платежных шлюзов указаны правильно (cod,stripeи т.п.). Можно посмотреть в WooCommerce > Настройки > Платежи. - Роль не определяется
Убедитесь, что пользователь действительно имеет нужную роль. Иногда роли могут быть кастомными или с другим именем. Используйтеvar_dump(wp_get_current_user())для диагностики. - Фильтр конфликтует с другими плагинами
Отключите плагины, которые могут влиять на способы оплаты, чтобы проверить конфликт.
Практические советы по безопасности и производительности
- Не стоит хранить логику определения роли и фильтрации оплаты в плагинах с плохой репутацией — лучше писать свой код или использовать надёжные библиотеки.
- Кеширование страниц может мешать корректному отображению способов оплаты по ролям. Убедитесь, что страницы корзины и оплаты не кешируются.
- Если добавляете новые роли, не давайте им избыточных прав, чтобы минимизировать риски безопасности.
Сравнение подходов к изменению способов оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_available_payment_gateways | Код на PHP для динамического удаления/добавления способов оплаты | Гибкость, высокая производительность, отсутствие лишних плагинов | Требует знаний PHP, может конфликтовать с другими кастомизациями |
| Плагины ограничения оплаты по ролям | Готовые решения с интерфейсом | Простота использования, не требует кода | Платные, могут влиять на производительность, ограниченная кастомизация |