Зачем ограничивать доступ к заказам в WooCommerce
В стандартной установке WooCommerce все пользователи с ролью администратора или менеджера магазина имеют полный доступ к заказам. Однако иногда возникает задача, чтобы пользователи (например, клиенты или менеджеры с ограниченными правами) видели только свои собственные заказы. Это полезно для сайтов с несколькими продавцами, агентами или организациями, где требуется разграничение доступа.
Диагностика текущих прав доступа к заказам
Перед внедрением ограничений нужно понять, какие роли и возможности сейчас имеют доступ к заказам:
- Перейдите в админку WordPress → Пользователи → Все пользователи и проверьте роли пользователей.
- С помощью плагина User Role Editor можно посмотреть, какие возможности (capabilities) привязаны к ролям.
- По умолчанию заказ — это тип записи
shop_order. Возможность читать заказы —read_shop_orderилиedit_shop_orderу менеджера и администратора.
Пошаговое решение: ограничение доступа к заказам по авторству
Для реализации ограничения доступа к заказам по авторству можно использовать фильтр pre_get_posts в админке, который изменит запрос списка заказов, показывая только те, что созданы текущим пользователем.
Пример кода, который добавьте в файл functions.php вашей дочерней темы или в кастомный плагин:
add_action('pre_get_posts', function($query) {
if (is_admin()
&& $query->is_main_query()
&& $query->get('post_type') === 'shop_order') {
$user = wp_get_current_user();
// Разрешаем администраторам и менеджерам видеть все заказы
if (in_array('administrator', $user->roles) || in_array('shop_manager', $user->roles)) {
return;
}
// Остальные пользователи видят только свои заказы
$query->set('author', $user->ID);
}
});Объяснение:
- Проверяем, что мы в админке и основной запрос для заказов.
- Если пользователь — админ или менеджер, ограничений нет.
- Если любая другая роль, фильтруем заказы по автору.
Настройка прав пользователя для создания заказов
Обратите внимание, что для корректной работы нужно, чтобы пользователь был автором заказа. По умолчанию заказы создаются системой, и автор может быть администратор. Для этого при создании заказа вручную или программно указывайте автора:
$order = wc_create_order();
$order->set_customer_id(get_current_user_id());
wp_update_post(['ID' => $order->get_id(), 'post_author' => get_current_user_id()]);Проверка результата после внедрения
Для проверки результата:
- Залогиньтесь под пользователем с ролью, отличной от администратора или менеджера.
- Перейдите в раздел WooCommerce → Заказы. Вы должны увидеть только те заказы, которые вы создали.
- Под администратором или менеджером доступ к полному списку заказов сохраняется.
- Для дополнительной проверки можно создать заказ от имени другого пользователя и убедиться, что он не отображается.
Частые ошибки и их исправление
- Заказы не отображаются у пользователя
Причина: пользователь не является автором заказа. Решение: при создании заказа обязательно указывайте автора (как показано в примере кода). - Все заказы скрыты, даже для администратора
Причина: условие в фильтреpre_get_postsневерно прописано или роли проверяются неправильно.
Решение: проверьте, что условиеin_array('administrator', $user->roles)корректно и что фильтр применяется только в админке. - Пользователь видит чужие заказы
Причина: фильтр не применился, возможно, из-за плагина кэширования или других хуков.
Решение: временно отключите кэш и плагины, проверяйте конфликт.
Практические советы по безопасности и производительности
- Не используйте этот код для ролей с административными привилегиями — они должны видеть все заказы.
- Если у вас много заказов, фильтрация по автору может влиять на производительность. Рассмотрите индексацию поля
post_authorв базе данных. - При интеграции с внешними сервисами следите, чтобы авторство заказа сохранялось корректно.
- Для расширения функционала используйте плагины с осторожностью — некоторые могут конфликтовать с кастомными ограничениями доступа.
Таблица сравнения вариантов реализации ограничения доступа к заказам
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр pre_get_posts для ограничения списка заказов | Простота реализации, гибкость настройки | Требуется корректное управление авторством, может влиять на производительность при большом объеме |
| Плагины для многосайтовости или мультивендорности (например, Dokan) | Расширенный функционал, готовые решения для разделения доступа | Сложнее настраивать, могут быть избыточны для простых задач |
| Изменение прав ролей через User Role Editor | Контроль прав на уровне ролей | Не обеспечивает фильтрацию по авторству, требует дополнительной доработки |