Диагностика задачи: зачем менять цену товара по ролям пользователей
В WooCommerce иногда нужно показывать разные цены для разных групп покупателей — например, оптовикам, зарегистрированным клиентам, партнёрам или гостям. Задача — изменить цену товара динамически при выводе на сайте, не создавая отдельные товары или вариации. Это поможет сделать персонализированные предложения и повысить конверсию.
Пошаговое решение: изменение цены товара по ролям с помощью кода
Самый надёжный способ — использовать фильтр woocommerce_product_get_price и аналогичный для регулярной и акционной цены. В функции определяем роль пользователя и задаём нужную цену.
1. Получаем роль пользователя
function get_user_primary_role() {
if ( ! is_user_logged_in() ) {
return 'guest';
}
$user = wp_get_current_user();
$roles = (array) $user->roles;
return ! empty( $roles ) ? $roles[0] : 'subscriber';
}
2. Функция для изменения цены
function change_price_by_user_role( $price, $product ) {
$role = get_user_primary_role();
// Пример изменения цен по ролям
switch ( $role ) {
case 'wholesaler':
// Скидка 20% для оптовиков
$price = $price * 0.8;
break;
case 'vip_customer':
// Фиксированная цена 1000 для VIP
$price = 1000;
break;
case 'guest':
// Для гостей цена не меняется
break;
default:
// Для остальных цена без изменений
break;
}
return $price;
}
3. Подключаем фильтры WooCommerce
add_filter( 'woocommerce_product_get_price', 'change_price_by_user_role', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'change_price_by_user_role', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'change_price_by_user_role', 10, 2 );
Как проверить, что изменение цены работает
- Зарегистрируйте пользователей с разными ролями:
wholesaler,vip_customer, обычный пользователь. - Авторизуйтесь под каждым и откройте страницу товара — цена должна изменяться согласно коду.
- Для теста гостя выйдите из аккаунта и проверьте цену, она должна быть стандартной.
- В админке WooCommerce проверьте, что в заказах сохраняется правильная цена.
- В консоли разработчика браузера проверьте, что цена выводится корректно и нет JS-ошибок.
Частые ошибки и способы их исправления
- Цена не меняется на сайте: проверьте, что фильтры подключены правильно и функция получает роль пользователя.
- Цена меняется, но в корзине и оплате — нет: добавьте аналогичные фильтры для корзины и корзинных объектов, например
woocommerce_get_priceили используйте хуки для обновления цены вWC_Cart. - Конфликт с кешированием: если используете кеширование страниц, цены могут кэшироваться и не обновляться. Настройте исключения кеша по ролям или отключите кеш для страниц магазина.
- Не учитываются дополнительные налоги и скидки: убедитесь, что ваша логика не конфликтует с налоговыми правилами WooCommerce.
Практические советы по безопасности и производительности
- Не храните цены в пользовательских метаполях без необходимости — лучше рассчитывать динамически.
- Оптимизируйте функцию определения роли, чтобы не вызывать лишние запросы.
- Избегайте жёсткого кодирования цен — лучше вынесите их в настройки темы или отдельный файл.
- Тестируйте изменения на staging-сайте перед внедрением в продакшн.
Альтернативы: плагины vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Гибкость, отсутствие лишних плагинов, полный контроль | Требует навыков PHP, риск ошибок без тестирования |
| Плагины для ценообразования по ролям (например, WooCommerce Role Based Pricing) | Простая настройка, поддержка обновлений, дополнительные функции | Могут нагружать сайт, не всегда бесплатны |
Если нужна автоматизация и расширенные возможности — рассмотрите плагин Clearfy Pro от WPShop (https://wpshop.ru/plugins/clearfy) с функциями SEO и оптимизации, которые помогут избежать дублирования цен и ошибок.