WP REST API: разрешение доступа для пользователей по ролям с примерами кода

WordPress REST API — мощный инструмент для взаимодействия с сайтом из внешних приложений и создания сложных фронтендов. Однако при открытии API важно грамотно ограничить доступ к данным в зависимости от роли пользователя, чтобы избежать утечек информации и повысить безопасность.

Почему важно ограничивать доступ к WP REST API по ролям

По умолчанию REST API в WordPress открывает множество данных, включая публичные записи и метаданные. Но когда речь идет о пользовательских данных, конфиденциальной информации или административных возможностях, необходимо контролировать, кто и что может получить через API.

Без правильной фильтрации любой анонимный пользователь сможет получить доступ к нежелательной информации, что представляет угрозу безопасности и конфиденциальности.

Примером может служить сайт с несколькими типами пользователей: подписчики, редакторы, администраторы. Каждой роли нужен разный уровень доступа к API.

Как работает проверка прав в WP REST API

Каждое REST API-эндпоинт в WordPress содержит callback-функции, которые обрабатывают запросы. Для проверки прав доступа используется параметр permission_callback, где можно задать функцию, возвращающую true или false в зависимости от условий.

Например, базовая проверка на авторизацию пользователя может выглядеть так:

function wpeducation_permission_callback() {
    return is_user_logged_in();
}

Но этого мало, чтобы разграничить доступ по ролям — нужно детальнее проверять роль текущего пользователя.

Пример: разрешение доступа к API только для редакторов и администраторов

Создадим свой эндпоинт, доступный только для пользователей с ролями editor и administrator. Для примера отдавать будем список последних 5 публикаций.

add_action('rest_api_init', 'wpeducation_register_custom_endpoint');

function wpeducation_register_custom_endpoint() {
    register_rest_route('wpeducation/v1', '/latest-posts/', array(
        'methods' => 'GET',
        'callback' => 'wpeducation_get_latest_posts',
        'permission_callback' => 'wpeducation_check_user_roles',
    ));
}

function wpeducation_check_user_roles() {
    if (!is_user_logged_in()) {
        return false;
    }
    $user = wp_get_current_user();
    $allowed_roles = array('editor', 'administrator');
    return array_intersect($allowed_roles, $user->roles);
}

function wpeducation_get_latest_posts() {
    $args = array(
        'numberposts' => 5,
        'post_status' => 'publish'
    );
    $posts = wp_get_recent_posts($args);
    return rest_ensure_response($posts);
}

В этом примере функция wpeducation_check_user_roles проверяет, что пользователь авторизован и его роль входит в разрешённый список. Если условие не выполняется, запрос вернёт ошибку 403.

Разбор кода

  • Хук rest_api_init регистрирует новый маршрут /wpeducation/v1/latest-posts/.
  • permission_callback контролирует доступ — ключевой момент для безопасности.
  • Функция возвращает последние 5 опубликованных постов в формате JSON.

Как использовать проверку ролей для стандартных REST API маршрутов WordPress

Иногда нужно ограничить доступ к уже существующим эндпоинтам, например, к маршрутам для получения пользователей или записей. Для этого можно использовать фильтр rest_endpoints и менять права на лету.

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

add_filter('rest_endpoints', 'wpeducation_restrict_users_endpoint');

function wpeducation_restrict_users_endpoint($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        foreach ($endpoints['/wp/v2/users'] as &$endpoint) {
            $endpoint['permission_callback'] = function () {
                return current_user_can('administrator');
            };
        }
    }
    return $endpoints;
}

Этот код перебирает маршрут /wp/v2/users и заменяет функцию проверки прав на новую, которая разрешает доступ только администраторам.

Рекомендации по безопасности при работе с WP REST API

1. Всегда используйте permission_callback для проверки прав доступа, особенно для нестандартных эндпоинтов.

2. Отдавайте минимально необходимый набор данных. Не возвращайте лишних полей, которые могут раскрыть внутренние детали сайта.

3. Если вы создаёте публичные API, подумайте про ограничения скорости запросов и анонимный доступ.

4. Для управления ролями и разрешениями можно использовать плагины, например, Clearfy Pro, которые помогают тонко настраивать права и повышать безопасность.

Пример: добавление кастомных полей в ответ REST API с проверкой роли

Если вам нужно добавить в ответ API дополнительные данные, например, поле user_phone из метаполя пользователя, и показывать его только администраторам, можно использовать фильтр rest_prepare_user:

add_filter('rest_prepare_user', 'wpeducation_add_custom_user_data', 10, 3);

function wpeducation_add_custom_user_data($response, $user, $request) {
    if (!current_user_can('administrator')) {
        return $response;
    }
    $user_phone = get_user_meta($user->ID, 'user_phone', true);
    $response->data['user_phone'] = $user_phone ? $user_phone : '';
    return $response;
}

Так мы расширяем стандартный ответ API, но только для пользователей с ролью администратора.

Выводы

Грамотная настройка прав доступа в WP REST API — обязательный шаг при разработке современных сайтов на WordPress. Использование permission_callback, проверка ролей, фильтрация данных — всё это позволяет защитить сайт и обеспечить адекватный доступ.

В дополнение к написанному, советую протестировать API с разными ролями, использовать инструменты типа Postman и рассмотреть плагины вроде WPCommunity для расширенных возможностей работы с пользователями через API.

Как создать уникальные метаданные для страниц в WordPress
14.02.2026
WP REST API: разрешение доступа для пользователей по ролям с примерами кода
14.04.2026
Изменение атрибута alt у изображений в WordPress: практические решения и примеры кода
29.11.2025
WooCommerce: как настроить автоматическое удаление дубликатов заказов
14.07.2026
Как избежать конфликтов между плагинами WordPress: практические советы и примеры
20.01.2026