В чем состоит задача автоматического изменения цены товара по акции
В WooCommerce часто требуется менять цену товара динамически, например, при проведении акции или скидки, которые зависят от даты, категории товара или количества в корзине. Использование стандартных скидок в админке не всегда удобно, особенно если нужно реализовать сложную логику или автоматизировать процесс. В этой статье рассмотрим, как программно изменить цену товара во фронтенде и в корзине с помощью фильтров WooCommerce.
Диагностика проблемы: почему стандартные скидки не подходят
Пользователи сталкиваются с проблемами, когда:
- Стандартные купоны и акции не позволяют задать сложные условия (например, скидка только на определённые вариации, или только при покупке от определённого количества).
- Нужно изменить цену на лету, без создания дополнительных товаров или вариаций.
- Скидка должна автоматически применяться при определённых условиях, без участия пользователя.
В таких случаях приходится использовать хуки WooCommerce для программного изменения цены товара.
Пошаговое решение: как изменить цену товара по акции через код
1. Используем фильтр woocommerce_get_price или woocommerce_product_get_price
Фильтры позволяют перехватить запрос цены товара и вернуть изменённое значение. Для динамической скидки удобнее использовать woocommerce_product_get_price, так как он срабатывает для объекта продукта.
2. Пример кода для скидки 20% на товары определённой категории при текущей дате акции
add_filter('woocommerce_product_get_price', 'custom_discounted_price', 10, 2);
function custom_discounted_price($price, $product) {
// Проверяем дату акции
$start_date = strtotime('2024-06-01');
$end_date = strtotime('2024-06-10');
$now = time();
if ($now < $start_date || $now > $end_date) {
return $price; // акция не активна
}
// Проверяем категорию товара
if (has_term('sale-category', 'product_cat', $product->get_id())) {
$discounted_price = $price * 0.8; // скидка 20%
return round($discounted_price, 2);
}
return $price;
}3. Применение скидки в корзине и на странице товара
Фильтр woocommerce_product_get_price действует на цену товара везде, включая страницу товара и корзину. Если нужно учесть цену для вариаций, добавьте аналогичный фильтр woocommerce_product_variation_get_price.
Проверка результата после внедрения
Чтобы убедиться, что скидка работает:
- Откройте страницу товара из категории
sale-categoryв период акции — цена должна быть уменьшена на 20%. - Добавьте товар в корзину — цена в корзине и в чекауте должна соответствовать изменённой цене.
- Попробуйте товары из других категорий — цена не должна изменяться.
- Вне периода акции цена должна отображаться без изменений.
Для отладки можно временно добавить error_log() с выводом цены и ID товара в файл debug.log.
Частые ошибки и как их исправить
- Скидка не применяется: Проверьте, что имя категории указано правильно (без пробелов, в нижнем регистре). Используйте
var_dump(has_term('sale-category', 'product_cat', $product->get_id()));для проверки. - Цена меняется, но в корзине возвращается исходная: Добавьте фильтр
woocommerce_product_variation_get_priceдля вариаций, или используйте фильтрwoocommerce_cart_item_priceдля корректировки цены в корзине. - Проблемы с кэшированием: Если используется плагин кэширования, очистите кэш после внесения изменений.
- Округление цены: Используйте
round($price, 2)для корректного отображения с двумя десятичными.
Практические советы по безопасности и производительности
- Избегайте сложных запросов в хуках, чтобы не замедлять загрузку страниц.
- Для больших магазинов лучше использовать transient API для кэширования рассчитанных цен на время акции.
- Не храните логику скидок в админке напрямую, если есть сложные условия — лучше реализовать в коде с комментариями.
- Проверяйте права доступа и корректность ID товара, чтобы избежать сбоев.
Сравнение вариантов реализации автоматических скидок
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагины скидок | Удобный интерфейс, много настроек | Могут грузить сайт, не всегда гибкие | WooCommerce Dynamic Pricing |
| Код через фильтры | Полный контроль, минимальный вес | Требует навыков разработки | Пример выше |
| Использование купонов | Простая реализация | Пользователь должен ввести код | Стандарт WooCommerce |