Диагностика задачи: зачем нужно автоматическое изменение цен
В WooCommerce иногда требуется динамически менять цену товара в зависимости от различных условий: пользовательской роли, времени суток, объема заказа или других параметров. Например, предоставлять скидки для оптовиков, менять цену в зависимости от региона или активировать специальные акции. Стандартными средствами WooCommerce это сделать сложно без плагинов, но с помощью хуков и кастомного кода можно реализовать точечное решение.
Как работает изменение цены в WooCommerce: основные хуки
Для динамического изменения цены чаще всего используют фильтр woocommerce_get_price или woocommerce_product_get_price и woocommerce_product_get_regular_price. Эти хуки позволяют перехватывать запрос цены товара перед выводом на сайт и менять ее на лету.
Пример базового фильтра:
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
// Логика изменения цены
return $price;
}Пошаговое решение: изменение цены для пользователей с ролью «оптовик»
1. Определяем роль пользователя
Для начала проверяем роль текущего пользователя. В WooCommerce роли добавляются как стандартные WordPress-роли, например, 'wholesale_customer'.
function is_wholesale_customer() {
if (is_user_logged_in()) {
$user = wp_get_current_user();
return in_array('wholesale_customer', (array) $user->roles);
}
return false;
}2. Изменяем цену товара на 20% ниже для оптовиков
add_filter('woocommerce_product_get_price', 'wholesale_price_discount', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'wholesale_price_discount', 10, 2);
function wholesale_price_discount($price, $product) {
if (is_wholesale_customer()) {
$discounted_price = $price * 0.8; // скидка 20%
return round($discounted_price, 2);
}
return $price;
}3. Добавляем отображение цены с учетом скидки на странице товара
Чтобы покупатель видел, что цена изменена, можно добавить метку или изменить вывод цены в шаблоне. Например, через хук woocommerce_get_price_html:
add_filter('woocommerce_get_price_html', 'show_wholesale_price_notice', 10, 2);
function show_wholesale_price_notice($price_html, $product) {
if (is_wholesale_customer()) {
$price_html .= ' <small>(Оптовая цена)</small>';
}
return $price_html;
}Как проверить, что автоматическое изменение цены работает
- Войти под пользователем с ролью
wholesale_customer. - Открыть страницу товара и убедиться, что цена уменьшена на 20% и отображается пометка «Оптовая цена».
- Проверить, что под другими ролями или гостями цена отображается без изменений.
- Добавить товар в корзину и проверить, что цена в корзине соответствует измененной цене.
Частые ошибки при динамическом изменении цены в WooCommerce
- Использование неправильного хука:
woocommerce_get_priceработает не всегда, лучше использоватьwoocommerce_product_get_priceиwoocommerce_product_get_regular_price. - Изменение цены только на фронтенде: Если не менять цену в корзине и на страницах оформления заказа, клиент запутается. Для этого нужно также использовать фильтр
woocommerce_cart_item_priceили вмешиваться в расчеты корзины. - Неправильное округление: Всегда используйте
round()с нужным числом знаков после запятой, чтобы избежать проблем с отображением. - Не проверена роль пользователя: Если не проверять, залогинен ли пользователь, код может выдать ошибку.
Практические советы по безопасности и производительности
- Кеширование цен: если на сайте используется кеширование страниц (например, через плагин кеша), динамическое изменение цен по ролям может не сработать. В этом случае стоит исключить страницы с товарами из кеша или реализовать кеширование с учетом куков/сессий.
- Минимизируйте количество вычислений в фильтрах цены — фильтры вызываются часто, и сложные вычисления замедляют сайт.
- Не храните измененные цены в базе данных — лучше менять их на лету через фильтры, чтобы не создавать рассинхронизаций.
Сравнение вариантов реализации изменения цены
| Метод | Плюсы | Минусы |
|---|---|---|
| Кастомный код с хуками WooCommerce | Полный контроль, не требует сторонних плагинов, быстро работает | Требует навыков, возможны ошибки при неправильной реализации |
| Плагин для оптовых скидок (например, Wholesale Suite) | Простая настройка, много функций, поддержка | Дополнительная нагрузка, возможные конфликты, платные версии |
| Использование динамических цен через плагин скидок | Гибкие условия, интеграция с купонами, правилами | Может быть сложно настроить, часто платный функционал |