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

Диагностика задачи: зачем и когда менять стоимость товара автоматически

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

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

  • Скидка при покупке более N штук товара
  • Цена для определённой роли пользователя (оптовики, партнёры)
  • Сезонные акции — изменение цены в заданные даты
  • Изменение стоимости при наличии определённых меток или свойств товара

Пошаговое решение: как программно изменить цену товара в WooCommerce

Для динамического изменения цены лучше использовать фильтр woocommerce_product_get_price и аналогичные. Они вызываются при получении цены товара, что позволяет подменить значение на лету без изменения базы.

Рассмотрим пример: скидка 10% при покупке от 5 штук одного товара.

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_price', 10, 2);

function custom_dynamic_price($price, $product) {
    if (!is_admin() && is_product()) {
        $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.9; // скидка 10%
        }
    }
    return $price;
}

Этот код проверяет, если в корзине 5 и более данного товара — применяет скидку 10%.

Изменение цены для определённой роли пользователя

add_filter('woocommerce_product_get_price', 'role_based_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'role_based_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'role_based_price', 10, 2);

function role_based_price($price, $product) {
    if (current_user_can('wholesale_customer')) { // замените на нужную роль
        $price = $price * 0.85; // скидка 15% для оптовиков
    }
    return $price;
}

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

  • Добавьте в корзину нужное количество товара и убедитесь, что на странице товара и в корзине цена изменилась.
  • Для проверки по роли — войдите под пользователем с нужной ролью, обновите страницу товара и посмотрите на цену.
  • Для отладки можно временно добавить error_log() внутри функций чтобы фиксировать вычисляемую цену.

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

  • Цена не меняется: проверьте, что фильтры подключены корректно и при вызове WC()->cart объект корзины доступен (нельзя использовать в админке или когда корзина ещё не инициализирована).
  • Конфликты с кешированием: кеширующие плагины могут показывать старую цену. Очистите кеш сайта и браузера.
  • Цена меняется в админке: добавьте проверку !is_admin() чтобы не менять цену в административной части.
  • Цена не обновляется после изменения количества в корзине: убедитесь, что страница корзины и товара динамически обновляются (AJAX), или используйте wp_enqueue_script с JS для принудительного обновления.

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

  • Не изменяйте цену напрямую в базе данных — используйте фильтры WooCommerce для корректной работы с кэшами и учётом налогов.
  • Проверяйте наличие объекта корзины перед использованием WC()->cart чтобы избежать ошибок на страницах без корзины.
  • Если логика усложняется — выносите её в отдельные классы и методы для удобства поддержки и тестирования.
  • Для частых условий (даты, роли) кешируйте результаты внутри запроса, чтобы не выполнять лишних проверок.

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

МетодПлюсыМинусы
Фильтры woocommerce_product_get_priceДинамическая подмена без изменения базы, совместимость с WooCommerceНе всегда учитывается в отчетах и интерфейсах, требует проверки на кеширование
Изменение цены через метаполя и сохранениеПоказывается в админке, отчетахТребует сложной логики обновления и может вызвать проблемы с кешем
Плагины для динамического ценообразованияГотовые решения с поддержкой и настройкамиМогут быть дорогими, не всегда покрывают все сценарии
Как удалить пустые мета данные в WordPress для оптимизации базы
25.03.2026
Как создать собственный шорткод в WordPress
05.11.2025
WooCommerce: установка лимитов на количество товаров в корзине
26.04.2026
Автоматическое удаление неактивных пользователей WordPress
08.02.2026
Как автоматизировать управление ролями в WordPress с помощью кода
22.12.2025