В WordPress с версии 4.7 появился встроенный REST API, который открывает широкие возможности для взаимодействия с сайтом через HTTP-запросы. Однако стандартный набор эндпоинтов не всегда покрывает все задачи, и часто требуется создавать собственные REST API маршруты для обработки специфичных запросов.
Что такое REST API эндпоинты в WordPress и зачем они нужны
REST API эндпоинт — это URL, который предоставляет определённый интерфейс для получения или изменения данных на сайте. Например, стандартные эндпоинты позволяют получить список постов, пользователей или таксономий, но они не всегда удобны для уникальных бизнес-задач.
Создавая свои собственные эндпоинты, мы можем реализовать:
- Обработку пользовательских данных и сложную бизнес-логику.
- Интеграцию с внешними сервисами и приложениями.
- Создание мобильных приложений или SPA, которые общаются с сайтом через API.
В этой статье мы подробно разберём, как добавить свои REST API маршруты в WordPress, как обеспечить их безопасность и как обрабатывать данные.
Регистрация собственного REST API маршрута в WordPress
Для создания нового эндпоинта используется функция register_rest_route, которую нужно вызвать в хук rest_api_init. Давайте рассмотрим пример создания эндпоинта, который возвращает список последних 5 постов определённой категории.
add_action('rest_api_init', 'wpwp_register_custom_routes');
function wpwp_register_custom_routes() {
register_rest_route('wpwp/v1', '/latest-posts/(?P<category>[a-zA-Z0-9-]+)', array(
'methods' => 'GET',
'callback' => 'wpwp_get_latest_posts_by_category',
'permission_callback' => '__return_true', // Позже обсудим безопасность
));
}
function wpwp_get_latest_posts_by_category($request) {
$category_slug = sanitize_text_field($request['category']);
$args = array(
'category_name' => $category_slug,
'posts_per_page' => 5,
'post_status' => 'publish',
);
$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(),
'date' => get_the_date(),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}В этом примере создаётся маршрут /wp-json/wpwp/v1/latest-posts/{category}, где в {category} передаётся слаг категории. Эндпоинт возвращает JSON с пятью последними опубликованными постами указанной категории.
Обеспечение безопасности REST API эндпоинтов
Важный момент — безопасность. В примере выше мы указали permission_callback равным __return_true, что позволяет любому пользователю делать запросы. В реальных проектах это опасно, особенно если эндпоинт меняет данные или содержит приватную информацию.
Для проверки прав можно использовать встроенные функции WordPress, например:
current_user_can('edit_posts')— проверяет, может ли пользователь редактировать записи.is_user_logged_in()— проверяет, вошёл ли пользователь в систему.
Пример с ограничением доступа только для авторизованных пользователей с правами редактирования:
function wpwp_permission_check($request) {
return current_user_can('edit_posts');
}
add_action('rest_api_init', function() {
register_rest_route('wpwp/v1', '/private-data', array(
'methods' => 'GET',
'callback' => 'wpwp_get_private_data',
'permission_callback' => 'wpwp_permission_check',
));
});
function wpwp_get_private_data() {
return rest_ensure_response(array('secret' => 'Это приватные данные'));
}Такой подход гарантирует, что только пользователи с нужными правами смогут получить доступ к эндпоинту.
Обработка POST-запросов и получение данных
REST API используется не только для получения данных, но и для их создания или обновления. Рассмотрим пример, как создать новый пост через кастомный эндпоинт.
add_action('rest_api_init', function() {
register_rest_route('wpwp/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wpwp_create_post',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
),
'content' => array(
'required' => true,
'sanitize_callback' => 'wp_kses_post',
),
),
));
});
function wpwp_create_post($request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_id = wp_insert_post(array(
'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('post_creation_failed', 'Ошибка создания поста', array('status' => 500));
}
return rest_ensure_response(array(
'message' => 'Пост успешно создан',
'post_id' => $post_id,
));
}Обратите внимание, что здесь мы используем аргументы с валидацией и санитизацией, а также проверяем права доступа. Это обязательные меры для защиты сайта от нежелательных действий.
Примеры полезных плагинов для расширения REST API
Если вы не хотите писать всё с нуля, есть готовые решения, которые помогут быстро расширить стандартный REST API:
- WP REST API Controller — позволяет настраивать доступ к стандартным эндпоинтам и создавать новые без кода.
- Advanced Custom Fields to REST API — добавляет поля ACF в REST API вывод.
- JWT Authentication for WP REST API — добавляет поддержку JWT-токенов для безопасного аутентифицированного доступа к API.
Использование этих плагинов может значительно упростить разработку, особенно если вы не хотите углубляться в программирование сразу.
Отладка и тестирование собственных REST API эндпоинтов
Для проверки работы ваших маршрутов используйте инструменты:
- Postman — мощный клиент для отправки HTTP-запросов с любыми методами, заголовками и телом.
- curl — утилита командной строки для быстрого тестирования.
Пример запроса через curl для получения последних постов категории «news»:
curl https://your-site.ru/wp-json/wpwp/v1/latest-posts/newsОбязательно проверяйте ответы на ошибки, статусы HTTP и корректность возвращаемых данных.
Заключение
Создание собственных REST API эндпоинтов в WordPress — мощный инструмент для кастомизации и интеграции вашего сайта с внешними сервисами. Следуя рекомендациям по безопасности и качественной обработке данных, вы сможете легко расширять возможности вашего проекта.
Если вы хотите глубже погрузиться в тему, рекомендую внимательно изучить официальный гайд по добавлению кастомных эндпоинтов от WordPress.