WordPress уже давно вышел за рамки простой CMS и превратился в мощную платформу для разработки различных веб-приложений. Одним из ключевых инструментов, расширяющих возможности WP, является REST API, позволяющий взаимодействовать с сайтом программно через HTTP-запросы. В этой статье мы разберем, как создавать кастомные REST API эндпоинты в WordPress, чтобы получить доступ к своим данным и функционалу вне стандартных возможностей.
Что такое REST API в WordPress и зачем создавать кастомные эндпоинты
REST API — это интерфейс, который позволяет внешним приложениям получать, создавать, обновлять и удалять данные на сайте через HTTP-запросы. WordPress по умолчанию предоставляет множество эндпоинтов для работы с постами, пользователями, таксономиями и другими сущностями.
Однако стандартных возможностей не всегда хватает. Например, если нужно предоставить доступ к кастомным данным, выполнять сложную бизнес-логику или создавать собственные маршруты для интеграций — тогда на помощь приходят кастомные REST API эндпоинты.
Создавая свои маршруты, вы получаете полный контроль над структурой данных, механизмом авторизации и логикой обработки запросов. Это особенно полезно при разработке мобильных приложений, SPA, а также при интеграции с внешними сервисами.
Регистрация кастомного REST API эндпоинта в WordPress
Для регистрации своих эндпоинтов используется хук rest_api_init и функция register_rest_route(). Рассмотрим пример, как создать эндпоинт, который возвращает список последних 5 постов определенного типа.
add_action('rest_api_init', 'wpapp_register_custom_endpoint');
function wpapp_register_custom_endpoint() {
register_rest_route('wpapp/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpapp_get_latest_posts',
'permission_callback' => '__return_true', // можно настроить доступ
));
}
function wpapp_get_latest_posts(WP_REST_Request $request) {
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'post_status' => 'publish',
);
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
'date' => get_the_date('c'),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}
В этом примере мы регистрируем маршрут /wpapp/v1/latest-posts/, который возвращает JSON с данными о последних 5 опубликованных постах. Обратите внимание на параметр permission_callback, который здесь установлен в __return_true для открытого доступа. В реальных проектах рекомендуется настраивать проверки прав доступа.
Обработка параметров запроса и фильтрация данных в кастомных эндпоинтах
Часто нужно принимать параметры от клиента, например, фильтровать посты по категории, дате или автору. Для этого в register_rest_route можно указать схему параметров и реализовать их обработку.
Добавим в наш пример поддержку параметра category для фильтрации постов по категории.
add_action('rest_api_init', 'wpapp_register_filtered_endpoint');
function wpapp_register_filtered_endpoint() {
register_rest_route('wpapp/v1', '/posts/', array(
'methods' => 'GET',
'callback' => 'wpapp_get_filtered_posts',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => function($param) {
return is_numeric($param);
},
),
),
'permission_callback' => '__return_true',
));
}
function wpapp_get_filtered_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'post_status' => 'publish',
);
if ($category) {
$args['cat'] = intval($category);
}
$query = new WP_Query($args);
$posts = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
'date' => get_the_date('c'),
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}
Теперь запрос GET /wpapp/v1/posts?category=3 вернет посты из категории с ID 3. Обратите внимание на валидацию параметра — это важно для безопасности и корректной работы.
Авторизация и безопасность кастомных REST API эндпоинтов
Открытые эндпоинты с permission_callback = __return_true подходят для публичных данных, но если вы хотите работать с конфиденциальной информацией или выполнять изменения, нужно настроить проверку прав.
Самый простой способ — проверить, что пользователь авторизован и обладает необходимыми правами, например, правом редактирования постов.
function wpapp_permission_check() {
return current_user_can('edit_posts');
}
add_action('rest_api_init', function() {
register_rest_route('wpapp/v1', '/private-data/', array(
'methods' => 'GET',
'callback' => 'wpapp_get_private_data',
'permission_callback' => 'wpapp_permission_check',
));
});
function wpapp_get_private_data() {
return rest_ensure_response(array('secret' => 'Это приватные данные, доступные только авторизованным пользователям.'));
}
Такой эндпоинт вернет данные только авторизованным пользователям с правами edit_posts. Для REST API WordPress есть различные способы аутентификации — cookie, OAuth, JWT и другие, в зависимости от задачи.
Полезные плагины для работы с REST API в WordPress
Чтобы упростить создание и тестирование REST API, рекомендую обратить внимание на следующие плагины:
- WP REST API Controller — позволяет управлять доступом и полями существующих эндпоинтов без кода.
- JWT Authentication for WP REST API — добавляет поддержку JWT-токенов для безопасной аутентификации.
- REST API Toolbox — расширяет возможности настройки и фильтрации REST API.
Эти инструменты помогут быстро настроить API даже без глубоких знаний PHP.
Заключение: почему кастомные REST API эндпоинты важны для современных проектов на WordPress
Использование кастомных REST API эндпоинтов позволяет создавать гибкие и масштабируемые решения на базе WordPress, интегрировать сайт с мобильными приложениями, внешними сервисами и SPA. Правильная организация маршрутов, обработка параметров и безопасность — ключевые моменты успешной реализации.
В этой статье мы рассмотрели базовые принципы создания кастомных эндпоинтов, привели примеры кода и рекомендации по безопасности. Освоив эти техники, вы сможете существенно расширить функционал своих проектов и повысить их интеграционную способность.