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

Почему динамическое изменение цены товара в WooCommerce важно

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

Диагностика: как понять, что цена не меняется динамически

Если вы пытаетесь изменить цену товара программно, но на сайте ничего не меняется, проверьте следующее:

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

Пошаговое решение: как динамически менять цену товара с помощью хуков

1. Используем хук woocommerce_product_get_price

Этот фильтр вызывается при получении цены товара в WooCommerce. Можно вернуть нужное значение цены в зависимости от условий.

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    // Пример: если пользователь авторизован и у него роль 'subscriber', уменьшаем цену на 10%
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('subscriber', (array) $user->roles)) {
            $price = $price * 0.9; // скидка 10%
        }
    }
    return $price;
}

2. Аналогично изменяем цену для вариативных товаров

Для вариаций нужно использовать woocommerce_product_variation_get_price:

add_filter('woocommerce_product_variation_get_price', 'custom_dynamic_variation_price', 10, 2);
function custom_dynamic_variation_price($price, $variation) {
    // Пример: скидка 5% для всех вариаций
    return $price * 0.95;
}

3. Изменяем цену товара в корзине

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

add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 20);
function custom_cart_item_price($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        // Пример: скидка 15% для всех товаров в корзине
        $new_price = $product->get_price() * 0.85;
        $product->set_price($new_price);
    }
}

Как проверить, что динамическая цена работает

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

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

  • Цена не меняется на странице товара: Возможно, код не подключен или подключен после загрузки WooCommerce. Поместите код в functions.php или в плагин с приоритетом ниже 10, если нужно.
  • В корзине цена не меняется: Не забудьте про хук woocommerce_before_calculate_totals и убедитесь, что в функции вызывается $product->set_price().
  • Конфликт с кэшированием: Если используется плагин кеша, отключите кеширование страниц с динамическими ценами, или используйте AJAX для подгрузки цен.
  • Неверные условия в коде: Проверяйте, что условия для изменения цены точно срабатывают (роль пользователя, дата, и т.п.) с помощью отладочного вывода.

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

  • Не храните динамические цены в базе, используйте фильтры, чтобы избежать рассинхронизации и ошибок.
  • Старайтесь минимизировать количество вычислений в хукe woocommerce_before_calculate_totals, так как он вызывается часто.
  • Используйте кэширование результатов вычислений, если логика сложная.
  • Проверяйте, что ваш код не вызывает ошибок PHP, используйте WP_DEBUG и логи.

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

МетодПлагинКодПлюсыМинусы
Фильтры WooCommerceНетДаГибкость, нет зависимостиТребует навыков PHP
Плагины скидок и динамических ценЕсть, например Dynamic PricingНетПростота настройкиПлатные, нагрузка на сайт
Использование AJAX для загрузки ценыНетДаДинамичность, свежие данныеСложнее реализовать
Как удалить пустые теги HTML в WordPress
29.01.2026
WooCommerce: как запретить пересекающиеся скидки и купоны
14.07.2026
WooCommerce: как установить ограничения на количество покупок одного товара
29.06.2026
Использование внутренних категорий в WordPress для эффективной организации контента
30.03.2026
WooCommerce: как отключить автоматическое удаление товаров из корзины после отмены оплаты
26.06.2026