REST API в WordPress — мощный инструмент, который позволяет создавать уникальные эндпоинты для обмена данными между вашим сайтом и внешними приложениями или скриптами. В этой статье разберёмся, как создать собственный REST API эндпоинт, который будет возвращать кастомные данные, а также рассмотрим примеры кода и полезные советы для разработчиков.
Что такое REST API в WordPress и зачем создавать свои эндпоинты
WordPress изначально поставляется с мощным REST API, который позволяет получать, создавать, обновлять и удалять записи, страницы, пользователей и другие данные. Однако иногда стандартных эндпоинтов недостаточно, и возникает необходимость создавать собственные, чтобы обеспечить специфичный функционал, например, отдавать кастомные данные или реализовывать бизнес-логику.
Создание собственных REST API эндпоинтов позволит вам:
- Интегрировать WordPress с внешними сервисами и приложениями.
- Создавать одностраничные приложения (SPA) на React, Vue или Angular с динамическим контентом.
- Безопасно отдавать только нужные данные, фильтруя и форматируя их по своему усмотрению.
- Упрощать взаимодействие с мобильными приложениями.
Далее рассмотрим, как на практике создать такой кастомный эндпоинт.
Регистрация собственного REST API эндпоинта в WordPress
Для создания собственного эндпоинта достаточно использовать функцию register_rest_route. Ниже представлен пример кода, который регистрирует новый маршрут /wp-blog/v1/custom-data и возвращает простой JSON с данными:
add_action('rest_api_init', function() {
register_rest_route('wp-blog/v1', '/custom-data', array(
'methods' => 'GET',
'callback' => 'wpblog_get_custom_data',
'permission_callback' => '__return_true'
));
});
function wpblog_get_custom_data(WP_REST_Request $request) {
$data = array(
'message' => 'Привет от wp-blog.ru!',
'time' => current_time('mysql')
);
return rest_ensure_response($data);
}
Разберём детали:
rest_api_init— хук, в котором регистрируются все свои REST маршруты.register_rest_route— функция регистрации маршрута. В первом параметре указываем namespace (лучше использовать префикс вашего сайта или плагина), во втором — путь маршрута, в третьем — массив параметров.methods— HTTP метод. В нашем случае GET.callback— функция, которая вызывается при обращении к данному маршруту.permission_callback— функция проверки прав доступа. Тут мы возвращаем всегда true, разрешая доступ всем, но для защиты данных лучше реализовать проверку.
Теперь, если перейти по адресу https://ваш-сайт.ru/wp-json/wp-blog/v1/custom-data, вы получите JSON с сообщением и текущим временем.
Добавление параметров и обработка запросов
Часто нужно получать параметры из URL или тела запроса. Например, добавим параметр name, чтобы возвращать персонализированное приветствие:
add_action('rest_api_init', function() {
register_rest_route('wp-blog/v1', '/greet', array(
'methods' => 'GET',
'callback' => 'wpblog_greet_user',
'args' => array(
'name' => array(
'required' => false,
'validate_callback' => function($param, $request, $key) {
return is_string($param);
}
)
),
'permission_callback' => '__return_true'
));
});
function wpblog_greet_user(WP_REST_Request $request) {
$name = $request->get_param('name');
if (!$name) {
$name = 'Гость';
}
return rest_ensure_response(array('greeting' => 'Привет, ' . sanitize_text_field($name) . '!'));
}
В этом примере:
- Мы добавили параметр
name, который можно передавать в запросе, например:?name=Иван. - Определили функцию валидации, чтобы параметр был строкой.
- В ответе выводим персональное приветствие с безопасной очисткой данных.
Таким образом можно легко расширять функционал своих эндпоинтов.
Пример: получение кастомных записей с фильтрацией и пагинацией
Частая задача — создавать API для работы с кастомными типами записей (Custom Post Types). Допустим, у вас есть CPT book, и нужно возвращать их список с пагинацией.
add_action('rest_api_init', function() {
register_rest_route('wp-blog/v1', '/books', array(
'methods' => 'GET',
'callback' => 'wpblog_get_books',
'args' => array(
'page' => array(
'default' => 1,
'validate_callback' => 'is_numeric'
),
'per_page' => array(
'default' => 5,
'validate_callback' => 'is_numeric'
)
),
'permission_callback' => '__return_true'
));
});
function wpblog_get_books(WP_REST_Request $request) {
$page = max(1, (int)$request->get_param('page'));
$per_page = min(20, max(1, (int)$request->get_param('per_page')));
$args = array(
'post_type' => 'book',
'posts_per_page' => $per_page,
'paged' => $page
);
$query = new WP_Query($args);
$books = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$books[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'excerpt' => get_the_excerpt(),
'link' => get_permalink()
);
}
}
wp_reset_postdata();
return rest_ensure_response(array(
'page' => $page,
'per_page' => $per_page,
'total_books' => $query->found_posts,
'books' => $books
));
}
Этот пример показывает, как получить список книг с параметрами page и per_page. Такой эндпоинт удобно использовать для построения интерфейсов с постраничным выводом.
Безопасность и права доступа к кастомным эндпоинтам
Очень важно контролировать, кто может обращаться к вашим REST API маршрутам. В примерах выше стоит 'permission_callback' => '__return_true', что разрешает всем доступ. В реальных проектах рекомендуем реализовывать проверку, например:
- Проверка авторизации пользователя (
is_user_logged_in()). - Проверка прав на определённые действия (
current_user_can('edit_posts')). - Использование nonce или токенов для защиты от CSRF.
Пример проверки прав:
function wpblog_permission_check() {
return current_user_can('edit_posts');
}
register_rest_route('wp-blog/v1', '/secure-data', array(
'methods' => 'GET',
'callback' => 'wpblog_get_secure_data',
'permission_callback' => 'wpblog_permission_check'
));
Полезные плагины для работы с REST API в WordPress
Для удобства разработки и тестирования REST API можно использовать следующие плагины:
- Clearfy Pro — оптимизация и расширение возможностей WordPress, включая REST API.
- WPRemark — плагин для комментариев с поддержкой REST API.
- WPStories — создание историй с интеграцией через API.
Эти решения помогут расширить функционал сайта и упростить взаимодействие с внешними системами.