Диагностика задачи: как автоматически менять цены товаров во время акции
В WooCommerce часто возникает необходимость автоматически менять цену товаров при активной акции без создания купонов или ручного редактирования. Например, при запуске распродажи нужно снизить цену на 20% на выбранные категории или теги товаров. При этом важно, чтобы изменения отображались на фронтенде и в корзине, а в админке сохранялась оригинальная цена.
Если вы столкнулись с тем, что стандартные возможности WooCommerce не позволяют гибко и автоматизированно менять цены на основе своих условий, следующий раздел решит эту проблему с помощью кастомного кода.
Пошаговое решение: реализация автоматического изменения цены через хук woocommerce_product_get_price
Для изменения цены товара динамически нужно использовать фильтры WooCommerce, которые отвечают за возврат цены продукта. Рассмотрим пример снижения цены на 20% на товары из категории sale.
add_filter('woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', '__return_empty_string');
function custom_dynamic_sale_price($price, $product) {
if (is_admin()) {
return $price; // Не меняем цену в админке
}
// Проверяем, есть ли категория 'sale'
if (has_term('sale', 'product_cat', $product->get_id())) {
// Снижаем цену на 20%
$new_price = $price * 0.8;
return round($new_price, 2);
}
return $price;
}Объяснение кода:
- Фильтры применяются к получению цены товара.
- В админке цена не меняется, чтобы не путать управление запасами и отчетность.
- Проверяется принадлежность товара к категории
sale. - Если условие выполняется — цена уменьшается на 20%, иначе возвращается оригинальная цена.
Как добавить поддержку отображения изменённой цены в корзине и оформлении заказа
Чтобы новая цена корректно отображалась в корзине и при оформлении, нужно добавить ещё один фильтр:
add_filter('woocommerce_cart_item_price', 'custom_cart_item_price_display', 10, 3);
function custom_cart_item_price_display($price_html, $cart_item, $cart_item_key) {
$product = $cart_item['data'];
if (has_term('sale', 'product_cat', $product->get_id())) {
$price = $product->get_price();
$price_html = wc_price($price);
}
return $price_html;
}Проверка результата после внедрения
- Перейдите на страницу товара из категории
saleи убедитесь, что цена отображается с 20% скидкой. - Добавьте товар в корзину и проверьте, что в корзине и при оформлении заказа цена та же, что и на странице товара.
- В админке в карточке товара цена не изменилась — это важно для сохранения данных.
- Для товаров вне категории
saleцена не меняется.
Частые ошибки и как исправить
- Цена не меняется на фронтенде: проверьте, что фильтр добавлен в functions.php текущей активной темы или плагине, и нет конфликтов с другими плагинами, которые могут переопределять цены.
- Цена изменяется в админке: убедитесь, что условие
if (is_admin()) return $price;присутствует, чтобы не мешать работе в админке. - В корзине и заказе цена не совпадает с отображаемой на странице товара: добавьте фильтр для отображения цены в корзине, как показано выше.
- Неверное округление цены: используйте
round($new_price, 2)для двух знаков после запятой.
Практические советы по безопасности и производительности
- Не делайте тяжелых запросов в функции, вызываемые на каждом показе цены — кешируйте результаты при необходимости.
- Для больших магазинов с тысячами товаров лучше использовать transient API или meta поля для хранения скидок, чтобы избежать нагрузки.
- Всегда тестируйте изменения на тестовом сайте перед внедрением в продакшен.
- Если нужна более гибкая логика, стоит рассмотреть использование плагинов для управления скидками, например, WooCommerce Dynamic Pricing, а кастомный код использовать для точечных задач.
Сравнение вариантов реализации автоматической скидки
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Кастомный фильтр цены в functions.php | Полный контроль, бесплатно, легкий код | Требует навыков, может конфликтовать с плагинами | Небольшие проекты, простая логика |
| Плагины для динамических скидок | Готовые решения, поддержка, гибкая настройка | Платные, нагрузка на сайт | Крупные магазины, сложные условия |
| Использование купонов WooCommerce | Простой способ, встроенный функционал | Не автоматизируется изменение цены на уровне продукта | Разовые акции, промо-коды |