Как правильно настроить WooCommerce для продавцов с разным уровнем доступа

Диагностика задачи: зачем нужны разные уровни доступа продавцов в 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 + мета в заказахЛегче и дешевле, точечный контрольТребует разработки, поддержкаПодходит для небольших магазинов
Один аккаунт для всех продавцовПростоНет разграничения, риск ошибокИспользовать только в простых случаях
Как создать собственный шорткод в WordPress
06.11.2025
Как создать автоматические сообщения в WordPress с помощью хуков и пингов
04.03.2026
Как создать собственный тип записей (Custom Post Type) в WordPress
03.12.2025
Очистка базы данных WooCommerce без потери данных: практическое руководство
10.05.2026
Как создать автоматическую резервную копию WordPress с помощью WPRemark
20.02.2026