Что такое REST API в WordPress и зачем создавать собственные endpoints
REST API в WordPress — это мощный инструмент, который позволяет взаимодействовать с сайтом извне через HTTP-запросы. По умолчанию WordPress предоставляет стандартные endpoints для работы с постами, пользователями, комментариями и другими сущностями. Но зачастую стандартных возможностей недостаточно, и возникает необходимость создать собственные endpoints, которые будут возвращать нужные данные или принимать специальные запросы.
Создание собственного REST API endpoint полезно, когда нужно интегрировать WordPress с внешними сервисами, мобильными приложениями или реализовать уникальный функционал, который нельзя покрыть стандартным API. В этой статье мы подробно разберем, как это сделать правильно и безопасно.
Регистрация собственного REST API endpoint в WordPress
Для регистрации нового endpoint используется хук rest_api_init и функция register_rest_route. Рассмотрим пример, как добавить endpoint, который возвращает список последних 5 постов определенной категории.
add_action('rest_api_init', 'wpboard_register_custom_endpoint');
function wpboard_register_custom_endpoint() {
register_rest_route('wpboard/v1', '/latest-posts/(?P<category_id>\d+)', [
'methods' => 'GET',
'callback' => 'wpboard_get_latest_posts_by_category',
'permission_callback' => '__return_true', // Позже обсудим безопасность
]);
}
function wpboard_get_latest_posts_by_category($request) {
$category_id = $request['category_id'];
$args = [
'posts_per_page' => 5,
'category' => $category_id,
'post_status' => 'publish',
];
$posts = get_posts($args);
$data = [];
foreach ($posts as $post) {
$data[] = [
'id' => $post->ID,
'title' => get_the_title($post->ID),
'excerpt' => get_the_excerpt($post->ID),
'link' => get_permalink($post->ID),
];
}
return rest_ensure_response($data);
}В этом примере мы создали endpoint /wp-json/wpboard/v1/latest-posts/{category_id}, который принимает ID категории и возвращает 5 последних постов этой категории.
Пояснения к коду регистрации endpoint
- rest_api_init — хук для инициализации REST API;
- register_rest_route — функция, регистрирующая новый маршрут с пространством имён
wpboard/v1; - permission_callback — проверяет права доступа. В примере стоит
__return_true, то есть доступ открыт всем. Для защищённых данных нужно реализовать проверку.
Реализация проверки доступа и безопасность custom REST API endpoint
Очень важно контролировать, кто может использовать ваш endpoint. Если вы возвращаете приватные данные, то надо настроить permission_callback так, чтобы только авторизованные пользователи получали ответ. Рассмотрим, как это сделать.
function wpboard_permission_check($request) {
return current_user_can('edit_posts'); // Например, разрешаем только редакторам и выше
}
add_action('rest_api_init', function() {
register_rest_route('wpboard/v1', '/private-data/', [
'methods' => 'GET',
'callback' => 'wpboard_get_private_data',
'permission_callback' => 'wpboard_permission_check',
]);
});
function wpboard_get_private_data($request) {
// Возвращаем какие-то приватные данные
return rest_ensure_response(['secret' => 'Это секретная информация']);
}В данном случае, если пользователь не имеет права редактировать записи, он получит ошибку доступа при попытке обращения к endpoint.
Обработка POST-запросов и передача данных в собственный REST API endpoint
Иногда нужно принимать данные от клиента и обрабатывать их. Например, создадим endpoint, который принимает JSON с данными и сохраняет новую запись в пользовательскую таблицу.
add_action('rest_api_init', function() {
register_rest_route('wpboard/v1', '/save-data', [
'methods' => 'POST',
'callback' => 'wpboard_save_custom_data',
'permission_callback' => function() {
return is_user_logged_in();
},
'args' => [
'title' => [
'required' => true,
'validate_callback' => function($param) {
return is_string($param) && !empty($param);
}
],
'content' => [
'required' => true,
'sanitize_callback' => 'sanitize_text_field'
],
]
]);
});
function wpboard_save_custom_data($request) {
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_text_field($request->get_param('content'));
$post_id = wp_insert_post([
'post_title' => $title,
'post_content' => $content,
'post_status' => 'pending',
'post_type' => 'post',
]);
if (is_wp_error($post_id)) {
return new WP_Error('cannot_create', 'Не удалось создать запись', ['status' => 500]);
}
return rest_ensure_response(['post_id' => $post_id, 'message' => 'Запись создана и ожидает проверки']);
}Обратите внимание, что мы используем:
permission_callbackдля проверки, что пользователь авторизован;- валидацию и санитизацию входящих данных через
args; - функцию
wp_insert_postдля создания записи.
Практические примеры полезных плагинов для работы с REST API в WordPress
Если хочется расширить возможности работы с REST API без написания собственного кода, рекомендую обратить внимание на несколько полезных плагинов:
- WP REST API Controller — позволяет настраивать, какие поля и таксономии отображать в REST API, а также управлять доступом;
- JWT Authentication for WP REST API — добавляет поддержку авторизации через JWT-токены, что удобно для мобильных приложений;
- Advanced Custom Fields (ACF) to REST API — расширяет стандартный API, добавляя поля ACF в REST-ответы.
Эти плагины помогут быстро получить нужный функционал и сэкономить время на разработку.
Отладка и тестирование собственного REST API endpoint
После создания собственного endpoint важно его протестировать. Для этого подойдут следующие инструменты:
- Postman — очень удобный клиент для отправки HTTP-запросов с возможностью настраивать заголовки, тело запроса и смотреть ответы;
- curl из командной строки — быстрый способ проверить работу endpoint;
- встроенный REST API браузер — в WordPress можно открыть
https://your-site.ru/wp-json/и изучить доступные маршруты.
Для проверки POST-запросов в Postman можно указать заголовок Content-Type: application/json и передать тело в формате JSON.
Заключение по созданию собственного REST API в WordPress
Создание собственного REST API endpoint — это отличный способ расширить возможности вашего сайта и интегрировать WordPress с внешними сервисами. Главное — грамотно организовать регистрацию маршрутов, обеспечить безопасность и корректно обрабатывать входящие данные. Практическое применение этих навыков позволит создавать более гибкие и мощные решения на базе WordPress.