REST API в WordPress открывает огромные возможности для разработчиков, позволяя создавать мощные и интерактивные плагины и приложения, которые могут взаимодействовать с сайтом извне и внутри. В этой статье мы подробно разберём, как использовать REST API для создания собственного плагина на WordPress, рассмотрим структуру маршрутов, методы и примеры кода.
Что такое REST API в WordPress и зачем он нужен
REST API (Representational State Transfer Application Programming Interface) — это современный способ обмена данными между клиентом и сервером через HTTP-запросы. WordPress включает собственный REST API, который позволяет работать с постами, пользователями, таксономиями и другими сущностями сайта через JSON-запросы.
Главное преимущество REST API — возможность создавать динамические интерфейсы, мобильные приложения и расширения, которые не зависят от традиционной архитектуры WordPress. Например, вы можете написать плагин, который будет получать данные с сайта и отображать их в виде виджета на внешнем ресурсе или обрабатывать запросы из внешних систем.
Кроме того, REST API позволяет легко интегрировать сторонние сервисы и создавать SPA (single-page applications) на базе WordPress.
Создание собственного REST API маршрута в плагине WordPress
Для начала необходимо зарегистрировать новый маршрут (endpoint) в REST API. Это делается с помощью функции register_rest_route, которую нужно вызвать в хуке rest_api_init. Рассмотрим пример из плагина wplock, который создаст endpoint для получения списка последних 5 постов с дополнительной информацией.
add_action('rest_api_init', 'wplock_register_routes');
function wplock_register_routes() {
register_rest_route('wplock/v1', '/recent-posts/', array(
'methods' => 'GET',
'callback' => 'wplock_get_recent_posts',
'permission_callback' => '__return_true' // доступ открыт всем
));
}
function wplock_get_recent_posts(WP_REST_Request $request) {
$args = array(
'numberposts' => 5,
'post_status' => 'publish'
);
$posts = wp_get_recent_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post['ID'],
'title' => $post['post_title'],
'excerpt' => wp_trim_words($post['post_content'], 20),
'date' => $post['post_date']
);
}
return rest_ensure_response($data);
}В этом примере мы создаём маршрут /wp-json/wplock/v1/recent-posts/, который возвращает JSON с пятью последними опубликованными постами. Обратите внимание на использование функции rest_ensure_response для корректного формирования ответа API.
Обработка POST-запросов и создание данных через REST API
REST API позволяет не только получать данные, но и создавать, обновлять или удалять их. Для демонстрации создадим endpoint, который будет принимать POST-запрос и создавать новую заметку (post типа 'post') с данными, переданными в JSON.
add_action('rest_api_init', 'wplock_register_post_route');
function wplock_register_post_route() {
register_rest_route('wplock/v1', '/add-post/', array(
'methods' => 'POST',
'callback' => 'wplock_create_post',
'permission_callback' => function () {
return current_user_can('edit_posts'); // только для авторизованных с правами
}
));
}
function wplock_create_post(WP_REST_Request $request) {
$params = $request->get_json_params();
if (empty($params['title']) || empty($params['content'])) {
return new WP_Error('missing_data', 'Необходимо указать title и content', array('status' => 400));
}
$post_data = array(
'post_title' => sanitize_text_field($params['title']),
'post_content' => wp_kses_post($params['content']),
'post_status' => 'draft',
'post_author' => get_current_user_id(),
'post_type' => 'post'
);
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
return new WP_Error('insert_failed', 'Ошибка при создании поста', array('status' => 500));
}
return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Пост создан в статусе черновика'));
}Здесь важно обеспечить безопасность: мы проверяем права пользователя через permission_callback. Также используем функции очистки данных sanitize_text_field и wp_kses_post для предотвращения XSS и других атак.
Добавление пользовательских параметров и фильтрация данных в REST API
В реальных проектах часто нужно принимать дополнительные параметры в запросах и фильтровать результаты. Например, можно добавить параметр category_id для фильтрации постов по категории:
add_action('rest_api_init', function () {
register_rest_route('wplock/v1', '/filtered-posts/', array(
'methods' => 'GET',
'callback' => 'wplock_get_filtered_posts',
'args' => array(
'category_id' => array(
'required' => false,
'validate_callback' => function ($param) {
return is_numeric($param);
}
),
),
'permission_callback' => '__return_true'
));
});
function wplock_get_filtered_posts(WP_REST_Request $request) {
$category_id = $request->get_param('category_id');
$args = array(
'post_status' => 'publish',
'numberposts' => 10,
);
if ($category_id) {
$args['category'] = intval($category_id);
}
$posts = get_posts($args);
$result = array();
foreach ($posts as $post) {
$result[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'date' => $post->post_date,
);
}
return rest_ensure_response($result);
}Опция 'args' позволяет задать правила валидации и обязательность параметров. Это помогает контролировать входные данные и исключать ошибки.
Популярные плагины для расширения возможностей REST API в WordPress
Существуют плагины, которые значительно упрощают работу с REST API или расширяют его функционал:
- WP REST API Controller — позволяет управлять доступом и видимостью полей в REST API без кода.
- ACF to REST API — расширяет REST API, добавляя поддержку полей Advanced Custom Fields.
- REST API Toolbox — инструмент для настройки маршрутов, разрешений и параметров.
- JWT Authentication for WP REST API — добавляет поддержку аутентификации через JWT токены для безопасного доступа к API.
Использование этих плагинов помогает быстро настроить API под задачи проекта и повысить безопасность.
Рекомендации по безопасности при работе с REST API в WordPress
При разработке плагинов с REST API важно не забывать о безопасности. Вот основные рекомендации:
- Используйте
permission_callbackдля проверки прав пользователя. - Обязательно очищайте и валидируйте входящие данные.
- Ограничивайте доступ к критичным маршрутам только авторизованным пользователям.
- Используйте аутентификацию, например, через JWT или OAuth, если API доступен для внешних клиентов.
- Логируйте подозрительные запросы и контролируйте нагрузку на сервер.
Безопасность — ключевой аспект при расширении функционала сайта через API.