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

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

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

REST API — это интерфейс, который позволяет отправлять GET, POST, PUT, DELETE запросы к сайту и получать структурированные данные в формате JSON. По умолчанию WordPress предоставляет множество стандартных эндпоинтов для работы с постами, пользователями, таксономиями и другими сущностями.

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

Создание собственных эндпоинтов позволяет:

  • Экспортировать данные в нужном формате.
  • Создавать API для мобильных приложений.
  • Обеспечивать безопасность и контроль доступа к данным.
  • Расширять возможности сайта без изменения фронтенда.

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

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

Рассмотрим пример создания простого эндпоинта, который возвращает список последних 5 постов в формате JSON.

add_action('rest_api_init', 'wp0_register_custom_endpoint');
function wp0_register_custom_endpoint() {
    register_rest_route('wp0/v1', '/recent-posts/', [
        'methods' => 'GET',
        'callback' => 'wp0_get_recent_posts',
        'permission_callback' => '__return_true',
    ]);
}

function wp0_get_recent_posts() {
    $args = [
        'numberposts' => 5,
        'post_status' => 'publish'
    ];
    $recent_posts = wp_get_recent_posts($args);
    return rest_ensure_response($recent_posts);
}

В этом коде мы создаём маршрут /wp-json/wp0/v1/recent-posts/, который по GET-запросу возвращает массив с последними публикациями. Обратите внимание на параметр permission_callback — здесь он установлен в __return_true, то есть доступ открыт для всех. В реальных проектах лучше реализовать проверку прав.

Параметры маршрута и фильтрация данных

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

add_action('rest_api_init', 'wp0_register_custom_endpoint_with_params');
function wp0_register_custom_endpoint_with_params() {
    register_rest_route('wp0/v1', '/recent-posts/', [
        'methods' => 'GET',
        'callback' => 'wp0_get_recent_posts_with_params',
        'permission_callback' => '__return_true',
        'args' => [
            'count' => [
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric($param) && $param > 0 && $param <= 20;
                },
                'default' => 5
            ]
        ]
    ]);
}

function wp0_get_recent_posts_with_params($request) {
    $count = $request->get_param('count');
    $args = [
        'numberposts' => $count,
        'post_status' => 'publish'
    ];
    $recent_posts = wp_get_recent_posts($args);
    return rest_ensure_response($recent_posts);
}

Теперь можно запрашивать, например, /wp-json/wp0/v1/recent-posts?count=10, и получить 10 постов. Валидация параметра ограничивает число от 1 до 20, чтобы избежать излишней нагрузки.

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

REST API позволяет не только получать данные, но и создавать или обновлять их. Для этого используются методы POST, PUT и DELETE. Рассмотрим пример создания нового поста через POST-запрос.

add_action('rest_api_init', 'wp0_register_post_creation_endpoint');
function wp0_register_post_creation_endpoint() {
    register_rest_route('wp0/v1', '/create-post/', [
        'methods' => 'POST',
        'callback' => 'wp0_handle_post_creation',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
        'args' => [
            'title' => [
                'required' => true,
                'sanitize_callback' => 'sanitize_text_field'
            ],
            'content' => [
                'required' => true,
                'sanitize_callback' => 'wp_kses_post'
            ]
        ]
    ]);
}

function wp0_handle_post_creation($request) {
    $title = $request->get_param('title');
    $content = $request->get_param('content');
    
    $post_id = wp_insert_post([
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'draft',
        'post_author' => get_current_user_id()
    ]);

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

    return rest_ensure_response(['post_id' => $post_id, 'message' => 'Пост успешно создан']);
}

Здесь мы регистрируем эндпоинт /wp-json/wp0/v1/create-post/, который принимает параметры заголовка и контента, проверяет права пользователя и создает новый пост в статусе черновика.

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

Для удобства работы с REST API и расширения возможностей можно использовать готовые плагины:

  • WP REST API Controller — позволяет управлять доступом и контролировать, какие поля и маршруты доступны через API.
  • Advanced Custom Fields (ACF) — вместе с ACF to REST API расширяет стандартный API, добавляя пользовательские поля.
  • Postman или Insomnia — мощные инструменты для тестирования и отладки REST запросов.

Эти инструменты помогут создавать сложные API без излишнего кода и обеспечат удобную работу с данными.

Безопасность и аутентификация при работе с REST API

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

Для аутентификации можно использовать:

  • Куки и стандартную сессию WordPress (только для авторизованных пользователей через браузер).
  • Basic Auth — простой, но менее безопасный метод, подходит для тестирования.
  • OAuth или JWT (JSON Web Tokens) — современные и безопасные способы аутентификации для внешних приложений.

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

'permission_callback' => function() {
    return current_user_can('edit_posts');
}

Использование REST API для динамического обновления контента на сайте

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

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

fetch('/wp-json/wp0/v1/recent-posts?count=3')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    // Здесь можно обновить DOM, чтобы показать посты
  })
  .catch(error => console.error('Ошибка:', error));

Такой подход улучшает UX, ускоряет взаимодействие и снижает нагрузку на сервер.

Итог

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

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