В современных темах 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 — расширенный инструмент для отзывов с динамической подгрузкой контента.
Эти плагины помогут быстро добавить нужный функционал без глубоких знаний программирования, но для максимальной гибкости лучше использовать кастомные решения, описанные выше.