Диагностика задачи: зачем менять цену товара по условию через фильтры WooCommerce
В WooCommerce стандартная цена задаётся в карточке товара, но часто возникают ситуации, когда нужно динамически менять цену на фронтенде без создания новых товаров или вариаций. Например, изменить цену товара в зависимости от роли пользователя, количества в корзине или даты. Решение — использовать фильтры WooCommerce для изменения цены на лету.
Пошаговое решение: как реализовать динамическое изменение цены через фильтр
1. Определите условие изменения цены
Например, скидка 10% для пользователей с ролью "оптовик" или изменение цены при покупке более 5 единиц товара.
2. Используйте фильтр woocommerce_product_get_price
Этот фильтр позволяет изменить цену перед выводом на странице товара и в корзине.
3. Пример кода для изменения цены по роли пользователя
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (is_user_logged_in()) {
$user = wp_get_current_user();
if (in_array('wholesaler', (array) $user->roles)) {
$price = $price * 0.9; // скидка 10%
}
}
return $price;
}4. Пример кода для изменения цены в корзине при количестве больше 5
add_action('woocommerce_before_calculate_totals', 'custom_price_based_on_quantity', 10, 1);
function custom_price_based_on_quantity($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item) {
if ($cart_item['quantity'] > 5) {
$original_price = $cart_item['data']->get_price();
$new_price = $original_price * 0.85; // скидка 15%
$cart_item['data']->set_price($new_price);
}
}
}Проверка результата после внедрения
- Зайдите на страницу товара под пользователем с ролью, для которого меняется цена (например, "оптовик").
- Убедитесь, что на странице товара и в корзине отображается изменённая цена.
- Добавьте в корзину количество товара больше 5 и проверьте изменение цены по второму примеру.
- Проверьте, что для обычных пользователей цена остаётся без изменений.
Частые ошибки и как их исправить
- Цена не меняется в корзине: Не используйте только фильтр
woocommerce_product_get_priceдля изменения цены в корзине. Для корзины нужно использоватьwoocommerce_before_calculate_totalsи методset_price(). - Изменение цены не отображается на странице товара: Возможно, кэширование страницы мешает. Очистите кэш и отключите временно плагины кэширования.
- Функция применяется ко всем пользователям: Проверьте корректность условий в коде, например, проверку ролей через
in_arrayи вызовis_user_logged_in(). - Производительность снижается: Избегайте сложных SQL-запросов и вызывайте фильтры только при необходимости.
Практические советы по безопасности и производительности
- Не храните изменённые цены в базе — используйте фильтры для динамического изменения на лету.
- Минимизируйте количество операций в хуках, чтобы не замедлять загрузку страницы и расчёт корзины.
- При необходимости масштабируемых решений рассмотрите использование специализированных плагинов для динамического ценообразования, например Clearfy Pro для оптимизации и управления ценами.
Сравнение подходов к изменению цены в WooCommerce
| Метод | Где работает | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_product_get_price | Вывод цены | Простота, универсальность | Не меняет цену в корзине и заказах |
Хук woocommerce_before_calculate_totals + set_price() | Корзина, оформление заказа | Изменяет цену в корзине и заказах | Нужно правильно использовать, может влиять на производительность |
| Создание вариаций или отдельных товаров | Вся система WooCommerce | Стандартное решение, совместимость с отчётами | Больше администрирования, нагрузка на БД |