REST API — это мощный инструмент, который позволяет взаимодействовать с сайтом WordPress извне через HTTP-запросы. Начиная с версии 4.7, WordPress имеет встроенный REST API, но иногда возникает необходимость создать собственные эндпоинты для специфичных задач. В этой статье мы подробно разберём, как создать собственный REST API в WordPress, чтобы расширить функционал вашего сайта и интегрировать его с внешними приложениями.
Что такое REST API в WordPress и зачем создавать собственный эндпоинт
WordPress REST API позволяет получать и изменять данные сайта через стандартные HTTP-запросы. По умолчанию доступно множество стандартных ресурсов: посты, страницы, пользователи и т.д. Но часто требуется добавить уникальную логику, например, получить данные из кастомных таблиц или выполнить бизнес-логику на сервере.
Собственный REST API поможет:
- Создавать новые интерфейсы для мобильных приложений или SPA (Single Page Application);
- Интегрировать WordPress с внешними сервисами;
- Обеспечить безопасный и удобный доступ к специфичным данным;
- Управлять кастомными типами записей и метаданными.
Далее мы рассмотрим, как регистрировать свои маршруты и обработчики запросов.
Регистрация собственного REST API эндпоинта в WordPress
Чтобы добавить новый маршрут в REST API WordPress, используется функция register_rest_route. Её нужно вызывать в хук rest_api_init. Вот базовый пример, как это сделать:
add_action('rest_api_init', 'wpteam_register_custom_route');
function wpteam_register_custom_route() {
register_rest_route('wpteam/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpteam_hello_world',
));
}
function wpteam_hello_world() {
return array('message' => 'Привет, REST API от WPTeam!');
}В этом примере мы регистрируем маршрут /wp-json/wpteam/v1/hello, который при GET-запросе возвращает простой JSON с приветствием. Это самое простое, с чего стоит начать.
Обратите внимание на структуру маршрута: wpteam/v1 — пространство имён и версия API, что помогает структурировать ваши эндпоинты и поддерживать обратную совместимость.
Обработка параметров запроса и валидация данных
Чаще всего API должен принимать параметры, например ID записи или фильтры. Чтобы это реализовать, используйте ключ args при регистрации маршрута для описания параметров и их валидации.
add_action('rest_api_init', 'wpteam_register_post_route');
function wpteam_register_post_route() {
register_rest_route('wpteam/v1', '/post/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'wpteam_get_post_by_id',
'args' => array(
'id' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0;
}
),
),
));
}
function wpteam_get_post_by_id($request) {
$id = intval($request['id']);
$post = get_post($id);
if (empty($post) || $post->post_status !== 'publish') {
return new WP_Error('post_not_found', 'Запись не найдена', array('status' => 404));
}
return array(
'id' => $post->ID,
'title' => $post->post_title,
'content' => apply_filters('the_content', $post->post_content),
);
}Здесь мы создаём маршрут с динамическим параметром id и проверяем, что это положительное число. Если запись с таким ID не опубликована или не существует, возвращаем ошибку с HTTP статусом 404.
Авторизация и права доступа в собственном REST API
Очень важно контролировать, кто и что может делать через ваш API. Для этого в register_rest_route можно задать параметр permission_callback, который проверит права пользователя.
function wpteam_check_permissions() {
return current_user_can('edit_posts');
}
add_action('rest_api_init', function() {
register_rest_route('wpteam/v1', '/protected-data', array(
'methods' => 'GET',
'callback' => 'wpteam_get_protected_data',
'permission_callback' => 'wpteam_check_permissions',
));
});
function wpteam_get_protected_data() {
return array('secret' => 'Только для авторизованных пользователей');
}В этом примере доступ к эндпоинту получат только пользователи с правом edit_posts, то есть авторы и выше. Если права не подтверждены, API вернёт ошибку 403.
Пример: создание REST API для кастомного типа записи "Проект"
Предположим, у вас есть кастомный тип записи project, и вы хотите создать API для получения списка проектов и отдельного проекта по ID.
Сначала регистрируем маршруты:
add_action('rest_api_init', function() {
register_rest_route('wpteam/v1', '/projects', array(
'methods' => 'GET',
'callback' => 'wpteam_get_projects',
'permission_callback' => '__return_true',
));
register_rest_route('wpteam/v1', '/projects/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'wpteam_get_project_by_id',
'permission_callback' => '__return_true',
'args' => array(
'id' => array(
'validate_callback' => 'is_numeric',
),
),
));
});
function wpteam_get_projects() {
$args = array(
'post_type' => 'project',
'post_status' => 'publish',
'numberposts' => 10,
);
$projects = get_posts($args);
$data = array();
foreach ($projects as $project) {
$data[] = array(
'id' => $project->ID,
'title' => $project->post_title,
'excerpt' => $project->post_excerpt,
);
}
return $data;
}
function wpteam_get_project_by_id($request) {
$id = intval($request['id']);
$project = get_post($id);
if (!$project || $project->post_type !== 'project') {
return new WP_Error('project_not_found', 'Проект не найден', array('status' => 404));
}
return array(
'id' => $project->ID,
'title' => $project->post_title,
'content' => apply_filters('the_content', $project->post_content),
);
}Таким образом, вы получите два REST API эндпоинта:/wp-json/wpteam/v1/projects — список проектов/wp-json/wpteam/v1/projects/{id} — конкретный проект по ID
Использование плагинов для расширения REST API WordPress
Хотя создание собственного API — это гибко, иногда удобно использовать готовые решения для быстрого старта или расширения функционала.
Рассмотрим несколько полезных плагинов:
- WP REST API Controller — позволяет управлять доступом к стандартным эндпоинтам и создавать свои без кода.
- Advanced Custom Fields to REST API — добавляет поля ACF к ответам стандартного REST API.
- JWT Authentication for WP REST API — добавляет поддержку JWT токенов для авторизации через API.
Эти плагины помогут улучшить работу с REST API и повысить безопасность.
Советы по безопасности при создании собственного REST API
Безопасность — ключевой момент при работе с API. Вот несколько рекомендаций:
- Используйте
permission_callbackдля проверки прав пользователей. - Валидация и фильтрация всех входящих данных.
- Используйте nonce или JWT для авторизации, если API доступен внешним клиентам.
- Не раскрывайте в API лишнюю информацию, особенно данные пользователей или системные детали.
- Ограничивайте количество данных в ответах (пагинация, фильтры).
Соблюдение этих правил поможет избежать уязвимостей и защитить сайт.
Итоги и рекомендации по работе с собственным REST API в WordPress
Создание собственного REST API в WordPress — мощный инструмент для расширения возможностей сайта и интеграции с внешними системами. Важно правильно структурировать маршруты, валидировать входящие данные и грамотно управлять доступом.
Начинайте с простых эндпоинтов, постепенно добавляя функционал и безопасность. Используйте встроенные возможности WordPress и проверенные плагины для ускорения разработки.
Практика и опыт позволят создавать удобные и надёжные API, которые станут основой для современных интерфейсов и приложений на базе WordPress.