WordPress с версии 4.7 поставляется с мощным REST API, которое позволяет взаимодействовать с сайтом через HTTP-запросы. Однако часто возникает необходимость добавить свои собственные endpoint'ы для решения специфических задач. В этой статье подробно разберём, как создать собственный REST API endpoint в WordPress, чтобы получать, изменять или удалять данные на сайте.
Что такое REST API endpoint в WordPress и зачем он нужен
REST API endpoint — это URL-адрес, по которому можно отправлять HTTP-запросы (GET, POST, PUT, DELETE и др.) для получения или изменения данных. В WordPress уже есть множество стандартных endpoints для работы с постами, пользователями, таксономиями и т.д. Но иногда стандартных методов недостаточно, и нужно расширить API собственными маршрутами.
Например, вы хотите предоставить мобильному приложению или внешнему сервису доступ к специфическим данным вашего сайта, которые не входят в стандартный набор. Или создать API для формы обратной связи с дополнительной логикой. В таких случаях и создают кастомные endpoint'ы.
Регистрация собственного REST API endpoint в WordPress
Для регистрации собственного endpoint используется функция register_rest_route, которую нужно вызывать в хуке rest_api_init. Давайте рассмотрим простой пример.
add_action('rest_api_init', function() {
register_rest_route('wpfreecourses/v1', '/hello', array(
'methods' => 'GET',
'callback' => 'wpfreecourses_hello_endpoint',
));
});
function wpfreecourses_hello_endpoint(WP_REST_Request $request) {
return array('message' => 'Привет из собственного REST API endpoint!');
}В этом примере мы создаём endpoint /wp-json/wpfreecourses/v1/hello, который при GET-запросе вернёт JSON с сообщением. Префикс wpfreecourses/v1 — это namespace и версия API, что помогает структурировать и версионировать ваши endpoint'ы.
Поддержка различных HTTP-методов
Вы можете указать несколько методов, например, 'GET, POST' или использовать константы, например WP_REST_Server::READABLE для GET и HEAD, и WP_REST_Server::CREATABLE для POST.
Пример регистрации POST-метода с обработкой входящих данных:
add_action('rest_api_init', function() {
register_rest_route('wpfreecourses/v1', '/data', array(
'methods' => 'POST',
'callback' => 'wpfreecourses_save_data',
'permission_callback' => function () {
return current_user_can('edit_posts');
}
));
});
function wpfreecourses_save_data(WP_REST_Request $request) {
$params = $request->get_json_params();
if (empty($params['title'])) {
return new WP_Error('no_title', 'Не передан заголовок', array('status' => 400));
}
$post_id = wp_insert_post(array(
'post_title' => sanitize_text_field($params['title']),
'post_status' => 'draft',
'post_type' => 'post'
));
if (is_wp_error($post_id)) {
return $post_id;
}
return array('success' => true, 'post_id' => $post_id);
}Обработка параметров запроса и валидация данных
REST API позволяет принимать параметры как в URL (GET), так и в теле запроса (POST). Чтобы корректно работать с входящими данными, используйте методы объекта WP_REST_Request:
get_param()— получить параметр по имениget_params()— получить все параметрыget_json_params()— получить параметры из JSON тела запроса
Важно проводить валидацию и санитизацию данных. В примере выше мы использовали sanitize_text_field для очистки строки заголовка.
Добавление схемы для endpoint
Чтобы описать структуру данных и параметры, можно добавить схему (schema). Это полезно для валидации и документации.
register_rest_route('wpfreecourses/v1', '/data', array(
'methods' => 'POST',
'callback' => 'wpfreecourses_save_data',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
'args' => array(
'title' => array(
'required' => true,
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'description' => 'Заголовок поста'
),
),
));Безопасность и права доступа к REST API endpoint
Обязательно контролируйте, кто может использовать ваши endpoint'ы. Используйте параметр permission_callback для проверки прав пользователя.
Если endpoint публичный и не требует авторизации, верните true в permission_callback. Иначе проверяйте права, например:
'permission_callback' => function () {
return current_user_can('edit_posts');
}Без правильной проверки вы рискуете раскрыть конфиденциальные данные или позволить нежелательные действия.
Пример расширенного REST API endpoint для кастомного типа записи
Допустим, у вас есть кастомный тип записи course для сайта wpfreecourses.ru. Создадим endpoint для получения списка курсов с фильтрацией по категории и пагинацией.
add_action('rest_api_init', function() {
register_rest_route('wpfreecourses/v1', '/courses', array(
'methods' => 'GET',
'callback' => 'wpfreecourses_get_courses',
'args' => array(
'category' => array('type' => 'string'),
'per_page' => array('type' => 'integer', 'default' => 10),
'page' => array('type' => 'integer', 'default' => 1),
),
'permission_callback' => '__return_true',
));
});
function wpfreecourses_get_courses(WP_REST_Request $request) {
$category = $request->get_param('category');
$per_page = $request->get_param('per_page');
$page = $request->get_param('page');
$args = array(
'post_type' => 'course',
'posts_per_page' => $per_page,
'paged' => $page,
);
if ($category) {
$args['tax_query'] = array(
array(
'taxonomy' => 'course_category',
'field' => 'slug',
'terms' => sanitize_text_field($category),
),
);
}
$query = new WP_Query($args);
$courses = array();
foreach ($query->posts as $post) {
$courses[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'excerpt' => $post->post_excerpt,
'link' => get_permalink($post->ID),
);
}
return array(
'total' => (int)$query->found_posts,
'per_page' => $per_page,
'page' => $page,
'courses' => $courses,
);
}Использование плагина Clearfy Pro для расширения REST API
На сайте Clearfy Pro есть инструменты для оптимизации и безопасности REST API. Например, можно управлять доступом к стандартным endpoint'ам, отключать ненужные маршруты и защищать API от нежелательных запросов.
Это удобно, если вы создаёте собственные endpoint'ы и хотите избежать конфликтов или угроз безопасности.
Тестирование собственного REST API endpoint
После создания endpoint тестируйте его с помощью инструментов, таких как Postman, Insomnia или curl.
Пример запроса через curl:
curl https://ваш-сайт.ru/wp-json/wpfreecourses/v1/helloЕсли всё сделано правильно, вы получите JSON с сообщением.
Для POST-запросов:
curl -X POST https://ваш-сайт.ru/wp-json/wpfreecourses/v1/data \
-H "Content-Type: application/json" \
-d '{"title":"Новый пост через API"}'Выводы
Создание собственного REST API endpoint в WordPress даёт мощные возможности для интеграции с внешними сервисами и расширения функционала сайта. Главное — грамотно регистрировать маршруты, обрабатывать и валидировать данные, а также контролировать права доступа.
Этот навык особенно полезен для разработчиков, создающих кастомные решения и мобильные приложения на базе WordPress.