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

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

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

REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия с веб-приложениями через HTTP-запросы с использованием стандартных методов (GET, POST, PUT, DELETE). В WordPress он реализован через специальный маршрут /wp-json/.

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

Преимущества создания кастомных эндпоинтов

  • Гибкость в работе с данными и бизнес-логикой.
  • Возможность интеграции с мобильными приложениями или SPA.
  • Упрощение взаимодействия с внешними сервисами.
  • Создание собственных интерфейсов для админки или фронтенда.

Как зарегистрировать собственный REST API эндпоинт в WordPress

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

add_action('rest_api_init', 'wplessons_register_custom_route');

function wplessons_register_custom_route() {
    register_rest_route('wplessons/v1', '/recent-posts/', array(
        'methods' => 'GET',
        'callback' => 'wplessons_get_recent_posts',
        'permission_callback' => '__return_true',
    ));
}

function wplessons_get_recent_posts() {
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 5,
    );

    $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(),
                'excerpt' => get_the_excerpt(),
                'custom_field' => get_post_meta(get_the_ID(), 'my_custom_field', true),
            );
        }
        wp_reset_postdata();
    }

    return $posts;
}

В этом примере мы регистрируем маршрут /wp-json/wplessons/v1/recent-posts/, который возвращает массив из 5 последних постов с заголовком, отрывком и значением произвольного поля my_custom_field.

Разбор параметров функции register_rest_route

  • namespace: уникальное пространство имён для вашего API, рекомендуется использовать название сайта или плагина.
  • route: путь эндпоинта после namespace.
  • methods: HTTP-методы, которые поддерживает маршрут (GET, POST и др.).
  • callback: функция, которая обрабатывает запрос и возвращает данные.
  • permission_callback: функция проверки прав доступа. В примере использовали __return_true для открытого доступа, но для защищённых данных нужно реализовать проверку.

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

Часто необходимо не только отдавать данные, но и принимать их для создания или обновления записей. Для этого в register_rest_route указываем метод POST и в коллбэке используем объект запроса.

add_action('rest_api_init', 'wplessons_register_post_route');

function wplessons_register_post_route() {
    register_rest_route('wplessons/v1', '/add-post/', array(
        'methods' => 'POST',
        'callback' => 'wplessons_add_post',
        'permission_callback' => 'wplessons_permission_check',
        'args' => array(
            'title' => array(
                'required' => true,
                'validate_callback' => 'rest_validate_request_arg',
            ),
            'content' => array(
                'required' => true,
            ),
        ),
    ));
}

function wplessons_add_post(WP_REST_Request $request) {
    $title = sanitize_text_field($request->get_param('title'));
    $content = sanitize_textarea_field($request->get_param('content'));

    $new_post = array(
        'post_title'   => $title,
        'post_content' => $content,
        'post_status'  => 'publish',
        'post_author'  => get_current_user_id(),
    );

    $post_id = wp_insert_post($new_post);

    if (is_wp_error($post_id)) {
        return new WP_Error('post_creation_failed', 'Ошибка при создании поста', array('status' => 500));
    }

    return array('success' => true, 'post_id' => $post_id);
}

function wplessons_permission_check() {
    return current_user_can('edit_posts');
}

Здесь создаётся эндпоинт /wp-json/wplessons/v1/add-post/ для добавления поста при POST-запросе с параметрами title и content. Важно реализовать проверку прав доступа — в примере разрешено создавать посты только авторизованным пользователям с правом edit_posts.

Передача параметров и фильтрация данных в кастомных REST API

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

add_action('rest_api_init', 'wplessons_register_filtered_route');

function wplessons_register_filtered_route() {
    register_rest_route('wplessons/v1', '/filtered-posts/', array(
        'methods' => 'GET',
        'callback' => 'wplessons_get_filtered_posts',
        'args' => array(
            'category' => array(
                'required' => false,
                'validate_callback' => 'is_numeric',
            ),
            'posts_per_page' => array(
                'required' => false,
                'default' => 10,
                'validate_callback' => function($param) {
                    return is_numeric($param) && $param > 0 && $param <= 100;
                },
            ),
        ),
        'permission_callback' => '__return_true',
    ));
}

function wplessons_get_filtered_posts(WP_REST_Request $request) {
    $category = $request->get_param('category');
    $posts_per_page = $request->get_param('posts_per_page') ?: 10;

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => intval($posts_per_page),
    );

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

    $query = new WP_Query($args);
    $posts = array();

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

    return $posts;
}

Теперь можно делать запросы с параметрами, например:

GET /wp-json/wplessons/v1/filtered-posts/?category=3&posts_per_page=5

Это вернёт 5 последних постов из категории с ID 3.

Реализация авторизации и безопасности в кастомных эндпоинтах

Безопасность REST API — ключевой момент. Для публичных данных можно использовать __return_true в permission_callback, но для приватных или изменяющих данные операций необходимо проверять права пользователя.

Примеры проверок:

  • current_user_can('edit_posts') — проверка прав на редактирование постов.
  • is_user_logged_in() — проверка авторизации.
  • Можно использовать nonce, если запросы идут с фронтенда сайта.

Если нужен доступ по токенам, можно дополнительно реализовать JWT-авторизацию через плагины или собственные механизмы.

Использование плагина Clearfy Pro для расширения возможностей REST API

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

Рассмотрите установку Clearfy Pro, если планируете открывать доступ к REST API для внешних приложений и хотите минимизировать риски.

Советы и лучшие практики при работе с кастомными REST API в WordPress

  • Всегда валидируйте и санитизируйте входящие данные.
  • Обязательно реализуйте проверку прав доступа в permission_callback.
  • Используйте уникальные namespace для своих маршрутов, чтобы избежать конфликтов.
  • Документируйте свои эндпоинты, чтобы команда понимала, как ими пользоваться.
  • Проверяйте ошибки и возвращайте понятные сообщения клиенту.
  • Оптимизируйте запросы, чтобы не перегружать сервер.

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

Как удалить автоматические частые запросы в WordPress для оптимизации производительности
19.01.2026
Как изменить permalink для типа записи в WordPress без плагинов
31.12.2025
Как удалить неиспользуемые теги в WordPress для оптимизации базы данных
02.03.2026
Как использовать WPGPT для автоматизации создания контента в WordPress
02.02.2026
Создание динамического AJAX-фильтра по категориям и таксономиям в WordPress
15.02.2026