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

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

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

Основные фильтры для изменения цены в WooCommerce

Для изменения цены товара в корзине используют следующие ключевые фильтры:

  • woocommerce_before_calculate_totals — позволяет изменять цену товара перед расчетом итогов корзины;
  • woocommerce_cart_item_price — позволяет изменить отображаемую цену товара в корзине;
  • woocommerce_get_price и woocommerce_product_get_price — применяются для изменения цены продукта в целом, но не всегда подходят для динамического изменения в корзине.

Почему важен фильтр woocommerce_before_calculate_totals

Этот хук вызывается перед подсчетом итогов корзины и позволяет программно установить новую цену для каждого элемента корзины. Изменения, внесённые здесь, корректно учитываются во всех расчетах.

Пошаговое решение: динамическая скидка 10% для пользователей с ролью "оптовик"

Рассмотрим пример, где мы хотим автоматически уменьшать цену товаров в корзине на 10% для пользователей с ролью wholesale_customer.

add_action('woocommerce_before_calculate_totals', 'apply_wholesale_discount', 10, 1);function apply_wholesale_discount( $cart ) {if ( is_admin() && ! defined('DOING_AJAX') )return;if ( ! is_user_logged_in() )return;$user = wp_get_current_user();if ( in_array( 'wholesale_customer', (array) $user->roles ) ) {foreach ( $cart->get_cart() as $cart_item ) { $original_price = $cart_item['data']->get_regular_price();$discounted_price = $original_price * 0.9;$cart_item['data']->set_price( $discounted_price );}}}

Объяснение:

  • Проверяем, что это не админка и не AJAX-запрос.
  • Проверяем, что пользователь залогинен и имеет нужную роль.
  • Для каждого товара в корзине берём оригинальную цену и уменьшаем на 10%.
  • Устанавливаем новую цену через метод set_price().

Как проверить, что изменение цены сработало

  • Залогиньтесь под пользователем с ролью wholesale_customer и добавьте товар в корзину.
  • Проверьте цену товара в корзине — она должна быть на 10% ниже исходной.
  • Выйдите из аккаунта или войдите под другим пользователем — цена должна отображаться без скидки.
  • Для дополнительной проверки можно включить логирование, добавив в функцию error_log('Цена товара изменилась: ' . $discounted_price);.

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

  • Изменения не применяются: причиной может быть неправильный приоритет хука или отсутствие вызова set_price(). Используйте приоритет 10 и проверяйте, что объект товара действительно модифицируется.
  • Цена изменяется для всех пользователей: забыли проверить роль или статус пользователя. Добавьте проверки is_user_logged_in() и in_array() для ролей.
  • Кеширование мешает увидеть изменения: отключите кеширование страниц и плагинов, которые могут кешировать корзину, либо добавьте исключения.
  • Изменение цены не отображается в итогах заказа: убедитесь, что изменение цены происходит до подсчёта итогов, то есть через woocommerce_before_calculate_totals, а не после.

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

  • Не используйте изменение цены через JavaScript — это легко обходится и опасно с точки зрения безопасности.
  • Минимизируйте количество запросов внутри хука — не делайте лишних запросов к базе, кэшируйте данные, если нужно.
  • При работе с ролями используйте стандартные функции WordPress для проверки прав, чтобы избежать ошибок.
  • Тестируйте изменения на локальной копии, чтобы избежать сбоев на живом сайте.

Сравнение методов изменения цены в корзине

МетодПлюсыМинусыИспользование
woocommerce_before_calculate_totalsНадёжное изменение цены перед расчетом итогов.Требует программирования, нельзя менять отображение без изменения цены.Динамическое изменение цены товаров в корзине.
woocommerce_cart_item_priceМожно изменить отображаемую цену без изменения стоимости.Цена в итогах не меняется, только визуально.Для визуального оформления, не для расчётов.
woocommerce_get_priceГлобальное изменение цены товара.Меняет цену во всех местах, сложно контролировать.Для изменения цены товара в каталоге.
Как защитить WordPress от внедрения злонамеренных кодов через AJAX
14.04.2026
Как защитить WordPress от проблем с файловыми правилами .htaccess
13.03.2026
Как защитить WordPress от размещения вредоносных файлов в каталогах загрузок
17.04.2026
Как защитить WordPress от PHP File Injection
02.02.2026
Как защитить WordPress от удаленного выполнения кода (RCE)
14.11.2025