Проблема: фиксированная стоимость доставки для всех пользователей
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
));Проверка результата после внедрения
- Залогиньтесь под пользователем с ролью
wholesalerи проверьте стоимость доставки в корзине и на странице оформления заказа — она должна стать 5. - Залогиньтесь под
vip_customer— доставка должна быть бесплатной. - Под другими ролями и гостями цена не меняется.
Для удобства можно временно добавить вывод текущей роли и стоимости доставки в шаблон корзины, чтобы удостовериться в корректности работы кода.
Частые ошибки и их исправление
- Стоимость доставки не меняется: проверьте, что код добавлен в правильный файл (functions.php активной темы или в собственный плагин), а роль пользователя соответствует той, что указана в коде.
- Кэширование мешает изменениям: очистите кеш сайта и браузера, отключите кеширование плагинов на время тестирования.
- Роль пользователя не присвоена: убедитесь, что пользователь действительно имеет нужную роль через админку или используя
wp_get_current_user(). - Конфликты с другими плагинами доставки: отключите сторонние плагины доставки и проверьте работу.
Практические советы по безопасности и производительности
- Не используйте глобальные переменные для хранения стоимости — всегда меняйте стоимость через объект
$rate. - Если планируется много разных ролей и сложных условий, рассмотрите использование плагина для управления доставкой, например, Clearfy Pro, который позволяет гибко настраивать правила без кода.
- Всегда тестируйте изменения на тестовом сайте перед применением на продакшене.
- Ограничьте права на редактирование кода functions.php, чтобы избежать ошибок и взлома.
Сравнение вариантов решения
| Подход | Плюсы | Минусы |
|---|---|---|
Код в functions.php (фильтр woocommerce_package_rates) | Бесплатно, гибко, быстро внедряется | Требует навыков PHP, сложно масштабировать |
| Плагины управления доставкой (например, Table Rate Shipping) | Простота настройки, множество опций | Платные, могут замедлять сайт |
| Clearfy Pro (оптимизация и настройка WooCommerce) | Дополнительные функции по оптимизации и безопасности | Платный продукт |