WooCommerce: как использовать фильтр hook для изменения цены товаров динамически

Диагностика проблемы: почему нужно менять цену товара программно

Часто в WooCommerce возникает задача динамически менять цену товара в зависимости от условий, например, пользовательской роли, количества в корзине, даты или других параметров. Стандартные настройки WooCommerce не всегда позволяют реализовать такие сценарии без дополнительных плагинов или кода. Использование фильтров WooCommerce — оптимальный способ внедрить логику изменения цены без модификации ядра.

Какие задачи решает фильтр цены?

  • Применение индивидуальных скидок для групп пользователей.
  • Изменение цены в зависимости от количества товара.
  • Временные акции без создания купонов.
  • Изменение цены по внешним данным — например, курсу валют.

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

В WooCommerce для изменения цены на лету используется фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price. Вот пример кода, который снижает цену на 10% для пользователей с ролью customer:

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

function custom_dynamic_price($price, $product) {
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('customer', $user->roles)) {
            $price = $price * 0.9; // скидка 10%
        }
    }
    return $price;
}

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

Объяснение кода

  • woocommerce_product_get_price — фильтр цены товара, который вызывается при получении цены.
  • Параметры: текущая цена и объект продукта.
  • Проверяем роль пользователя и применяем скидку.

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

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

  1. Войдите на сайт под пользователем с ролью customer.
  2. Откройте страницу товара и проверьте отображаемую цену — она должна быть на 10% меньше.
  3. Выйдите из аккаунта или войдите под другой ролью — цена должна отображаться без скидки.
  4. Добавьте товар в корзину и проверьте итоговую сумму.

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

  • Цена не меняется: Проверьте, что фильтр добавлен с правильным приоритетом и количество аргументов указано 2. Убедитесь, что функция подключена и код без синтаксических ошибок.
  • Цена меняется, но в корзине не обновляется: WooCommerce кеширует цены в корзине. В таких случаях нужно добавить фильтр woocommerce_get_cart_item_from_session для корректного обновления цен в сессии.
  • Ошибка при отображении цены: Убедитесь, что цена возвращается как строка или число в правильном формате. Используйте floatval() для преобразования.

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

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

Дополнительно: обновление цены в корзине

Чтобы цена корректно обновлялась в корзине, добавьте следующий код:

add_filter('woocommerce_get_cart_item_from_session', 'custom_cart_price_update', 20, 2);
function custom_cart_price_update($cart_item, $values) {
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('customer', $user->roles)) {
            $product = wc_get_product($cart_item['product_id']);
            $cart_item['data']->set_price($product->get_price() * 0.9);
        }
    }
    return $cart_item;
}

Сравнение способов изменения цены

ПодходПлюсыМинусы
Фильтры WooCommerce (код)Гибкость, не требует плагинов, высокая производительностьТребует навыков разработки, нужно правильно учитывать кеширование
Плагины скидок и динамических ценПростота настройки, готовые функцииНагрузка на сайт, возможные конфликты, ограниченная кастомизация
Редактирование базы данныхПолный контрольРиск сломать магазин, проблемы с обновлениями
WooCommerce: как отключить автоматическое обновление статуса заказов
04.06.2026
Как создать автоматический отчет о проблемах безопасности WordPress
21.03.2026
Как создать и использовать зависимый плагин в WordPress
13.04.2026
Автоматические отзывы на WordPress: создание и настройка
09.04.2026
Как автоматизировать создание резервных копий WordPress с помощью WPMax
23.01.2026