Диагностика задачи: зачем автоматически менять цены в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически снижать цены товаров во время акций, распродаж или специальных предложений. Ручное изменение цен неудобно и чревато ошибками, особенно если товаров много. Автоматизация этой задачи с помощью хуков WooCommerce позволяет гибко управлять ценами без сторонних плагинов.
Какие хуки использовать для изменения цены товара
Для динамического изменения цены товара применяются фильтры WooCommerce, которые отвечают за получение цены товара на фронтенде и в корзине:
woocommerce_product_get_price— цена товара для отображения;woocommerce_product_get_sale_price— специальная цена (скидка);woocommerce_product_get_regular_price— базовая цена без скидок;woocommerce_before_calculate_totals— событие перед подсчетом итогов в корзине (для динамического изменения цен в корзине).
Пошаговое решение: пример кода для изменения цены при акции
Рассмотрим пример, как снизить цену всех товаров категории sale-category на 20%:
add_filter('woocommerce_product_get_price', 'custom_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_discount_price', 10, 2);
function custom_discount_price($price, $product) {
if (has_term('sale-category', 'product_cat', $product->get_id())) {
$discounted_price = $price * 0.8; // скидка 20%
return round($discounted_price, 2);
}
return $price;
}Для корректного применения скидки в корзине дополнительно добавим обработчик:
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_discount');
function custom_cart_item_discount($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (has_term('sale-category', 'product_cat', $product->get_id())) {
$original_price = $product->get_regular_price();
$discounted_price = $original_price * 0.8;
$product->set_price(round($discounted_price, 2));
}
}
}Как проверить, что скидка работает
- Откройте страницу товара из категории
sale-category. Цена должна отображаться с учетом скидки 20%. - Добавьте товар в корзину. В корзине и при оформлении заказа цена тоже должна быть снижена на 20%.
- Очистите кеш сайта и браузера, если изменения не видны сразу.
- Для проверки используйте режим инкогнито или другой браузер.
Частые ошибки при автоматическом изменении цен и их исправление
- Скидка не применяется в корзине
Причина: не добавлен обработчикwoocommerce_before_calculate_totalsили он написан с ошибками. Решение: добавьте обработчик и используйте$product->set_price()внутри цикла по товарам корзины. - Старая цена отображается на странице товара
Причина: не подключены фильтрыwoocommerce_product_get_priceиwoocommerce_product_get_sale_price. Решение: добавьте эти фильтры для корректного отображения. - Скидка применяется ко всем товарам
Причина: неверная проверка категории вhas_term(). Решение: убедитесь, что название категории указано правильно, можно проверить через админку или функциюprint_r(wp_get_post_terms($product_id, 'product_cat')).
Практические советы по безопасности и производительности
- Используйте кэширование при большом каталоге, но исключите страницы корзины и оформления заказа из кэша, иначе динамическая цена не обновится.
- Проверяйте, что ваши хуки не конфликтуют с плагинами скидок и акций. В случае конфликтов лучше реализовать логику через один централизованный фильтр.
- Не изменяйте цену товара напрямую в базе — используйте только хуки и методы API WooCommerce для динамического изменения.
- Если скидки сложные — с разными условиями, рассмотрите использование плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcontent.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-izmenenie-tsen-pri-aktsiyah) для оптимизации и управления акциями.
Сравнение подходов: плагин vs код vs комбинация
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин скидок (например, WooCommerce Dynamic Pricing) | Простота настройки, готовый UI, поддержка сложных правил | Нагрузка на сайт, может конфликтовать с другими плагинами, платный | Большой каталог, сложные сценарии скидок |
| Код на хуках (как в статье) | Легковесность, полный контроль, нет лишних зависимостей | Нужны навыки PHP, ограниченная функциональность, поддержка вручную | Небольшие каталоги, простые скидки |
| Комбинация | Использование кода для базовых скидок + плагинов для сложных | Требует тщательного тестирования, возможны конфликты | Средние и крупные проекты с частыми акциями |