Современные проекты на WordPress часто требуют расширения стандартного функционала API для интеграции с внешними сервисами или создания мобильных приложений. В этой статье мы подробно разберём, как создать собственный REST API endpoint в WordPress, зарегистрировать его, обработать запросы и обеспечить безопасность.
Что такое REST API в WordPress и зачем создавать собственные endpoints
WordPress с версии 4.7 включает встроенный REST API, который позволяет взаимодействовать с данными сайта через HTTP-запросы. В стандартном API доступны методы для работы с постами, пользователями, комментариями и так далее.
Однако часто возникает задача добавить собственные точки доступа (endpoints), которые будут предоставлять специализированные данные или выполнять определённые операции, не предусмотренные стандартным API. Это может быть полезно для интеграции с мобильным приложением, создания кастомных админ-интерфейсов или реализации API для плагина.
Создание собственного endpoint даёт полный контроль над структурой ответа, методами и логикой обработки запросов.
Регистрация собственного REST API endpoint в WordPress
Функция wpmeta_register_rest_routes: добавляем новый endpoint
Для регистрации REST API endpoint в WordPress используется хук rest_api_init и функция register_rest_route. Создадим функцию wpmeta_register_rest_routes, которая будет регистрировать наш маршрут.
function wpmeta_register_rest_routes() {
register_rest_route('wpmeta/v1', '/custom-data', array(
'methods' => 'GET',
'callback' => 'wpmeta_get_custom_data',
'permission_callback' => '__return_true',
));
}
add_action('rest_api_init', 'wpmeta_register_rest_routes');В этом примере мы регистрируем маршрут /wp-json/wpmeta/v1/custom-data с методом GET. Параметр permission_callback определяет, кто может обращаться к этому endpoint — здесь разрешён доступ всем.
Обработка запросов: функция wpmeta_get_custom_data
Функция-обработчик должна вернуть данные в формате, который будет конвертирован в JSON. Сделаем простой пример, возвращающий массив с информацией.
function wpmeta_get_custom_data(WP_REST_Request $request) {
$data = array(
'message' => 'Привет от собственного REST API endpoint!',
'timestamp' => current_time('mysql'),
'site_url' => get_site_url(),
);
return rest_ensure_response($data);
}Используем объект WP_REST_Request, чтобы в дальнейшем можно было обрабатывать параметры запроса.
Добавление параметров и валидация запросов
Часто endpoint должен принимать параметры, например, ID поста или фильтры. Добавим параметр post_id, который будет передаваться через URL.
function wpmeta_register_rest_routes() {
register_rest_route('wpmeta/v1', '/custom-data/(?P<post_id>\d+)', array(
'methods' => 'GET',
'callback' => 'wpmeta_get_custom_data_by_post',
'permission_callback' => 'wpmeta_check_permissions',
'args' => array(
'post_id' => array(
'validate_callback' => 'is_numeric',
),
),
));
}
add_action('rest_api_init', 'wpmeta_register_rest_routes');
function wpmeta_get_custom_data_by_post(WP_REST_Request $request) {
$post_id = (int) $request->get_param('post_id');
$post = get_post($post_id);
if (!$post) {
return new WP_Error('no_post', 'Пост не найден', array('status' => 404));
}
return rest_ensure_response(array(
'ID' => $post->ID,
'title' => $post->post_title,
'content' => $post->post_content,
));
}
function wpmeta_check_permissions() {
return current_user_can('read');
}Здесь мы добавили:
- Параметр
post_id, обязательный числовой параметр в URL. - Проверку наличия поста и возврат ошибки, если пост не найден.
- Проверку прав доступа, разрешающую запрос только авторизованным пользователям с правом
read.
Пример POST-запроса: создание записи через API
Кроме GET, можно создавать endpoint для обработки POST-запросов, например, для добавления новых записей. В этом примере мы создадим endpoint для создания кастомного типа записи wpmeta_item.
function wpmeta_register_rest_routes_post() {
register_rest_route('wpmeta/v1', '/items', array(
'methods' => 'POST',
'callback' => 'wpmeta_create_item',
'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',
),
),
));
}
add_action('rest_api_init', 'wpmeta_register_rest_routes_post');
function wpmeta_create_item(WP_REST_Request $request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'wpmeta_item',
'post_status' => 'publish',
));
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка создания записи', array('status' => 500));
}
return rest_ensure_response(array(
'success' => true,
'post_id' => $post_id,
));
}Не забудьте зарегистрировать кастомный тип записи wpmeta_item в коде плагина или темы.
Безопасность и производительность собственного REST API
Проверка прав доступа и авторизация
Очень важно ограничивать доступ к собственным API-методам. В параметре permission_callback указывайте функции проверки прав, например current_user_can или проверяйте токены авторизации.
Для публичных данных можно использовать __return_true, но будьте осторожны с конфиденциальной информацией.
Обработка ошибок и валидация данных
Используйте класс WP_Error для возврата информативных ошибок с правильным HTTP-статусом. Валидация параметров через args позволяет автоматически проверять входящие данные.
Кэширование ответов
Для снижения нагрузки можно использовать кэширование ответов через Transients API или внешние системы кэширования. Это особенно актуально при сложных запросах с длительной обработкой.
Популярные плагины для работы с REST API в WordPress
Если вы хотите расширить возможности REST API без написания кода с нуля, рассмотрите следующие плагины:
- WP REST API Controller – позволяет управлять доступом и настраивать стандартные endpoints через интерфейс.
- Advanced Custom Fields (ACF) to REST API – добавляет поля ACF к стандартным REST API ответам.
- JWT Authentication for WP REST API – реализует авторизацию через JWT-токены для безопасного использования API.
Заключение
Создание собственного REST API endpoint в WordPress — мощный инструмент для расширения функционала вашего сайта и интеграции с внешними сервисами. В этой статье мы подробно рассмотрели процесс регистрации маршрутов, обработку запросов, валидацию и безопасность. Используйте данный подход для реализации гибких и безопасных API на базе WordPress.