Диагностика задачи: зачем и когда менять цену автоматически
В магазинах на WooCommerce часто возникает потребность менять цену товара динамически — например, при достижении определённого количества в корзине, для конкретной роли пользователя или в рамках акции. Стандартные возможности WooCommerce не позволяют гибко настроить такие изменения без сторонних плагинов или кастомного кода.
Типичные сценарии:
- Скидка при покупке от 3 штук одного товара;
- Изменение цены для определённых групп пользователей (например, оптовиков);
- Временные цены для акций без изменения основной цены в админке;
- Зависимость цены от выбранных атрибутов или других параметров.
Пошаговое решение: как реализовать изменение цены в коде
Для изменения цены товара перед выводом и добавлением в корзину удобно использовать фильтр woocommerce_get_price или woocommerce_product_get_price. Рассмотрим пример, где цена меняется при покупке более 3 единиц товара.
1. Изменение цены при количестве товара в корзине
Добавьте следующий код в файл functions.php вашей темы или в свой плагин:
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) {
if (is_admin()) return $price; // не менять в админке
$cart = WC()->cart;
if (!$cart) return $price; // если корзина не инициализирована
$cart_item_key = null;
foreach ($cart->get_cart() as $key => $item) {
if ($item['product_id'] == $product->get_id()) {
$cart_item_key = $key;
break;
}
}
if (!$cart_item_key) return $price; // товара нет в корзине
$quantity = $cart->get_cart_item_quantity($cart_item_key);
if ($quantity >= 3) {
// например, скидка 20%
$price = $price * 0.8;
}
return $price;
}
Этот код проверяет, сколько данного товара уже в корзине, и если 3 и более — снижает цену на 20%.
2. Изменение цены для определённых ролей пользователей
Для оптовиков с ролью wholesale_customer можно добавить скидку 15%:
add_filter('woocommerce_product_get_price', 'price_for_wholesale_users', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'price_for_wholesale_users', 10, 2);
function price_for_wholesale_users($price, $product) {
if (is_admin()) return $price;
if (!is_user_logged_in()) return $price;
$user = wp_get_current_user();
if (in_array('wholesale_customer', (array) $user->roles)) {
$price = $price * 0.85; // скидка 15%
}
return $price;
}
Проверка результата после внедрения
- Добавьте в корзину 3 и более единиц товара и обновите страницу корзины. Цена должна измениться с учётом скидки.
- Залогиньтесь под пользователем с ролью
wholesale_customerи проверьте цену на странице товара и в корзине. - Если скидка не применится, проверьте, что код корректно подключён и фильтры срабатывают (можно добавить
error_log()для отладки).
Частые ошибки и как их исправить
- Цена не меняется в админке: так и должно быть, фильтры игнорируют админку с помощью
is_admin(). - Цена не меняется при добавлении товара в корзину: возможно, корзина не инициализирована, код срабатывает слишком рано. Убедитесь, что код подключён в правильном хуке или в
functions.php. - Конфликт с другими плагинами скидок: проверьте порядок применения фильтров и совместимость.
- Некорректное округление цены: используйте функции WooCommerce
wc_price()иwc_format_decimal()для правильного форматирования.
Практические советы по безопасности и производительности
- Не используйте слишком много похожих фильтров для изменения цены — это может замедлить загрузку страницы.
- Для массовых изменений рассмотри использование систем кеширования и оптимизацию запросов.
- Не храните временные цены в базе, лучше рассчитывать на лету.
- Следите, чтобы код не ломал логику WooCommerce — всегда проверяйте работу корзины и оформления заказа после изменений.
Сравнение подходов для автоматического изменения цены в WooCommerce
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код на хуках (как в статье) | Гибко, бесплатно, без лишних плагинов | Требует навыков, возможны конфликты | Используйте для простых условий |
| Плагины скидок (Dynamic Pricing, Discount Rules) | Простой интерфейс, много условий | Платные, влияет на скорость | Для сложных сценариев и непрофильных пользователей |
| Кэширование и сторонние сервисы | Высокая производительность | Сложность настройки, дополнительные расходы | Для крупных магазинов с большим трафиком |