WordPress изначально поддерживает REST API, что позволяет создавать и взаимодействовать с данными сайта через HTTP-запросы. Однако часто возникает необходимость создать собственные, кастомные REST API эндпоинты для решения специфических задач, например, для интеграций, мобильных приложений или SPA (одностраничных приложений).
Что такое REST API в WordPress и зачем нужен кастомный эндпоинт
REST API — это интерфейс взаимодействия с сайтом через стандартные HTTP методы (GET, POST, PUT, DELETE). По умолчанию WordPress предоставляет множество стандартных эндпоинтов для работы с постами, пользователями, таксономиями и т.д. Но что делать, если ваш проект требует нестандартной логики или работы с кастомными данными? Ответ — создавать собственные REST API эндпоинты.
Преимущества кастомных эндпоинтов:
- Гибкость — реализуете именно ту функциональность, которая нужна;
- Безопасность — контролируете доступ и проверяете права;
- Оптимизация — возвращаете только нужные данные, уменьшаете нагрузку;
- Интеграция — упрощаете взаимодействие с внешними сервисами.
Регистрация собственного REST API эндпоинта в WordPress
Для регистрации нового REST API эндпоинта используется функция register_rest_route(). Она вызывается на хуке rest_api_init. Рассмотрим пример создания простого эндпоинта, который возвращает список последних 5 постов.
add_action('rest_api_init', function () {
register_rest_route('wpplugin/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpplugin_get_latest_posts',
'permission_callback' => '__return_true', // публичный доступ
));
});
function wpplugin_get_latest_posts(WP_REST_Request $request) {
$args = array(
'numberposts' => 5,
'post_status' => 'publish'
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => get_the_title($post),
'link' => get_permalink($post),
);
}
return rest_ensure_response($data);
}После добавления этого кода в плагин или файл functions.php вы сможете получить список последних постов, отправив GET-запрос на URL:
https://ваш-сайт.ru/wp-json/wpplugin/v1/latest-posts/
Обработка параметров запроса и фильтрация данных
Часто требуется принимать параметры в запросе, например, количество постов или тип поста. Это делается через объект WP_REST_Request, который передаётся в callback-функцию.
Допустим, добавим параметр count, который контролирует количество выводимых записей:
add_action('rest_api_init', function () {
register_rest_route('wpplugin/v1', '/posts/', array(
'methods' => 'GET',
'callback' => 'wpplugin_get_posts_with_count',
'permission_callback' => '__return_true',
'args' => array(
'count' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
'default' => 5
),
),
));
});
function wpplugin_get_posts_with_count(WP_REST_Request $request) {
$count = (int) $request->get_param('count');
$args = array(
'numberposts' => $count,
'post_status' => 'publish'
);
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => get_the_title($post),
'excerpt' => get_the_excerpt($post),
'link' => get_permalink($post),
);
}
return rest_ensure_response($data);
}Теперь запрос https://ваш-сайт.ru/wp-json/wpplugin/v1/posts/?count=10 вернёт 10 последних записей, а если параметр не указан — 5 (по умолчанию). Обратите внимание на валидацию параметров, это важный элемент безопасности и стабильности.
Добавление прав доступа и аутентификации REST API эндпоинтов
В реальных проектах многие эндпоинты должны быть защищены, чтобы не допускать неавторизованных пользователей. Для этого в параметре permission_callback указывается функция, которая возвращает true или false в зависимости от прав пользователя.
Пример ограничения доступа только для авторизованных пользователей:
add_action('rest_api_init', function () {
register_rest_route('wpplugin/v1', '/user-data/', array(
'methods' => 'GET',
'callback' => 'wpplugin_get_user_data',
'permission_callback' => function() {
return is_user_logged_in();
},
));
});
function wpplugin_get_user_data(WP_REST_Request $request) {
$current_user = wp_get_current_user();
if (!$current_user->exists()) {
return new WP_Error('rest_forbidden', __('Доступ запрещён'), array('status' => 403));
}
return rest_ensure_response(array(
'ID' => $current_user->ID,
'login' => $current_user->user_login,
'email' => $current_user->user_email,
));
}При попытке получить данные без авторизации API вернёт ошибку 403. Для авторизации в REST API можно использовать cookie (если запрос с того же домена) или OAuth, JWT и другие методы для внешних приложений.
Практические кейсы использования кастомных REST API эндпоинтов
1. Интеграция с внешним сервисом
Например, вам нужно передавать данные заказов в CRM. Создаёте эндпоинт, который принимает POST запрос с параметрами заказа, валидируете и сохраняете в базе. Это избавит от необходимости использовать громоздкие плагины и позволит максимально оптимизировать процесс.
2. Мобильное приложение или SPA
Для мобильного приложения удобнее получать данные через REST API, а не HTML. Кастомные эндпоинты помогут сформировать именно те данные, которые нужны, без лишней информации, что ускорит работу приложения.
3. Расширение функционала сайта
Создаёте собственные эндпоинты для получения статистики, управления контентом или взаимодействия с пользовательскими данными — это даст гибкость и независимость от стандартных решений.
Советы по оптимизации и безопасности при работе с REST API
- Всегда проверяйте права пользователя в
permission_callback. - Валидация и фильтрация входящих данных обязательна.
- Минимизируйте возвращаемые данные, чтобы снизить нагрузку.
- Используйте nonce или токены для защиты POST запросов.
- Логируйте ошибки и подозрительную активность для анализа.
Заключение
Создание собственных REST API эндпоинтов в WordPress — мощный инструмент для расширения возможностей сайта и интеграций. С помощью приведённых примеров вы сможете реализовать гибкие и безопасные решения под свои задачи. Главное — внимательно подходить к вопросам безопасности и качества кода.