Как создать запросы REST API с фильтрами в WordPress

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

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

Для начала нужно зарегистрировать свой REST API маршрут через хук rest_api_init. В функции регистрации мы определим путь, метод и callback-функцию, которая будет отвечать на запрос.

Пример регистрации маршрута с фильтрами:

add_action('rest_api_init', function() {
    register_rest_route('wpblock/v1', '/posts/', [
        'methods' => 'GET',
        'callback' => 'wpblock_get_filtered_posts',
        'args' => [
            'category' => [
                'required' => false,
                'validate_callback' => 'is_string',
            ],
            'author' => [
                'required' => false,
                'validate_callback' => 'is_numeric',
            ],
            'per_page' => [
                'required' => false,
                'default' => 10,
                'validate_callback' => function($param) {
                    return is_numeric($param) && $param > 0 && $param <= 100;
                },
            ],
        ],
    ]);
});

Здесь мы создаём маршрут /wpblock/v1/posts/, который принимает параметры фильтрации: category, author, per_page. Параметры валидируются для безопасности.

Обработка запроса и фильтрация данных

Функция-обработчик принимает объект WP_REST_Request, из которого удобно получать параметры и работать с ними.

function wpblock_get_filtered_posts(WP_REST_Request $request) {
    $category = $request->get_param('category');
    $author = $request->get_param('author');
    $per_page = $request->get_param('per_page');

    $args = [
        'post_type' => 'post',
        'posts_per_page' => $per_page,
    ];

    if ($category) {
        $args['category_name'] = sanitize_text_field($category);
    }

    if ($author) {
        $args['author'] = intval($author);
    }

    $query = new WP_Query($args);

    $posts = [];

    foreach ($query->posts as $post) {
        $posts[] = [
            'id' => $post->ID,
            'title' => get_the_title($post),
            'date' => get_the_date('', $post),
            'link' => get_permalink($post),
        ];
    }

    return rest_ensure_response($posts);
}

В этом примере мы собираем параметры запроса, формируем аргументы для WP_Query и возвращаем простой массив с нужной информацией о постах.

Добавление пользовательских фильтров и параметров

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

add_action('rest_api_init', function() {
    register_rest_route('wpblock/v1', '/posts/', [
        'methods' => 'GET',
        'callback' => 'wpblock_get_filtered_posts',
        'args' => [
            'meta_key' => [
                'required' => false,
                'validate_callback' => 'is_string',
            ],
            'meta_value' => [
                'required' => false,
                'validate_callback' => 'is_string',
            ],
        ],
    ]);
});

function wpblock_get_filtered_posts(WP_REST_Request $request) {
    $args = [
        'post_type' => 'post',
        'posts_per_page' => $request->get_param('per_page') ?: 10,
    ];

    $meta_key = $request->get_param('meta_key');
    $meta_value = $request->get_param('meta_value');

    if ($meta_key && $meta_value) {
        $args['meta_query'] = [
            [
                'key' => sanitize_text_field($meta_key),
                'value' => sanitize_text_field($meta_value),
                'compare' => '=',
            ],
        ];
    }

    $query = new WP_Query($args);

    // обработка результата...
}

Такой подход позволяет гибко создавать фильтры под любые задачи.

Обеспечение безопасности REST API запросов

При работе с REST API крайне важно валидировать и санитизировать все входящие данные. В параметрах маршрута можно использовать validate_callback и santize_callback для автоматической проверки. Кроме того, если API предполагает доступ к приватным данным, добавьте проверку прав пользователя через параметр permission_callback.

Пример с проверкой прав:

register_rest_route('wpblock/v1', '/private-data/', [
    'methods' => 'GET',
    'callback' => 'wpblock_get_private_data',
    'permission_callback' => function() {
        return current_user_can('edit_posts');
    }
]);

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

Примеры полезных плагинов для работы с REST API и фильтрами в WordPress

Если хотите расширить возможности REST API без написания кода, обратите внимание на плагины:

  • Clearfy Pro — оптимизация и расширение безопасности REST API, управление доступом.
  • WPGPT — интеграция с ИИ, позволяет создавать динамические запросы и получать ответы через API.
  • Expert Review — для создания отзывов и их вывода через REST API с фильтрами.

Выводы и рекомендации

Создание собственных REST API маршрутов с фильтрами в WordPress — это мощный способ сделать ваш сайт более гибким и интегрируемым. Всегда тщательно валидируйте входные данные, используйте возможности register_rest_route для описания параметров и прав доступа. При необходимости расширьте функциональность с помощью специализированных плагинов из каталога WPSHOP.

Как создать динамический контейнер для Gutenberg блоков с поддержкой внешних данных
22.01.2026
Как ограничить доступ к REST API WordPress только для авторизованных пользователей
16.12.2025
Как создать динамический Gutenberg блок с подгрузкой данных из REST API в WordPress
12.12.2025
Как добавить атрибуты ARIA в Gutenberg блоках WordPress для улучшения доступности
16.04.2026
Как отключить загрузку CSS и JS плагинов на отдельных страницах WordPress
22.02.2026

С появлением Gutenberg в WP появились и блоки. Однако не всем по душе новая версия редактора.