Создание кастомных REST API эндпоинтов в WordPress

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

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

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

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

Создавая свои маршруты, вы получаете полный контроль над структурой данных, механизмом авторизации и логикой обработки запросов. Это особенно полезно при разработке мобильных приложений, SPA, а также при интеграции с внешними сервисами.

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

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

add_action('rest_api_init', 'wpapp_register_custom_endpoint');
function wpapp_register_custom_endpoint() {
    register_rest_route('wpapp/v1', '/latest-posts/', array(
        'methods' => 'GET',
        'callback' => 'wpapp_get_latest_posts',
        'permission_callback' => '__return_true', // можно настроить доступ
    ));
}

function wpapp_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(),
                'date' => get_the_date('c'),
            );
        }
        wp_reset_postdata();
    }
    return rest_ensure_response($posts);
}

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

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

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

Добавим в наш пример поддержку параметра category для фильтрации постов по категории.

add_action('rest_api_init', 'wpapp_register_filtered_endpoint');
function wpapp_register_filtered_endpoint() {
    register_rest_route('wpapp/v1', '/posts/', array(
        'methods' => 'GET',
        'callback' => 'wpapp_get_filtered_posts',
        'args' => array(
            'category' => array(
                'required' => false,
                'validate_callback' => function($param) {
                    return is_numeric($param);
                },
            ),
        ),
        'permission_callback' => '__return_true',
    ));
}

function wpapp_get_filtered_posts(WP_REST_Request $request) {
    $category = $request->get_param('category');

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 10,
        'post_status' => 'publish',
    );

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

    $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(),
                'date' => get_the_date('c'),
            );
        }
        wp_reset_postdata();
    }

    return rest_ensure_response($posts);
}

Теперь запрос GET /wpapp/v1/posts?category=3 вернет посты из категории с ID 3. Обратите внимание на валидацию параметра — это важно для безопасности и корректной работы.

Авторизация и безопасность кастомных REST API эндпоинтов

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

Самый простой способ — проверить, что пользователь авторизован и обладает необходимыми правами, например, правом редактирования постов.

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

add_action('rest_api_init', function() {
    register_rest_route('wpapp/v1', '/private-data/', array(
        'methods' => 'GET',
        'callback' => 'wpapp_get_private_data',
        'permission_callback' => 'wpapp_permission_check',
    ));
});

function wpapp_get_private_data() {
    return rest_ensure_response(array('secret' => 'Это приватные данные, доступные только авторизованным пользователям.'));
}

Такой эндпоинт вернет данные только авторизованным пользователям с правами edit_posts. Для REST API WordPress есть различные способы аутентификации — cookie, OAuth, JWT и другие, в зависимости от задачи.

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

Чтобы упростить создание и тестирование REST API, рекомендую обратить внимание на следующие плагины:

  • WP REST API Controller — позволяет управлять доступом и полями существующих эндпоинтов без кода.
  • JWT Authentication for WP REST API — добавляет поддержку JWT-токенов для безопасной аутентификации.
  • REST API Toolbox — расширяет возможности настройки и фильтрации REST API.

Эти инструменты помогут быстро настроить API даже без глубоких знаний PHP.

Заключение: почему кастомные REST API эндпоинты важны для современных проектов на WordPress

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

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

Наш каталог плагинов WordPress