Диагностика задачи: зачем менять цену товара для разных пользователей
В WooCommerce по умолчанию цены одинаковы для всех покупателей, но в реальных проектах часто нужно устанавливать индивидуальные цены: например, для оптовиков, постоянных клиентов или по ролям пользователей. Стандартных настроек нет, поэтому приходится внедрять кастомные решения или использовать плагины.
Способы изменения цены товара в зависимости от пользователя
1. Использование плагинов для управления ценами
Плагины вроде Clearfy Pro или сторонние плагины «Dynamic Pricing» позволяют гибко настраивать цены по ролям, группам или другим правилам. Преимущество — быстрое внедрение без кода. Недостаток — часто платные и влияют на производительность.
2. Кастомный код через фильтр woocommerce_product_get_price
Для полной кастомизации можно использовать хук woocommerce_product_get_price, который позволяет изменить цену товара динамически перед выводом на сайте.
add_filter('woocommerce_product_get_price', 'custom_price_for_user', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_price_for_user', 10, 2);
function custom_price_for_user($price, $product) {
if (is_user_logged_in()) {
$user = wp_get_current_user();
// Пример: снизить цену на 10% для пользователей с ролью "wholesale_customer"
if (in_array('wholesale_customer', $user->roles)) {
$price = $price * 0.9;
}
}
return $price;
}Пошаговое решение на примере снижения цены для роли wholesale_customer
- Добавьте новую роль пользователя, если её ещё нет, например через плагин или код
add_role('wholesale_customer', 'Оптовый клиент'); - Поместите приведённый выше код в файл
functions.phpвашей темы или в отдельный плагин. - Очистите кеш сайта и браузера.
- Залогиньтесь под пользователем с ролью
wholesale_customerи проверьте цену товара на витрине.
Как проверить, что решение сработало
- Зайдите под пользователем с нужной ролью и откройте страницу товара — цена должна отображаться со скидкой.
- Выйдите из аккаунта или войдите под другим пользователем — цена должна быть исходной.
- Проверьте корзину и оформление заказа — итоговая сумма должна учитывать изменённую цену.
- Если есть кеширующие плагины, временно отключите их и проверьте результат.
Частые ошибки и их исправление
- Цена не меняется для роли пользователя: Проверьте, что пользователь действительно имеет эту роль (
print_r(wp_get_current_user())). Также убедитесь, что фильтры добавлены корректно и не перезаписываются другими плагинами. - Изменённая цена не отображается в корзине и на этапе оформления заказа: Добавьте фильтр
woocommerce_get_price_htmlили используйте хукwoocommerce_before_calculate_totalsдля принудительного обновления цены в корзине. - Конфликты с плагинами скидок и кешированием: Отключите кеш и отключите плагины скидок, чтобы проверить, не влияют ли они на результат.
Практические советы по безопасности и производительности
- Избегайте тяжёлых запросов внутри функций фильтра цены, так как они вызываются при каждой загрузке товара.
- Кешируйте результаты вычисления цены, если логика сложная.
- Для сложного ценообразования лучше использовать специализированные плагины с поддержкой WooCommerce.
- Проверяйте права доступа пользователя, чтобы не допустить утечки ценовой информации.
Пример расширения: изменение цены в корзине
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1);
function custom_cart_item_price($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$price = $product->get_price();
$user = wp_get_current_user();
if (in_array('wholesale_customer', $user->roles)) {
$new_price = $price * 0.9; // 10% скидка
$product->set_price($new_price);
}
}
}Сравнение методов изменения цены
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Плагин (Clearfy Pro, Dynamic Pricing) | Быстро, много функций, поддержка | Платно, может нагружать сайт | Гибкая настройка без кода |
Фильтр woocommerce_product_get_price | Полный контроль, бесплатно | Требует навыков, может конфликтовать | Кастомные скидки по ролям |
Изменение цены в корзине через woocommerce_before_calculate_totals | Учёт скидок в заказе | Сложнее отлаживать, нужно тщательно тестировать | Динамическое изменение стоимости в корзине |