В современном развитии WordPress REST API стал мощным инструментом для взаимодействия с сайтом через HTTP-запросы. Несмотря на то, что WordPress уже предоставляет множество стандартных эндпоинтов для работы с постами, пользователями и так далее, часто возникает необходимость создать собственные кастомные REST API эндпоинты для специфических задач.
Что такое кастомные REST API эндпоинты в WordPress и зачем они нужны
REST API эндпоинт — это URL, по которому можно получить или отправить данные в формате JSON, используя стандартные HTTP методы (GET, POST, PUT, DELETE). В WordPress уже встроены базовые эндпоинты, например, для получения списка постов или информации о пользователях. Но эти стандартные интерфейсы не всегда подходят для уникальных задач сайта.
Создание кастомных эндпоинтов позволяет:
- Обеспечить обмен данными между WordPress и внешними сервисами;
- Реализовать нестандартную логику обработки запросов;
- Создавать API для мобильных приложений или SPA (Single Page Application);
- Обеспечить безопасность и контроль доступа к определённой информации.
Без кастомных эндпоинтов иногда приходится создавать отдельные скрипты или использовать устаревшие подходы, что небезопасно и неудобно.
Как зарегистрировать кастомный REST API эндпоинт в WordPress
Для регистрации собственного эндпоинта нужно использовать функцию register_rest_route. Обычно это делают в хуке rest_api_init. Рассмотрим простой пример создания эндпоинта, который возвращает список последних 5 постов определённой категории.
add_action('rest_api_init', 'wpshab_register_custom_endpoint');
function wpshab_register_custom_endpoint() {
register_rest_route('wpshab/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpshab_get_latest_posts',
'permission_callback' => '__return_true', // Для публичного доступа
));
}
function wpshab_get_latest_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$args = array(
'posts_per_page' => 5,
'post_status' => 'publish',
);
if ($category) {
$args['category_name'] = sanitize_text_field($category);
}
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => get_the_title($post),
'link' => get_permalink($post),
'date' => get_the_date('', $post),
);
}
return rest_ensure_response($data);
}В этом коде мы регистрируем маршрут /wp-json/wpshab/v1/latest-posts/?category=novosti, который возвращает последние 5 постов из категории "novosti". Параметр category необязательный, если его не передавать — вернутся последние 5 постов без фильтрации.
Обработка параметров и проверка прав доступа
Очень важно грамотно работать с параметрами запроса и безопасностью. В примере выше мы использовали sanitize_text_field для очистки параметра category, чтобы предотвратить XSS и другие атаки.
Для проверки прав доступа к эндпоинту используется параметр permission_callback. В примере стоит __return_true — это значит, что эндпоинт публичный и доступен всем. Если нужно ограничить доступ, например, только авторизованным пользователям, можно написать так:
'permission_callback' => function() {
return current_user_can('read');
}или более конкретно, если нужен админский доступ:
'permission_callback' => function() {
return current_user_can('manage_options');
}Пример создания POST эндпоинта для добавления комментариев
Рассмотрим пример эндпоинта, который позволит добавлять комментарии к постам через REST API. Это может быть полезно для мобильных приложений или при интеграции с внешними фронтендами.
add_action('rest_api_init', 'wpshab_register_comment_endpoint');
function wpshab_register_comment_endpoint() {
register_rest_route('wpshab/v1', '/add-comment/', array(
'methods' => 'POST',
'callback' => 'wpshab_add_comment',
'permission_callback' => function() {
return is_user_logged_in(); // Только для авторизованных
},
'args' => array(
'post_id' => array(
'required' => true,
'validate_callback' => 'is_numeric',
),
'comment_content' => array(
'required' => true,
'sanitize_callback' => 'sanitize_textarea_field',
),
),
));
}
function wpshab_add_comment(WP_REST_Request $request) {
$post_id = $request->get_param('post_id');
$content = $request->get_param('comment_content');
$user = wp_get_current_user();
if (!get_post($post_id)) {
return new WP_Error('invalid_post', 'Пост не найден', array('status' => 404));
}
$commentdata = array(
'comment_post_ID' => $post_id,
'comment_author' => $user->display_name,
'comment_author_email' => $user->user_email,
'comment_content' => $content,
'user_id' => $user->ID,
'comment_approved' => 1,
);
$comment_id = wp_new_comment($commentdata);
if (!$comment_id) {
return new WP_Error('comment_failed', 'Не удалось добавить комментарий', array('status' => 500));
}
return rest_ensure_response(array('comment_id' => $comment_id, 'message' => 'Комментарий добавлен успешно'));
}В этом коде мы обязательно проверяем, что пользователь авторизован, и валидируем входящие параметры. Это пример хорошей практики при создании REST API эндпоинтов.
Полезные плагины для работы с REST API в WordPress
Хотя WordPress изначально поддерживает REST API, существуют плагины, упрощающие работу или расширяющие возможности:
- WP REST API Controller — позволяет через интерфейс управлять эндпоинтами и разрешениями без написания кода.
- JWT Authentication for WP REST API — добавляет поддержку JSON Web Token для аутентификации в REST API.
- Advanced Custom Fields to REST API — добавляет в REST API данные из ACF-полей, что очень полезно при кастомных настройках.
Использование таких плагинов ускорит разработку и упростит интеграцию.
Заключение по созданию кастомных REST API эндпоинтов
Создание собственных REST API эндпоинтов — это мощный способ расширить функциональность WordPress и интегрировать его с другими сервисами. Главное — следовать рекомендациям безопасности, валидировать входные данные и грамотно управлять правами доступа. Примеры кода из статьи покажут, как быстро и эффективно создавать такие эндпоинты.