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

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

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

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

Регистрация кастомного REST API маршрута в WordPress

Для добавления собственного endpoint используется хук rest_api_init и функция register_rest_route(). Ниже пример базовой регистрации маршрута, который возвращает текст "Привет, мир!":

add_action('rest_api_init', 'wporg_register_custom_route');
function wporg_register_custom_route() {
    register_rest_route('wporg/v1', '/hello', array(
        'methods' => 'GET',
        'callback' => 'wporg_hello_callback',
    ));
}

function wporg_hello_callback() {
    return array('message' => 'Привет, мир!');
}

Данный код создаёт маршрут /wp-json/wporg/v1/hello, который при GET-запросе возвращает JSON с сообщением. Это самый простой endpoint, который можно расширять и дополнять.

Пояснение параметров register_rest_route

  • 'wporg/v1' — пространство имён (namespace) и версия API.
  • '/hello' — путь маршрута.
  • 'methods' — HTTP-методы, которые обрабатывает маршрут.
  • 'callback' — функция, вызываемая при обращении к маршруту.

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

Очень часто endpoint должен принимать параметры. Рассмотрим пример endpoint, который принимает параметр id и возвращает данные поста с этим ID.

add_action('rest_api_init', 'wporg_register_post_route');
function wporg_register_post_route() {
    register_rest_route('wporg/v1', '/post/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'wporg_get_post_by_id',
        'args' => array(
            'id' => array(
                'validate_callback' => function($param, $request, $key) {
                    return is_numeric($param) && $param > 0;
                }
            ),
        ),
        'permission_callback' => '__return_true',
    ));
}

function wporg_get_post_by_id($request) {
    $id = (int) $request['id'];
    $post = get_post($id);

    if (empty($post)) {
        return new WP_Error('no_post', 'Пост не найден', array('status' => 404));
    }

    return array(
        'id' => $post->ID,
        'title' => $post->post_title,
        'content' => $post->post_content,
        'date' => $post->post_date,
    );
}

Здесь:

  • Используется регулярное выражение (?P\d+) для захвата параметра id.
  • В поле args описана валидация параметра.
  • permission_callback отвечает за проверку прав доступа (в примере разрешено всем).

Такой подход защищает API от некорректных данных и ошибок.

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

Частая задача — создать запись через API. Для этого метод должен быть POST, а данные — в теле запроса JSON.

add_action('rest_api_init', 'wporg_register_create_post_route');
function wporg_register_create_post_route() {
    register_rest_route('wporg/v1', '/create-post', array(
        'methods' => 'POST',
        'callback' => 'wporg_create_post_callback',
        'permission_callback' => function() {
            return current_user_can('edit_posts');
        },
        'args' => array(
            'title' => array('required' => true),
            'content' => array('required' => true),
        ),
    ));
}

function wporg_create_post_callback($request) {
    $params = $request->get_json_params();

    $post_id = wp_insert_post(array(
        'post_title' => sanitize_text_field($params['title']),
        'post_content' => wp_kses_post($params['content']),
        'post_status' => 'publish',
        'post_type' => '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);
}

Обратите внимание на permission_callback, который проверяет, может ли текущий пользователь создавать записи. В противном случае API вернёт ошибку 403.

Использование популярных плагинов для расширения REST API

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

  • WP REST API Controller — позволяет настраивать доступ к endpoint'ам, поля постов и таксономий через интерфейс.
  • Advanced Custom Fields to REST API — добавляет кастомные поля ACF в ответы API.
  • JWT Authentication for WP REST API — добавляет аутентификацию по токену, что важно для безопасности.

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

Отладка и тестирование собственного REST API endpoint

Для проверки и отладки созданных маршрутов удобно использовать инструменты:

  • Postman — популярный клиент для API-запросов с поддержкой всех HTTP-методов.
  • curl — консольный инструмент для отправки запросов. Например:
curl -X GET 'https://wporg.ru/wp-json/wporg/v1/hello'

При возникновении ошибок полезно смотреть логи сервера и использовать функции error_log() в PHP. Также убедитесь, что REST API не отключен плагинами или настройками темы.

Рекомендации по безопасности REST API endpoint

Создавая собственные endpoint'ы, обязательно учитывайте безопасность:

  • Используйте permission_callback для проверки прав пользователя.
  • Валидация и санитизация всех входящих данных с помощью стандартных функций WordPress.
  • Не раскрывайте чувствительную информацию в ответах API.
  • Если необходимо, добавляйте аутентификацию через JWT или OAuth.

Безопасность — ключевой аспект при работе с REST API, особенно если endpoint позволяет изменять данные.

Скачать WP с оф. сайта Магазин проверенных платных тем