Проблема: необходимость динамически менять цену товара для разных ролей пользователей
В WooCommerce часто возникает задача показывать разные цены для разных групп клиентов: оптовикам, партнёрам, зарегистрированным пользователям с определённой ролью или гостям. Стандартный функционал WooCommerce этого не предусматривает, поэтому приходится использовать кастомные решения или плагины.
Диагностика проблемы
Если вы заметили, что цены на сайте одинаковы для всех посетителей, несмотря на то, что бизнес требует дифференцированного ценообразования, значит нужен механизм изменения стоимости товара в зависимости от роли пользователя. Проверить, что цена не меняется, можно так:
- Авторизуйтесь под разными ролями (например, администратор, клиент, оптовик).
- Откройте страницу товара и сравните отображаемую цену.
- Если цена одинаковая – решение нужно внедрять.
Пошаговое решение: изменение цены товара по роли пользователя через код
Для управления ценами по ролям пользователя используем фильтр woocommerce_get_price, который позволяет изменить цену товара перед выводом на экран.
Вот пример кода, который можно добавить в файл functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_get_price', 'custom_price_by_user_role', 10, 2);
function custom_price_by_user_role($price, $product) {
if (is_admin()) return $price; // не меняем цену в админке
// Получаем объект текущего пользователя
$user = wp_get_current_user();
if (empty($user->roles)) return $price; // если гость, возвращаем обычную цену
// Пример: оптовая скидка 20% для роли "wholesale_customer"
if (in_array('wholesale_customer', $user->roles)) {
$new_price = $price * 0.8;
return $new_price;
}
// Другие роли и условия можно добавить ниже
return $price; // по умолчанию цена без изменений
}Этот код уменьшит цену для пользователей с ролью wholesale_customer на 20%. Для добавления других ролей и скидок просто допишите дополнительные условия.
Как проверить, что решение работает
- Выйдите из учётной записи и проверьте цену товара как гость.
- Залогиньтесь под пользователем с ролью
wholesale_customer(создайте такого пользователя, если нет). - Обновите страницу товара и убедитесь, что цена уменьшилась на 20%.
- Проверьте, что в админке цены не изменились.
Частые ошибки и как их исправить
- Цена не меняется для нужной роли: проверьте, что у пользователя действительно есть нужная роль и что роль правильно указана в коде.
- Изменение цены влияет на админку: добавьте проверку
is_admin(), чтобы не менять цену в административной части. - Неправильное округление цены: используйте функции
wc_get_price_to_display()илиwc_format_decimal()для корректного форматирования цены. - Кэширование цен: если у вас включено кэширование страницы или объекта, возможно, изменения не отображаются сразу – очистите кэш.
Дополнительная настройка: изменение цены в корзине и на странице оформления заказа
Чтобы цена учитывалась и в корзине, и при оплате, нужно дополнительно использовать хук woocommerce_before_calculate_totals. Пример:
add_action('woocommerce_before_calculate_totals', 'custom_cart_price_by_user_role', 10, 1);
function custom_cart_price_by_user_role($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
$user = wp_get_current_user();
if (empty($user->roles)) return;
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$price = $product->get_price();
if (in_array('wholesale_customer', $user->roles)) {
$new_price = $price * 0.8;
$product->set_price($new_price);
}
}
}Этот код гарантирует, что цена в корзине и на странице заказа совпадает с той, что вы изменили для роли пользователя.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код на фильтрах WooCommerce | Гибко, бесплатно, полный контроль | Нужны навыки PHP, возможны конфликты при обновлениях | Для разработчиков, при кастомных требованиях |
| Плагины для управления ценами по ролям (например, "WooCommerce Role Based Pricing") | Простота установки, готовый функционал | Может быть платным, ограниченная кастомизация | Для быстрой реализации без программирования |
| Комбинированный подход | Использование плагинов + доработка кода | Сложнее в поддержке | Если нужно расширить функционал плагина |
Практические советы по безопасности и производительности
- Не храните цены по ролям в пользовательских метаданных – это усложнит обновления и приведёт к дублированию данных.
- Используйте кеширование результатов, если количество товаров и пользователей большое, чтобы не перегружать сервер.
- Проверяйте совместимость ваших изменений с обновлениями WooCommerce и темой.
- Отключайте изменения цен в админке, чтобы избежать ошибок при редактировании товара.