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

Проблема: Как автоматически применять расширенный дисконт в WooCommerce

В стандартном WooCommerce нет гибкого механизма для автоматического изменения цены товара в зависимости от сложных условий скидок (например, количества в корзине, категории товара, или роли пользователя). В результате приходится вручную обновлять цены или использовать громоздкие купоны. Задача — настроить автоматическое изменение цены товара с помощью кода, учитывая расширенные условия.

Диагностика: Проверяем используемые методы скидок в WooCommerce

Для начала важно понять, как реализованы скидки сейчас:

  • Проверить наличие купонов в WooCommerce (WooCommerce > Купоны).
  • Оценить, используются ли плагины для скидок (например, WooCommerce Dynamic Pricing).
  • Анализировать, есть ли пользовательские фильтры или действия, влияющие на цену товара.

Если скидки не автоматизированы или не покрывают все условия, стоит реализовать собственное решение через хуки WooCommerce.

Решение: Автоматическое изменение цены товара с помощью фильтра woocommerce_get_price

Для динамического изменения цены можно использовать фильтр woocommerce_get_price. Рассмотрим пример, где цена товара уменьшается на 10% при покупке более 5 штук:

add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);function custom_dynamic_price($price, $product) {    // Проверяем, что это объект WC_Product    if (!is_a($product, 'WC_Product')) {        return $price;    }    // Получаем текущую корзину    $cart = WC()->cart;    if (!$cart) {        return $price;    }    // Считаем количество товара в корзине по ID    $product_id = $product->get_id();    $quantity = 0;    foreach ($cart->get_cart() as $cart_item) {        if ($cart_item['product_id'] === $product_id) {            $quantity += $cart_item['quantity'];        }    }    // Если куплено больше 5, уменьшаем цену на 10%    if ($quantity >= 5) {        $price = $price * 0.9;    }    return $price;}

Этот код можно вставить в functions.php вашей темы или в кастомный плагин.

Добавим условие для роли пользователя

Если скидка должна применяться только для определённой роли, например, для «оптовиков»:

add_filter('woocommerce_get_price', 'custom_dynamic_price_with_role', 10, 2);function custom_dynamic_price_with_role($price, $product) {    if (!is_a($product, 'WC_Product')) {        return $price;    }    if (!is_user_logged_in()) {        return $price;    }    $user = wp_get_current_user();    if (!in_array('wholesaler', (array) $user->roles)) {        return $price;    }    // Здесь добавляем логику изменения цены    $cart = WC()->cart;    if (!$cart) {        return $price;    }    $product_id = $product->get_id();    $quantity = 0;    foreach ($cart->get_cart() as $cart_item) {        if ($cart_item['product_id'] === $product_id) {            $quantity += $cart_item['quantity'];        }    }    if ($quantity >= 5) {        $price = $price * 0.85; // 15% скидка для оптовиков при покупке от 5    }    return $price;}

Проверка результата после внедрения

Чтобы убедиться, что автоматическое изменение цены работает:

  1. Очистите кеш сайта и браузера.
  2. Войдите под пользователем с нужной ролью (если применимо).
  3. Добавьте в корзину нужное количество товара (5 и более штук).
  4. Перейдите в корзину и проверьте, что цена товара уменьшена на заданный процент.
  5. Проверьте, что при меньшем количестве товара цена не меняется.

Частые ошибки и их исправление

  • Цена не меняется: Проверьте, что корзина инициализирована (сессия открыта). Фильтр woocommerce_get_price срабатывает и в админке, но корзина доступна только на фронтенде.
  • Конфликты с плагинами скидок: Если стоит плагин динамических скидок, он может переопределять цены. Отключите плагины и протестируйте отдельно.
  • Скидка применяется ко всем: Проверьте проверку роли пользователя или другие условия, чтобы скидка не была глобальной.
  • Цена отображается не везде: В некоторых местах (например, мини-корзина или виджетах) может потребоваться дополнительный фильтр woocommerce_get_price_html для актуализации цены.

Практические советы по производительности и безопасности

  • Не нагружайте фильтр сложными запросами к базе данных. Все данные берите из коллекций WooCommerce.
  • Кешируйте результаты, если вычисления затратные.
  • Проверяйте, что код работает только на фронтенде и для нужных страниц (is_admin(), is_cart(), is_checkout()).
  • Избегайте изменения цены в заказах и админке, чтобы не ломать учёт.

Сравнение вариантов реализации автоматических скидок

Метод Преимущества Недостатки Пример
Купоны WooCommerce Готовое решение, легкая настройка для пользователей Не автоматические, требуют ввода пользователем Встроенный функционал WooCommerce
Плагины динамических скидок Много условий, удобный интерфейс Дополнительная нагрузка, могут конфликтовать WooCommerce Dynamic Pricing
Кастомный код на хуках Максимальная гибкость, под любые условия Требует навыков программирования Фильтр woocommerce_get_price
Как отключить архивы дат в WordPress и убрать лишние страницы из индекса
21.09.2026
Как использовать WPCommunity для создания форума на WordPress
13.09.2026
Как отключить отложенную загрузку в WordPress для картинок и видео
01.09.2026
WooCommerce: автоматическое добавление товара в корзину при открытии страницы
08.09.2026
Как закрыть от индексации страницы поискового фильтра в WordPress
19.08.2026