Диагностика задачи: зачем нужны разные уровни доступа продавцов в WooCommerce
В классическом WooCommerce все продавцы имеют одинаковые права или вы используете единый аккаунт администратора для управления товарами и заказами. Это не всегда удобно, если магазин работает с несколькими поставщиками или у вас мультивендорная модель. Нужно разграничить права, чтобы продавцы могли управлять только своими товарами и видеть только связанные с ними заказы.
Основная проблема: WooCommerce по умолчанию не поддерживает разделение прав продавцов. Нужно либо использовать специальные плагины, либо реализовывать кастомные решения через хуки и фильтры WordPress.
Пошаговое решение: настройка ролей и ограничение доступа продавцов
1. Создание кастомных ролей для продавцов
Используем функцию add_role() в файле functions.php или в собственном плагине. Например, создадим роль «Продавец базовый» с ограниченными правами:
function add_custom_vendor_roles() {
add_role('basic_vendor', 'Продавец базовый', array(
'read' => true,
'edit_posts' => false,
'publish_products' => true,
'edit_products' => true,
'delete_products' => true,
'manage_woocommerce' => false // ограничиваем доступ к настройкам
));
}
add_action('init', 'add_custom_vendor_roles');Обратите внимание, что стандартных capability для продуктов нет, поэтому ниже мы создадим их через фильтры.
2. Добавление capability для управления товарами
WooCommerce использует capability manage_woocommerce и edit_products, но для точного контроля лучше добавить фильтр для custom post type product:
function add_vendor_caps() {
// Получаем объект роли
$role = get_role('basic_vendor');
if (!$role) return;
// Добавляем необходимые capability
$role->add_cap('edit_products');
$role->add_cap('publish_products');
$role->add_cap('edit_published_products');
$role->add_cap('delete_products');
$role->add_cap('delete_published_products');
}
add_action('admin_init', 'add_vendor_caps');3. Ограничение доступа к товарам конкретного продавца
Чтобы продавцы видели только свои товары, используем фильтр pre_get_posts в админке:
function restrict_products_to_vendor($query) {
if (!is_admin()) return;
$user = wp_get_current_user();
if (in_array('basic_vendor', (array)$user->roles) && $query->get('post_type') === 'product') {
$query->set('author', $user->ID);
}
}
add_action('pre_get_posts', 'restrict_products_to_vendor');4. Ограничение доступа продавцов к заказам
Заказы — кастомный тип shop_order. Чтобы продавец видел только заказы, в которых есть его товары, используем SQL-джойн через фильтр posts_where и pre_get_posts. Это сложнее, пример базового ограничения ниже:
function restrict_orders_to_vendor($query) {
if (!is_admin()) return;
$user = wp_get_current_user();
if (in_array('basic_vendor', (array)$user->roles) && $query->get('post_type') === 'shop_order') {
global $wpdb;
$query->set('meta_query', array(
array(
'key' => '_vendor_id', // кастомное поле с ID продавца в заказе
'value' => $user->ID,
'compare' => '='
)
));
}
}
add_action('pre_get_posts', 'restrict_orders_to_vendor');Важно: для этого нужно заранее добавить мета с ID продавца в каждый заказ при оформлении.
Проверка результата после внедрения
- Авторизуйтесь под пользователем с ролью «Продавец базовый».
- Перейдите в раздел «Товары» — должны отображаться только товары, созданные этим пользователем.
- Перейдите в «Заказы» — отображаются только заказы, связанные с товарами этого продавца (если настроено мета поле).
- Проверьте, что у продавца нет доступа к настройкам WooCommerce или другим зонам админки.
Частые ошибки и как исправить
- Роли не видят свои товары — проверьте, что фильтр
pre_get_postsсрабатывает и условие по роли корректно. - Продавец видит все заказы — скорее всего, не добавлено мета поле с ID продавца в заказ или фильтр не применяется.
- Нет прав на публикацию товаров — убедитесь, что capability добавлены роли корректно и функции срабатывают на нужном хуке.
- Админка работает медленнее — сложные SQL-запросы для заказов могут замедлять работу, оптимизируйте мета-запросы и используйте индексы в базе.
Практические советы по безопасности и производительности
- Используйте проверенные плагины для мультивендорных магазинов, например Dokan, WC Vendors, если нужна сложная логика разграничения доступа.
- Если реализуете собственное решение — тщательно тестируйте права и доступы, чтобы исключить утечки данных.
- Кэшируйте запросы в админке, чтобы снизить нагрузку на базу при фильтрации заказов по продавцам.
- Ограничьте количество видимых записей в списках для ускорения загрузки страниц.
Сравнение вариантов реализации разграничения доступа продавцов в WooCommerce
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин мультивендор (Dokan, WC Vendors) | Полный функционал, поддержка платежей, рейтингов, отчетов | Сложность, нагрузка, стоимость | Использовать для крупных проектов |
| Кастомные роли + фильтры WP + мета в заказах | Легче и дешевле, точечный контроль | Требует разработки, поддержка | Подходит для небольших магазинов |
| Один аккаунт для всех продавцов | Просто | Нет разграничения, риск ошибок | Использовать только в простых случаях |