WordPress из коробки поддерживает REST API, позволяя работать с контентом сайта через HTTP-запросы. Однако часто возникает необходимость добавить собственные API endpoints, чтобы расширить функциональность сайта или интегрироваться с внешними сервисами. В этой статье подробно разберём, как создать собственный REST API endpoint в WordPress на примере практического кода.
Что такое REST API endpoint и зачем он нужен в WordPress
REST API endpoint — это URL, по которому можно отправлять HTTP-запросы для получения, создания, обновления или удаления данных. В WordPress уже есть стандартные endpoints для работы с постами, пользователями и так далее. Но если вам нужно добавить специфичный функционал — например, получить данные из кастомной таблицы или реализовать авторизацию с дополнительными параметрами, то создание собственного endpoint — правильное решение.
Такой подход позволяет создавать мобильные приложения, SPA, интеграции с внешними сервисами и даже собственные административные панели, которые обращаются к сайту через API.
Регистрация собственного REST API endpoint в WordPress
Для создания собственного endpoint мы будем использовать функцию register_rest_route, которая принимает пространство имён, путь и параметры маршрута, включая методы, обработчики и права доступа.
Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
add_action('rest_api_init', 'wptour_register_custom_endpoint');
function wptour_register_custom_endpoint() {
register_rest_route('wptour/v1', '/data/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'wptour_get_custom_data',
'permission_callback' => '__return_true',
]);
}
function wptour_get_custom_data($request) {
$id = $request->get_param('id');
// Здесь может быть логика получения данных из базы или другого источника
$data = [
'id' => $id,
'message' => 'Данные успешно получены для ID ' . $id
];
return rest_ensure_response($data);
}В этом примере мы регистрируем endpoint /wp-json/wptour/v1/data/<id>, который принимает GET-запрос с параметром ID. Функция wptour_get_custom_data возвращает простой массив с подтверждением.
Разбор параметров register_rest_route
Параметры функции:
- namespace — пространство имён, чтобы избежать конфликтов, здесь используется
wptour/v1; - route — путь маршрута, с поддержкой переменных в скобках и регулярных выражений;
- methods — HTTP методы (GET, POST, PUT, DELETE и др.);
- callback — функция, обрабатывающая запрос;
- permission_callback — функция проверки прав доступа, в примере разрешена всем.
Обработка параметров и возврат данных в формате JSON
Для получения параметров запроса используйте объект WP_REST_Request и метод get_param или get_params. В нашем примере мы получили ID из URL и вернули объект с сообщением.
Важно возвращать данные через функцию rest_ensure_response, чтобы WordPress корректно сформировал JSON-ответ и HTTP-заголовки.
Пример POST-запроса и проверка прав доступа
Часто нужно принимать данные методом POST и защищать endpoint от неавторизованных пользователей. Добавим пример:
add_action('rest_api_init', 'wptour_register_post_endpoint');
function wptour_register_post_endpoint() {
register_rest_route('wptour/v1', '/save-data', [
'methods' => 'POST',
'callback' => 'wptour_save_custom_data',
'permission_callback' => 'wptour_check_permission',
]);
}
function wptour_save_custom_data($request) {
$params = $request->get_json_params();
$title = sanitize_text_field($params['title'] ?? '');
$content = sanitize_textarea_field($params['content'] ?? '');
if (empty($title) || empty($content)) {
return new WP_Error('invalid_data', 'Отсутствуют обязательные поля', ['status' => 400]);
}
// Пример создания поста
$post_id = wp_insert_post([
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => 'post',
]);
if (is_wp_error($post_id)) {
return new WP_Error('db_error', 'Ошибка при сохранении данных', ['status' => 500]);
}
return rest_ensure_response(['post_id' => $post_id, 'message' => 'Пост успешно создан']);
}
function wptour_check_permission() {
return current_user_can('edit_posts');
}В этом примере мы регистрируем POST endpoint /wp-json/wptour/v1/save-data, который принимает JSON с title и content, проверяет авторизацию пользователя (только пользователи с правом edit_posts могут создавать посты) и создаёт запись.
Полезные советы и лучшие практики при создании REST API endpoint
При разработке собственных API endpoints в WordPress стоит учитывать несколько важных моментов:
- Безопасность: всегда проверяйте права доступа через
permission_callback, особенно если endpoint изменяет данные. - Валидация и очистка данных: используйте функции
sanitize_text_field,sanitize_textarea_fieldи другие для очистки входящих данных. - Обработка ошибок: возвращайте объекты
WP_Errorс корректным HTTP-статусом для информирования клиента. - Документирование API: описывайте параметры и возвращаемые данные, чтобы упростить интеграцию.
- Кэширование: если данные не меняются часто, используйте кэширование для повышения производительности.
Полезные плагины для работы с REST API в WordPress
Для более удобной работы с REST API и создания собственных endpoints можно использовать специализированные плагины:
- WP REST API Controller — позволяет создавать и настраивать REST endpoints через админку без кода.
- Advanced Custom Fields (ACF) вместе с ACF to REST API — расширяет стандартные REST endpoints данными пользовательских полей.
- JWT Authentication for WP REST API — добавляет поддержку JWT-токенов для безопасной аутентификации через API.
Использование этих плагинов ускорит разработку и расширит возможности вашего API.
Пример интеграции собственного REST API endpoint с JavaScript
Для вызова созданного нами GET endpoint на стороне клиента можно использовать fetch:
fetch('/wp-json/wptour/v1/data/123')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));Для POST-запроса с авторизацией через nonce или JWT нужно настроить заголовки и тело запроса соответственно. Такой подход позволяет строить SPA или мобильные приложения, обращающиеся к вашему WordPress-сайту через REST API.