Диагностика проблемы: почему стандартные акции WooCommerce недостаточны
WooCommerce предлагает базовые механизмы скидок и купонов, но часто требуется более гибкое и автоматическое изменение цены товара на основе условий акции — например, изменение цены с учётом определённого периода, категорий товаров или динамических условий без участия пользователя. Стандартные купоны не всегда подходят, поскольку требуют ручного ввода клиентом и не позволяют менять цену в самом каталоге.
Типичные симптомы:
- Нет возможности показать скидочную цену в каталоге без ручного применения купона
- Сложные правила скидок требуют кастомного программного решения
- Нужна автоматическая замена цены товара на странице без влияния на базовую цену в административной панели
Пошаговое решение: добавляем автоматическую акционную цену через фильтр
Для изменения цены товара на фронтенде без изменения базовой цены используем фильтр woocommerce_get_price. Он позволяет динамически подменять цену в зависимости от условий.
Пример кода для functions.php вашей темы или в виде небольшого плагина:
add_filter('woocommerce_get_price', 'custom_woocommerce_sale_price', 10, 2);
function custom_woocommerce_sale_price($price, $product) {
// Проверяем, что это товар и он в категории 'sale-products'
if (is_admin()) return $price; // не менять цену в админке
if ($product->is_type('simple') && has_term('sale-products', 'product_cat', $product->get_id())) {
$discount_percentage = 20; // скидка 20%
$new_price = $price * (1 - $discount_percentage / 100);
return round($new_price, 2);
}
return $price;
}Объяснение:
- Фильтр срабатывает при выводе цены
- Проверяем, что товар относится к категории
sale-products(создайте такую категорию и добавьте туда товары) - Применяем скидку в 20%
- Возвращаем новую цену, округлённую до 2 знаков после запятой
Как расширить логику
Можно добавить дополнительные условия — дату акции, пользовательские роли, количество в корзине и т.д. Например, ограничить акцию по дате:
function custom_woocommerce_sale_price($price, $product) {
if (is_admin()) return $price;
$now = current_time('timestamp');
$sale_start = strtotime('2024-07-01 00:00:00');
$sale_end = strtotime('2024-07-07 23:59:59');
if ($product->is_type('simple') && has_term('sale-products', 'product_cat', $product->get_id())
&& $now >= $sale_start && $now <= $sale_end) {
$discount_percentage = 20;
$new_price = $price * (1 - $discount_percentage / 100);
return round($new_price, 2);
}
return $price;
}Проверка результата после внедрения
Чтобы убедиться, что цена товара меняется автоматически:
- Добавьте товар в категорию
sale-products - Откройте страницу товара на сайте (не в админке)
- Проверьте, что цена отображается с учётом скидки (уменьшена на 20%)
- Для проверки даты акции измените время на сервере или скорректируйте условия в коде
- Убедитесь, что цена в админке товара не изменилась
Частые ошибки и как их исправить
- Цена не меняется на фронтенде
Проверьте, что фильтр подключён и не выключен другими плагинами. Для отладки вставьтеerror_log()в функцию и смотрите логи. - Изменяется цена в админке
Нужно добавить проверкуis_admin(), чтобы не менять цену в панели управления. - Скидка применяется ко всем товарам
Убедитесь, что условиеhas_term()правильно указывает категорию. - Конфликт с другими плагинами скидок
Проверьте, нет ли плагинов, которые тоже фильтруют цены, и отключите их для теста.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в фильтрах цены — используйте кеширование и минимальные проверки.
- Всегда проверяйте тип продукта — например, для вариативных товаров цена формируется иначе.
- Для сложных акций лучше создавать отдельный плагин с возможностью включения/отключения и настройками.
- Не изменяйте цены в базе напрямую, чтобы не нарушить логику WooCommerce и отчёты.
Сравнение вариантов реализации автоматических акций в WooCommerce
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Стандартные купоны | Ручное применение скидок покупателем | Простота, стандартный функционал | Не автоматично, пользователь должен вводить код |
| Встроенные акции WooCommerce | Установка цены продажи в админке | Отображается в каталоге, простота | Нельзя динамически менять цену по сложным условиям |
Код с фильтром woocommerce_get_price |
Динамическая замена цены на фронтенде | Гибкость, автоматизация, без изменения базы | Требует навыков программирования, возможны конфликты |