Как создать динамические блоки в теме WordPress на основе REST API

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

Что такое динамические блоки и зачем использовать REST API

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

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

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

Подготовка темы к работе с REST API

Регистрация скриптов и локализация

Для начала необходимо зарегистрировать и подключить JavaScript-файл, который будет работать с REST API. В файле functions.php вашей темы добавьте следующий код:

function wp_theme_register_scripts() {
    wp_enqueue_script('wp-theme-dynamic-blocks', get_template_directory_uri() . '/js/dynamic-blocks.js', array('jquery'), '1.0', true);
    wp_localize_script('wp-theme-dynamic-blocks', 'wpThemeSettings', array(
        'apiUrl' => esc_url_raw(rest_url('wp/v2/')),
        'nonce' => wp_create_nonce('wp_rest')
    ));
}
add_action('wp_enqueue_scripts', 'wp_theme_register_scripts');

Здесь мы подключаем файл dynamic-blocks.js и передаем в него URL REST API и nonce для безопасности запросов.

Создание контейнера для динамического блока

В нужном шаблоне темы (например, index.php или single.php) добавьте HTML-контейнер, в который будут подгружаться данные:

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

Этот блок будет обновляться динамически с помощью JavaScript.

Реализация динамического блока на JavaScript

В файле dynamic-blocks.js реализуем функцию загрузки последних постов с помощью REST API и обновления содержимого блока.

jQuery(document).ready(function($) {
    function wpThemeFetchPosts() {
        $.ajax({
            url: wpThemeSettings.apiUrl + 'posts',
            method: 'GET',
            beforeSend: function(xhr) {
                xhr.setRequestHeader('X-WP-Nonce', wpThemeSettings.nonce);
            },
            data: {
                per_page: 5,
                orderby: 'date',
                order: 'desc'
            },
            success: function(data) {
                let html = '<ul class="wp-theme-post-list">';
                data.forEach(function(post) {
                    html += '<li><a href="' + post.link + '">' + post.title.rendered + '</a></li>';
                });
                html += '</ul>';
                $('#wp-theme-dynamic-posts').html(html);
            },
            error: function() {
                $('#wp-theme-dynamic-posts').html('Ошибка загрузки данных');
            }
        });
    }

    wpThemeFetchPosts();

    // Обновлять блок каждые 5 минут
    setInterval(wpThemeFetchPosts, 300000);
});

Этот скрипт запрашивает последние 5 постов, формирует список с ссылками и выводит его в контейнер. Также реализовано автоматическое обновление каждые 5 минут.

Расширение функционала: фильтрация и пагинация динамических блоков

Добавление фильтра по категории

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

В шаблоне темы добавьте HTML:

<select id="wp-theme-category-filter">
  <option value="">Все категории</option>
  <option value="news">Новости</option>
  <option value="reviews">Обзоры</option>
</select>

В скрипте модифицируйте функцию так, чтобы учитывать выбранную категорию:

jQuery(document).ready(function($) {
    function wpThemeFetchPosts(category = '') {
        let data = {
            per_page: 5,
            orderby: 'date',
            order: 'desc'
        };
        if (category) {
            data.categories = category;
        }

        $.ajax({
            url: wpThemeSettings.apiUrl + 'posts',
            method: 'GET',
            beforeSend: function(xhr) {
                xhr.setRequestHeader('X-WP-Nonce', wpThemeSettings.nonce);
            },
            data: data,
            success: function(data) {
                let html = '<ul class="wp-theme-post-list">';
                data.forEach(function(post) {
                    html += '<li><a href="' + post.link + '">' + post.title.rendered + '</a></li>';
                });
                html += '</ul>';
                $('#wp-theme-dynamic-posts').html(html);
            },
            error: function() {
                $('#wp-theme-dynamic-posts').html('Ошибка загрузки данных');
            }
        });
    }

    $('#wp-theme-category-filter').on('change', function() {
        let category = $(this).val();
        wpThemeFetchPosts(category);
    });

    wpThemeFetchPosts();
});

Для правильной работы фильтра укажите ID категории, а не slug, или реализуйте динамическое получение категорий через REST API.

Реализация простой пагинации

Пагинация позволяет разбивать контент на страницы. Добавим кнопки «Следующая» и «Предыдущая» и будем менять параметр page в запросе.

HTML для кнопок:

<div id="wp-theme-pagination">
  <button id="wp-theme-prev" disabled>Предыдущая</button>
  <button id="wp-theme-next">Следующая</button>
</div>

Модификация скрипта:

jQuery(document).ready(function($) {
    let currentPage = 1;
    let maxPages = 1;

    function wpThemeFetchPosts(page = 1) {
        $.ajax({
            url: wpThemeSettings.apiUrl + 'posts',
            method: 'GET',
            beforeSend: function(xhr) {
                xhr.setRequestHeader('X-WP-Nonce', wpThemeSettings.nonce);
            },
            data: {
                per_page: 5,
                page: page,
                orderby: 'date',
                order: 'desc'
            },
            success: function(data, textStatus, request) {
                maxPages = parseInt(request.getResponseHeader('X-WP-TotalPages'));
                currentPage = page;

                let html = '<ul class="wp-theme-post-list">';
                data.forEach(function(post) {
                    html += '<li><a href="' + post.link + '">' + post.title.rendered + '</a></li>';
                });
                html += '</ul>';
                $('#wp-theme-dynamic-posts').html(html);

                $('#wp-theme-prev').prop('disabled', currentPage <= 1);
                $('#wp-theme-next').prop('disabled', currentPage >= maxPages);
            },
            error: function() {
                $('#wp-theme-dynamic-posts').html('Ошибка загрузки данных');
            }
        });
    }

    $('#wp-theme-prev').on('click', function() {
        if (currentPage > 1) {
            wpThemeFetchPosts(currentPage - 1);
        }
    });

    $('#wp-theme-next').on('click', function() {
        if (currentPage < maxPages) {
            wpThemeFetchPosts(currentPage + 1);
        }
    });

    wpThemeFetchPosts();
});

Теперь пользователи могут листать страницы с постами без перезагрузки.

Практические рекомендации и полезные плагины

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

  • Clearfy Pro — для оптимизации REST API и безопасности.
  • Тема Reboot — хорошо подходит для работы с динамическими блоками и современным JS.

Также рекомендуем внимательно следить за безопасностью при работе с REST API, использовать nonce и правильные права доступа.

Заключение

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

Как создать шорткод в WordPress своими руками
10.11.2025
Оптимизация кода темы WordPress для улучшения производительности
15.01.2026
Как добавить поддержку AJAX в дочерних темах WordPress
05.03.2026
Как использовать хуки в WordPress для разработки тем
02.12.2025
Как создать динамический слайдер в WordPress теме
02.02.2026