REST API в WordPress — мощный инструмент, который позволяет создавать, читать, обновлять и удалять данные сайта через HTTP-запросы. Это открывает огромные возможности для интеграций, мобильных приложений и кастомных функциональностей. В этой статье мы подробно рассмотрим, как создавать собственные эндпоинты REST API в WordPress, чтобы получать и отправлять именно те данные, которые нужны вашему проекту.
Что такое REST API в WordPress и зачем создавать свои эндпоинты
WordPress с версии 4.7 включает встроенный REST API, предоставляющий стандартные маршруты для работы с постами, страницами, комментариями и другими сущностями. Однако часто возникает необходимость расширить стандартный функционал, добавив свои собственные маршруты для специфичных данных или бизнес-логики.
Создание собственных эндпоинтов позволяет:
- Обеспечить доступ к кастомным типам записей и метаданным;
- Реализовать аутентификацию и авторизацию специфичных операций;
- Интегрироваться с внешними сервисами;
- Организовать сложную логику обработки данных на стороне сервера через API.
Далее подробно разберем, как это сделать на практике.
Регистрация собственного маршрута REST API в WordPress
Для создания собственного маршрута используется функция register_rest_route. Обычно регистрацию эндпоинтов выполняют через хук rest_api_init. Рассмотрим пример создания маршрута, который возвращает список последних кастомных записей.
add_action('rest_api_init', function () {
register_rest_route('wpdeveloper/v1', '/custom-posts/', array(
'methods' => 'GET',
'callback' => 'wpdeveloper_get_custom_posts',
'permission_callback' => '__return_true',
));
});
function wpdeveloper_get_custom_posts(WP_REST_Request $request) {
$args = array(
'post_type' => 'custom_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(),
'link' => get_permalink()
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}В этом примере мы создали маршрут /wp-json/wpdeveloper/v1/custom-posts/, который возвращает последние 5 записей типа custom_post. Параметр permission_callback настроен так, что маршрут доступен всем, но в реальном проекте стоит реализовать проверки доступа.
Объяснение параметров функции register_rest_route
Первый параметр — пространство имён и версия API, здесь wpdeveloper/v1. Второй — путь маршрута. Третий — массив с настройками:
methods: HTTP-методы, поддерживаемые маршрутом (GET, POST, PUT, DELETE и др.);callback: функция, обрабатывающая запрос и возвращающая данные;permission_callback: функция для проверки прав доступа к маршруту.
Обработка параметров запроса и фильтры
Часто нужно принимать параметры из URL, например, количество записей, категории, сортировку. Для этого в функции-обработчике можно использовать объект WP_REST_Request. Давайте расширим наш пример, чтобы принимать параметр per_page и фильтровать записи.
add_action('rest_api_init', function () {
register_rest_route('wpdeveloper/v1', '/custom-posts/', array(
'methods' => 'GET',
'callback' => 'wpdeveloper_get_custom_posts',
'permission_callback' => '__return_true',
'args' => array(
'per_page' => array(
'validate_callback' => function($param, $request, $key) {
return is_numeric($param) && $param > 0 && $param <= 20;
},
'default' => 5
),
'category' => array(
'validate_callback' => 'is_string'
)
),
));
});
function wpdeveloper_get_custom_posts(WP_REST_Request $request) {
$per_page = $request->get_param('per_page');
$category = $request->get_param('category');
$args = array(
'post_type' => 'custom_post',
'posts_per_page' => $per_page,
);
if ($category) {
$args['tax_query'] = array(
array(
'taxonomy' => 'custom_category',
'field' => 'slug',
'terms' => $category,
),
);
}
$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(),
'link' => get_permalink()
);
}
wp_reset_postdata();
}
return rest_ensure_response($posts);
}Теперь можно делать запросы вида /wp-json/wpdeveloper/v1/custom-posts/?per_page=10&category=novosti, и API вернёт до 10 записей из заданной категории.
Аутентификация и безопасность: permission_callback
Чтобы ограничить доступ к эндпоинтам, используйте параметр permission_callback. Например, разрешить доступ только авторизованным пользователям:
'permission_callback' => function () {
return is_user_logged_in();
}Или проверять конкретные права:
'permission_callback' => function () {
return current_user_can('edit_posts');
}Это важно, чтобы не раскрывать конфиденциальные данные и не допустить нежелательных изменений.
Популярные плагины для расширения REST API в WordPress
Если вы хотите ускорить разработку или получить дополнительные возможности, есть готовые плагины:
- WP REST API Controller — позволяет управлять доступом к стандартным эндпоинтам через удобный интерфейс;
- Advanced Custom Fields to REST API — расширяет API данными из ACF, что полезно при работе с метаполями;
- JWT Authentication for WP REST API — добавляет поддержку аутентификации через JSON Web Token;
- WPGraphQL — если хотите альтернативу REST API с GraphQL.
Заключение: лучшие практики работы с REST API в WordPress
При создании собственных эндпоинтов REST API важно соблюдать следующие рекомендации:
- Используйте уникальное пространство имён и версии API для совместимости и масштабируемости;
- Обязательно реализуйте проверку прав доступа через
permission_callback; - Валидация и санитизация входящих данных — залог безопасности и стабильности;
- Возвращайте стандартизированные ответы с помощью
rest_ensure_responseдля корректной работы клиента; - Документируйте свои маршруты и методы, чтобы другие разработчики понимали логику.
Освоив создание собственных REST API маршрутов, вы значительно расширите возможности своего WordPress-сайта и сможете интегрировать его с любыми внешними системами и приложениями.