Диагностика задачи: зачем нужно автоматическое изменение цен в WooCommerce
Часто в интернет-магазинах на WooCommerce возникает необходимость динамически менять цены товаров во время акций. Типичные сценарии: скидка в процентах, фиксированное снижение цены, специальные цены на наборы или категории товаров. Важно, чтобы изменения применялись автоматически, без ручного правления каждого товара, и отображались корректно в каталоге, карточке товара и корзине.
Если не использовать плагины, можно добиться этой задачи за счёт кастомного PHP-кода в functions.php или собственном плагине. Это поможет избежать избыточного функционала, ускорить сайт и сохранить контроль над логикой скидок.
Как WooCommerce рассчитывает цены и где внедрять изменения
WooCommerce использует класс WC_Product, который содержит методы get_price(), get_regular_price(), get_sale_price(). На фронтенде вывод цены берётся через фильтр woocommerce_get_price и woocommerce_product_get_price. Для изменения цен в реальном времени нужно использовать эти фильтры.
Основные хуки для изменения цены товара
woocommerce_product_get_price– возвращает текущую цену товара.woocommerce_product_get_sale_price– цена со скидкой.woocommerce_get_price– универсальный фильтр для цены.
Изменения через эти фильтры гарантируют, что цена будет корректно отображаться в каталоге, карточке товара и корзине.
Пошаговое решение: пример кода для автоматической 10% скидки на категорию товаров
Пример, как применить скидку 10% на все товары из категории с таксономией 'category' и slug 'sale':
add_filter('woocommerce_product_get_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_discount_price', 10, 2);
function custom_dynamic_discount_price($price, $product) {
// Проверяем, входит ли товар в категорию 'sale'
if ( has_term('sale', 'product_cat', $product->get_id()) ) {
$discount = 0.10; // 10% скидка
$new_price = $price * (1 - $discount);
// Округляем до 2 знаков
return round($new_price, 2);
}
return $price;
}Этот код автоматически уменьшит цену для всех товаров в категории 'sale' на 10%. Цена будет корректно отображаться во всех местах.
Как добавить условие действия скидки по датам акции
Если нужно активировать скидку только в определённый период, добавим проверку даты:
function custom_dynamic_discount_price($price, $product) {
$start_date = strtotime('2024-01-01');
$end_date = strtotime('2024-01-10');
$current_date = current_time('timestamp');
if ( $current_date >= $start_date && $current_date <= $end_date ) {
if ( has_term('sale', 'product_cat', $product->get_id()) ) {
$discount = 0.10;
$new_price = $price * (1 - $discount);
return round($new_price, 2);
}
}
return $price;
}Проверка результата после внедрения кода
- Очистите кэш сайта и браузера.
- Перейдите на страницу товара из категории 'sale' – цена должна быть снижена на 10%.
- Добавьте товар в корзину – в корзине и на странице оформления заказа должна отображаться обновлённая цена.
- Проверьте, что цены товаров вне категории не изменились.
- Для проверки даты измените системное время или даты в коде и убедитесь, что скидка активируется и деактивируется.
Частые ошибки и как их исправить
- Цена не меняется в корзине: возможно, вы не добавили фильтр
woocommerce_product_get_priceили кеш WooCommerce не очищен. Добавьте все три фильтра, показанных в примере, и очистите кеш. - Цена меняется, но не отображается как скидка: WooCommerce выводит только
regular_priceиsale_priceдля отображения скидки. Чтобы показывать акционные цены корректно, используйте толькоget_priceдля динамического изменения, аsale_priceоставьте пустым или равнымregular_price. - Конфликты с плагинами кеширования: отключите кеширование страниц для страниц корзины и оформления заказа или настройте исключения.
- Изменение цены влияет на другие места сайта: убедитесь, что условия в функции ограничивают действие скидки только на нужные товары и даты.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в фильтрах изменения цены, чтобы не замедлять загрузку страниц.
- Кешируйте результаты проверки условий скидки, если они сложные, например, даты и категории.
- Всегда делайте бэкап functions.php перед правками.
- Для больших магазинов с тысячами товаров рассматривайте использование transient API для кеширования вычисленных цен.
- Проверяйте совместимость с WooCommerce и обновляйте код при переходах на новые версии.
Сравнение вариантов реализации автоматических скидок в WooCommerce
| Вариант | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Код в functions.php | Контроль, нет плагинов, легковесно | Требуется навыки, ограниченная гибкость | Подходит для простых скидок и разработчиков |
| Плагины акций (например, WooCommerce Dynamic Pricing) | Богатый функционал, GUI, гибкость | Плагины нагружают сайт, возможны конфликты | Лучше для сложных маркетинговых схем |
| Использование кастомных полей и cron для массовых изменений | Автоматизация, масштабируемость | Сложность настройки, требует поддержки | Для больших магазинов с частыми акциями |