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

Диагностика задачи: зачем менять список заказов по ролям

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)Легко настраивается без кодаМожет быть ограничен функционал, нагрузка от плагиновДля простых случаев без сложной логики
Создание отдельных админских панелей под ролиМаксимальная изоляция данныхСложно в реализации, требует поддержкиКрупные проекты с большим числом ролей и заказов
Как удалить или скрыть регистрацию пользователей в WordPress
28.03.2026
Как добавить локализацию в плагин WordPress
13.02.2026
Как создать динамические блоки с AJAX в WordPress
22.02.2026
Как сделать динамический список постов с пагинацией на AJAX в WordPress
05.04.2026
Как удалить или изменить email пользователя после регистрации в WooCommerce без потери данных
28.06.2026

Ниже мы подобрали самые актуальные материалы по Вордпресс