Что такое REST API в WordPress и зачем он нужен
REST API — это современный способ взаимодействия с сайтом на WordPress через HTTP-запросы. Он позволяет создавать, читать, обновлять и удалять данные сайта из внешних приложений или внутри самого WordPress. Использование REST API дает разработчикам мощный инструмент для написания плагинов и тем, которые могут работать асинхронно, обеспечивая гибкое и масштабируемое взаимодействие с данными.
REST API встроен в ядро WordPress с версии 4.7 и предоставляет стандартные конечные точки для работы с такими сущностями, как записи, страницы, пользователи и таксономии. Однако, для реализации уникальной логики плагина, часто необходимо создавать собственные маршруты и контроллеры.
Понимание работы REST API критично для разработки современных расширений WordPress, особенно если ваш плагин должен взаимодействовать с фронтендом на React, Vue или мобильными приложениями.
Регистрация собственных маршрутов REST API в плагине
Чтобы расширить стандартный REST API, нужно зарегистрировать свои маршруты. Это выполняется с помощью функции register_rest_route(), которая вызывается на хуке rest_api_init.
Рассмотрим пример регистрации нового маршрута для нашего плагина wpengine_rest_api_example:
add_action('rest_api_init', function () {
register_rest_route('wpengine/v1', '/message/', array(
'methods' => 'GET',
'callback' => 'wpengine_rest_api_example_get_message',
));
});
function wpengine_rest_api_example_get_message(WP_REST_Request $request) {
return array('message' => 'Привет от WPengine REST API!');
}В этом примере мы создали новый маршрут /wpengine/v1/message/, который при GET-запросе будет возвращать JSON с сообщением. Такой подход позволяет легко расширять API под нужды вашего плагина.
Параметры маршрута и проверка входных данных
Очень важно валидировать и фильтровать параметры запросов, чтобы избежать ошибок и угроз безопасности. В register_rest_route() можно указать схему параметров и функцию проверки.
register_rest_route('wpengine/v1', '/user/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'wpengine_rest_api_example_get_user',
'args' => array(
'id' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0;
}
),
),
));
function wpengine_rest_api_example_get_user(WP_REST_Request $request) {
$user_id = (int)$request->get_param('id');
$user = get_userdata($user_id);
if (!$user) {
return new WP_Error('no_user', 'Пользователь не найден', array('status' => 404));
}
return array('id' => $user->ID, 'login' => $user->user_login, 'email' => $user->user_email);
}Здесь мы регистрируем маршрут с параметром id, который проверяется на положительное число. Если пользователь с таким ID не найден, возвращается ошибка с кодом 404.
Пример: создание плагина с REST API для управления заметками
Далее создадим простой плагин, который позволит создавать, получать и удалять пользовательские заметки через REST API.
Структура плагина
- Регистрация кастомного типа записи
note - Создание REST API маршрутов для CRUD операций
- Обработка запросов с проверкой прав пользователя
Код плагина
/**
* Регистрация кастомного типа записи 'note'
*/
function wpengine_rest_api_example_register_post_type() {
register_post_type('note', array(
'label' => 'Заметки',
'public' => false,
'show_ui' => true,
'supports' => array('title', 'editor'),
'show_in_rest' => true,
'rest_base' => 'notes',
));
}
add_action('init', 'wpengine_rest_api_example_register_post_type');
/**
* Регистрация маршрутов REST API
*/
function wpengine_rest_api_example_register_routes() {
register_rest_route('wpengine/v1', '/notes/', array(
'methods' => 'GET',
'callback' => 'wpengine_rest_api_example_get_notes',
'permission_callback' => function() {
return current_user_can('read');
},
));
register_rest_route('wpengine/v1', '/notes/', array(
'methods' => 'POST',
'callback' => 'wpengine_rest_api_example_create_note',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
register_rest_route('wpengine/v1', '/notes/(?P<id>\d+)', array(
'methods' => 'DELETE',
'callback' => 'wpengine_rest_api_example_delete_note',
'permission_callback' => function() {
return current_user_can('delete_posts');
},
));
}
add_action('rest_api_init', 'wpengine_rest_api_example_register_routes');
/**
* Получение заметок текущего пользователя
*/
function wpengine_rest_api_example_get_notes(WP_REST_Request $request) {
$current_user_id = get_current_user_id();
$args = array(
'post_type' => 'note',
'author' => $current_user_id,
'post_status' => 'publish',
'numberposts' => -1,
);
$notes = get_posts($args);
$result = array();
foreach ($notes as $note) {
$result[] = array(
'id' => $note->ID,
'title' => $note->post_title,
'content' => $note->post_content,
);
}
return $result;
}
/**
* Создание новой заметки
*/
function wpengine_rest_api_example_create_note(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_textarea_field($request->get_param('content'));
$post_id = wp_insert_post(array(
'post_type' => 'note',
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_author' => get_current_user_id(),
));
if (is_wp_error($post_id)) {
return new WP_Error('cannot_create', 'Не удалось создать заметку', array('status' => 500));
}
return array('id' => $post_id, 'title' => $title, 'content' => $content);
}
/**
* Удаление заметки по ID
*/
function wpengine_rest_api_example_delete_note(WP_REST_Request $request) {
$id = (int)$request->get_param('id');
$post = get_post($id);
if (!$post || $post->post_type !== 'note' || $post->post_author !== get_current_user_id()) {
return new WP_Error('not_found', 'Заметка не найдена или доступ запрещен', array('status' => 404));
}
wp_delete_post($id, true);
return array('deleted' => true, 'id' => $id);
}Полезные плагины для работы с REST API в WordPress
Помимо самостоятельной разработки, есть готовые решения, которые упрощают работу с REST API:
- WP REST API Controller — позволяет управлять доступом и видимостью стандартных маршрутов API через удобный интерфейс.
- Advanced Custom Fields (ACF) — с помощью дополнения ACF to REST API можно добавить пользовательские поля в ответы API.
- JWT Authentication for WP REST API — плагин для реализации аутентификации через JSON Web Tokens, что важно для безопасности.
Использование этих плагинов значительно ускорит разработку и улучшит безопасность ваших API-интерфейсов.
Советы по безопасности и производительности REST API
При разработке REST API важно учитывать безопасность:
- Используйте
permission_callbackдля проверки прав доступа к маршрутам. - Валидация и санитизация всех входных данных.
- Ограничение объема возвращаемых данных и пагинация.
- Кэширование ответов для уменьшения нагрузки на сервер.
Также следите за производительностью: избегайте тяжелых запросов к базе, используйте транзиенты и оптимизируйте код.