WordPress с версии 4.7 содержит встроенный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Это мощный инструмент для разработчиков, который открывает новые возможности для интеграций, мобильных приложений и SPA (одностраничных приложений). В этой статье мы подробно рассмотрим, как создавать собственные REST API эндпоинты в WordPress, чтобы расширить стандартный функционал и реализовать индивидуальные задачи.
Что такое REST API в WordPress и зачем нужны собственные эндпоинты
REST API — это архитектурный стиль взаимодействия клиент-сервер, основанный на HTTP-протоколе. В WordPress он реализован как набор URL, которые возвращают данные в формате JSON. Стандартный API позволяет работать с постами, пользователями, таксономиями и другими сущностями.
Однако часто стандартных эндпоинтов недостаточно. Например, нужно создать API для управления пользовательскими данными, которые не хранятся в стандартных таблицах, или для выполнения сложной логики на сервере. В таких случаях создают собственные эндпоинты, которые обрабатывают нужные запросы и возвращают данные в нужном формате.
Важным моментом является безопасность: нужно контролировать права доступа и валидировать входящие данные, чтобы избежать уязвимостей.
Создание собственного REST API эндпоинта в WordPress
Для регистрации собственного маршрута в REST API используется функция register_rest_route(). Обычно это делают внутри хука rest_api_init. Рассмотрим пример создания простого эндпоинта, который возвращает список последних 5 пользовательских записей с типом book.
add_action('rest_api_init', 'wpassist_register_book_endpoint');
function wpassist_register_book_endpoint() {
register_rest_route('wpassist/v1', '/books/', array(
'methods' => 'GET',
'callback' => 'wpassist_get_books',
'permission_callback' => '__return_true', // для публичного доступа
));
}
function wpassist_get_books() {
$args = array(
'post_type' => 'book',
'posts_per_page' => 5,
);
$query = new WP_Query($args);
$books = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$books[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
);
}
wp_reset_postdata();
}
return $books;
}После добавления этого кода в файл темы или плагина, эндпоинт будет доступен по адресу https://your-site.ru/wp-json/wpassist/v1/books/. Он возвращает JSON-массив с последними 5 записями типа book.
Обработка POST-запросов и безопасность REST эндпоинтов
Создание эндпоинтов для получения данных — это только часть задач. Часто нужно принимать данные от клиента и сохранять их. Например, создадим POST-эндпоинт для добавления новой записи типа book с валидацией и проверкой прав пользователя.
add_action('rest_api_init', 'wpassist_register_create_book_endpoint');
function wpassist_register_create_book_endpoint() {
register_rest_route('wpassist/v1', '/books/', array(
'methods' => 'POST',
'callback' => 'wpassist_create_book',
'permission_callback' => 'wpassist_user_can_edit',
'args' => array(
'title' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
),
'content' => array(
'required' => false,
'sanitize_callback' => 'sanitize_textarea_field',
),
),
));
}
function wpassist_user_can_edit() {
return current_user_can('edit_posts');
}
function wpassist_create_book(WP_REST_Request $request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_data = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => 'book',
);
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
return new WP_Error('cant-create', __('Не удалось создать запись'), array('status' => 500));
}
return array('message' => 'Книга успешно создана', 'id' => $post_id);
}В этом примере мы используем permission_callback для проверки, что пользователь авторизован и имеет права на редактирование записей. Параметры запроса валидируются и очищаются, что предотвращает XSS и SQL-инъекции.
Регистрация собственных полей в REST API и расширение ответа
Иногда нужно, чтобы в ответе API возвращались не только стандартные поля записи, но и метаданные или пользовательские поля. Для этого используется функция register_rest_field(). Пример добавления в ответ поля book_author, хранящегося в метаполе:
add_action('rest_api_init', 'wpassist_register_book_author_field');
function wpassist_register_book_author_field() {
register_rest_field('book', 'book_author', array(
'get_callback' => 'wpassist_get_book_author',
'update_callback' => 'wpassist_update_book_author',
'schema' => array(
'description' => 'Автор книги',
'type' => 'string',
'context' => array('view','edit'),
),
));
}
function wpassist_get_book_author($object) {
return get_post_meta($object['id'], 'book_author', true);
}
function wpassist_update_book_author($value, $object) {
if (!current_user_can('edit_post', $object->ID)) {
return new WP_Error('rest_forbidden', __('Нет доступа для редактирования автора'), array('status' => 403));
}
return update_post_meta($object->ID, 'book_author', sanitize_text_field($value));
}Теперь при запросе информации о книге через REST API в JSON будет возвращено поле book_author. Также его можно обновлять через PUT или PATCH запросы.
Полезные плагины для работы с REST API в WordPress
Для ускорения разработки и расширения возможностей REST API существуют готовые плагины:
- WP REST API Controller — удобный интерфейс для управления доступом к REST API и редактирования эндпоинтов.
- Advanced Custom Fields (ACF) to REST API — автоматически добавляет поля ACF в ответы REST API.
- JWT Authentication for WP REST API — добавляет поддержку JWT-токенов для авторизации через REST API.
Использование этих плагинов поможет сократить время разработки и повысить безопасность API.
Советы по безопасности и производительности при работе с REST API
При создании собственных эндпоинтов важно соблюдать несколько правил:
- Проверяйте права доступа. Никогда не возвращайте конфиденциальные данные без проверки, обладает ли пользователь нужными полномочиями.
- Валидация и санитизация. Всегда проверяйте и очищайте входящие данные. Используйте встроенные функции WordPress для этого.
- Кэширование. Если данные редко меняются, используйте кэширование ответов для снижения нагрузки на сервер.
- Логирование ошибок. Отслеживайте ошибки и исключения для быстрого исправления проблем.
Правильная организация REST API позволит создать надежные и быстрые интеграции для вашего WordPress сайта.