Когда нужно автоматически менять цену товара по атрибуту в WooCommerce
Иногда требуется, чтобы цена товара в WooCommerce менялась динамически в зависимости от выбранного покупателем атрибута. Например, если в магазине продаются футболки с разными цветами, и цена для красного цвета должна быть выше на 10%, а для синего — на 5%. В стандартном WooCommerce для этого используются вариации, но иногда нужно изменить цену глобально для всех товаров с определённым атрибутом или применить дополнительную наценку без создания вариаций.
Диагностика проблемы: почему стандартных вариаций недостаточно
Вариации — классический способ установить цену для каждого набора атрибутов. Но у них есть ограничения:
- Требуется создавать отдельные вариации для каждого сочетания атрибутов, что неудобно при большом ассортименте.
- Изменение цен вручную на каждой вариации — трудоёмкий процесс.
- Невозможно задать ценовые правила, например, наценку в процентах, без дополнительного кода или плагина.
Если нужно автоматизировать изменение цен по атрибуту без создания вариаций, понадобится программное решение.
Пошаговое решение: как изменить цену товара по атрибуту программно
1. Определяем атрибут и наценку
Для примера возьмём атрибут "color" (цвет) и для значения "red" увеличим цену на 10%.
2. Используем фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price
Эти фильтры позволяют менять цену товара перед выводом на сайте.
add_filter('woocommerce_product_get_price', 'change_price_by_attribute', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'change_price_by_attribute', 10, 2);
function change_price_by_attribute($price, $product) {
// Проверяем, что продукт простой
if(!$product || $product->is_type('variable')) {
return $price;
}
// Получаем атрибуты товара
$attributes = $product->get_attributes();
// Проверяем, есть ли нужный атрибут
if(isset($attributes['pa_color'])) { // 'pa_color' — так WooCommerce хранит атрибуты с префиксом 'pa_'
$terms = wp_get_post_terms($product->get_id(), 'pa_color');
foreach($terms as $term) {
if($term->slug === 'red') { // если цвет красный
// Увеличиваем цену на 10%
$price = $price * 1.10;
}
}
}
return $price;
}
3. Применение для вариаций
Если нужно, чтобы наценка работала и для вариаций, добавьте фильтр и для вариаций:
add_filter('woocommerce_variation_prices_price', 'change_price_by_attribute_variation', 10, 3);
add_filter('woocommerce_variation_prices_regular_price', 'change_price_by_attribute_variation', 10, 3);
function change_price_by_attribute_variation($price, $variation, $product) {
if(!$variation) {
return $price;
}
$attributes = $variation->get_attributes();
if(isset($attributes['attribute_pa_color']) && $attributes['attribute_pa_color'] === 'red') {
$price = $price * 1.10;
}
return $price;
}
Проверка результата после внедрения
Чтобы убедиться, что цена меняется:
- Перейдите на страницу товара с атрибутом "color".
- Выберите значение "red" в атрибуте (если вариации используются) или откройте простой товар с атрибутом "red".
- Цена должна увеличиться на 10% по сравнению с базовой.
- Проверьте на фронтенде и в админке (например, через просмотр цены в элементах страницы или отладчик).
Частые ошибки и как их исправить
- Цена не меняется: проверьте, что атрибуты зарегистрированы с префиксом
pa_и что slug атрибута верный. - Изменяется цена вариаций, но не простых товаров или наоборот: убедитесь, что добавлены фильтры и для простых товаров, и для вариаций.
- Некорректное округление цены: используйте функцию
wc_price()для вывода цены или добавьтеround()для корректного округления в коде. - Кэширование мешает увидеть изменения: очистите кэш сайта и браузера.
Практические советы по производительности и безопасности
- Не делайте тяжелые запросы внутри фильтров изменения цены — получайте данные атрибутов через методы объекта продукта.
- Кэшируйте результаты, если применяете сложные вычисления на большом количестве товаров.
- Тестируйте изменения на staging-сайте, чтобы не нарушить работу магазина в продакшене.
- Для сложных правил ценообразования рассмотрите использование плагинов, например, Clearfy Pro или специализированных решений.
Сравнение методов изменения цены по атрибуту
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Создание вариаций | Ручное создание вариаций с разной ценой | Простая настройка, поддержка WooCommerce | Трудоемко при большом количестве атрибутов, нет гибкости |
| Код на фильтрах WooCommerce (пример выше) | Динамическое изменение цены в зависимости от атрибута | Автоматизация, гибкость, нет необходимости создавать вариации | Требует навыков разработки, нужно тестировать |
| Плагины ценообразования | Готовые решения для сложных правил цен | Быстрая настройка, расширенные функции | Платные, могут влиять на производительность |