Диагностика задачи: зачем менять цены по ролям пользователей
В интернет-магазинах на WooCommerce часто возникает необходимость показывать разные цены для разных групп пользователей. Например, оптовые покупатели получают скидку, а партнеры — особые тарифы. В базовом WooCommerce нет инструмента для гибкого изменения цены в зависимости от роли, поэтому приходится использовать кастомные решения или плагины.
Как понять, что нужна настройка по ролям?
- Вы видите, что все пользователи видят одинаковую цену, но хотите сегментировать цены.
- Есть зарегистрированные пользователи с разными ролями (например, "оптовик" и "гость").
- Вы хотите избежать создания дублирующих товаров с разными ценами.
Пошаговое решение: изменение цены товара по роли пользователя через код
Для автоматического изменения цены в зависимости от роли пользователя можно использовать фильтр woocommerce_get_price и woocommerce_product_get_price. Ниже пример, который снижает цену на 10% для пользователей с ролью "wholesale_customer".
add_filter('woocommerce_product_get_price', 'custom_price_by_user_role', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_price_by_user_role', 10, 2);
function custom_price_by_user_role($price, $product) {
if (is_admin()) return $price; // Для админки не менять
if (is_user_logged_in()) {
$user = wp_get_current_user();
if (in_array('wholesale_customer', (array) $user->roles)) {
$discount = 0.9; // скидка 10%
$price = $price * $discount;
}
}
return $price;
}Код стоит добавить в файл functions.php дочерней темы или в плагин функционала.
Как добавить новую роль пользователя?
Если роли "wholesale_customer" еще нет, добавьте ее так:
function add_wholesale_customer_role() {
add_role('wholesale_customer', 'Оптовый покупатель', [
'read' => true,
'level_0' => true
]);
}
add_action('init', 'add_wholesale_customer_role');Проверка результата после внедрения
Чтобы убедиться, что цены меняются:
- Зарегистрируйте пользователя с ролью
wholesale_customer. - Авторизуйтесь под этим пользователем на фронтенде.
- Откройте страницу товара и сравните цену с ценой для гостя или пользователя с другой ролью.
- Для точного сравнения можно временно вывести цену через
echoили в консоль браузера.
Если цена отличается и применена скидка, значит все работает корректно.
Частые ошибки и как их исправить
- Цена не меняется — проверьте, что фильтр применяется к нужным хукам и что код не конфликтует с другими плагинами ценообразования.
- Изменение цены в админке — добавьте условие
if (is_admin()) return $price;чтобы не ломать интерфейс управления товарами. - Роль пользователя не распознается — убедитесь в правильности названия роли и что пользователь действительно авторизован.
- Кэш блокирует изменение цены — очистите кэш сайта и браузера, временно отключите плагин кэширования.
Практические советы по безопасности и производительности
- Минимизируйте количество вычислений в фильтрах цен — например, кэшируйте результаты, если цена рассчитывается сложно.
- Не используйте глобальные запросы к базе данных внутри фильтра цены, чтобы не замедлять загрузку страниц.
- Обязательно проверяйте
is_user_logged_in()перед получением роли, чтобы избежать ошибок. - Если магазин использует сложные правила ценообразования, рассмотрите плагины типа Clearfy Pro для дополнительной оптимизации и настройки.
Сравнение вариантов реализации изменения цены по ролям
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
| Код в functions.php | Легко кастомизировать, не требует плагинов | Требует знаний PHP, возможны ошибки | Пример выше с фильтрами WooCommerce |
| Плагин для ролей и цен (например, Wholesale Suite) | Удобный интерфейс, готовые функции | Платный, лишние функции могут замедлять сайт | Управление ценами через панель |
| Комбинация плагинов + кастомный код | Максимальная гибкость и контроль | Сложнее в поддержке, требует тестирования | Clearfy + кастомный фильтр |