Как создать динамический журнал в WordPress с помощью REST API

Введение в REST API WordPress для динамического контента

WordPress REST API – мощный инструмент, позволяющий создавать динамические приложения и интегрировать WordPress с внешними сервисами. Для динамического журнала это особенно актуально, так как можно получать и отображать контент без перезагрузки страницы, создавая современный пользовательский опыт.

REST API предоставляет JSON-формат данных, которые можно использовать с помощью JavaScript-фреймворков или традиционных скриптов. В этой статье мы разберём, как построить динамический журнал, который подгружает статьи по категориям, фильтрует их и отображает в удобном виде.

Для начала убедитесь, что в вашей установке WordPress REST API активен (он включён по умолчанию с версии 4.7).

Настройка пользовательских эндпоинтов для журнала – расширяем REST API

Стандартных эндпоинтов для получения записей достаточно, но часто нужно добавить специфичные параметры или обрабатывать данные особым образом. Создадим собственный эндпоинт, который будет возвращать статьи с дополнительными метаданными и фильтрами.

Добавим в functions.php вашей темы следующий код:

function wp_theme_register_journal_endpoint() {
    register_rest_route('wp-theme/v1', '/journal', array(
        'methods' => 'GET',
        'callback' => 'wp_theme_get_journal_posts',
        'permission_callback' => '__return_true',
    ));
}
add_action('rest_api_init', 'wp_theme_register_journal_endpoint');

function wp_theme_get_journal_posts($request) {
    $category = $request->get_param('category');
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 10,
        'orderby' => 'date',
        'order' => 'DESC',
    );
    if ($category) {
        $args['category_name'] = sanitize_text_field($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(),
                'excerpt' => get_the_excerpt(),
                'date' => get_the_date('c'),
                'link' => get_permalink(),
            );
        }
        wp_reset_postdata();
    }
    return $posts;
}

Этот эндпоинт /wp-json/wp-theme/v1/journal?category=novosti вернёт последние 10 новостей из категории «новости» в формате JSON. Можно расширить логику, добавив пагинацию или сортировки.

Объяснение кода

Функция wp_theme_register_journal_endpoint регистрирует новый маршрут в REST API. Обработчик wp_theme_get_journal_posts формирует запрос с учётом параметра категории и возвращает массив с нужными полями.

Такой подход позволяет гибко управлять данными, минимизируя нагрузку на клиент и сервер.

Вывод динамического журнала на фронтенде с помощью JavaScript

Теперь нужно вывести полученные данные на странице. Для этого используем JavaScript и fetch API. Создадим простой скрипт, который подгружает статьи по категории и отображает их.

document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('wp-theme-journal');
  const categorySelect = document.getElementById('wp-theme-category');

  function loadPosts(category = '') {
    let url = '/wp-json/wp-theme/v1/journal';
    if (category) {
      url += '?category=' + encodeURIComponent(category);
    }
    fetch(url)
      .then(response => response.json())
      .then(data => {
        container.innerHTML = '';
        if (data.length === 0) {
          container.innerHTML = '<p>Статей не найдено.</p>';
          return;
        }
        data.forEach(post => {
          const postElem = document.createElement('article');
          postElem.innerHTML = `<h3><a href="${post.link}">${post.title}</a></h3><p>${post.excerpt}</p><time datetime="${post.date}">${new Date(post.date).toLocaleDateString()}</time>`;
          container.appendChild(postElem);
        });
      })
      .catch(error => {
        container.innerHTML = '<p>Ошибка загрузки статей.</p>';
        console.error(error);
      });
  }

  categorySelect.addEventListener('change', function() {
    loadPosts(this.value);
  });

  loadPosts();
});

На странице добавьте HTML-разметку:

<select id="wp-theme-category">
  <option value="">Все категории</option>
  <option value="novosti">Новости</option>
  <option value="stati">Статьи</option>
  <option value="obzory">Обзоры</option>
</select>

<div id="wp-theme-journal">Загрузка...</div>

Так посетитель сможет выбирать категорию, а список статей будет обновляться без перезагрузки страницы.

Полезные плагины для расширения функционала динамического журнала

Чтобы облегчить разработку и добавить дополнительные возможности, рассмотрите следующие плагины:

  • WP REST API Controller – позволяет управлять видимостью и настройками REST API для разных типов записей и таксономий без кода.
  • Advanced Custom Fields (ACF) – расширяет возможности метаданных, которые можно включать в REST API для более богатого контента.
  • WP AJAX Pagination – готовые решения для AJAX-пагинации, которые можно интегрировать с REST API.

Используя эти инструменты, вы снизите количество ручной работы и сможете быстро настроить расширенный динамический журнал.

Оптимизация и безопасность REST API для динамического журнала

При работе с REST API важно учитывать безопасность и производительность. Вот несколько рекомендаций:

  • Добавляйте проверку прав доступа при необходимости, чтобы ограничить доступ к данным.
  • Кэшируйте результаты запросов на стороне сервера или клиента, чтобы уменьшить нагрузку.
  • Используйте фильтры и параметры запроса, чтобы отдавать только нужные данные.
  • Следите за размером возвращаемого JSON, избегайте избыточной информации.

Например, в нашем эндпоинте мы указали 'permission_callback' => '__return_true', что открывает доступ всем. В реальном проекте стоит заменить на проверку, например, current_user_can('read') или другие условия.

Пример с проверкой прав доступа

function wp_theme_get_journal_posts($request) {
    if (!current_user_can('read')) {
        return new WP_Error('rest_forbidden', esc_html__('Доступ запрещён'), array('status' => 403));
    }
    // остальной код...
}

Это защитит данные от неавторизованных пользователей, если это необходимо.

Как добавить собственный тип записей в WordPress
13.11.2025
Как добавить автоматическое обновление тем в WordPress
06.02.2026
Как создать свою WordPress тему с нуля
04.11.2025
Как добавить автоматическое изображение для новостей в теме WordPress
22.12.2025
Как добавить динамические стили в тему WordPress
30.01.2026