Диагностика задачи: зачем менять цену товаров по категории автоматически
В WooCommerce часто требуется динамически менять цены товаров в зависимости от категории. Например, проводить распродажу только для определённой категории или увеличить цену на премиальный сегмент. Вручную это делать неудобно и чревато ошибками, особенно при большом каталоге. Автоматизация экономит время и исключает человеческий фактор.
Как реализовать автоматическое изменение цены по категории товаров
Использование фильтра woocommerce_product_get_price
Для динамического изменения цены используем хук woocommerce_product_get_price, который возвращает цену товара при вызове $product->get_price(). С помощью этого фильтра можно подменять цену без изменения данных в базе.
Пример кода для увеличения цены на 20% для категории с ID 15:
add_filter('woocommerce_product_get_price', 'change_price_by_category', 10, 2);
function change_price_by_category($price, $product) {
if (has_term(15, 'product_cat', $product->get_id())) {
$price = $price * 1.2; // Увеличение на 20%
}
return $price;
}Изменение цены для вариативных товаров
Для вариативных товаров нужно также фильтровать цену вариаций:
add_filter('woocommerce_product_variation_get_price', 'change_price_by_category', 10, 2);
add_filter('woocommerce_product_variation_get_regular_price', 'change_price_by_category', 10, 2);
add_filter('woocommerce_product_variation_get_sale_price', 'change_price_by_category', 10, 2);Добавьте эти фильтры, чтобы цена изменялась корректно во всех местах.
Проверка результата после внедрения кода
- Перейдите на страницу товара из нужной категории — цена должна измениться на 20%.
- Проверьте страницу архива категории — цены должны отображаться обновлёнными.
- Добавьте товар в корзину — итоговая стоимость должна соответствовать изменённой цене.
- Для вариативных товаров проверяйте цену каждой вариации.
Частые ошибки и как их исправить
- Цена не меняется: Проверьте, что ID категории указан правильно и товар действительно относится к ней.
- Цена меняется для всех товаров: Возможно, условие
has_term()написано с ошибкой. Используйте отладку сerror_log()для проверки. - Изменения не видны из-за кэша: Очистите кэш сайта и браузера, отключите кэширование на время тестов.
- Неверные цены в корзине: Убедитесь, что все необходимые фильтры для вариаций подключены.
Практические советы по производительности и безопасности
- Используйте в условии
has_term()ID или слаг категории — ID быстрее, но слаг удобнее читать. - Добавьте проверку
is_admin()внутри функции, чтобы изменения не влияли на админку и не создавали лишнюю нагрузку:
if (is_admin()) {
return $price;
}- Для больших магазинов с сотнями товаров лучше реализовать кеширование результатов проверки принадлежности к категории.
- Избегайте изменения цены напрямую в базе, используйте фильтры для безопасности и простоты отката изменений.
Сравнение вариантов реализации изменения цены по категории
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_product_get_price | Быстрая реализация, не меняет базу, гибко | Цена изменяется только при выводе, нельзя использовать для сложных расчётов в админке |
| Изменение цены в базе (переопределение метаполей) | Цена меняется для всех операций, включая админку | Риск ошибок, нужно ручное восстановление, сложнее отладка |
| Плагины скидок и динамических цен | Удобно для пользователей без кода | Нагрузка, не всегда гибко, платные решения |