Диагностика задачи: зачем менять список заказов по ролям
WooCommerce по умолчанию отображает одинаковый список заказов в админке для всех пользователей с доступом к управлению заказами. Однако в проектах с кастомными ролями, например менеджеры, оптовики или региональные администраторы, часто нужно ограничить или изменить видимость заказов. Это помогает избежать ошибок, разграничить ответственность и повысить безопасность.
Частая проблема — все пользователи видят все заказы, что нежелательно. Иногда требуется показывать только заказы, относящиеся к определённым статусам, клиентам или регионам.
Как отследить текущий список заказов и роли пользователей
Для начала определите, какие роли у вас есть и кто должен видеть какие заказы. В WordPress роли можно посмотреть в разделе «Пользователи» или программно:
$roles = wp_roles()->roles;
print_r($roles);Проверьте, как выглядит таблица заказов в админке — обычно это edit.php?post_type=shop_order.
Пошаговое решение: фильтрация списка заказов по ролям
1. Используем хук pre_get_posts для фильтрации запросов
Чтобы изменить список заказов, нужно добавить фильтр в админке, который будет менять WP_Query для типа shop_order в зависимости от роли пользователя.
add_action('pre_get_posts', 'filter_orders_by_user_role');
function filter_orders_by_user_role($query) {
if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'shop_order') {
$user = wp_get_current_user();
if (in_array('manager', (array) $user->roles)) {
// Пример: менеджеры видят только заказы со статусом processing и completed
$query->set('post_status', array('wc-processing', 'wc-completed'));
} elseif (in_array('wholesaler', (array) $user->roles)) {
// Оптовики видят только заказы с мета ключом 'wholesale_customer' равным true
$meta_query = array(
array(
'key' => 'wholesale_customer',
'value' => 'yes',
'compare' => '='
)
);
$query->set('meta_query', $meta_query);
}
// Для администраторов или других ролей можно не менять запрос
}
}2. Добавляем пользовательскую мета-информацию к заказам
Если фильтрация по мета-данным (как в примере с оптовиками), убедитесь, что заказы содержат нужную мета-информацию. Добавьте мета поле при создании заказа или через админку:
update_post_meta($order_id, 'wholesale_customer', 'yes');Это можно сделать при сохранении заказа, если заказ оформлен оптовым клиентом.
Проверка результата после внедрения
- Зайдите в админку под пользователем с ролью
manager. Откройте список заказов — должны отображаться только заказы со статусамиprocessingиcompleted. - Зайдите под пользователем с ролью
wholesaler. В списке должны быть только заказы с мета ключомwholesale_customer = yes. - Под администратором отображаются все заказы.
Если изменения не видны, очистите кеш и проверьте, что код подключен в functions.php или в плагине.
Частые ошибки и как их исправить
- Ошибка: Фильтр не работает, список заказов не меняется.
Причина: Не проверяетсяis_main_query()илиpost_type, код срабатывает не в том месте.
Решение: Обязательно проверяйте условия вpre_get_posts. - Ошибка: Неправильный статус заказов в
post_status.
Причина: WooCommerce использует префиксwc-для статусов (например,wc-processing), а не простоprocessing.
Решение: Используйте полный статус с префиксомwc-. - Ошибка: Нет доступа к мета-данным заказов.
Причина: Мета-ключи не добавлены или неправильно заданы.
Решение: Проверьте, что мета-данные действительно есть в базе, используйтеupdate_post_metaили ACF для удобства.
Практические советы по безопасности и производительности
- Безопасность: Никогда не давайте роли возможность редактировать заказы, если она не должна этого делать. Фильтрация списка — это только визуальный контроль, для полноценной защиты используйте Capability Checks.
- Производительность: При фильтрации по мета-данным используйте индексы в базе данных, избегайте сложных мета-запросов, которые могут замедлять запросы.
- Если список заказов большой, подумайте о пагинации и AJAX-подгрузке.
Сравнение вариантов реализации фильтрации
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| pre_get_posts с фильтрацией по ролям | Гибко, не требует сторонних плагинов | Требует программирования, может влиять на производительность | Когда нужна кастомизация под конкретные бизнес-правила |
| Плагины управления ролями и доступом (например, User Role Editor + WooCommerce Role Based Pricing) | Легко настраивается без кода | Может быть ограничен функционал, нагрузка от плагинов | Для простых случаев без сложной логики |
| Создание отдельных админских панелей под роли | Максимальная изоляция данных | Сложно в реализации, требует поддержки | Крупные проекты с большим числом ролей и заказов |