WordPress с версии 4.7 включает встроенный REST API, который позволяет создавать, читать, обновлять и удалять данные сайта через HTTP-запросы. Это мощный инструмент для разработчиков, который можно использовать не только для стандартных возможностей, но и для реализации собственных REST-эндпоинтов. В этой статье мы подробно разберём, как создавать нестандартные REST API эндпоинты в WordPress, чтобы расширить функциональность сайта и интегрироваться с внешними сервисами.
Что такое REST API в WordPress и зачем создавать нестандартные эндпоинты
REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия с веб-приложениями через HTTP-запросы с использованием стандартных методов (GET, POST, PUT, DELETE). В WordPress он реализован через специальный маршрут /wp-json/.
Стандартный WordPress REST API позволяет работать с такими объектами, как посты, страницы, пользователи, таксономии и т.д. Однако часто возникает задача добавить собственные конечные точки для специфичных данных или логики, которые не покрываются стандартом. Например, можно создать API для получения данных из пользовательских таблиц, реализации кастомной бизнес-логики или интеграции с внешними сервисами.
Преимущества создания кастомных эндпоинтов
- Гибкость в работе с данными и бизнес-логикой.
- Возможность интеграции с мобильными приложениями или SPA.
- Упрощение взаимодействия с внешними сервисами.
- Создание собственных интерфейсов для админки или фронтенда.
Как зарегистрировать собственный REST API эндпоинт в WordPress
Для регистрации собственного эндпоинта используется функция register_rest_route, которую нужно вызывать на хуке rest_api_init. Рассмотрим простой пример создания эндпоинта, который возвращает список последних 5 постов с пользовательскими полями.
add_action('rest_api_init', 'wplessons_register_custom_route');
function wplessons_register_custom_route() {
register_rest_route('wplessons/v1', '/recent-posts/', array(
'methods' => 'GET',
'callback' => 'wplessons_get_recent_posts',
'permission_callback' => '__return_true',
));
}
function wplessons_get_recent_posts() {
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
);
$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(),
'excerpt' => get_the_excerpt(),
'custom_field' => get_post_meta(get_the_ID(), 'my_custom_field', true),
);
}
wp_reset_postdata();
}
return $posts;
}
В этом примере мы регистрируем маршрут /wp-json/wplessons/v1/recent-posts/, который возвращает массив из 5 последних постов с заголовком, отрывком и значением произвольного поля my_custom_field.
Разбор параметров функции register_rest_route
namespace: уникальное пространство имён для вашего API, рекомендуется использовать название сайта или плагина.route: путь эндпоинта после namespace.methods: HTTP-методы, которые поддерживает маршрут (GET, POST и др.).callback: функция, которая обрабатывает запрос и возвращает данные.permission_callback: функция проверки прав доступа. В примере использовали__return_trueдля открытого доступа, но для защищённых данных нужно реализовать проверку.
Обработка POST-запросов и получение данных из тела запроса
Часто необходимо не только отдавать данные, но и принимать их для создания или обновления записей. Для этого в register_rest_route указываем метод POST и в коллбэке используем объект запроса.
add_action('rest_api_init', 'wplessons_register_post_route');
function wplessons_register_post_route() {
register_rest_route('wplessons/v1', '/add-post/', array(
'methods' => 'POST',
'callback' => 'wplessons_add_post',
'permission_callback' => 'wplessons_permission_check',
'args' => array(
'title' => array(
'required' => true,
'validate_callback' => 'rest_validate_request_arg',
),
'content' => array(
'required' => true,
),
),
));
}
function wplessons_add_post(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_textarea_field($request->get_param('content'));
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_author' => get_current_user_id(),
);
$post_id = wp_insert_post($new_post);
if (is_wp_error($post_id)) {
return new WP_Error('post_creation_failed', 'Ошибка при создании поста', array('status' => 500));
}
return array('success' => true, 'post_id' => $post_id);
}
function wplessons_permission_check() {
return current_user_can('edit_posts');
}
Здесь создаётся эндпоинт /wp-json/wplessons/v1/add-post/ для добавления поста при POST-запросе с параметрами title и content. Важно реализовать проверку прав доступа — в примере разрешено создавать посты только авторизованным пользователям с правом edit_posts.
Передача параметров и фильтрация данных в кастомных REST API
Можно расширить функциональность, добавив параметры фильтрации, пагинацию, сортировку и другие опции для удобства работы с API.
add_action('rest_api_init', 'wplessons_register_filtered_route');
function wplessons_register_filtered_route() {
register_rest_route('wplessons/v1', '/filtered-posts/', array(
'methods' => 'GET',
'callback' => 'wplessons_get_filtered_posts',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => 'is_numeric',
),
'posts_per_page' => array(
'required' => false,
'default' => 10,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 100;
},
),
),
'permission_callback' => '__return_true',
));
}
function wplessons_get_filtered_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$posts_per_page = $request->get_param('posts_per_page') ?: 10;
$args = array(
'post_type' => 'post',
'posts_per_page' => intval($posts_per_page),
);
if ($category) {
$args['cat'] = intval($category);
}
$query = new WP_Query($args);
$posts = array();
while ($query->have_posts()) {
$query->the_post();
$posts[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
);
}
wp_reset_postdata();
return $posts;
}
Теперь можно делать запросы с параметрами, например:
GET /wp-json/wplessons/v1/filtered-posts/?category=3&posts_per_page=5
Это вернёт 5 последних постов из категории с ID 3.
Реализация авторизации и безопасности в кастомных эндпоинтах
Безопасность REST API — ключевой момент. Для публичных данных можно использовать __return_true в permission_callback, но для приватных или изменяющих данные операций необходимо проверять права пользователя.
Примеры проверок:
current_user_can('edit_posts')— проверка прав на редактирование постов.is_user_logged_in()— проверка авторизации.- Можно использовать nonce, если запросы идут с фронтенда сайта.
Если нужен доступ по токенам, можно дополнительно реализовать JWT-авторизацию через плагины или собственные механизмы.
Использование плагина Clearfy Pro для расширения возможностей REST API
Плагин Clearfy Pro позволяет оптимизировать и обезопасить WordPress, в том числе расширять и настраивать REST API. С его помощью можно быстро блокировать нежелательные запросы, ограничивать доступ к API, а также интегрировать дополнительные функции безопасности.
Рассмотрите установку Clearfy Pro, если планируете открывать доступ к REST API для внешних приложений и хотите минимизировать риски.
Советы и лучшие практики при работе с кастомными REST API в WordPress
- Всегда валидируйте и санитизируйте входящие данные.
- Обязательно реализуйте проверку прав доступа в
permission_callback. - Используйте уникальные namespace для своих маршрутов, чтобы избежать конфликтов.
- Документируйте свои эндпоинты, чтобы команда понимала, как ими пользоваться.
- Проверяйте ошибки и возвращайте понятные сообщения клиенту.
- Оптимизируйте запросы, чтобы не перегружать сервер.
Создание собственных REST API эндпоинтов в WordPress — мощный инструмент расширения функционала сайта и интеграции с внешними сервисами. Следуя описанным в статье шагам и рекомендациям, вы сможете быстро и безопасно реализовать любые необходимые API.