Диагностика задачи: зачем автоматически менять цены товаров при скидках категорий
В WooCommerce часто требуется применить скидку не к отдельным товарам, а к целым категориям. При этом важно, чтобы цены товаров на сайте менялись автоматически без необходимости редактировать каждый товар вручную. Это особенно актуально для магазинов с большим ассортиментом и регулярными акциями.
Обычно скидки реализуют через купоны или промокоды, но они не всегда удобны для постоянных акций на категории. Поэтому автоматическое изменение цены на этапе отображения и заказа — более гибкое решение.
Как работает автоматическое изменение цены: ключевые моменты
- Изменение цены происходит динамически через фильтры WooCommerce, без прямого редактирования базы данных.
- Скидка применяется на уровне отображения цены и итоговой суммы в корзине/чеке.
- Используются хуки
woocommerce_get_priceиwoocommerce_before_calculate_totalsдля корректного отображения и расчёта.
Пошаговое решение: код для автоматической скидки по категориям
1. Добавление фильтра для изменения цены товара на странице магазина
add_filter('woocommerce_get_price', 'apply_category_discount_on_price', 10, 2);
function apply_category_discount_on_price($price, $product) {
// ID категорий для скидки
$discount_categories = array(15, 22); // замените на ваши ID
$discount_percentage = 20; // скидка 20%
if (is_admin()) return $price; // не меняем в админке
if (has_term($discount_categories, 'product_cat', $product->get_id())) {
$price = $price * (1 - $discount_percentage / 100);
}
return $price;
}
2. Обновление цены товара в корзине и на этапе оформления заказа
add_action('woocommerce_before_calculate_totals', 'apply_category_discount_in_cart', 10, 1);
function apply_category_discount_in_cart($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
$discount_categories = array(15, 22); // те же ID категорий
$discount_percentage = 20;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (has_term($discount_categories, 'product_cat', $product->get_id())) {
$original_price = $product->get_regular_price();
$new_price = $original_price * (1 - $discount_percentage / 100);
$product->set_price($new_price);
}
}
}
Проверка результата после внедрения
- Откройте страницу категории с ID 15 или 22, проверьте, что цены товаров отображаются с 20% скидкой.
- Добавьте товар из этой категории в корзину, перейдите к оформлению заказа и убедитесь, что цена в корзине и итоговая сумма соответствуют скидке.
- Проверьте, что товары из других категорий цены не изменились.
Частые ошибки и как их исправить
- Цена не меняется на страницах магазина: проверьте, что ID категорий указаны правильно и что фильтр
woocommerce_get_priceдобавлен без ошибок. - Скидка не применяется в корзине: убедитесь, что хук
woocommerce_before_calculate_totalsработает и что функция корректно обновляет цену товара через$product->set_price(). - Скидка применяется в админке: фильтры должны игнорировать админку, для этого есть проверка
is_admin(). - При использовании кэширования цены не обновляются: отключите кэширование для страниц корзины и товаров или используйте AJAX для динамического обновления.
Практические советы по безопасности и производительности
- Не редактируйте цены напрямую в базе данных — используйте фильтры и хуки WooCommerce.
- Для большого количества категорий и товаров лучше использовать кэширование с осторожностью, чтобы не показывать устаревшие цены.
- Проверяйте совместимость с плагинами кэширования (например, WP Rocket, W3 Total Cache) и настройте исключения для страниц корзины и оформления заказа.
- При использовании кастомного кода храните его в дочерней теме или специальном плагине, чтобы не потерять изменения при обновлениях.
Сравнение способов реализации скидок на категории WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Купоны | Ручное создание скидочных купонов для категорий | Простота, встроено в WooCommerce | Не автоматично, требует действия пользователя |
| Плагины скидок | Использование плагинов для акций на категории | Готовые решения с UI, гибкость | Может замедлять сайт, платные функции |
| Кастомный код (фильтры) | Динамическое изменение цены через хуки | Быстро, бесплатно, гибко | Требует навыков разработки, возможны ошибки |