В этой статье подробно рассмотрим, как создать собственный внутренний REST API в WordPress для обмена данными между вашим сайтом и внешними сервисами или фронтенд-приложениями. Это решение актуально для разработчиков, которые хотят расширить функционал сайта, организовать взаимодействие с мобильными приложениями или SPA (Single Page Application), а также упростить интеграцию с внешними системами.
Что такое REST API в WordPress и почему стоит создавать собственные эндпоинты
WordPress из коробки предоставляет мощный REST API, который позволяет читать, создавать, обновлять и удалять записи, страницы, пользователей и другие типы контента. Однако стандартный набор эндпоинтов не всегда покрывает специфические задачи проекта.
Создание собственных REST API-эндпоинтов позволяет:
- Обеспечить доступ к кастомным данным и бизнес-логике;
- Оптимизировать обмен данными под конкретные нужды клиента;
- Обеспечить безопасность и контроль доступа к API;
- Интегрировать нестандартные функции без изменения ядра WordPress.
Далее рассмотрим, как создавать и регистрировать свои маршруты, обрабатывать запросы и возвращать ответы.
Регистрация собственного REST API в WordPress
Для регистрации собственного эндпоинта используйте хук rest_api_init. В обработчике этого хука вызывается функция register_rest_route, в которой задаются название маршрута, методы запроса и callback-функция.
Пример регистрации простого эндпоинта, который возвращает список последних 5 публикаций:
add_action('rest_api_init', 'wpin_register_custom_routes');
function wpin_register_custom_routes() {
register_rest_route('wpin/v1', '/latest-posts', array(
'methods' => 'GET',
'callback' => 'wpin_get_latest_posts',
'permission_callback' => '__return_true', // для публичного доступа
));
}
function wpin_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),
'date' => get_the_date('', $post)
);
}
return rest_ensure_response($data);
}
Теперь при запросе https://your-site.ru/wp-json/wpin/v1/latest-posts вы получите JSON-массив с данными последних пяти публикаций.
Добавление параметров и фильтрация данных в REST API
Очень часто нужно принимать параметры от клиента, чтобы фильтровать или изменять результат. Для этого в register_rest_route можно задать схему аргументов и обработать их в callback.
Пример эндпоинта с параметром category для фильтрации постов по таксономии:
add_action('rest_api_init', 'wpin_register_filtered_posts_route');
function wpin_register_filtered_posts_route() {
register_rest_route('wpin/v1', '/posts', array(
'methods' => 'GET',
'callback' => 'wpin_get_posts_by_category',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => function($param, $request, $key) {
return is_string($param) && !empty($param);
},
),
),
'permission_callback' => '__return_true',
));
}
function wpin_get_posts_by_category(WP_REST_Request $request) {
$category = $request->get_param('category');
$args = array(
'post_status' => 'publish',
'numberposts' => 10,
);
if ($category) {
$args['category_name'] = sanitize_text_field($category);
}
$posts = get_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => get_the_title($post),
'link' => get_permalink($post),
'date' => get_the_date('', $post),
);
}
return rest_ensure_response($data);
}
Теперь можно делать запросы типа /wp-json/wpin/v1/posts?category=novosti и получать посты только из категории «новости».
Обработка POST-запросов: создание и обновление данных через REST API
Кроме GET-запросов, часто нужно принимать POST-запросы для создания или редактирования данных. Для этого указывайте 'methods' => 'POST' и реализуйте проверку прав в permission_callback.
Ниже пример эндпоинта для создания новой записи с проверкой прав пользователя:
add_action('rest_api_init', 'wpin_register_create_post_route');
function wpin_register_create_post_route() {
register_rest_route('wpin/v1', '/create-post', array(
'methods' => 'POST',
'callback' => 'wpin_create_post',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
}
function wpin_create_post(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_textarea_field($request->get_param('content'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => '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' => 'Запись создана успешно'));
}
Этот эндпоинт позволит авторизованным пользователям с правом редактирования создавать новые записи в статусе черновика.
Безопасность и разрешения для REST API
Очень важно грамотно настроить разрешения и проверку прав доступа в permission_callback. Никогда не оставляйте этот параметр __return_true для операций, изменяющих данные.
Для проверки авторизации можно использовать функции WordPress, например, current_user_can(), is_user_logged_in() или реализовать OAuth / JWT аутентификацию для внешних клиентов.
Также не забывайте валидировать и санитизировать входящие данные, чтобы избежать уязвимостей.
Примеры полезных плагинов для работы с REST API в WordPress
- WPRemark — плагин для управления отзывами с поддержкой REST API, который можно расширять своими эндпоинтами.
- Clearfy Pro — оптимизационный плагин, позволяющий отключать ненужные REST API-вызовы для повышения безопасности.
- WPStories — плагин для сторис с удобными REST API для управления контентом из внешних приложений.
Отладка и тестирование REST API
Для тестирования своих эндпоинтов удобно использовать инструменты:
- Postman — мощный клиент для отправки HTTP-запросов;
- curl — для быстрых запросов из терминала;
- Плагины для браузера, например, REST API Console;
- Встроенный в WordPress JSON-ответ с информацией об ошибках.
Также включайте режим отладки WordPress и логируйте ошибки для поиска проблем.
Выводы и рекомендации
Создание и использование собственных REST API в WordPress — мощный инструмент для расширения функционала и интеграции. Следите за безопасностью, валидируйте данные и тщательно тестируйте свои маршруты. Используйте готовые плагины для упрощения задач и придерживайтесь стандартов WordPress для максимальной совместимости.