Как создать динамические блоки с подгрузкой в GeneratePress для улучшения производительности

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

Что такое динамические блоки с подгрузкой и зачем они нужны

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

  • Сократить время первой загрузки страницы.
  • Уменьшить нагрузку на сервер.
  • Обеспечить плавную работу интерфейса.

В GeneratePress, благодаря его легковесности и гибкости, удобно реализовать динамические блоки с помощью AJAX и пользовательских хуков.

Создание AJAX-подгрузки динамических блоков в GeneratePress

Рассмотрим пример, как добавить динамический блок с подгрузкой постов по категории при нажатии кнопки «Загрузить ещё».

Шаг 1. Регистрация AJAX-обработчика

Добавляем следующий код в файл functions.php вашей дочерней темы GeneratePress или в плагин:

function generatepress_ajax_load_more_posts() {
    // Проверяем nonce для безопасности
    check_ajax_referer('generatepress_load_more_nonce', 'nonce');

    $paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'paged' => $paged,
    ];
    if ($category) {
        $args['category_name'] = $category;
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            // Выводим посты в нужном формате
            echo '<article><h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2><div>' . get_the_excerpt() . '</div></article>';
        }
    } else {
        echo '<p>Больше постов нет.</p>';
    }
    wp_die();
}
add_action('wp_ajax_generatepress_load_more_posts', 'generatepress_ajax_load_more_posts');
add_action('wp_ajax_nopriv_generatepress_load_more_posts', 'generatepress_ajax_load_more_posts');

Шаг 2. Подключение JavaScript для отправки AJAX-запроса

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

function generatepress_enqueue_load_more_script() {
    wp_enqueue_script('generatepress-load-more', get_stylesheet_directory_uri() . '/js/load-more.js', ['jquery'], '', true);
    wp_localize_script('generatepress-load-more', 'generatepressLoadMore', [
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('generatepress_load_more_nonce'),
    ]);
}
add_action('wp_enqueue_scripts', 'generatepress_enqueue_load_more_script');

В файле js/load-more.js разместим следующий код:

jQuery(document).ready(function($) {
    var page = 2;
    $('#generatepress-load-more-button').on('click', function() {
        var button = $(this);
        button.attr('disabled', true).text('Загрузка...');
        $.post(generatepressLoadMore.ajaxurl, {
            action: 'generatepress_load_more_posts',
            nonce: generatepressLoadMore.nonce,
            page: page,
            category: 'news' // Замените на нужную категорию или передавайте динамически
        }, function(response) {
            if ($.trim(response) === '<p>Больше постов нет.</p>') {
                button.text('Больше постов нет').attr('disabled', true);
            } else {
                $('#generatepress-posts-container').append(response);
                button.attr('disabled', false).text('Загрузить ещё');
                page++;
            }
        });
    });
});

Вставка блока и кнопки в шаблон GeneratePress

Добавим в нужное место шаблона (например, через хук generate_after_main_content) HTML-код контейнера и кнопки:

function generatepress_add_load_more_section() {
    echo '<div id="generatepress-posts-container">';
    // Выводим первые 5 постов категории 'news'
    $args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'category_name' => 'news'
    ];
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<article><h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2><div>' . get_the_excerpt() . '</div></article>';
        }
        wp_reset_postdata();
    }
    echo '</div>';
    echo '<button id="generatepress-load-more-button">Загрузить ещё</button>';
}
add_action('generate_after_main_content', 'generatepress_add_load_more_section');

Как улучшить и адаптировать решение для разных задач

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

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

Также полезно подключить кэширование результатов AJAX-запросов через transient API, чтобы снизить нагрузку при повторных запросах.

Использование плагинов для реализации динамической подгрузки в GeneratePress

Если не хотите писать код, можно использовать плагины, которые интегрируются с GeneratePress:

  • ABC Pagination — позволяет создавать постраничную навигацию с AJAX-подгрузкой.
  • WPRemark — расширенный инструмент для отзывов с динамической подгрузкой контента.

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

Как добавить переменные из пользовательского профиля в Gutenberg на GeneratePress
04.03.2026
Как добавить кастомные виджеты в GeneratePress с помощью кода
12.12.2025
Как создать динамические колонтитулы в GeneratePress на WordPress
14.02.2026
Как добавить динамические строки в GeneratePress для улучшения функционала сайта
01.11.2025
WooCommerce: как изменить название и описание товара после покупки в GeneratePress
29.04.2026