Как использовать REST API для динамического получения данных в WordPress

Современные сайты на 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 постов с указанными полями, сокращая объём передаваемых данных.

Как удалить автоматические чистки кеша в WordPress: решение проблем с кешированием
14.04.2026
Удаление записей WordPress по массиву ID с помощью WPLab
03.12.2025
Как изменить URL авторского архива WordPress
13.12.2025
Как автоматически удалять старые медиа-файлы в WordPress
07.03.2026
Как удалить неиспользуемые мета данные WordPress для ускорения сайта
21.11.2025