WordPress REST API — мощный инструмент для взаимодействия с сайтом извне. Он позволяет создавать, читать, обновлять и удалять данные сайта через HTTP-запросы. В этой статье мы подробно разберём, как создавать собственные REST API эндпоинты в WordPress, чтобы расширять функциональность вашего сайта и интегрировать его с внешними сервисами.
Что такое REST API в WordPress и зачем нужны кастомные эндпоинты
REST API — это стандартный интерфейс для обмена данными между клиентом и сервером. WordPress из коробки предоставляет множество стандартных эндпоинтов для работы с постами, страницами, пользователями и другими типами данных. Но иногда стандартных возможностей недостаточно — например, нужно получить данные из кастомных полей, выполнить сложный запрос или реализовать специфическую бизнес-логику.
В таких случаях создаются кастомные эндпоинты — свои маршруты (URL), которые обрабатывают определённые запросы и возвращают нужные данные в формате JSON. Это особенно удобно для SPA (одностраничных приложений), мобильных приложений, интеграций и кастомных админ-панелей.
Регистрация кастомного REST API эндпоинта в WordPress
Для регистрации кастомного эндпоинта используется функция register_rest_route(). Она вызывается в хуке rest_api_init. Рассмотрим пример создания простого эндпоинта, который возвращает список последних 5 постов с заголовками и ссылками.
add_action('rest_api_init', 'wp3_register_custom_endpoint');
function wp3_register_custom_endpoint() {
register_rest_route('wp3/v1', '/recent-posts/', array(
'methods' => 'GET',
'callback' => 'wp3_get_recent_posts',
'permission_callback' => '__return_true',
));
}
function wp3_get_recent_posts() {
$args = array(
'numberposts' => 5,
'post_status' => 'publish',
);
$recent_posts = wp_get_recent_posts($args);
$data = array();
foreach ($recent_posts as $post) {
$data[] = array(
'id' => $post['ID'],
'title' => $post['post_title'],
'link' => get_permalink($post['ID']),
);
}
return rest_ensure_response($data);
}
Теперь, отправив GET-запрос на https://yourdomain.com/wp-json/wp3/v1/recent-posts/, вы получите JSON с последними 5 опубликованными постами.
Добавление параметров и фильтрация данных в кастомном эндпоинте
Часто нужно не просто отдавать фиксированный набор данных, а принимать параметры от клиента. Например, ограничить количество постов или фильтровать по категории. Это делается через параметр args при регистрации маршрута.
add_action('rest_api_init', 'wp3_register_filtered_posts_endpoint');
function wp3_register_filtered_posts_endpoint() {
register_rest_route('wp3/v1', '/filtered-posts/', array(
'methods' => 'GET',
'callback' => 'wp3_get_filtered_posts',
'permission_callback' => '__return_true',
'args' => array(
'category' => array(
'validate_callback' => 'is_numeric',
'required' => false,
),
'limit' => array(
'validate_callback' => 'is_numeric',
'default' => 10,
),
),
));
}
function wp3_get_filtered_posts(WP_REST_Request $request) {
$category = $request->get_param('category');
$limit = $request->get_param('limit');
$args = array(
'numberposts' => $limit,
'post_status' => 'publish',
);
if ($category) {
$args['category'] = intval($category);
}
$posts = wp_get_recent_posts($args);
$data = array();
foreach ($posts as $post) {
$data[] = array(
'id' => $post['ID'],
'title' => $post['post_title'],
'link' => get_permalink($post['ID']),
);
}
return rest_ensure_response($data);
}
С помощью такого эндпоинта можно делать запросы типа https://yourdomain.com/wp-json/wp3/v1/filtered-posts/?category=4&limit=5. Это удобный способ динамически получать данные с сайта.
Обработка POST-запросов и создание данных через REST API
REST API умеет не только отдавать данные, но и принимать их для создания или обновления. Рассмотрим пример эндпоинта, который позволяет создать новый пост через POST-запрос.
add_action('rest_api_init', 'wp3_register_create_post_endpoint');
function wp3_register_create_post_endpoint() {
register_rest_route('wp3/v1', '/create-post/', array(
'methods' => 'POST',
'callback' => 'wp3_create_post',
'permission_callback' => 'wp3_check_permissions',
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
),
));
}
function wp3_check_permissions() {
return current_user_can('edit_posts');
}
function wp3_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));
}
Важно, что для создания поста проверяется право пользователя с помощью permission_callback. Без этой проверки любой посетитель смог бы добавлять записи.
Использование плагинов для расширения функциональности REST API
Для удобства можно использовать готовые плагины, которые расширяют возможности REST API. Например, Clearfy Pro позволяет улучшить безопасность и оптимизацию API, а WPGPT может использоваться для интеграции ИИ в ваши собственные эндпоинты.
Также для упрощения работы можно использовать Expert Review для сбора отзывов и отображения их через API.
Советы по безопасности при работе с REST API в WordPress
При создании собственных эндпоинтов важно не забывать про безопасность. Вот основные рекомендации:
- Используйте
permission_callbackдля проверки прав доступа и аутентификации пользователя. - Валидируйте и фильтруйте все входящие данные перед обработкой.
- Минимизируйте открытые эндпоинты, которые не требуют авторизации.
- При необходимости ограничьте скорость запросов с помощью плагинов защиты.
Соблюдение этих правил поможет защитить ваш сайт от несанкционированного доступа и атак.