REST API в WordPress — мощный инструмент для взаимодействия с данными вашего сайта из внешних приложений, мобильных клиентов или одностраничных приложений. Но стандартных маршрутов API не всегда хватает, и часто возникает задача создать собственные эндпоинты (custom endpoints), чтобы расширить функциональность и обеспечить доступ к специфичным данным.
Что такое Custom REST API Endpoint и зачем он нужен
Custom REST API Endpoint — это пользовательский маршрут, который вы добавляете в REST API WordPress, позволяющий выполнять определённые операции с данными через HTTP-запросы. Это может быть получение, создание, обновление или удаление информации, которая не входит в стандартные возможности WordPress.
Например, если вы хотите создать API для вывода списка товаров с дополнительными мета-данными, или реализовать интерфейс для мобильного приложения, custom endpoint — оптимальное решение.
Преимущества создания собственного REST API endpoint:
- Гибкость в работе с данными
- Безопасность через регистрацию своих маршрутов и прав доступа
- Удобство интеграции с внешними сервисами
- Контроль над форматированием и структурой ответа
Регистрация Custom REST API Endpoint в WordPress
Для создания собственного endpoint в WordPress используется хук rest_api_init и функция register_rest_route(). Ниже рассмотрим пошагово, как это сделать.
Пример: Создадим endpoint для получения списка последних 5 постов с дополнительным полем
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
add_action('rest_api_init', 'wpload_register_custom_endpoint');
function wpload_register_custom_endpoint() {
register_rest_route('wpload/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpload_get_latest_posts',
'permission_callback' => '__return_true' // Открытый доступ, можно заменить на проверку
));
}
function wpload_get_latest_posts($request) {
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'post_status' => 'publish'
];
$query = new WP_Query($args);
$posts_data = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts_data[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'excerpt' => get_the_excerpt(),
'date' => get_the_date('c'),
'custom_field' => get_post_meta(get_the_ID(), '_wpload_custom_field', true) // Дополнительное поле
];
}
wp_reset_postdata();
}
return rest_ensure_response($posts_data);
}Теперь вы можете обратиться к вашему API по адресу https://ваш-сайт.ru/wp-json/wpload/v1/latest-posts/ и получить JSON с последними 5 постами и дополнительным полем.
Как добавить параметры запроса и фильтрацию данных
Часто нужно сделать endpoint более гибким, чтобы пользователь мог передавать параметры, например, количество постов или категорию. Для этого используйте аргумент args в register_rest_route() и извлекайте параметры из объекта запроса.
add_action('rest_api_init', 'wpload_register_filtered_endpoint');
function wpload_register_filtered_endpoint() {
register_rest_route('wpload/v1', '/posts/', array(
'methods' => 'GET',
'callback' => 'wpload_get_filtered_posts',
'args' => array(
'per_page' => array(
'validate_callback' => 'is_numeric',
'default' => 5
),
'category' => array(
'validate_callback' => 'is_string'
)
),
'permission_callback' => '__return_true'
));
}
function wpload_get_filtered_posts($request) {
$per_page = (int) $request->get_param('per_page');
$category = sanitize_text_field($request->get_param('category'));
$args = [
'post_type' => 'post',
'posts_per_page' => $per_page,
'post_status' => 'publish'
];
if ($category) {
$args['category_name'] = $category;
}
$query = new WP_Query($args);
$posts_data = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$posts_data[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink()
];
}
wp_reset_postdata();
}
return rest_ensure_response($posts_data);
}Такой endpoint позволяет передавать параметры в URL, например: https://ваш-сайт.ru/wp-json/wpload/v1/posts/?per_page=3&category=novosti.
Обработка POST-запросов и создание данных через API
Кроме GET, REST API WordPress поддерживает методы POST, PUT, DELETE. Создадим пример, где через POST создаётся новый пост с полями заголовка и содержимого.
add_action('rest_api_init', 'wpload_register_post_creation');
function wpload_register_post_creation() {
register_rest_route('wpload/v1', '/create-post/', array(
'methods' => 'POST',
'callback' => 'wpload_create_post',
'permission_callback' => function() {
return current_user_can('edit_posts'); // Проверка прав
},
'args' => array(
'title' => array(
'required' => true,
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field'
),
'content' => array(
'required' => true,
'type' => 'string'
)
)
));
}
function wpload_create_post($request) {
$title = $request->get_param('title');
$content = $request->get_param('content');
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft', // Создаём черновик
'post_type' => 'post'
);
$post_id = wp_insert_post($new_post);
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка создания поста', array('status' => 500));
}
return rest_ensure_response(array('post_id' => $post_id, 'message' => 'Пост успешно создан'));
}Для вызова этого API необходимо отправить POST-запрос с параметрами title и content. Права пользователя проверяются функцией current_user_can('edit_posts'), что защищает endpoint от неавторизованного доступа.
Использование плагинов для расширения REST API
Если не хочется писать код вручную, можно использовать плагины, которые помогают создавать свои API endpoints без глубокого программирования.
Примеры полезных плагинов:
- WPCommunity — расширение для управления сообществом с поддержкой REST API.
- Expert Review — плагин для отзывов, который можно интегрировать через REST API.
Для более сложных задач можно использовать плагины типа WP REST API Controller, позволяющие регистрировать свои типы записей и поля с поддержкой REST API через интерфейс.
Советы по безопасности и производительности
При создании custom endpoint важно учитывать следующие моменты:
- Проверка прав доступа: обязательно используйте параметр
permission_callback, чтобы ограничить доступ к чувствительным данным. - Валидация и санитизация входящих данных: для каждого параметра используйте
validate_callbackиsanitize_callback. - Кэширование ответов: если данные редко меняются, используйте transient API или внешние кэш-сервисы (Redis, Memcached) для уменьшения нагрузки.
- Обработка ошибок: возвращайте корректные коды HTTP и понятные сообщения через объекты
WP_Error.
Заключение
Создание custom REST API endpoints в WordPress — отличный способ расширить возможности вашего сайта и интегрировать его с внешними сервисами. Следуя рекомендациям и примерам из этой статьи, вы сможете реализовать гибкие и безопасные маршруты для своих задач.
Если хотите ускорить разработку и получить дополнительные возможности, обратите внимание на плагины с поддержкой REST API на wpshop.ru.