Диагностика задачи: зачем менять список заказов по ролям
В стандартном WooCommerce все пользователи с ролью «Customer» видят одинаковый список своих заказов. Но в проектах с разными типами клиентов (например, оптовики и розничные покупатели) часто нужно показывать разные наборы заказов или скрывать определённые. Стандарт WooCommerce не предусматривает гибкой фильтрации списка заказов в личном кабинете, поэтому приходится реализовывать кастомные решения.
Пошаговое решение: фильтрация заказов по ролям
1. Определение роли пользователя
Первым делом нужно получить роль текущего пользователя для дальнейшей логики фильтрации. Обычно это делается через wp_get_current_user():
$user = wp_get_current_user();
$roles = (array) $user->roles;
2. Использование хука для изменения запроса заказов
Для изменения списка заказов в кабинете пользователя используется фильтр woocommerce_my_account_my_orders_query. Он позволяет модифицировать WP_Query, который загружает заказы.
add_filter('woocommerce_my_account_my_orders_query', 'filter_orders_by_user_role');
function filter_orders_by_user_role($args) {
$user = wp_get_current_user();
$roles = (array) $user->roles;
// Пример: если роль 'wholesaler', показываем только заказы со статусом completed
if (in_array('wholesaler', $roles)) {
$args['status'] = array('completed');
}
// Если роль 'retailer', показываем все статусы, кроме cancelled
if (in_array('retailer', $roles)) {
$args['status'] = array('pending', 'processing', 'completed');
}
return $args;
}
3. Кастомизация вывода заказов
Если требуется не только фильтровать, но и менять вывод списка (например, добавить дополнительные колонки или изменить стили), то можно использовать хук woocommerce_my_account_my_orders_columns и хуки для контента колонок.
Проверка результата после внедрения
Чтобы проверить, что фильтрация работает:
- Залогиньтесь под пользователем с ролью
wholesalerи убедитесь, что в списке заказов отображаются только выполненные (completed) заказы. - Залогиньтесь под пользователем с ролью
retailerи проверьте, что заказов со статусомcancelledнет. - Попробуйте сменить роли и проверить влияние на список заказов.
Также можно временно добавить дебаг-вывод в фильтр для проверки параметров:
error_log(print_r($args, true));
Частые ошибки и как их исправить
- Неверное определение роли пользователя: Помните, что у пользователя может быть несколько ролей, поэтому проверяйте роль через
in_arrayв массиве ролей. - Перезапись статусов заказов: При установке
$args['status']будьте аккуратны, чтобы не удалить нужные статусы. Лучше явно указывать массив нужных статусов. - Кэширование WooCommerce: Иногда кэширование может мешать обновлению списка заказов. Очистите кэш сайта и браузера.
- Конфликты с плагинами: Некоторые плагины, которые модифицируют личный кабинет WooCommerce, могут влиять на запросы. Временно отключите их для диагностики.
Практические советы по безопасности и производительности
- Не используйте прямые SQL-запросы для фильтрации заказов — применяйте стандартные хуки WooCommerce для совместимости и безопасности.
- Избегайте добавления сложных условий в фильтры без кэширования, чтобы не замедлять загрузку кабинета.
- Если требуется сложная логика отображения заказов, рассмотрите создание отдельной кастомной страницы с собственным WP_Query.
Сравнение способов фильтрации заказов по ролям
| Метод | Плюсы | Минусы |
|---|---|---|
Использование фильтра woocommerce_my_account_my_orders_query | Простой, встроенный способ, легко поддерживаемый | Ограничен стандартными параметрами WP_Query |
| Создание кастомной страницы с WP_Query | Максимальная гибкость, можно реализовать любые фильтры | Требует больше кода и поддержки, возможно дублирование функционала |
| Плагины для кастомизации кабинета | Быстрое внедрение без кода | Могут конфликтовать, не всегда подходят под точные требования |