WordPress с версии 4.7 имеет мощный встроенный REST API, который позволяет создавать, читать, обновлять и удалять данные сайта через HTTP-запросы. В этой статье мы подробно рассмотрим, как создать собственный REST API endpoint для специфичных задач, например, для вывода данных пользовательских типов записей или обработки форм на стороне сервера.
Что такое REST API endpoint в WordPress и зачем он нужен
REST API endpoint — это URL, по которому можно получить доступ к определённым данным или функциям сайта через запросы типа GET, POST, PUT, DELETE. Это удобно для интеграции WordPress с внешними сервисами, мобильными приложениями или для создания современных одностраничных приложений (SPA) на базе WordPress.
Создание собственного endpoint позволяет расширить стандартные возможности API, добавив уникальную бизнес-логику, фильтрацию данных, авторизацию и другие функции.
Регистрация собственного REST API endpoint в WordPress
Для создания собственного REST API endpoint используется функция register_rest_route(). Она регистрирует новый маршрут и связывает его с обработчиком запроса.
Рассмотрим пример создания endpoint, который возвращает список кастомных записей «Отзывы» с дополнительными полями.
Пример кода регистрации маршрута
add_action('rest_api_init', 'wpgen_register_reviews_endpoint');
function wpgen_register_reviews_endpoint() {
register_rest_route('wpgen/v1', '/reviews', array(
'methods' => 'GET',
'callback' => 'wpgen_get_reviews',
'permission_callback' => '__return_true', // или своя функция проверки прав
));
}Здесь мы создаём маршрут /wp-json/wpgen/v1/reviews с методом GET, который вызывает функцию wpgen_get_reviews.
Обработка запроса и получение данных
В функции-обработчике получаем нужные записи и формируем ответ в формате JSON:
function wpgen_get_reviews(WP_REST_Request $request) {
$args = array(
'post_type' => 'review', // ваш кастомный тип записи
'posts_per_page' => 10,
'post_status' => 'publish',
);
$query = new WP_Query($args);
$reviews = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$reviews[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'content' => get_the_content(),
'rating' => get_post_meta(get_the_ID(), 'rating', true),
);
}
wp_reset_postdata();
}
return rest_ensure_response($reviews);
}Добавление параметров и фильтров к REST API endpoint
Вы можете добавить параметры запроса для фильтрации, пагинации или сортировки данных. Для этого следует описать аргументы в третьем параметре register_rest_route:
register_rest_route('wpgen/v1', '/reviews', array(
'methods' => 'GET',
'callback' => 'wpgen_get_reviews',
'permission_callback' => '__return_true',
'args' => array(
'rating' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param >= 1 && $param <= 5;
},
'required' => false,
),
'page' => array(
'validate_callback' => 'is_numeric',
'default' => 1,
),
),
));В функции-обработчике используйте параметры из запроса:
function wpgen_get_reviews(WP_REST_Request $request) {
$rating = $request->get_param('rating');
$page = max(1, (int) $request->get_param('page'));
$args = array(
'post_type' => 'review',
'posts_per_page' => 10,
'paged' => $page,
'post_status' => 'publish',
);
if ($rating) {
$args['meta_query'] = array(
array(
'key' => 'rating',
'value' => $rating,
'compare' => '=',
'type' => 'NUMERIC',
),
);
}
// остальной код запроса
}Безопасность и проверка прав доступа в REST API
Важно контролировать, кто может обращаться к вашему endpoint. В параметре permission_callback укажите функцию, которая проверит права пользователя или API-ключ.
Например, чтобы разрешить доступ только авторизованным пользователям:
function wpgen_check_permissions() {
return is_user_logged_in();
}И зарегистрировать маршрут так:
register_rest_route('wpgen/v1', '/reviews', array(
'methods' => 'GET',
'callback' => 'wpgen_get_reviews',
'permission_callback' => 'wpgen_check_permissions',
));Обработка POST-запросов: создание новых отзывов через REST API
REST API в WordPress позволяет не только получать данные, но и создавать или обновлять их. Рассмотрим пример обработки POST-запроса для добавления нового отзыва.
add_action('rest_api_init', 'wpgen_register_create_review_endpoint');
function wpgen_register_create_review_endpoint() {
register_rest_route('wpgen/v1', '/review', array(
'methods' => 'POST',
'callback' => 'wpgen_create_review',
'permission_callback' => function() {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array('required' => true),
'content' => array('required' => true),
'rating' => array(
'required' => true,
'validate_callback' => function($param) {
return is_numeric($param) && $param >= 1 && $param <= 5;
},
),
),
));
}
function wpgen_create_review(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$content = sanitize_textarea_field($request->get_param('content'));
$rating = intval($request->get_param('rating'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'review',
'post_status' => 'pending', // на проверку
));
if (is_wp_error($post_id)) {
return new WP_Error('cannot_create', 'Не удалось создать отзыв', array('status' => 500));
}
update_post_meta($post_id, 'rating', $rating);
return rest_ensure_response(array('success' => true, 'id' => $post_id));
}Использование плагина Clearfy Pro для расширения REST API
Если вы хотите дополнительно защитить REST API и оптимизировать его работу, рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет легко управлять правами доступа к API, ограничивать запросы и ускорять работу сайта.
Тестирование собственного REST API endpoint
Для тестирования можно использовать инструменты как Postman, curl или браузер (для GET-запросов). Пример запроса с curl:
curl https://example.com/wp-json/wpgen/v1/reviews?rating=5&page=1Для POST-запроса с передачей JSON:
curl -X POST https://example.com/wp-json/wpgen/v1/review \
-H "Content-Type: application/json" \
-d '{"title":"Отличный плагин", "content":"Очень удобный и простой в использовании.", "rating":5}' \
-u user:passwordУбедитесь, что аутентификация настроена корректно, если endpoint требует авторизации.
Итог
Создание собственного REST API endpoint в WordPress — мощный способ расширить функциональность сайта и интегрировать его с внешними системами. Главное — грамотно регистрировать маршруты, обрабатывать параметры, обеспечивать безопасность и тестировать конечные точки.
Если хотите быстро добавить расширенные возможности с управлением доступом, обратите внимание на Clearfy Pro. Это поможет избежать многих распространённых ошибок и повысить безопасность вашего API.