WordPress с версии 4.7 включает встроенный REST API, который позволяет создавать, читать, обновлять и удалять данные сайта через HTTP-запросы. Это мощный инструмент для разработчиков, позволяющий интегрировать WordPress с внешними приложениями, создавать мобильные приложения или расширять функциональность сайта без перезагрузки страниц.
Что такое REST API в WordPress и зачем нужны свои эндпоинты?
REST API — это интерфейс взаимодействия, который использует стандарты HTTP и формат JSON для обмена данными. WordPress предоставляет множество стандартных маршрутов (эндпоинтов) для работы с записями, пользователями, таксономиями и т.д.
Однако часто возникает необходимость создать собственные эндпоинты для доступа к специфичным данным или логике, не покрываемой стандартным API. Например, можно создать эндпоинт, который возвращает список последних популярных товаров, или реализовать обработку формы обратной связи через API.
Создание пользовательских эндпоинтов расширяет возможности интеграции и позволяет более гибко управлять данными.
Регистрация пользовательского REST API эндпоинта в WordPress
Для создания собственного эндпоинта в WordPress нужно использовать хук rest_api_init и функцию register_rest_route(). Они позволяют определить маршрут, методы запроса и callback-функцию для обработки.
Рассмотрим пример создания простого эндпоинта, который возвращает приветствие.
add_action('rest_api_init', 'wphelper_register_custom_route');
function wphelper_register_custom_route() {
register_rest_route('wphelper/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wphelper_hello_callback',
));
}
function wphelper_hello_callback(WP_REST_Request $request) {
return array('message' => 'Привет от WPHelper API!');
}В данном примере регистрируется маршрут /wp-json/wphelper/v1/hello, который отвечает на GET-запрос и возвращает JSON с сообщением. Это базовый пример, но на его основе можно строить более сложные решения.
Работа с параметрами и фильтрация данных в эндпоинтах
Обычно API требуют передачи параметров — через URL или тело запроса. В пользовательских эндпоинтах WordPress параметры доступны через объект WP_REST_Request. Это позволяет гибко управлять входными данными.
Например, создадим эндпоинт, который возвращает список постов определённой категории с пагинацией.
add_action('rest_api_init', 'wphelper_register_posts_route');
function wphelper_register_posts_route() {
register_rest_route('wphelper/v1', '/posts', array(
'methods' => 'GET',
'callback' => 'wphelper_get_posts',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => function($param) {
return is_numeric($param);
}
),
'page' => array(
'required' => false,
'default' => 1,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0;
}
),
),
));
}
function wphelper_get_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$page = $request->get_param('page') ?: 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $page,
);
if ($category) {
$args['cat'] = intval($category);
}
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
);
}
}
wp_reset_postdata();
return $posts;
}Теперь, отправляя запрос GET /wp-json/wphelper/v1/posts?category=5&page=2, мы получим JSON с постами из категории с ID 5 на второй странице.
Обработка POST-запросов: создание новых записей через API
REST API поддерживает не только получение данных, но и создание, обновление и удаление. Для этого используются методы POST, PUT и DELETE.
Пример создания нового поста через пользовательский эндпоинт:
add_action('rest_api_init', 'wphelper_register_create_post_route');
function wphelper_register_create_post_route() {
register_rest_route('wphelper/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wphelper_create_post',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
}
function wphelper_create_post(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = wp_kses_post($request->get_param('content'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_author' => get_current_user_id(),
));
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка при создании поста', array('status' => 500));
}
return array('post_id' => $post_id, 'message' => 'Пост успешно создан');
}Обратите внимание на permission_callback — она проверяет, что текущий пользователь имеет право создавать записи. Это важный момент безопасности.
Полезные плагины для работы с REST API в WordPress
Для расширения возможностей REST API можно использовать следующие плагины:
- WP REST API Controller — позволяет настраивать доступность стандартных эндпоинтов и создавать свои без написания кода.
- Advanced Custom Fields (ACF) + ACF to REST API — добавляет данные пользовательских полей в ответы API.
- JWT Authentication for WP REST API — реализует аутентификацию через JWT, что удобно для безопасности API.
Используя эти плагины, вы сможете значительно упростить и обезопасить работу с API.
Советы по безопасности при создании своих REST API эндпоинтов
Работа с API всегда требует внимания к безопасности, особенно если вы позволяете создавать или изменять данные. Вот основные рекомендации:
- Проверяйте права доступа через
permission_callback. Никогда не оставляйте эндпоинты открытыми для всех без ограничений. - Валидация и санитизация входных данных — используйте функции WordPress, такие как
sanitize_text_field(),wp_kses_post()и собственные проверки. - Ограничивайте методы — разрешайте только те HTTP-методы, которые действительно нужны.
- Используйте HTTPS для защиты передаваемых данных.
Выводы и рекомендации по работе с REST API в WordPress
Создание собственных REST API эндпоинтов в WordPress — мощный способ расширить функциональность сайта и интегрировать его с внешними системами. Благодаря встроенным средствам это стало проще, чем раньше.
Используйте четкую архитектуру маршрутов, следите за безопасностью и оптимизируйте ответы для повышения производительности. Начинайте с простых примеров, постепенно усложняя логику и добавляя проверки.
Если хотите быстро создать сложный API без глубокого программирования, рассмотрите использование плагинов, которые помогают управлять эндпоинтами и правами доступа.