WordPress изначально поставляется с мощным REST API, который позволяет получать и изменять данные сайта через HTTP-запросы. Но часто стандартных эндпоинтов недостаточно, и возникает необходимость создать собственный REST API для специфических задач. В этой статье мы подробно рассмотрим, как создать собственный REST API в WordPress, как регистрировать новые маршруты и обрабатывать запросы на примерах.
Что такое REST API в WordPress и зачем создавать свои эндпоинты
REST API — это архитектурный стиль взаимодействия по протоколу HTTP с ресурсами сайта. WordPress с версии 4.7 имеет встроенный REST API, который предоставляет стандартные маршруты для работы с записями, таксономиями, пользователями и другими сущностями.
Однако в реальных проектах часто нужны нестандартные данные или особая логика обработки. Например, нужно вернуть кастомные поля, объединить данные из разных таблиц или реализовать специфику бизнес-логики. Для этого используется регистрация собственных маршрутов (эндпоинтов) и реализация функций-обработчиков.
Создание собственного REST API позволяет:
- Расширить функциональность стандартного API;
- Оптимизировать работу фронтенда с сервером;
- Обеспечить интеграцию с внешними сервисами;
- Защитить определённые данные и реализовать аутентификацию.
Регистрация собственного маршрута REST API в WordPress
Для регистрации собственного маршрута используется функция register_rest_route(). Она вызывается в хук rest_api_init. Рассмотрим пример, как добавить маршрут /wpcatalog/v1/hello, который возвращает простое приветствие.
add_action('rest_api_init', 'wpcatalog_register_routes');
function wpcatalog_register_routes() {
register_rest_route('wpcatalog/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpcatalog_handle_hello',
'permission_callback' => '__return_true',
));
}
function wpcatalog_handle_hello(WP_REST_Request $request) {
return new WP_REST_Response(array('message' => 'Привет, это собственный REST API WordPress!'), 200);
}В этом примере мы создали маршрут /wp-json/wpcatalog/v1/hello. При обращении к нему через браузер или curl мы получим JSON с сообщением.
Разбор параметров функции register_rest_route
Первый параметр — пространство имён и версия API, здесь wpcatalog/v1. Это помогает логически группировать маршруты.
Второй параметр — путь маршрута /hello. Можно использовать динамические параметры, например /item/(?P.
Третий параметр — массив с настройками, где указываются методы HTTP (GET, POST и др.), callback-функция и проверка прав доступа.
Приём и обработка параметров запроса в REST API
Для более полезного API часто нужно принимать параметры. Рассмотрим пример маршрута, который принимает параметр name и возвращает персональное приветствие.
add_action('rest_api_init', 'wpcatalog_register_greet_route');
function wpcatalog_register_greet_route() {
register_rest_route('wpcatalog/v1', '/greet', array(
'methods' => 'GET',
'callback' => 'wpcatalog_handle_greet',
'permission_callback' => '__return_true',
'args' => array(
'name' => array(
'required' => false,
'validate_callback' => function($param, $request, $key) {
return is_string($param);
}
),
),
));
}
function wpcatalog_handle_greet(WP_REST_Request $request) {
$name = $request->get_param('name') ?: 'Гость';
return new WP_REST_Response(array('message' => "Привет, {$name}!"), 200);
}Теперь можно обратиться к /wp-json/wpcatalog/v1/greet?name=Иван и получить персональное сообщение.
Обработка POST-запросов и получение данных
Для создания или обновления данных обычно используют POST-запросы. Рассмотрим пример, где принимается JSON с данными и создаётся новая запись кастомного типа.
add_action('rest_api_init', 'wpcatalog_register_create_post');
function wpcatalog_register_create_post() {
register_rest_route('wpcatalog/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wpcatalog_handle_create_post',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
}
function wpcatalog_handle_create_post(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = wp_kses_post($request->get_param('content'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => 'post',
));
if (is_wp_error($post_id)) {
return new WP_REST_Response(array('error' => $post_id->get_error_message()), 400);
}
return new WP_REST_Response(array('message' => 'Запись создана', 'post_id' => $post_id), 201);
}Обратите внимание на проверку прав доступа в permission_callback. Это важно для безопасности.
Примеры полезных плагинов для работы с REST API WordPress
Для расширения возможностей REST API можно использовать и готовые плагины:
- WP REST API Controller — позволяет управлять видимостью стандартных типов и полей в API без кода.
- Advanced Custom Fields to REST API — добавляет поля ACF в REST API.
- JWT Authentication for WP REST API — реализует аутентификацию через JSON Web Token для защищённых запросов.
Эти плагины помогают быстро настроить API и интегрировать его с фронтендом или мобильными приложениями.
Советы по безопасности и оптимизации собственного REST API
Создавая собственные эндпоинты, обязательно учитывайте безопасность:
- Используйте
permission_callbackдля ограничения доступа; - Валидацию и санитизацию всех входящих данных;
- Используйте nonce и аутентификацию, если API используется для управления контентом;
- Минимизируйте нагрузку, оптимизируя запросы и кешируя результаты.
Также рекомендуется документировать свои маршруты, чтобы другие разработчики могли легко использовать ваш API.
Выводы и рекомендации по созданию собственного REST API
Создание собственного REST API в WordPress — мощный инструмент для расширения возможностей сайта и интеграции с внешними системами. С помощью нескольких функций и хуков можно быстро зарегистрировать маршруты и реализовать нужную логику.
Главное — внимательно относиться к безопасности и правильно обрабатывать входящие данные. Используйте встроенные возможности WordPress для валидации и авторизации.
Если вы планируете активно работать с REST API, советую изучить официальную документацию и поэкспериментировать с примерами, приведёнными в статье.