WordPress REST API — мощный инструмент, который позволяет создавать гибкие и масштабируемые решения, взаимодействующие с сайтом через HTTP-запросы. В этой статье мы подробно разберем, как использовать REST API для создания собственного плагина. Это поможет вам расширить функциональность сайта, создавать мобильные приложения или интегрироваться с внешними сервисами.
Что такое WordPress REST API и зачем он нужен
REST API — это интерфейс для взаимодействия с WordPress через стандартные HTTP-запросы. Он позволяет выполнять операции чтения, создания, обновления и удаления (CRUD) данных сайта с помощью JSON-формата. Это открывает большие возможности для разработчиков, например:
- Создание SPA (Single Page Application) на базе WordPress
- Мобильные приложения, которые взаимодействуют с WordPress
- Интеграция с внешними системами и сервисами
- Расширение функционала без необходимости напрямую работать с шаблонами
В WordPress REST API уже встроен, начиная с версии 4.7, и предоставляет набор стандартных маршрутов для работы с постами, пользователями, таксономиями и другими объектами. Также вы можете создавать свои собственные маршруты API для специфичных задач.
Создаем простой плагин с собственным REST API маршрутом
Давайте пошагово создадим плагин, который добавит новый маршрут в REST API. Он будет возвращать список последних новостей, хранящихся в специальном типе записи.
Шаг 1. Создаем тип записи «новости»
Для начала зарегистрируем кастомный тип записи news. Добавьте следующий код в основной файл плагина wpzoom-rest-api.php:
function wpzoom_register_news_post_type() {
$args = array(
'labels' => array(
'name' => 'Новости',
'singular_name' => 'Новость'
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true, // Важно для поддержки REST API
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type('news', $args);
}
add_action('init', 'wpzoom_register_news_post_type');Параметр show_in_rest разрешает использовать записи этого типа через REST API.
Шаг 2. Регистрируем собственный маршрут REST API
Теперь создадим новый маршрут /wpzoom/v1/latest-news, который будет возвращать последние 5 новостей. Добавьте в плагин следующий код:
function wpzoom_register_rest_route() {
register_rest_route('wpzoom/v1', '/latest-news', array(
'methods' => 'GET',
'callback' => 'wpzoom_get_latest_news',
'permission_callback' => '__return_true' // открытый доступ
));
}
add_action('rest_api_init', 'wpzoom_register_rest_route');
function wpzoom_get_latest_news(WP_REST_Request $request) {
$args = array(
'post_type' => 'news',
'posts_per_page' => 5,
'post_status' => 'publish'
);
$query = new WP_Query($args);
$news = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$news[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'content' => get_the_content(),
'date' => get_the_date('c'),
'link' => get_permalink()
);
}
wp_reset_postdata();
}
return rest_ensure_response($news);
}Этот код создает маршрут, который при GET-запросе возвращает JSON с последними 5 новостями.
Тестирование нового REST API маршрута
Для проверки работы маршрута можно использовать браузер или инструменты типа Postman, curl:
curl https://ваш-сайт.ru/wp-json/wpzoom/v1/latest-newsВы получите JSON-массив с новостями, которые можно использовать в фронтенде или приложениях.
Расширение функционала: добавление параметров и фильтров
Мы можем добавить параметры к маршруту, например, чтобы вернуть новости по категории или по количеству.
Добавляем параметр «category»
Изменим функцию регистрации маршрута и колбэк:
function wpzoom_register_rest_route() {
register_rest_route('wpzoom/v1', '/latest-news', array(
'methods' => 'GET',
'callback' => 'wpzoom_get_latest_news',
'permission_callback' => '__return_true',
'args' => array(
'category' => array(
'required' => false,
'validate_callback' => 'is_numeric'
),
'count' => array(
'required' => false,
'default' => 5,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 20;
}
)
)
));
}
function wpzoom_get_latest_news(WP_REST_Request $request) {
$category = $request->get_param('category');
$count = $request->get_param('count') ?: 5;
$args = array(
'post_type' => 'news',
'posts_per_page' => $count,
'post_status' => 'publish'
);
if ($category) {
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => intval($category)
)
);
}
$query = new WP_Query($args);
$news = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$news[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'content' => get_the_content(),
'date' => get_the_date('c'),
'link' => get_permalink()
);
}
wp_reset_postdata();
}
return rest_ensure_response($news);
}Теперь вы можете делать запросы вида /wp-json/wpzoom/v1/latest-news?category=3&count=10.
Практические советы по безопасности и оптимизации REST API
Хотя мы сделали маршрут открытым (permission_callback возвращает true), в реальных условиях нужно учитывать безопасность:
- Ограничивайте доступ, если данные чувствительные или требуют авторизации
- Используйте nonce и права пользователей для защищенных маршрутов
- Кэшируйте ответы, чтобы снизить нагрузку на сервер
- Валидация и очистка входных данных крайне важны для предотвращения уязвимостей
Например, если нужно ограничить доступ только для авторизованных пользователей с правом редактирования новостей, замените permission_callback на:
function wpzoom_permission_callback() {
return current_user_can('edit_posts');
}И в регистрации маршрута используйте:
'permission_callback' => 'wpzoom_permission_callback'Заключение
WordPress REST API открывает огромные возможности для разработки современных решений. Создание собственного плагина с пользовательскими маршрутами — отличная практика и полезный навык для каждого разработчика. В статье мы рассмотрели, как зарегистрировать кастомный тип записи, добавить новый маршрут REST API, принимать параметры и обеспечивать безопасность. Эти техники помогут вам создавать мощные и гибкие приложения на базе WordPress.