WooCommerce: автоматическое изменение цен товаров при применении скидок к категориям

Диагностика задачи: зачем автоматически менять цены товаров при скидках категорий

В 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, гибкостьМожет замедлять сайт, платные функции
Кастомный код (фильтры)Динамическое изменение цены через хукиБыстро, бесплатно, гибкоТребует навыков разработки, возможны ошибки
WooCommerce: авторизация через социальные сети без плагинов — практическое руководство
29.04.2026
Как использовать REST API для управления пользователями в WordPress
07.01.2026
WooCommerce: автоматическое удаление неоплаченных заказов после отсутствия платежа
15.06.2026
Как добавить дополнительные роли и права в WordPress с примерами
20.01.2026
Как создать автоматические уведомления в WordPress с помощью хуков и плагинов
25.02.2026