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

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

В стандартном WooCommerce цена товара в корзине берется из базы и не меняется динамически. Однако в ряде случаев необходимо изменить стоимость товара прямо на этапе оформления заказа: например, при предоставлении индивидуальных скидок, акций, изменении цены в зависимости от пользовательских данных или дополнительных условий.

Основная диагностика: если стандартных скидок и купонов недостаточно, и нужно изменить цену программно, то нужно использовать фильтры и хуки WooCommerce для корректного пересчёта итогов в корзине и заказе.

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

Для корректного изменения цены в корзине используйте хук woocommerce_before_calculate_totals. Он срабатывает до перерасчёта итогов, что позволяет модифицировать цену каждого товара.

Пример кода для изменения цены товара в корзине:

add_action('woocommerce_before_calculate_totals', 'wpmod_change_cart_item_price', 20, 1); function wpmod_change_cart_item_price($cart) {    if (is_admin() && !defined('DOING_AJAX')) return;    // Пример: скидка 10% на все товары с категорией "sale"    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {        $product = $cart_item['data'];        if (has_term('sale', 'product_cat', $product->get_id())) {            $original_price = $product->get_regular_price();            $new_price = $original_price * 0.9; // скидка 10%            $product->set_price($new_price);        }    }}

Важные моменты:

  • Функция проверяет, что код не срабатывает в админке вне AJAX.
  • Изменяется цена через объект товара $product->set_price().
  • Пересчет итогов происходит автоматически после этого хука.

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

Добавьте в корзину товар из категории sale, затем на странице корзины проверьте цену. Она должна быть на 10% меньше оригинала. Изменения также видны на странице оформления заказа и в сумме заказа.

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

Если нужно менять цену в корзине для определенного пользователя или роли, можно добавить условие:

add_action('woocommerce_before_calculate_totals', 'wpmod_change_price_for_user', 20, 1); function wpmod_change_price_for_user($cart) {    if (is_admin() && !defined('DOING_AJAX')) return;    if (!is_user_logged_in()) return;    $user = wp_get_current_user();    if (in_array('wholesale_customer', $user->roles)) {        foreach ($cart->get_cart() as $cart_item_key => $cart_item) {            $product = $cart_item['data'];            $new_price = $product->get_regular_price() * 0.85; // скидка 15%            $product->set_price($new_price);        }    }}

Проверка

Залогиньтесь под пользователем с ролью wholesale_customer и проверьте цену в корзине.

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

  • Изменения цены не видны: часто из-за отсутствия is_admin() && !defined('DOING_AJAX') проверки, и изменение происходит в админке или в момент Ajax-запроса, что ломает отображение.
  • Цена меняется, но итог не пересчитывается: необходимо использовать именно хук woocommerce_before_calculate_totals, а не позднее.
  • Изменение цены применяется ко всем товарам, а нужно только к некоторым: правильно фильтруйте товары по категориям, тегам, мета-данным.
  • Цена в заказе отличается от цены в корзине: убедитесь, что цена меняется в момент формирования заказа, чтобы сохранить её в мета-данных, если нужно.

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

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

  1. Добавьте в корзину товар, попадающий под условие изменения цены.
  2. Обновите страницу корзины, убедитесь, что цена изменилась.
  3. Перейдите к оформлению заказа, проверьте итоговую сумму.
  4. Оформите тестовый заказ, проверьте, что цена в админке заказа совпадает с измененной.
  5. Если применяются разные роли, проверьте под разными пользователями.

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

  • Не изменяйте цену товара в базе данных напрямую — меняйте цену только в объекте товара в корзине.
  • Добавляйте проверку условий, чтобы избежать лишних вычислений и не замедлять загрузку страницы.
  • Используйте кэширование или мета-данные, если цена зависит от сложных вычислений или внешних API.
  • Тестируйте все изменения на тестовом стенде, чтобы не нарушить логику оформления заказа.

Сравнительная таблица способов изменения цены в корзине WooCommerce

МетодОписаниеПлюсыМинусы
Фильтр woocommerce_before_calculate_totalsИзменение цены товара динамически в корзинеПростота, интеграция с WooCommerce, автоматический пересчётПотребуется дополнительный код для сохранения цены в заказе
Плагин скидок и акцийИспользование готовых решений для скидокНе требует программирования, поддержкаНе всегда гибко, может не покрыть все сценарии
Изменение цены в базеПрямое изменение стоимости товара в базе данныхПостоянное изменение ценыНебезопасно, ломает логику WooCommerce, не рекомендуется
Как использовать хук woocommerce_order_status_changed для автоматизации задач в WooCommerce
29.05.2026
WooCommerce: как исправить невозможность отмены заказа после оплаты
15.06.2026
Как использовать метаданные товаров для оптимизации WooCommerce
23.05.2026
WooCommerce: как избежать проблем с кэшированием при использовании сниппетов
08.06.2026
WooCommerce: как исправить невозможность удаления заказа после оплаты
27.06.2026