WordPress с версии 4.7 содержит встроенный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Однако иногда стандартных эндпоинтов недостаточно, и нужно создать собственные маршруты, которые выполняют специфические задачи. В этой статье мы подробно разберём, как создать собственный REST API в WordPress на PHP, как правильно регистрировать маршруты, обрабатывать запросы и возвращать данные в формате JSON.
Что такое REST API в WordPress и зачем создавать собственные эндпоинты
REST API — это интерфейс, который позволяет приложениям общаться с сайтом через стандартные HTTP методы (GET, POST, PUT, DELETE). В WordPress есть готовые маршруты для работы с постами, пользователями, комментариями и т.д. Но если вы хотите добавить функциональность, которой нет в ядре, например, получить данные из кастомных таблиц, обработать запросы с дополнительной логикой или интегрировать WordPress с внешним сервисом, нужно создавать свои собственные маршруты.
Создание собственного REST API расширяет возможности вашего сайта, позволяет строить SPA-приложения, мобильные приложения или интеграции с CRM, ERP и другими системами.
Регистрация собственного REST API маршрута в WordPress
Регистрация маршрута происходит с помощью хука rest_api_init и функции register_rest_route(). Рассмотрим пример создания простого маршрута, который возвращает данные о текущем пользователе.
add_action('rest_api_init', 'wpmail_register_api_routes');
function wpmail_register_api_routes() {
register_rest_route('wpmail/v1', '/current-user', [
'methods' => 'GET',
'callback' => 'wpmail_get_current_user',
'permission_callback' => function () {
return is_user_logged_in();
}
]);
}
function wpmail_get_current_user(WP_REST_Request $request) {
$user = wp_get_current_user();
if ($user->ID === 0) {
return new WP_Error('no_user', 'Пользователь не авторизован', ['status' => 401]);
}
return [
'ID' => $user->ID,
'login' => $user->user_login,
'email' => $user->user_email
];
}
В этом примере мы регистрируем маршрут /wp-json/wpmail/v1/current-user, который возвращает информацию о залогиненном пользователе. Обратите внимание на permission_callback — проверка прав доступа. Без неё любой пользователь мог бы получить данные.
Обработка параметров запроса и валидация данных
Часто нужно принимать параметры в запросах, например, ID поста или фильтры. Рассмотрим пример маршрута, который получает пост по ID, переданному в URL.
add_action('rest_api_init', 'wpmail_register_post_route');
function wpmail_register_post_route() {
register_rest_route('wpmail/v1', '/post/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'wpmail_get_post_by_id',
'args' => [
'id' => [
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0;
}
]
],
'permission_callback' => '__return_true'
]);
}
function wpmail_get_post_by_id(WP_REST_Request $request) {
$id = (int) $request->get_param('id');
$post = get_post($id);
if (!$post) {
return new WP_Error('no_post', 'Пост не найден', ['status' => 404]);
}
return [
'ID' => $post->ID,
'title' => $post->post_title,
'content' => apply_filters('the_content', $post->post_content),
'date' => $post->post_date
];
}
Здесь мы используем параметр id в URL, проверяем его валидность с помощью validate_callback и возвращаем данные поста. Если пост не найден, возвращаем ошибку с HTTP кодом 404.
Дополнительные параметры и фильтрация
Вы можете добавлять параметры в запросы GET или POST, например, фильтры по дате, категории и т.д. Важно валидировать и санитизировать все входящие данные, чтобы избежать уязвимостей.
Пример добавления параметра category:
register_rest_route('wpmail/v1', '/posts', [
'methods' => 'GET',
'callback' => 'wpmail_get_posts_by_category',
'args' => [
'category' => [
'required' => false,
'sanitize_callback' => 'sanitize_text_field'
]
],
'permission_callback' => '__return_true'
]);
function wpmail_get_posts_by_category(WP_REST_Request $request) {
$category = $request->get_param('category');
$args = [
'post_type' => 'post',
'posts_per_page' => 10
];
if ($category) {
$args['category_name'] = $category;
}
$query = new WP_Query($args);
$posts = [];
foreach ($query->posts as $post) {
$posts[] = [
'ID' => $post->ID,
'title' => $post->post_title
];
}
return $posts;
}
Обработка POST-запросов и создание новых записей через REST API
Кроме получения данных, REST API позволяет создавать и обновлять записи. Рассмотрим пример обработки POST-запроса для создания нового поста.
add_action('rest_api_init', 'wpmail_register_create_post_route');
function wpmail_register_create_post_route() {
register_rest_route('wpmail/v1', '/create-post', [
'methods' => 'POST',
'callback' => 'wpmail_create_post',
'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 wpmail_create_post(WP_REST_Request $request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_id = wp_insert_post([
'post_title' => $title,
'post_content' => $content,
'post_status' => 'pending',
'post_author' => get_current_user_id()
]);
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Не удалось создать пост', ['status' => 500]);
}
return [
'message' => 'Пост успешно создан',
'post_id' => $post_id
];
}
Обратите внимание, что вызывающий пользователь должен иметь право редактировать записи. Также мы санитизируем входящие данные с помощью встроенных функций WordPress. Статус поста установлен в pending для модерации перед публикацией.
Полезные плагины для работы с REST API в WordPress
Для расширения возможностей REST API существуют плагины, которые могут помочь в разработке:
- WP REST API Controller — позволяет настраивать доступ к эндпоинтам, включать или отключать стандартные маршруты.
- Advanced Custom Fields (ACF) to REST API — добавляет поля ACF в ответы REST API, что удобно для кастомных данных.
- JWT Authentication for WP REST API — добавляет возможность аутентификации через JSON Web Token, что удобно для SPA и мобильных приложений.
Выбор плагинов зависит от целей проекта и требуемой функциональности.
Советы по безопасности при работе с REST API
REST API открывает мощные возможности, но требует внимательного отношения к безопасности:
- Всегда используйте
permission_callback, чтобы ограничить доступ к чувствительным данным. - Санитизируйте и валидируйте все входящие данные.
- Не возвращайте лишнюю информацию, особенно если это касается персональных данных.
- Используйте аутентификацию (например, JWT или OAuth) для защищённых маршрутов.
- Проверяйте и обновляйте используемые плагины для REST API во избежание уязвимостей.
Заключение
Создание собственного REST API в WordPress — это гибкий инструмент для расширения функционала сайта и интеграции с внешними системами. Следуя приведённым примерам и рекомендациям, вы сможете быстро и безопасно создавать свои маршруты и обрабатывать запросы. Такой подход поможет строить современные веб-приложения и улучшать пользовательский опыт.