Диагностика задачи: зачем нужна автоматическая смена цены в WooCommerce
В интернет-магазинах на WooCommerce часто требуется динамически менять цену товара в зависимости от условий: акций, количества в корзине, времени суток или пользовательской роли. Без автоматизации администратору приходится вручную обновлять цены, что неудобно и увеличивает риск ошибок.
Пример: нужно снизить цену на 10% для определённых товаров при покупке от 3 штук или сделать скидку в вечерние часы.
Подходы к решению задачи
Есть три основных способа:
- Использовать стандартные возможности WooCommerce — цены со скидками, купоны, цены по ролям через плагины;
- Применять сторонние плагины для динамического ценообразования;
- Реализовать кастомный код на PHP с использованием хуков WooCommerce.
Для гибкости и конкретных условий лучше подходит третий вариант.
Реализация: использование фильтра woocommerce_get_price для динамического изменения цены
Хук woocommerce_get_price позволяет перехватывать запрос цены товара. Его можно использовать для изменения цены на лету без изменения данных в базе.
Пример кода для скидки 10% при покупке 3 и более товаров определённого типа (например, по категории 'sale'):
add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (is_admin()) return $price; // не трогаем админку
// Проверяем, что товар из нужной категории
if (has_term('sale', 'product_cat', $product->get_id())) {
// Получаем количество товара в корзине
$cart = WC()->cart;
if (!$cart) return $price;
$qty = 0;
foreach ($cart->get_cart() as $cart_item) {
if ($cart_item['product_id'] == $product->get_id()) {
$qty += $cart_item['quantity'];
}
}
// Если в корзине 3 и более, даём скидку 10%
if ($qty >= 3) {
$price = $price * 0.9;
}
}
return $price;
}Как внедрить код
- Добавьте этот код в файл
functions.phpвашей дочерней темы или в кастомный плагин. - Убедитесь, что категория 'sale' существует и назначена нужным товарам.
- Проверьте работу на фронтенде, добавляя в корзину нужное количество товара.
Проверка результата после внедрения
Чтобы проверить, что цена меняется правильно:
- Откройте сайт в режиме инкогнито или выйдите из админки;
- Добавьте 1 товар из категории 'sale' в корзину — цена должна быть базовой;
- Добавьте 3 и более — цена должна снизиться на 10%;
- Проверьте, что в админке цены не изменились (только отображение для пользователя).
Частые ошибки и как их исправить
- Цена не меняется: возможно, корзина еще не инициализирована, попробуйте обернуть проверку
WC()->cartв условиеif ( did_action( 'woocommerce_before_calculate_totals' ) )или подключите фильтрwoocommerce_before_calculate_totalsдля более надёжного изменения цены. - Цена меняется и в админке: добавьте проверку
if (is_admin()) return $price;в начале функции. - Скидка применяется ко всем товарам: проверьте правильность категории и ID товара в условии.
- Проблемы с кешированием: убедитесь, что кеш на сайте и сервере не мешает отобразить актуальную цену.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в фильтрах цены, так как они вызываются часто.
- Кэшируйте результаты, если вычисления сложные.
- Не меняйте цены в базе данных — используйте фильтры WooCommerce для отображения.
- Тестируйте на staging-сайте, чтобы избежать сбоев на живом магазине.
Альтернативы: плагины для динамических цен
| Плагин | Описание | Плюсы | Минусы |
|---|---|---|---|
| WooCommerce Dynamic Pricing | Гибкая настройка правил ценообразования | Много условий, UI для настройки без кода | Платный, может нагружать сайт |
| Discount Rules for WooCommerce | Правила скидок с поддержкой разных условий | Бесплатная версия, удобный интерфейс | Ограничения в бесплатной версии |
| Кастомный код (пример выше) | Полный контроль, минимальная нагрузка | Нет зависимости от сторонних плагинов | Требует навыков разработки, не всем удобен |