WordPress с версии 4.7 поддерживает REST API из коробки, что значительно расширяет возможности для разработки и интеграции с внешними приложениями. В этой статье мы подробно разберём, как создать собственный REST API endpoint в WordPress, чтобы получать или отправлять данные в формате JSON. Это полезно, если стандартных эндпоинтов недостаточно или нужно реализовать кастомную логику.
Что такое REST API endpoint в WordPress и зачем он нужен
REST API endpoint — это URL, к которому можно обратиться с помощью HTTP-запроса (GET, POST, PUT, DELETE и т.д.) и получить или отправить данные в формате JSON. В WordPress уже есть множество стандартных эндпоинтов для работы с постами, пользователями, таксономиями и т.д.
Однако часто возникает необходимость добавить собственный endpoint для специфичных задач: например, для работы с кастомными таблицами, интеграции с внешними сервисами, реализации бизнес-логики на стороне сервера. Создание собственного REST API endpoint позволяет сделать WordPress полноценным бекендом для SPA, мобильных приложений или просто расширить возможности сайта.
Регистрация собственного REST API endpoint в WordPress
Для начала создадим простой endpoint, который будет возвращать список последних постов с некоторыми полями. Чтобы зарегистрировать endpoint, нужно воспользоваться хуком rest_api_init и функцией register_rest_route.
add_action('rest_api_init', 'wproot_register_custom_endpoint');
function wproot_register_custom_endpoint() {
register_rest_route('wproot/v1', '/latest-posts/', [
'methods' => 'GET',
'callback' => 'wproot_get_latest_posts',
'permission_callback' => '__return_true', // разрешаем всем
]);
}
function wproot_get_latest_posts(WP_REST_Request $request) {
$args = [
'posts_per_page' => 5,
'post_status' => 'publish',
];
$posts = get_posts($args);
$data = [];
foreach ($posts as $post) {
$data[] = [
'id' => $post->ID,
'title' => get_the_title($post),
'excerpt' => get_the_excerpt($post),
'date' => get_the_date('', $post),
'link' => get_permalink($post),
];
}
return rest_ensure_response($data);
}Теперь, если обратиться через браузер или Postman к URL https://ваш-сайт.ru/wp-json/wproot/v1/latest-posts/, мы получим JSON с последними пятью постами.
Обработка параметров запроса и фильтрация данных
Часто нужно принимать параметры от клиента, чтобы фильтровать или изменять выборку. Например, добавим параметр count, чтобы динамически задавать количество постов.
add_action('rest_api_init', 'wproot_register_custom_endpoint');
function wproot_register_custom_endpoint() {
register_rest_route('wproot/v1', '/latest-posts/', [
'methods' => 'GET',
'callback' => 'wproot_get_latest_posts',
'permission_callback' => '__return_true',
'args' => [
'count' => [
'required' => false,
'default' => 5,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
'sanitize_callback' => 'absint',
],
],
]);
}
function wproot_get_latest_posts(WP_REST_Request $request) {
$count = $request->get_param('count');
$args = [
'posts_per_page' => $count,
'post_status' => 'publish',
];
$posts = get_posts($args);
$data = [];
foreach ($posts as $post) {
$data[] = [
'id' => $post->ID,
'title' => get_the_title($post),
'excerpt' => get_the_excerpt($post),
'date' => get_the_date('', $post),
'link' => get_permalink($post),
];
}
return rest_ensure_response($data);
}Теперь можно запросить, например, https://ваш-сайт.ru/wp-json/wproot/v1/latest-posts/?count=10, чтобы получить 10 последних публикаций. Валидация параметра защитит от излишних нагрузок.
Добавление POST эндпоинта для создания записи
REST API поддерживает не только чтение, но и запись данных. Рассмотрим реализацию POST-запроса для создания нового поста через наш endpoint. Для этого важно правильно настроить проверку прав, чтобы только авторизованные пользователи могли создавать записи.
add_action('rest_api_init', 'wproot_register_post_creation_endpoint');
function wproot_register_post_creation_endpoint() {
register_rest_route('wproot/v1', '/create-post/', [
'methods' => 'POST',
'callback' => 'wproot_create_post',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => [
'title' => [
'required' => true,
'validate_callback' => function($param) {
return is_string($param) && strlen($param) > 0;
},
],
'content' => [
'required' => true,
],
],
]);
}
function wproot_create_post(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = wp_kses_post($request->get_param('content'));
$new_post = [
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_author' => get_current_user_id(),
];
$post_id = wp_insert_post($new_post);
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Не удалось создать запись', ['status' => 500]);
}
return rest_ensure_response(['post_id' => $post_id, 'message' => 'Пост успешно создан в статусе черновика']);
}Для тестирования такого запроса нужно отправить POST-запрос с заголовком авторизации и телом с параметрами title и content. Такой подход гарантирует безопасность и контроль доступа.
Советы по безопасности и производительности REST API в WordPress
Создавая свои endpoints, важно помнить о безопасности:
- Проверяйте права доступа — используйте
permission_callback, чтобы ограничить доступ только авторизованным пользователям или определённым ролям. - Валидация и санитизация входящих данных — не доверяйте данным от клиента, всегда проверяйте и очищайте параметры.
- Ограничение размера выборок — чтобы избежать излишней нагрузки, не отдавайте огромные объёмы данных одним запросом.
- Кеширование результатов — если данные не меняются часто, используйте transient API или внешние кеши.
Кроме этого, для удобства разработки и отладки можно использовать плагины, например:
- REST API Console — интерактивный клиент для тестирования API прямо в админке.
- WP REST API Controller — позволяет настраивать и расширять эндпоинты без программирования.
Расширение функционала: добавление кастомных полей и метаданных в ответ
Часто стандартных полей поста недостаточно. Рассмотрим пример, как добавить в ответ REST API кастомные поля, например, данные из мета-полей.
function wproot_register_custom_fields() {
register_rest_field('post', 'wproot_custom_meta', [
'get_callback' => function($post_arr) {
$post_id = $post_arr['id'];
return get_post_meta($post_id, 'wproot_custom_meta_key', true);
},
'schema' => [
'description' => 'Кастомное мета поле',
'type' => 'string',
],
]);
}
add_action('rest_api_init', 'wproot_register_custom_fields');После добавления этого кода при запросе поста через REST API в ответе появится поле wproot_custom_meta с нужными данными. Это удобно для передачи дополнительной информации на фронтенд.