Диагностика задачи: когда и зачем менять цену автоматически
В WooCommerce часто требуется изменить цену товара динамически — например, в зависимости от количества в корзине, роли пользователя или даты покупки. Стандартный функционал магазина не предусматривает такие сценарии, поэтому приходится внедрять кастомные решения.
Типичные примеры:
- Скидка при покупке от определённого количества;
- Повышение цены для определённой группы пользователей (оптовики, партнёры);
- Временные акции с изменённой ценой на ограниченный период;
- Изменение цены в зависимости от пользовательских мета-данных или кастомных полей.
Пошаговое решение: как изменить цену динамически с помощью хуков WooCommerce
1. Используем хук woocommerce_product_get_price и woocommerce_product_get_regular_price
Для изменения цены в реальном времени нужно переопределить методы получения цены товара. Так WooCommerce отобразит изменённую цену на страницах магазина и в корзине.
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
// Получаем ID товара
$product_id = $product->get_id();
// Пример: скидка 10% при покупке более 5 штук
$cart_quantity = 0;
foreach (WC()->cart->get_cart() as $cart_item) {
if ($cart_item['product_id'] === $product_id) {
$cart_quantity = $cart_item['quantity'];
break;
}
}
if ($cart_quantity >= 5) {
$price = $price * 0.9; // скидка 10%
}
return $price;
}2. Применяем цену в корзине и на странице оплаты
Чтобы цена обновлялась корректно и в корзине, нужно добавить хук woocommerce_before_calculate_totals и изменить цену каждого товара в корзине.
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_cart', 10, 1);
function custom_dynamic_price_cart($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$quantity = $cart_item['quantity'];
if ($quantity >= 5) {
$new_price = $product->get_regular_price() * 0.9; // 10% скидка
$product->set_price($new_price);
}
}
}Проверка результата после внедрения
- Добавьте товар в корзину количеством меньше 5 — цена должна быть стандартной;
- Увеличьте количество товара до 5 и более — цена автоматически снизится на 10%;
- Проверьте отображение цены на странице товаров, в корзине, на оформлении заказа и в письмах;
- Включите режим отладки WooCommerce и проверьте, что нет ошибок PHP;
- При необходимости очистите кеш сайта и браузера для корректного отображения.
Частые ошибки и как их исправить
- Скидка не применяется в корзине или на странице оформления заказа. Проверьте, что хук
woocommerce_before_calculate_totalsдобавлен и функция корректно меняет цену через$product->set_price(). - Цена меняется на страницах, но итог в заказе неверный. Убедитесь, что изменение происходит до подсчёта итогов и нет конфликтов с другими плагинами скидок.
- Изменение цены влияет на все товары, а нужно только на конкретные. Добавьте условия проверки
$product_idв функции для выборочного изменения цены. - Ошибки PHP или предупреждения. Проверьте корректность кода, используйте встроенные функции WooCommerce и избегайте прямого обращения к БД.
Практические советы по безопасности и производительности
- Не изменяйте цену товаров напрямую в базе — используйте хуки и методы WooCommerce.
- Кэшируйте результаты вычислений, если цена зависит от внешних данных или сложных условий.
- Тестируйте на стейджинге, чтобы не сломать процесс оформления заказа у клиентов.
- При необходимости используйте WP_DEBUG_LOG для отладки.
Сравнение подходов: код vs плагины
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Код на PHP (хуки WooCommerce) | Гибкость, точечное управление, нет зависимости от сторонних плагинов | Требует навыков программирования, сложнее поддерживать | Пример из статьи |
| Плагины скидок (например, WooCommerce Dynamic Pricing) | Удобный интерфейс, готовые шаблоны правил скидок | Дополнительная нагрузка, могут конфликтовать с темами и другими плагинами | WooCommerce Dynamic Pricing |