Диагностика проблемы: почему нужно менять стоимость товаров программно
В WooCommerce часто возникает задача автоматического изменения цены товара при акциях, распродажах или специальных условиях. Использование стандартного функционала со скидками не всегда удобно — например, если скидка должна применяться по сложным правилам (категории + пользовательская роль) или с динамическими формулами. В таких случаях стоит реализовать изменение цены через хуки и функции WordPress, чтобы гибко контролировать логику.
Как автоматически изменить цену товара в WooCommerce
Выбор подходящего хука для корректировки цены
Для изменения цены в WooCommerce на лету используется фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price. Они позволяют модифицировать цену товара перед выводом на сайте без изменения данных в базе.
Пример функции для автоматической скидки 20% на товары из категории "Распродажа"
add_filter('woocommerce_product_get_price', 'custom_sale_price_for_category', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price_for_category', 10, 2);
function custom_sale_price_for_category($price, $product) {
if (has_term('rasprodazha', 'product_cat', $product->get_id())) {
$discount = 0.8; // 20% скидка
$new_price = $price * $discount;
return round($new_price, 2);
}
return $price;
}Этот код проверяет, принадлежит ли товар категории с ярлыком rasprodazha и применяет скидку 20%. Функция работает динамически, не изменяя цены в админке.
Пошаговое руководство по внедрению
- Добавьте код в functions.php вашей дочерней темы (или используйте плагин для пользовательских функций).
- Измените ярлык категории
rasprodazhaна нужный вашей акции. - Очистите кэш сайта и кэш браузера.
- Проверьте страницу товара и страницу магазина, чтобы увидеть изменённую цену.
Как проверить, что решение сработало
- Откройте товар, который принадлежит к категории акции.
- Проверьте цену — она должна быть на 20% ниже оригинальной.
- Для контроля откройте товар вне категории — цена должна быть без изменений.
- Используйте инструмент разработчика браузера — в консоли запросов проверьте, что цена передаётся верно.
Частые ошибки и способы их исправления
- Цена не меняется: Проверьте корректность ярлыка категории, убедитесь, что фильтр подключён правильно и что код добавлен в активную тему.
- Цена меняется на странице товара, но не в корзине: Добавьте аналогичный фильтр на
woocommerce_cart_item_priceиwoocommerce_cart_item_subtotalдля корзины. - Конфликт с другими плагинами скидок: Отключите временно плагины скидок, проверьте, не перекрывают ли они цены.
- Кэширование мешает увидеть изменения: Очистите все кэши (сайт, сервер, CDN) и попробуйте снова.
Практические советы по безопасности и производительности
- Старайтесь минимизировать сложную логику внутри фильтров цены — тяжелые запросы замедляют загрузку страниц.
- Кэшируйте результаты вычислений, если скидки зависят от сложных условий (например, пользовательских ролей или внешних API).
- Не изменяйте цены в базе данных напрямую для временных акций — используйте фильтры, чтобы избежать ошибок и сохранить целостность данных.
Дополнительные варианты реализации
Если скидка должна зависеть от роли пользователя, можно добавить условие:
function custom_sale_price_for_category_and_role($price, $product) {
if (has_term('rasprodazha', 'product_cat', $product->get_id()) && current_user_can('wholesale_customer')) {
return round($price * 0.7, 2); // 30% скидка для оптовиков
}
return $price;
}
add_filter('woocommerce_product_get_price', 'custom_sale_price_for_category_and_role', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price_for_category_and_role', 10, 2);Сравнение способов реализации автоматических скидок
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Встроенные распродажи WooCommerce | Простота, поддержка из коробки | Мало гибкости, только фиксированные скидки | Обычные распродажи без условий |
| Плагины скидок (например, Dynamic Pricing) | Богатый функционал, UI для правил | Нагрузка, возможны конфликты, стоимость | Сложные акции, много условий |
| Кастомные фильтры и хуки (как в статье) | Максимальный контроль, легковесность | Требует навыков разработки | Уникальные условия, интеграции |