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

Проблема: фиксированная стоимость доставки для всех пользователей

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

Диагностика проблемы

Для начала убедитесь, что в WooCommerce настроена стандартная доставка с фиксированной ценой. Перейдите в WooCommerce > Настройки > Доставка > Зоны доставки и проверьте стоимость в выбранной зоне.

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

Решение: изменение стоимости доставки на основе роли пользователя

1. Использование хука woocommerce_package_rates

Этот фильтр позволяет менять стоимость уже рассчитанных тарифов доставки перед отображением пользователю.

2. Пример кода для functions.php вашей темы или плагина

add_filter('woocommerce_package_rates', 'change_shipping_cost_by_user_role', 10, 2);
function change_shipping_cost_by_user_role($rates, $package) {
    if (!is_user_logged_in()) {
        return $rates; // Не менять для гостей
    }

    $user = wp_get_current_user();

    foreach ($rates as $rate_key => $rate) {
        // Пример: для роли оптовик - доставка дешевле
        if (in_array('wholesaler', (array) $user->roles)) {
            $rates[$rate_key]->cost = 5; // фиксированная цена 5
        }
        // Для VIP клиентов - бесплатная доставка
        elseif (in_array('vip_customer', (array) $user->roles)) {
            $rates[$rate_key]->cost = 0;
        }
        // Для остальных ролей цена без изменений
    }

    return $rates;
}

3. Добавление пользовательских ролей

Если нужных ролей нет, создайте их с помощью плагина User Role Editor или программно:

add_role('wholesaler', 'Оптовик', array(
    'read' => true,
    'level_0' => true
));

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

  1. Залогиньтесь под пользователем с ролью wholesaler и проверьте стоимость доставки в корзине и на странице оформления заказа — она должна стать 5.
  2. Залогиньтесь под vip_customer — доставка должна быть бесплатной.
  3. Под другими ролями и гостями цена не меняется.

Для удобства можно временно добавить вывод текущей роли и стоимости доставки в шаблон корзины, чтобы удостовериться в корректности работы кода.

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

  • Стоимость доставки не меняется: проверьте, что код добавлен в правильный файл (functions.php активной темы или в собственный плагин), а роль пользователя соответствует той, что указана в коде.
  • Кэширование мешает изменениям: очистите кеш сайта и браузера, отключите кеширование плагинов на время тестирования.
  • Роль пользователя не присвоена: убедитесь, что пользователь действительно имеет нужную роль через админку или используя wp_get_current_user().
  • Конфликты с другими плагинами доставки: отключите сторонние плагины доставки и проверьте работу.

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

  • Не используйте глобальные переменные для хранения стоимости — всегда меняйте стоимость через объект $rate.
  • Если планируется много разных ролей и сложных условий, рассмотрите использование плагина для управления доставкой, например, Clearfy Pro, который позволяет гибко настраивать правила без кода.
  • Всегда тестируйте изменения на тестовом сайте перед применением на продакшене.
  • Ограничьте права на редактирование кода functions.php, чтобы избежать ошибок и взлома.

Сравнение вариантов решения

ПодходПлюсыМинусы
Код в functions.php (фильтр woocommerce_package_rates)Бесплатно, гибко, быстро внедряетсяТребует навыков PHP, сложно масштабировать
Плагины управления доставкой (например, Table Rate Shipping)Простота настройки, множество опцийПлатные, могут замедлять сайт
Clearfy Pro (оптимизация и настройка WooCommerce)Дополнительные функции по оптимизации и безопасностиПлатный продукт
Как создать автоматический импорт данных из Excel в WordPress
15.03.2026
Как избежать проблем с кешированием в WordPress: практические советы и решения
02.02.2026
Как использовать WPRemark для автоматического комментирования в WordPress
06.02.2026
Как изменить стоимость товара в WooCommerce в зависимости от роли пользователя
15.05.2026
Как создать собственный виджет в WordPress с примером кода
13.11.2025