WooCommerce: автоматическое изменение стоимости товара при определённых условиях

Что такое динамическое изменение цены в WooCommerce и зачем оно нужно

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

Диагностика задачи: как понять, что нужно менять цену программно

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

  • Нужна ли цена, зависящая от параметров (количество, роль пользователя, дата, купон и т.д.)
  • Не хватает ли стандартных скидок WooCommerce или плагинов (например, Dynamic Pricing)
  • Есть ли требования к времени действия изменений, к условиям применения

Если ответ "да" — программное решение на хуках WooCommerce будет оптимальным.

Пошаговое решение: реализация изменения цены через фильтр woocommerce_get_price

1. Подключаем функцию в файл functions.php вашей темы или в кастомный плагин

add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    // Проверяем, является ли продукт нужного типа
    if (!$product->is_type('simple')) {
        return $price; // Оставляем цену без изменений
    }

    // Пример условия 1: скидка 10% для пользователей с ролью 'subscriber'
    if (current_user_can('subscriber')) {
        $price = $price * 0.9; // уменьшаем на 10%
    }

    // Пример условия 2: скидка 20% при покупке от 5 штук
    // Чтобы получить количество, нужно использовать хук на уровне корзины, этот фильтр не подходит для этого условия

    return $price;
}

Данный код уменьшает цену на 10% для пользователей с ролью subscriber. Это простой пример, который можно расширять.

2. Для изменения цены в корзине по количеству — используем хук woocommerce_before_calculate_totals

add_action('woocommerce_before_calculate_totals', 'custom_price_by_quantity', 10, 1);
function custom_price_by_quantity($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $quantity = $cart_item['quantity'];
        $product = $cart_item['data'];
        $price = $product->get_regular_price();

        // Если куплено 5 и более, даём скидку 15%
        if ($quantity >= 5) {
            $new_price = $price * 0.85;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Этот код меняет цену уже в корзине, учитывая количество товара, что невозможно сделать в фильтре woocommerce_get_price.

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

  • Авторизуйтесь под пользователем с ролью subscriber, зайдите на страницу товара — цена должна быть снижена на 10%
  • Добавьте в корзину 5 и более единиц товара — в корзине цена товара должна уменьшиться на 15%
  • Попробуйте под другим пользователем или без авторизации — цена должна оставаться базовой

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

  • Изменение цены не происходит на страницах товара — фильтр woocommerce_get_price работает корректно, но кэширование может скрывать изменения. Очистите кэш и отключите плагины кэширования для проверки.
  • Цена меняется в каталоге, но не в корзине — учтите, что woocommerce_get_price влияет на отображение, а для цены в корзине нужен хук woocommerce_before_calculate_totals с вызовом set_price().
  • Изменения не учитываются при оплате — убедитесь, что цена меняется именно через set_price() в корзине, иначе в заказ попадёт базовая цена.
  • Проблемы с совместимостью с другими плагинами скидок — протестируйте с отключенными сторонними плагинами, чтобы исключить конфликты.

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

  • Не используйте тяжелые запросы к базе данных внутри фильтров цены — это замедлит загрузку страниц.
  • Для сложных условий лучше кешировать результаты условий (например, роль пользователя, состояние корзины).
  • Всегда проверяйте права доступа и корректность данных, чтобы избежать ошибок типа "undefined index".
  • Тестируйте изменения на тестовом стенде, чтобы избежать ошибок в продакшене.

Сравнение вариантов реализации автоматического изменения цены

МетодПлюсыМинусыКогда использовать
Фильтр woocommerce_get_priceПростая реализация, подходит для отображения ценыНе влияет на цену в корзине и заказеНебольшие изменения для отображения цены
Хук woocommerce_before_calculate_totalsИзменяет реальную цену в корзине и заказеСложнее в реализации, нужно учитывать AJAX-запросыИзменение цены по количеству, сложные условия
Плагины динамического ценообразованияГотовые решения с интерфейсом, много условийПлатные, могут замедлять сайтБыстрая реализация без кода
Как создать динамическую таблицу в WordPress с использованием PHP и плагинов
29.11.2025
Как использовать Metabox для создания дополнительных полей в WordPress
15.12.2025
Автоматическое удаление отзывов в WooCommerce после их модерации
22.05.2026
Как создать автозаполняемый формат даты в WordPress с примером кода
04.04.2026
Как отключить автоматические обновления WordPress
03.01.2026