WordPress REST API — мощный инструмент для взаимодействия с данными сайта из внешних приложений или фронтенд-частей. Однако работа с API часто требует точной настройки направления запросов и грамотной обработки данных, чтобы обеспечить безопасность, производительность и удобство использования. В этой статье разберём, как правильно организовать маршрутизацию запросов и обработку входящих данных в WordPress REST API, с примерами кода и рекомендациями по безопасности.
Основы маршрутизации запросов в WordPress REST API
Маршрутизация в REST API WordPress происходит через регистрацию конечных точек (endpoints) с помощью функции register_rest_route. При этом вы задаёте namespace, route и массив параметров, в котором указываются методы HTTP, callback функции, права доступа и валидация параметров.
Например, регистрация пользовательского маршрута, который возвращает список последних постов определённого типа:
function wpvip_register_custom_route() {
register_rest_route('wpvip/v1', '/latest-posts/', [
'methods' => 'GET',
'callback' => 'wpvip_get_latest_posts',
'permission_callback' => '__return_true',
'args' => [
'post_type' => [
'required' => false,
'default' => 'post',
'sanitize_callback' => 'sanitize_text_field',
],
'count' => [
'required' => false,
'default' => 5,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
],
],
]);
}
add_action('rest_api_init', 'wpvip_register_custom_route');В этом примере мы создаём endpoint /wpvip/v1/latest-posts/, который принимает параметры post_type и count. Обратите внимание на использование sanitize_callback и validate_callback — это важные элементы безопасности.
Обработка запроса и возврат данных
Обработчик запроса — функция, которая формирует ответ API. В нашем случае она должна получить последние записи нужного типа и вернуть их в формате JSON.
function wpvip_get_latest_posts($request) {
$post_type = $request->get_param('post_type');
$count = (int) $request->get_param('count');
$args = [
'post_type' => $post_type,
'posts_per_page' => $count,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
];
$query = new WP_Query($args);
$posts = [];
foreach ($query->posts as $post) {
$posts[] = [
'id' => $post->ID,
'title' => get_the_title($post),
'link' => get_permalink($post),
];
}
return rest_ensure_response($posts);
}Таким образом, мы возвращаем массив с ID, заголовками и ссылками на посты. Использование rest_ensure_response гарантирует, что данные корректно сериализуются в JSON.
Валидация и санитизация параметров в REST API
Правильная обработка параметров — ключ к безопасности. В WordPress REST API параметры можно валидировать и санитизировать через аргументы args при регистрации маршрута. Это предотвращает передачу вредоносных или некорректных данных.
Для валидации можно использовать анонимные функции или глобальные функции PHP, например:
is_numeric— для числовых параметровsanitize_text_field— для строк- свои функции для сложной логики
Пример проверки, что параметр числовой и находится в диапазоне:
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 100;
},Если валидация не пройдена, WordPress автоматически отправит ошибку 400 с описанием проблемы.
Обработка POST-запросов и сохранение данных
Часто REST API используется для приёма данных и их сохранения — например, для создания новых записей или обновления.
Рассмотрим пример регистрации маршрута для создания новой записи типа review с полями title и content:
function wpvip_register_create_review_route() {
register_rest_route('wpvip/v1', '/create-review/', [
'methods' => 'POST',
'callback' => 'wpvip_create_review',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => [
'title' => [
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
],
'content' => [
'required' => true,
'sanitize_callback' => 'sanitize_textarea_field',
],
],
]);
}
add_action('rest_api_init', 'wpvip_register_create_review_route');Функция-обработчик создаёт запись и возвращает ID новой записи или ошибку:
function wpvip_create_review($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_type' => 'review',
]);
if (is_wp_error($post_id)) {
return new WP_Error('create_failed', 'Ошибка создания записи', ['status' => 500]);
}
return rest_ensure_response(['post_id' => $post_id, 'message' => 'Отзыв создан и ожидает модерации']);
}Безопасность и права доступа в REST API
Очень важно контролировать, кто и какие данные может получать или изменять через API. Для этого служит параметр permission_callback — функция, которая возвращает true или false.
Примеры распространённых проверок:
__return_true— доступ открыт всем (например, для публичных данных)is_user_logged_in— проверить, что пользователь авторизованcurrent_user_can('edit_posts')— проверить права пользователя
Например, чтобы разрешить создание отзывов только авторизованным пользователям с правом редактирования постов, используем:
'permission_callback' => function() {
return current_user_can('edit_posts');
},Практические советы и плагины для работы с REST API
Для расширенного управления и отладки REST API полезны следующие плагины:
- Clearfy Pro — оптимизация и расширение безопасности, включая контроль REST API
- WPExpertReview — для создания и управления отзывами через REST API
Для тестирования API удобно использовать плагины типа REST API Console или сторонние инструменты вроде Postman.
Обработка ошибок и стандарты ответов в WordPress REST API
При работе с API важно грамотно обрабатывать ошибки, возвращая понятные сообщения и правильные HTTP-коды. WordPress предоставляет класс WP_Error для удобного создания ошибок.
Пример возвращения ошибки при неверных данных:
if (empty($title)) {
return new WP_Error('no_title', 'Заголовок обязателен', ['status' => 400]);
}Также рекомендуется использовать функции rest_ensure_response для обёртки данных и поддерживать единый формат вывода.
Заключение по теме направления запросов и обработки данных в WordPress REST API
Правильная организация маршрутов, тщательная валидация и санитизация параметров, грамотное управление правами доступа и обработка ошибок — это база стабильного и безопасного REST API в WordPress. Используйте представленные подходы и кодовые примеры для разработки своих собственных API-решений, которые будут надёжно работать и легко масштабироваться.