Как создать адаптивный обзор постов с помощью AJAX в WordPress

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

Почему стоит использовать AJAX для обзора постов

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

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

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

Создание AJAX-запроса для подгрузки постов

Начнем с создания функции, которая будет обрабатывать AJAX-запрос и возвращать HTML с постами. В WordPress для AJAX используется специальный хук wp_ajax_ для авторизованных пользователей и wp_ajax_nopriv_ для неавторизованных.

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

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

    $paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $posts_per_page = 5; // Можно изменить под себя

    $args = array(
        'post_type' => 'post',
        'posts_per_page' => $posts_per_page,
        'paged' => $paged
    );

    $query = new WP_Query($args);

    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-excerpt"><?php the_excerpt(); ?></div>
            </article>
            <?php
        }
        wp_reset_postdata();
        $posts_html = ob_get_clean();
        wp_send_json_success(array('html' => $posts_html));
    } else {
        wp_send_json_error(array('message' => 'Посты не найдены'));
    }
    wp_die();
}
add_action('wp_ajax_wpmax_load_posts', 'wpmax_load_posts_ajax');
add_action('wp_ajax_nopriv_wpmax_load_posts', 'wpmax_load_posts_ajax');

Здесь мы создаем обработчик wpmax_load_posts_ajax, который получает страницу page из POST-запроса и формирует вывод постов с помощью WP_Query. Результат возвращается в формате JSON.

Подключение JavaScript для AJAX-загрузки

Теперь нужно написать JS, который будет отправлять AJAX-запрос и подгружать посты на страницу без перезагрузки. Добавьте в вашу тему файл js/wpmax-ajax-posts.js со следующим содержимым:

jQuery(document).ready(function($) {
    var page = 2; // Начинаем со второй страницы
    var loading = false;
    var nonce = wpmax_ajax_object.nonce;

    $('#wpmax-load-more').on('click', function(e) {
        e.preventDefault();
        if (loading) return;
        loading = true;
        $('#wpmax-load-more').text('Загрузка...');

        $.ajax({
            url: wpmax_ajax_object.ajax_url,
            type: 'POST',
            data: {
                action: 'wpmax_load_posts',
                page: page,
                nonce: nonce
            },
            success: function(response) {
                if (response.success) {
                    $('#wpmax-posts-container').append(response.data.html);
                    page++;
                    $('#wpmax-load-more').text('Загрузить ещё');
                    loading = false;
                } else {
                    $('#wpmax-load-more').text('Больше постов нет');
                    $('#wpmax-load-more').prop('disabled', true);
                }
            },
            error: function() {
                $('#wpmax-load-more').text('Ошибка загрузки');
                loading = false;
            }
        });
    });
});

Данный скрипт добавляет обработчик на кнопку «Загрузить ещё», которая при клике отправляет AJAX-запрос на сервер и добавляет новые посты в контейнер с id wpmax-posts-container.

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

Чтобы JS получил URL для AJAX и nonce, добавьте следующий код в functions.php:

function wpmax_enqueue_scripts() {
    wp_enqueue_script('wpmax-ajax-posts', get_template_directory_uri() . '/js/wpmax-ajax-posts.js', array('jquery'), null, true);
    wp_localize_script('wpmax-ajax-posts', 'wpmax_ajax_object', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpmax_load_posts_nonce')
    ));
}
add_action('wp_enqueue_scripts', 'wpmax_enqueue_scripts');

Добавление HTML-разметки для обзора постов

В шаблоне вашей темы (например, в index.php или отдельном файле шаблона) добавьте следующий HTML:

<div id="wpmax-posts-container">
    <?php
    // Выводим первые 5 постов при загрузке страницы
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 5,
        'paged' => 1
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        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-excerpt"><?php the_excerpt(); ?></div>
            </article>
        <?php
        }
        wp_reset_postdata();
    }
    ?>
</div>
<button id="wpmax-load-more">Загрузить ещё</button>

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

Рекомендации по оптимизации и безопасности

Для повышения безопасности мы используем nonce — специальный одноразовый токен, который проверяется на сервере. Это защищает от CSRF-атак. Также рекомендуется ограничить количество постов на страницу, чтобы не перегружать сервер и клиент.

Если на сайте много пользователей, стоит подумать об использовании transient-кеша для хранения результатов запросов или применении плагинов кеширования, например Clearfy Pro, который помогает оптимизировать работу сайта и повысить скорость загрузки.

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

Заключение по созданию адаптивного обзора постов с AJAX

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

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

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

Как изменить функции WooCommerce без изменения основных файлов WordPress
18.11.2025
Как создать автоматические уведомления о обновлениях плагинов WordPress
05.02.2026
Как добавить дополнительные поля в формы регистрации WordPress
17.02.2026
Как создать динамические таблицы в WordPress с помощью AJAX
21.02.2026
Как создать автозаполняемое поле в WordPress с помощью JS и AJAX
23.12.2025