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

Почему нужно менять цену товара по ролям пользователей в WooCommerce

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

Диагностика проблемы: как понять, что цены не меняются корректно

  • Пользователи с определенной ролью не видят измененную цену на странице товара или в корзине.
  • Изменения цен влияют только на фронтенд, но не сохраняются при оформлении заказа.
  • Цены меняются, но расчет налогов или скидок идет неверно.

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

Для корректного изменения цены товара для разных ролей пользователей нужно использовать фильтры WooCommerce, которые возвращают цену товара в различных контекстах. Рассмотрим пример кода, который меняет цену для роли "оптовик" (определяется роль пользователя wholesale_customer):

add_filter('woocommerce_product_get_price', 'change_price_by_user_role', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'change_price_by_user_role', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'change_price_by_user_role', 10, 2);

function change_price_by_user_role($price, $product) {
    if (!is_user_logged_in()) {
        return $price; // не залогинен - цена без изменений
    }

    $user = wp_get_current_user();
    if (in_array('wholesale_customer', (array) $user->roles)) {
        // уменьшение цены на 20% для оптовиков
        $discounted_price = $price * 0.8;
        return $discounted_price;
    }

    return $price;
}

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

Как изменить цену для нескольких ролей

Добавьте дополнительные проверки ролей и соответствующие коэффициенты:

function change_price_by_user_role($price, $product) {
    if (!is_user_logged_in()) {
        return $price;
    }
    $user = wp_get_current_user();
    if (in_array('wholesale_customer', (array) $user->roles)) {
        return $price * 0.8; // 20% дисконт
    } elseif (in_array('vip_customer', (array) $user->roles)) {
        return $price * 0.9; // 10% дисконт
    }
    return $price;
}

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

  • Залогиньтесь под пользователем с ролью wholesale_customer и убедитесь, что цена товара на странице и в корзине уменьшилась на 20%.
  • Залогиньтесь под обычным пользователем — цена должна быть без изменений.
  • Проверьте оформление заказа — итоговая сумма должна корректно учитывать измененную цену.
  • Если используете кеширование, очистите кеш страниц и объекта.

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

  • Изменения не видны в корзине и на странице оформления заказа: не использовать только woocommerce_get_price_html, а заменить цену через фильтры woocommerce_product_get_price, woocommerce_product_get_regular_price и woocommerce_product_get_sale_price.
  • Цена меняется только для залогиненных пользователей: проверить функцию is_user_logged_in() и роль пользователя.
  • Проблемы с кэшированием: сбросить кеш, особенно если используете плагин кеширования (WP Rocket, LiteSpeed Cache и др.).
  • Цена не меняется для вариативных товаров: фильтры применяются к объекту товара, убедитесь, что код работает для всех типов товаров (simple, variable), или используйте фильтр woocommerce_variation_get_price.

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

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

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

СпособПлюсыМинусыПример ссылки
Код через фильтры woocommerce_product_get_priceГибко, работает без сторонних плагинов, быстроТребует знаний PHP, возможны ошибки при сложных условияхВ нашей статье
Плагины типа WooCommerce Role Based PricingУдобный интерфейс, много функцийНагрузка на сайт, может конфликтовать с кастомным кодомWooCommerce Role Based Pricing
Использование групп пользователей и скидочных купоновПростая реализация, управляется из админкиМенее гибко, не меняет цену на странице товараВстроенный функционал WooCommerce
Как использовать автоматическое удаление старых записей в WordPress с помощью WP-Cron
21.03.2026
WooCommerce: автоматическое изменение стоимости товара в зависимости от роли пользователя
11.07.2026
Как изменить календарь в Gutenberg блоках WordPress
29.03.2026
Автоматическое удаление спама в комментариях WordPress: лучшие решения и примеры кода
12.12.2025
Как добавить динамические поля в WordPress: практическое руководство
09.03.2026