Что такое REST API в WordPress и зачем создавать собственный endpoint
WordPress с версии 4.7 имеет встроенный REST API, который позволяет взаимодействовать с сайтом через HTTP-запросы. Это открывает большие возможности для интеграции, создания мобильных приложений, SPA и других решений. Однако стандартных endpoint'ов иногда недостаточно, и возникает необходимость создавать свои собственные маршруты для специфичных задач или данных.
Собственный REST API endpoint в WordPress позволяет получить, создать, обновить или удалить данные по своему сценарию, обеспечивая безопасность и гибкость. В этой статье разберём, как регистрировать свои маршруты, обрабатывать запросы и возвращать данные в формате JSON.
Регистрация кастомного REST API маршрута в WordPress
Для добавления собственного endpoint используется хук rest_api_init и функция register_rest_route(). Ниже пример базовой регистрации маршрута, который возвращает текст "Привет, мир!":
add_action('rest_api_init', 'wporg_register_custom_route');
function wporg_register_custom_route() {
register_rest_route('wporg/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wporg_hello_callback',
));
}
function wporg_hello_callback() {
return array('message' => 'Привет, мир!');
}Данный код создаёт маршрут /wp-json/wporg/v1/hello, который при GET-запросе возвращает JSON с сообщением. Это самый простой endpoint, который можно расширять и дополнять.
Пояснение параметров register_rest_route
'wporg/v1'— пространство имён (namespace) и версия API.'/hello'— путь маршрута.'methods'— HTTP-методы, которые обрабатывает маршрут.'callback'— функция, вызываемая при обращении к маршруту.
Передача параметров и валидация данных в REST API
Очень часто endpoint должен принимать параметры. Рассмотрим пример endpoint, который принимает параметр id и возвращает данные поста с этим ID.
add_action('rest_api_init', 'wporg_register_post_route');
function wporg_register_post_route() {
register_rest_route('wporg/v1', '/post/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'wporg_get_post_by_id',
'args' => array(
'id' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0;
}
),
),
'permission_callback' => '__return_true',
));
}
function wporg_get_post_by_id($request) {
$id = (int) $request['id'];
$post = get_post($id);
if (empty($post)) {
return new WP_Error('no_post', 'Пост не найден', array('status' => 404));
}
return array(
'id' => $post->ID,
'title' => $post->post_title,
'content' => $post->post_content,
'date' => $post->post_date,
);
}Здесь:
- Используется регулярное выражение
(?Pдля захвата параметра\d+) id. - В поле
argsописана валидация параметра. permission_callbackотвечает за проверку прав доступа (в примере разрешено всем).
Такой подход защищает API от некорректных данных и ошибок.
Обработка POST-запросов: создание записи через REST API
Частая задача — создать запись через API. Для этого метод должен быть POST, а данные — в теле запроса JSON.
add_action('rest_api_init', 'wporg_register_create_post_route');
function wporg_register_create_post_route() {
register_rest_route('wporg/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wporg_create_post_callback',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
}
function wporg_create_post_callback($request) {
$params = $request->get_json_params();
$post_id = wp_insert_post(array(
'post_title' => sanitize_text_field($params['title']),
'post_content' => wp_kses_post($params['content']),
'post_status' => 'publish',
'post_type' => 'post',
));
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка при создании поста', array('status' => 500));
}
return array('success' => true, 'post_id' => $post_id);
}Обратите внимание на permission_callback, который проверяет, может ли текущий пользователь создавать записи. В противном случае API вернёт ошибку 403.
Использование популярных плагинов для расширения REST API
Если не хочется писать код вручную, можно использовать готовые плагины, расширяющие возможности REST API:
- WP REST API Controller — позволяет настраивать доступ к endpoint'ам, поля постов и таксономий через интерфейс.
- Advanced Custom Fields to REST API — добавляет кастомные поля ACF в ответы API.
- JWT Authentication for WP REST API — добавляет аутентификацию по токену, что важно для безопасности.
Эти плагины помогут быстро настроить расширенный API без глубокого погружения в код.
Отладка и тестирование собственного REST API endpoint
Для проверки и отладки созданных маршрутов удобно использовать инструменты:
- Postman — популярный клиент для API-запросов с поддержкой всех HTTP-методов.
- curl — консольный инструмент для отправки запросов. Например:
curl -X GET 'https://wporg.ru/wp-json/wporg/v1/hello'При возникновении ошибок полезно смотреть логи сервера и использовать функции error_log() в PHP. Также убедитесь, что REST API не отключен плагинами или настройками темы.
Рекомендации по безопасности REST API endpoint
Создавая собственные endpoint'ы, обязательно учитывайте безопасность:
- Используйте
permission_callbackдля проверки прав пользователя. - Валидация и санитизация всех входящих данных с помощью стандартных функций WordPress.
- Не раскрывайте чувствительную информацию в ответах API.
- Если необходимо, добавляйте аутентификацию через JWT или OAuth.
Безопасность — ключевой аспект при работе с REST API, особенно если endpoint позволяет изменять данные.