Как создать собственный REST API в WordPress

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

Что такое REST API в WordPress и зачем создавать свои эндпоинты

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

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

Регистрация собственного REST API эндпоинта в WordPress

Чтобы добавить новый эндпоинт, нужно воспользоваться хуком rest_api_init и функцией register_rest_route(). Рассмотрим простой пример создания эндпоинта, который возвращает список последних кастомных постов.

add_action('rest_api_init', 'wpfactory_register_custom_endpoint');
function wpfactory_register_custom_endpoint() {
    register_rest_route('wpfactory/v1', '/latest-posts/', array(
        'methods' => 'GET',
        'callback' => 'wpfactory_get_latest_posts',
        'permission_callback' => '__return_true'
    ));
}

function wpfactory_get_latest_posts(WP_REST_Request $request) {
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 5,
        'post_status' => 'publish',
    );
    $query = new WP_Query($args);
    $posts = array();
    if($query->have_posts()) {
        while($query->have_posts()) {
            $query->the_post();
            $posts[] = array(
                'id' => get_the_ID(),
                'title' => get_the_title(),
                'link' => get_permalink(),
            );
        }
        wp_reset_postdata();
    }
    return rest_ensure_response($posts);
}

В этом коде мы создаём маршрут /wp-json/wpfactory/v1/latest-posts/, который возвращает JSON с последними 5 постами. Обратите внимание на параметр permission_callback, который в данном примере всегда возвращает true — это значит, что эндпоинт открыт для всех. В реальных проектах стоит реализовать проверку прав доступа.

Добавление параметров и фильтрация данных в REST API

Часто нужно передавать параметры в запрос, например, количество записей или тип поста. Для этого можно использовать аргумент args в register_rest_route(). Давайте расширим предыдущий пример.

add_action('rest_api_init', 'wpfactory_register_custom_endpoint_with_args');
function wpfactory_register_custom_endpoint_with_args() {
    register_rest_route('wpfactory/v1', '/posts/', array(
        'methods' => 'GET',
        'callback' => 'wpfactory_get_posts_with_args',
        'permission_callback' => '__return_true',
        'args' => array(
            'type' => array(
                'required' => false,
                'validate_callback' => function($param) {
                    return in_array($param, array('post', 'page', 'product'));
                }
            ),
            'per_page' => array(
                'required' => false,
                'default' => 5,
                'validate_callback' => 'is_numeric'
            ),
        ),
    ));
}

function wpfactory_get_posts_with_args(WP_REST_Request $request) {
    $type = $request->get_param('type') ?: 'post';
    $per_page = intval($request->get_param('per_page')) ?: 5;

    $args = array(
        'post_type' => $type,
        'posts_per_page' => $per_page,
        'post_status' => 'publish',
    );

    $query = new WP_Query($args);
    $posts = array();
    if($query->have_posts()) {
        while($query->have_posts()) {
            $query->the_post();
            $posts[] = array(
                'id' => get_the_ID(),
                'title' => get_the_title(),
                'link' => get_permalink(),
            );
        }
        wp_reset_postdata();
    }
    return rest_ensure_response($posts);
}

Теперь можно сделать запрос, например: /wp-json/wpfactory/v1/posts?type=page&per_page=3, чтобы получить 3 страницы вместо постов.

Пример использования плагина для упрощения создания REST API

Если хочется создавать REST API без глубокого погружения в код, можно использовать плагины, например, WP REST API Controller или WP REST API - Filter Fields. Они позволяют настраивать эндпоинты, фильтры и поля через админку.

Плагин WP REST API Controller позволяет включать или отключать поля стандартных и пользовательских типов записей, создавать новые маршруты и настраивать права доступа. Это очень удобно для быстрого прототипирования.

Однако для сложной логики и нестандартного поведения всё равно придётся писать собственный код, поэтому знание основ регистрации REST API эндпоинтов критично.

Обработка POST-запросов и создание новых записей через REST API

REST API в WordPress поддерживает не только получение данных, но и создание, обновление и удаление. Пример ниже показывает, как создать эндпоинт для добавления новой записи через POST-запрос.

add_action('rest_api_init', 'wpfactory_register_post_creation_endpoint');
function wpfactory_register_post_creation_endpoint() {
    register_rest_route('wpfactory/v1', '/create-post/', array(
        'methods' => 'POST',
        'callback' => 'wpfactory_create_post',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
        'args' => array(
            'title' => array(
                'required' => true,
                'sanitize_callback' => 'sanitize_text_field',
            ),
            'content' => array(
                'required' => true,
                'sanitize_callback' => 'wp_kses_post',
            ),
        ),
    ));
}

function wpfactory_create_post(WP_REST_Request $request) {
    $title = $request->get_param('title');
    $content = $request->get_param('content');

    $post_id = wp_insert_post(array(
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'draft',
        'post_type' => 'post',
    ));

    if (is_wp_error($post_id)) {
        return new WP_Error('post_creation_failed', 'Не удалось создать запись', array('status' => 500));
    }

    return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Запись успешно создана'));
}

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

Советы по безопасности и производительности REST API в WordPress

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

Для повышения производительности кешируйте результаты запросов, особенно если данные часто не меняются. Можно использовать транзиенты WordPress или внешние кеш-системы.

Также избегайте выполнения тяжёлых операций внутри обработчиков API. Если нужно что-то долгое, лучше поставить задачу в очередь и отдавать клиенту быстрый ответ.

Выводы и рекомендации по созданию собственного REST API в WordPress

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

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

Как создать автоматические сообщения в WordPress с помощью хуков и пингов
04.03.2026
Как автоматизировать удаление старых записей в WordPress без риска
25.03.2026
Как вывести и использовать метаданные товара WooCommerce в шаблонах
03.05.2026
Как автоматизировать создание бэкапов в WordPress
13.01.2026
Как успешно запустить собственный плагин WordPress в продакшн: практические советы
20.12.2025