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 позволит создать гибкий и надёжный интерфейс для вашего сайта.