Почему нужно менять цену товара по ролям пользователей в WooCommerce
В интернет-магазинах на WooCommerce часто требуется настроить разные цены для разных групп покупателей: оптовиков, постоянных клиентов, партнеров или сотрудников. Это позволяет гибко управлять скидками и условиями продаж без сложных плагинов.
Диагностика проблемы: как понять, что цены не меняются корректно
- Пользователи с определенной ролью не видят измененную цену на странице товара или в корзине.
- Изменения цен влияют только на фронтенд, но не сохраняются при оформлении заказа.
- Цены меняются, но расчет налогов или скидок идет неверно.
Пошаговое решение: автоматическое изменение цены по ролям через фильтр woocommerce_product_get_price
Для корректного изменения цены товара для разных ролей пользователей нужно использовать фильтры WooCommerce, которые возвращают цену товара в различных контекстах. Рассмотрим пример кода, который меняет цену для роли "оптовик" (определяется роль пользователя wholesale_customer):
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);
function change_price_by_user_role($price, $product) {
if (!is_user_logged_in()) {
return $price; // не залогинен - цена без изменений
}
$user = wp_get_current_user();
if (in_array('wholesale_customer', (array) $user->roles)) {
// уменьшение цены на 20% для оптовиков
$discounted_price = $price * 0.8;
return $discounted_price;
}
return $price;
}
Важно подключить фильтры к регулярной, распродажной и основной цене, чтобы изменения отображались везде, включая корзину и оформление заказа.
Как изменить цену для нескольких ролей
Добавьте дополнительные проверки ролей и соответствующие коэффициенты:
function change_price_by_user_role($price, $product) {
if (!is_user_logged_in()) {
return $price;
}
$user = wp_get_current_user();
if (in_array('wholesale_customer', (array) $user->roles)) {
return $price * 0.8; // 20% дисконт
} elseif (in_array('vip_customer', (array) $user->roles)) {
return $price * 0.9; // 10% дисконт
}
return $price;
}
Проверка результата после внедрения
- Залогиньтесь под пользователем с ролью
wholesale_customerи убедитесь, что цена товара на странице и в корзине уменьшилась на 20%. - Залогиньтесь под обычным пользователем — цена должна быть без изменений.
- Проверьте оформление заказа — итоговая сумма должна корректно учитывать измененную цену.
- Если используете кеширование, очистите кеш страниц и объекта.
Частые ошибки и их исправление
- Изменения не видны в корзине и на странице оформления заказа: не использовать только
woocommerce_get_price_html, а заменить цену через фильтрыwoocommerce_product_get_price,woocommerce_product_get_regular_priceиwoocommerce_product_get_sale_price. - Цена меняется только для залогиненных пользователей: проверить функцию
is_user_logged_in()и роль пользователя. - Проблемы с кэшированием: сбросить кеш, особенно если используете плагин кеширования (WP Rocket, LiteSpeed Cache и др.).
- Цена не меняется для вариативных товаров: фильтры применяются к объекту товара, убедитесь, что код работает для всех типов товаров (simple, variable), или используйте фильтр
woocommerce_variation_get_price.
Практические советы по безопасности и производительности
- Не сохраняйте измененную цену в базу данных — используйте фильтры для динамического изменения, чтобы не ломать логику WooCommerce.
- Избегайте тяжелой логики в фильтрах цены — кешируйте результаты, если рассчитываете цену по сложным правилам.
- Используйте child-тему или собственный плагин для кастомного кода, чтобы не потерять изменения при обновлении.
Сравнение способов реализации изменения цены по ролям
| Способ | Плюсы | Минусы | Пример ссылки |
|---|---|---|---|
Код через фильтры woocommerce_product_get_price | Гибко, работает без сторонних плагинов, быстро | Требует знаний PHP, возможны ошибки при сложных условиях | В нашей статье |
| Плагины типа WooCommerce Role Based Pricing | Удобный интерфейс, много функций | Нагрузка на сайт, может конфликтовать с кастомным кодом | WooCommerce Role Based Pricing |
| Использование групп пользователей и скидочных купонов | Простая реализация, управляется из админки | Менее гибко, не меняет цену на странице товара | Встроенный функционал WooCommerce |