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

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

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

Типичные сценарии:

  • Скидка для определенной группы пользователей;
  • Изменение цены при покупке определенного количества;
  • Повышение цены в зависимости от даты или времени;
  • Интеграция с внешними системами для корректировки цены.

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

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

  • woocommerce_get_price — изменяет цену для отображения на страницах товаров;
  • woocommerce_get_sale_price — для изменения акционной цены;
  • woocommerce_product_get_price и woocommerce_product_get_regular_price — более новые хуки для получения цены из объекта продукта;
  • woocommerce_before_calculate_totals — для изменения цены в корзине на лету.

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

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

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

Пример 2: Изменение цены в корзине на основе количества товара

add_action('woocommerce_before_calculate_totals', 'custom_price_quantity_discount', 20, 1);
function custom_price_quantity_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart->get_cart() as $cart_item) {
        $quantity = $cart_item['quantity'];
        $product = $cart_item['data'];
        $price = $product->get_regular_price();

        if ($quantity >= 5) {
            // Скидка 15% при покупке 5 и более штук
            $new_price = $price * 0.85;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Пошаговое решение

  1. Определите условие, при котором нужно менять цену (роль пользователя, количество, дата и т.п.).
  2. Используйте фильтры woocommerce_product_get_price и woocommerce_product_get_regular_price для изменения цены на страницах каталога и карточках товаров.
  3. Для изменения цены в корзине используйте хук woocommerce_before_calculate_totals, меняя цену у объекта продукта через set_price().
  4. Добавьте код в functions.php вашей дочерней темы или в свой собственный плагин, чтобы изменения не потерялись при обновлении.
  5. Протестируйте разные сценарии — разные роли, количество, время и т.д.

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

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

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

  • Изменения не применяются на фронтенде: возможно, вы изменяете цену, но забыли хук woocommerce_before_calculate_totals для корзины, где цена берется отдельно.
  • Цена меняется в базе данных: убедитесь, что вы не вызываете обновление цены через update_post_meta, а используете фильтры — чтобы не сохранять ненужные данные.
  • Цена не меняется в админке: это нормально, фильтры влияют только на вывод на фронтенде и корзине, для админки нужны отдельные решения.
  • Конфликты с кэшированием: если включены плагины кэширования, сбросьте кэш или используйте AJAX для динамического обновления цены.
  • Ошибки производительности: избегайте тяжелых операций в хуках, особенно в woocommerce_before_calculate_totals, лучше кэшировать данные.

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

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

Сравнение вариантов изменения цены: фильтры vs плагины

МетодПреимуществаНедостатки
Фильтры и хуки WooCommerceГибкость, отсутствие лишних плагинов, точечное решение, легко интегрируется в тему/плагинТребует знаний PHP, можно допустить ошибки, требует поддержки кода
Плагины динамического ценообразованияГотовый функционал, удобный интерфейс, поддержка разработчиковНагрузки на сайт, возможные конфликты, цена плагина, меньше гибкости
Как установить охранные роли в WordPress для доступа к административной панели
09.03.2026
Как создать настройку автоудаления старых ревизий записей в WordPress
16.03.2026
Как удалить пустое меню в административной панели WordPress
31.03.2026
Как создать собственный вид записей в WordPress
25.11.2025
Как создать настройки темы в WordPress с примерами кода
18.11.2025