Как сделать динамический список постов с пагинацией на AJAX в WordPress

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

Почему стоит использовать AJAX для пагинации постов в WordPress

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

Использование AJAX позволяет:

  • Загружать новые записи без перезагрузки страницы.
  • Снизить нагрузку на сервер и ускорить работу сайта.
  • Обеспечить лучший пользовательский опыт за счёт плавной подгрузки контента.

Для реализации этого функционала нам понадобится написать обработчик AJAX-запроса, JavaScript для отправки запроса и корректно вывести результаты.

Создание AJAX обработчика в WordPress

Для начала добавим в файл functions.php вашей темы или в отдельный плагин обработчик AJAX-запроса. Он будет принимать номер страницы, получать посты и возвращать HTML для вывода.

add_action('wp_ajax_wparticles_load_posts', 'wparticles_load_posts_callback');
add_action('wp_ajax_nopriv_wparticles_load_posts', 'wparticles_load_posts_callback');

function wparticles_load_posts_callback() {
    $paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $posts_per_page = 5; // Количество постов на страницу

    $query = new WP_Query(array(
        'post_type' => 'post',
        'paged' => $paged,
        'posts_per_page' => $posts_per_page
    ));

    if($query->have_posts()) {
        ob_start();
        while($query->have_posts()) {
            $query->the_post();
            ?>
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                <div class="entry-summary"><?php the_excerpt(); ?></div>
            </article>
            <?php
        }
        wp_reset_postdata();
        $content = ob_get_clean();
        wp_send_json_success(array('content' => $content, 'max_page' => $query->max_num_pages));
    } else {
        wp_send_json_error('Посты не найдены');
    }
    wp_die();
}

В этом коде мы создаём два экшена для авторизованных и неавторизованных пользователей, принимаем номер страницы через POST, выполняем WP_Query и возвращаем HTML контент и максимальное количество страниц.

JavaScript для отправки AJAX-запроса и обновления списка постов

Теперь добавим JavaScript, который будет отправлять AJAX-запрос при клике на кнопку «Загрузить ещё» и подгружать следующие записи.

jQuery(document).ready(function($) {
    var currentPage = 1;
    var maxPage = 1;

    function wparticles_loadPosts(page) {
        $.ajax({
            url: wparticles_ajax_object.ajax_url,
            type: 'POST',
            dataType: 'json',
            data: {
                action: 'wparticles_load_posts',
                page: page
            },
            beforeSend: function() {
                $('#load-more').attr('disabled', true).text('Загрузка...');
            },
            success: function(response) {
                if(response.success) {
                    $('#posts-container').append(response.data.content);
                    maxPage = response.data.max_page;
                    currentPage = page;
                    if(currentPage >= maxPage) {
                        $('#load-more').hide();
                    } else {
                        $('#load-more').attr('disabled', false).text('Загрузить ещё');
                    }
                } else {
                    $('#load-more').hide();
                }
            },
            error: function() {
                alert('Ошибка загрузки постов');
                $('#load-more').attr('disabled', false).text('Загрузить ещё');
            }
        });
    }

    $('#load-more').on('click', function() {
        wparticles_loadPosts(currentPage + 1);
    });

    // Можно подгрузить первую страницу сразу, если хотите
    // wparticles_loadPosts(1);
});

Этот скрипт привязывается к кнопке с ID load-more, отправляет номер следующей страницы, получает HTML и добавляет его в контейнер с ID posts-container. При достижении последней страницы кнопка скрывается.

Как добавить скрипт и передать AJAX URL в тему

Чтобы скрипт работал корректно, необходимо подключить его в теме и передать параметр ajax_url. Например, в functions.php добавьте:

function wparticles_enqueue_scripts() {
    wp_enqueue_script('wparticles-ajax', get_template_directory_uri() . '/js/wparticles-ajax.js', array('jquery'), '1.0', true);
    wp_localize_script('wparticles-ajax', 'wparticles_ajax_object', array(
        'ajax_url' => admin_url('admin-ajax.php'),
    ));
}
add_action('wp_enqueue_scripts', 'wparticles_enqueue_scripts');

Создайте файл wparticles-ajax.js в папке js вашей темы и вставьте туда код из предыдущего блока.

HTML-разметка для вывода и кнопки загрузки

В шаблоне (например, в файле index.php или archive.php) создайте контейнер для постов и кнопку загрузки:

<div id="posts-container">
    <!-- Посты будут добавляться сюда -->
</div>

<button id="load-more">Загрузить ещё</button>

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

Дополнительные советы и улучшения

1. Фильтрация и сортировка

Вы можете расширить AJAX-запрос, добавив параметры фильтрации (категории, метки) или сортировки. Для этого передавайте дополнительные параметры из JavaScript и используйте их в WP_Query.

2. Обработка ошибок и UX

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

3. Кеширование результатов

Если на вашем сайте много трафика, подумайте о кешировании результатов запросов для уменьшения нагрузки.

Пример использования плагина для упрощения AJAX пагинации

Если вы хотите готовое решение, обратите внимание на плагин ABC Pagination от WPShop. Он позволяет легко добавить AJAX пагинацию без написания кода, поддерживает кастомизацию и различные стили.

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

Итог

Реализация динамического списка постов с пагинацией на AJAX в WordPress — это отличный способ повысить юзабилити и производительность сайта. В статье показан базовый пример, который можно адаптировать под свои нужды, добавлять фильтрацию, анимацию и другие улучшения.

Как удалить загрузку WOFF шрифтов в WordPress для ускорения сайта
18.03.2026
Как отменить заказ в WooCommerce после оплаты с помощью хуков
07.05.2026
Как создать динамические блоки с AJAX в WordPress
22.02.2026
Как удалить ненужные шорткоды в WordPress без ошибок
31.01.2026
Как безопасно удалить или отключить плагин в WordPress без потери данных
16.11.2025

Ниже мы подобрали самые актуальные материалы по Вордпресс