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

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

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

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

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

  • woocommerce_product_get_price — основной фильтр для получения цены товара.
  • woocommerce_product_get_regular_price — для обычной (неакционной) цены.
  • woocommerce_product_get_sale_price — для акционной цены.
  • woocommerce_variation_prices_price и woocommerce_variation_prices_regular_price — для вариаций товара.

Пример: увеличение цены на 10% для всех товаров категории «Активные»

add_filter('woocommerce_product_get_price', 'wc_increase_price_for_category', 10, 2);
function wc_increase_price_for_category($price, $product) {
    if (has_term('aktivnye', 'product_cat', $product->get_id())) {
        $price = $price * 1.1; // +10%
    }
    return $price;
}

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

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

  1. Определите логику изменения цены (категория, роль пользователя, дата и т.п.).
  2. Выберите соответствующий фильтр WooCommerce (обычно woocommerce_product_get_price).
  3. Напишите функцию, которая принимает цену и объект товара, возвращает новую цену.
  4. Добавьте фильтр через add_filter с нужным приоритетом.
  5. Очистите кэш сайта и кэши плагинов кэширования.
  6. Проверьте работу на странице товара, в корзине и на кассе.

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

  • Откройте страницу товара, который входит в целевую категорию. Цена должна измениться согласно вашей логике.
  • Добавьте товар в корзину и проверьте итоговую цену.
  • Убедитесь, что при изменении категории товара или условий цена возвращается к исходной или меняется корректно.
  • Используйте инструмент разработчика браузера, чтобы убедиться, что цена подгружается динамически, а не из кеша.

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

  • Изменение цены только на странице товара, но не в корзине или на кассе. Нужно применять фильтры, которые работают во всех контекстах, например woocommerce_product_get_price, а не только на фронтенде.
  • Цена меняется, но итоговая сумма в заказе не совпадает. Возможно, нужно изменить цену также через фильтр woocommerce_cart_item_price или использовать woocommerce_before_calculate_totals для обновления цены в корзине.
  • Кэширование мешает отображению актуальной цены. Отключите кэширование для страниц корзины и кассы, либо добавьте исключения для динамических цен.
  • Неправильно обработаны вариации товаров. Для вариаций нужно использовать фильтры woocommerce_variation_prices_price и аналогичные.

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

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

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

МетодОписаниеПреимуществаНедостатки
Фильтры WooCommerce (напр. woocommerce_product_get_price) Изменение цены на лету без правки базы Безопасно, быстро, совместимо с обновлениями WooCommerce Цена не меняется в базе, возможны сложности с кэшированием
Изменение цены через woocommerce_before_calculate_totals Применение скидок/цен в корзине Точно меняет итоговую сумму заказа Требует точного тестирования, можно повлиять на другие вычисления
Прямое изменение цены в базе данных Редактирование поля цены в таблице postmeta Постоянное изменение цены Риск ошибок и рассинхронизации, не рекомендуется

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

add_action('woocommerce_before_calculate_totals', 'apply_role_based_price_discount', 10, 1);
function apply_role_based_price_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    // Пример: скидка 15% для роли "оптовик"
    foreach ($cart->get_cart() as $cart_item) {
        $user = wp_get_current_user();
        if (in_array('optovik', (array) $user->roles)) {
            $original_price = $cart_item['data']->get_price();
            $discounted_price = $original_price * 0.85;
            $cart_item['data']->set_price($discounted_price);
        }
    }
}
Как создать пользовательские роли и настройки для них в WordPress
26.01.2026
WooCommerce: как автоматически удалять товары при нулевом остатке
23.05.2026
Как настроить перенос пользователя между сайтами WordPress в мультисайте
14.12.2025
Как создать автоматический импорт постов в WordPress из внешнего источника
03.03.2026
WooCommerce: Автоматическое удаление неактивных заказов по дате
19.05.2026