Современные сайты на WordPress всё чаще нуждаются в динамическом выводе данных без полной перезагрузки страницы. Для этого отлично подходит REST API, встроенный в WordPress с версии 4.7. В этой статье подробно разберём, как использовать REST API для получения и отображения данных на сайте, рассмотрим примеры кода и полезные плагины.
Основы REST API в WordPress: что нужно знать разработчику
REST API позволяет взаимодействовать с сайтом через HTTP-запросы, получая данные в формате JSON. Это облегчает создание динамических интерфейсов, одностраничных приложений и мобильных клиентов, обращающихся к данным WordPress.
По умолчанию WordPress предоставляет стандартные эндпойнты для постов, страниц, пользователей, комментариев и таксономий. Их можно найти по адресу https://ваш-сайт.ru/wp-json/wp/v2/. Например, https://ваш-сайт.ru/wp-json/wp/v2/posts возвращает список постов.
Для создания кастомных эндпойнтов и расширения API потребуется регистрация собственных маршрутов с помощью функции register_rest_route. Это даёт гибкость в выводе данных под конкретные задачи.
Регистрация кастомного REST API эндпойнта в WordPress
Рассмотрим, как добавить свой эндпойнт для получения списка последних проектов с кастомного типа записи portfolio. Для начала регистрируем этот тип записи, если он ещё не создан:
function wplab_register_portfolio_cpt() {
register_post_type('portfolio', [
'labels' => [
'name' => 'Портфолио',
'singular_name' => 'Проект'
],
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => ['title', 'editor', 'thumbnail']
]);
}
add_action('init', 'wplab_register_portfolio_cpt');Обратите внимание на параметр show_in_rest => true, он включает стандартные REST API эндпойнты для данного типа записи.
Теперь создадим кастомный эндпойнт для выборки проектов с дополнительной логикой — например, фильтрацией по дате или категории. Добавим код в файл плагина или functions.php:
function wplab_register_portfolio_rest_route() {
register_rest_route('wplab/v1', '/portfolio', [
'methods' => 'GET',
'callback' => 'wplab_get_portfolio_items',
'permission_callback' => '__return_true'
]);
}
add_action('rest_api_init', 'wplab_register_portfolio_rest_route');
function wplab_get_portfolio_items(WP_REST_Request $request) {
$args = [
'post_type' => 'portfolio',
'posts_per_page' => 10
];
$query = new WP_Query($args);
$items = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$items[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'excerpt' => get_the_excerpt(),
'link' => get_permalink(),
'thumbnail' => get_the_post_thumbnail_url(get_the_ID(), 'medium')
];
}
wp_reset_postdata();
}
return rest_ensure_response($items);
}Этот эндпойнт будет доступен по URL /wp-json/wplab/v1/portfolio и вернёт JSON с последними 10 проектами.
Динамический вывод данных на фронтенде с помощью JavaScript и REST API
Для динамического получения и отображения данных с REST API используем JavaScript (например, fetch API). Добавим пример кода, который можно вставить в шаблон или отдельный JS-файл:
document.addEventListener('DOMContentLoaded', function() {
fetch('/wp-json/wplab/v1/portfolio')
.then(response => response.json())
.then(data => {
let container = document.getElementById('portfolio-container');
data.forEach(item => {
let div = document.createElement('div');
div.classList.add('portfolio-item');
div.innerHTML = `
<h3><a href="${item.link}">${item.title}</a></h3>
<img src="${item.thumbnail}" alt="${item.title}" />
<p>${item.excerpt}</p>
`;
container.appendChild(div);
});
})
.catch(err => console.error('Ошибка загрузки портфолио:', err));
});В шаблоне темы создайте контейнер для вывода:
<div id="portfolio-container"></div>Такой подход позволяет подгружать контент без перезагрузки страницы, улучшая UX и производительность.
Полезные плагины для работы с REST API в WordPress
Хотя WordPress предоставляет мощный API из коробки, существуют плагины, которые упрощают или расширяют работу с ним:
- WP REST API Controller — позволяет управлять доступом и видимостью полей и эндпойнтов через интерфейс без кода.
- Advanced Custom Fields (ACF) to REST API — интегрирует поля ACF в REST API, что полезно при использовании кастомных метаданных.
- JWT Authentication for WP REST API — добавляет поддержку JWT авторизации для защищённого доступа к приватным данным через API.
Использование этих плагинов значительно ускоряет разработку и помогает решать конкретные задачи, связанные с REST API.
Обработка аутентификации и безопасности при работе с REST API
Если вы планируете отдавать через REST API приватные данные или выполнять операции записи, необходимо настроить аутентификацию. Самый распространённый метод — использование JWT (JSON Web Tokens). Для этого можно применить плагин JWT Authentication for WP REST API, который упрощает настройку.
Также важно использовать permission_callback при регистрации маршрутов, чтобы ограничить доступ. Пример:
register_rest_route('wplab/v1', '/private-data', [
'methods' => 'GET',
'callback' => 'wplab_get_private_data',
'permission_callback' => function() {
return current_user_can('read');
}
]);<Это защищает эндпойнт от неавторизованного доступа, что критично для безопасности сайта.
Практические советы по оптимизации запросов REST API в WordPress
Чтобы не перегружать сервер и не тормозить сайт, стоит придерживаться нескольких рекомендаций:
- Используйте параметры запроса для ограничения количества возвращаемых записей (
per_page,offset). - Кешируйте ответы REST API с помощью transient API или сторонних кеширующих решений.
- Минимизируйте нагрузку, возвращая только нужные поля через параметр
_fieldsили создавая кастомные эндпойнты с выборочным выводом. - Используйте пагинацию для больших наборов данных.
Пример вызова с параметрами:
fetch('/wp-json/wp/v2/posts?per_page=5&_fields=id,title,link')Такой запрос вернёт только 5 постов с указанными полями, сокращая объём передаваемых данных.