Диагностика задачи: зачем менять стоимость товаров автоматически
В WooCommerce нередко возникает необходимость программно менять цену товара в зависимости от условий — например, количество в корзине, пользовательская роль, дата или другие параметры. Стандартными средствами это сделать сложно без плагинов, которые могут нагружать сайт или не подходить под конкретные бизнес-правила. Поэтому часто оптимальным решением становится написание собственного кода, который изменит цену динамически и корректно.
Как работает изменение цены в WooCommerce: ключевые хуки
Для изменения цены товара в корзине и на странице товара используют фильтры:
woocommerce_get_price— влияет на цену товара в каталоге;woocommerce_product_get_priceиwoocommerce_product_get_regular_price— фильтры цен объектовWC_Product;woocommerce_before_calculate_totals— хук для изменения цены товаров в корзине перед подсчетом итогов.
Для динамического изменения цены в корзине лучше всего использовать woocommerce_before_calculate_totals, так как он позволяет модифицировать цену именно для текущей сессии без изменения данных в базе.
Пошаговое решение: пример кода для изменения цены по количеству товара
Рассмотрим кейс: если в корзине лежит больше 3 единиц одного товара, снизим цену на 10%.
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 20, 1);function custom_dynamic_price_change($cart){if (is_admin() && !defined('DOING_AJAX')) return;if (did_action('woocommerce_before_calculate_totals') >= 2) return;foreach ($cart->get_cart() as $cart_item_key => $cart_item) { $quantity = $cart_item['quantity']; if ($quantity > 3) { $original_price = $cart_item['data']->get_regular_price(); $new_price = $original_price * 0.9; // скидка 10% $cart_item['data']->set_price($new_price); }}Этот код вставьте в файл functions.php активной темы или в кастомный плагин. Он работает только в корзине и на странице оформления заказа, не меняет цену в каталоге.
Добавление условий на пользовательскую роль
Чтобы изменить цену только для определенной роли пользователя, например, для оптовых клиентов с ролью wholesale_customer, добавьте проверку:
if (current_user_can('wholesale_customer') && $quantity > 3) { // логика изменения цены}Проверка результата после внедрения
- Добавьте в корзину товар в количестве 4 и больше.
- Убедитесь, что на странице корзины и оформления заказа цена товара изменилась с учетом скидки.
- Проверьте, что на странице каталога и в админке цена осталась без изменений.
- Попробуйте добавить товар в количестве 3 и убедитесь, что цена без скидки.
- Если применяли условие по роли, проверьте под разными пользователями.
Частые ошибки и как их исправлять
- Цена меняется везде, включая админку или каталог — не используйте фильтр
woocommerce_get_priceдля динамических скидок в корзине. Вместо этого применяйтеwoocommerce_before_calculate_totals. - Двойное применение скидки — вызов хука более одного раза. Добавляйте проверку
did_action('woocommerce_before_calculate_totals') >= 2чтобы избежать этого. - Цена не меняется при обновлении корзины — убедитесь, что при AJAX-обновлении корзины ваш код правильно подключен и хук вызывается.
- Цена меняется для неправильных товаров — в цикле проверяйте ID товара или другие характеристики, чтобы применить скидку только к нужным товарам.
Практические советы по безопасности и производительности
- Не сохраняйте измененные цены в базу данных — используйте изменение цены в сессии корзины, чтобы не ломать учет.
- Добавляйте проверки условий как можно точнее, чтобы избежать лишних вычислений.
- Тестируйте изменения на staging-сайте, чтобы не нарушить процесс оформления заказа.
- При необходимости кеширования учитывайте, что динамическая цена должна обновляться для каждого пользователя корректно.
Сравнение подходов: код против плагинов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Собственный PHP-код | Полный контроль, легковесность, без сторонних зависимостей | Требует навыков программирования, сложнее поддерживать | Уникальные бизнес-правила, небольшая команда разработчиков |
| Плагины скидок и динамического ценообразования | Быстрая настройка, готовый функционал, поддержка | Могут грузить сайт, ограничены в кастомизации, платные | Стандартные акции, отсутствие разработчиков |