Автоподгрузка страниц WordPress без плагинов: реализация и примеры кода

Автоподгрузка страниц, или бесконечная прокрутка (infinite scroll), становится все более популярным способом улучшить пользовательский опыт на сайтах WordPress. Вместо традиционной пагинации пользователь видит новые записи автоматически при прокрутке страницы вниз. В этой статье мы разберем, как реализовать автоподгрузку страниц без использования плагинов, используя только собственный код и штатные возможности WordPress.

Почему стоит реализовывать автоподгрузку без плагинов

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

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

Основные шаги реализации автоподгрузки страниц в WordPress

Для реализации автоподгрузки нам потребуется:

  • Создать AJAX обработчик в WordPress, который будет отдавать следующую страницу записей;
  • Добавить JavaScript код, который при скролле страницы будет посылать запросы к AJAX обработчику;
  • Обработать полученные данные и добавить их в текущий контент без перезагрузки страницы.

Рассмотрим подробнее каждый пункт.

Создание AJAX обработчика в functions.php

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

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

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

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

    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><?php the_excerpt(); ?></div>
            </article>
            <?php
        }
        wp_reset_postdata();
        $data = ob_get_clean();
        wp_send_json_success(array('html' => $data));
    } else {
        wp_send_json_error('no_more_posts');
    }
}
add_action('wp_ajax_wpcore_load_more', 'wpcore_load_more_ajax');
add_action('wp_ajax_nopriv_wpcore_load_more', 'wpcore_load_more_ajax');

В этом коде мы создаем функцию-обработчик, которая получает номер страницы, формирует запрос по записям и возвращает HTML для новых постов. Обратите внимание на проверку nonce — это важно для безопасности AJAX запросов.

Добавление nonce и скрипта в шаблон

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

function wpcore_enqueue_scripts() {
    wp_enqueue_script('wpcore-load-more', get_template_directory_uri() . '/js/load-more.js', array('jquery'), null, true);
    wp_localize_script('wpcore-load-more', 'wpcore_load_more_params', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpcore_load_more_nonce'),
        'posts_per_page' => 5
    ));
}
add_action('wp_enqueue_scripts', 'wpcore_enqueue_scripts');

Этот код подключит JavaScript файл load-more.js и передаст в него параметры для AJAX запросов.

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

Теперь создадим файл js/load-more.js со следующим содержимым:

jQuery(document).ready(function($) {
    var page = 2; // следующая страница
    var loading = false;
    var noMorePosts = false;

    function wpcore_load_more_posts() {
        if(loading || noMorePosts) return;
        loading = true;

        $.ajax({
            url: wpcore_load_more_params.ajaxurl,
            type: 'POST',
            data: {
                action: 'wpcore_load_more',
                nonce: wpcore_load_more_params.nonce,
                page: page
            },
            success: function(response) {
                if(response.success) {
                    $('#main').append(response.data.html);
                    page++;
                    loading = false;
                } else if(response.data === 'no_more_posts') {
                    noMorePosts = true;
                    loading = false;
                }
            },
            error: function() {
                loading = false;
            }
        });
    }

    $(window).scroll(function() {
        if($(window).scrollTop() + $(window).height() > $(document).height() - 200) {
            wpcore_load_more_posts();
        }
    });
});

В этом скрипте мы отслеживаем прокрутку страницы и когда пользователь приблизится к низу, отправляем AJAX запрос на сервер для подгрузки следующего блока записей. Новые записи добавляются в контейнер #main. Переменная page отслеживает номер страницы для запроса.

Настройка шаблона для поддержки автоподгрузки

Для корректной работы автоподгрузки в шаблоне (например, index.php или archive.php) убедитесь, что основной контейнер с записями имеет id main. Например:

<div id="main" class="content-area">
    <?php if(have_posts()) : ?>
        <?php while(have_posts()) : the_post(); ?>
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                <div><?php the_excerpt(); ?></div>
            </article>
        <?php endwhile; ?>
    <?php endif; ?>
</div>

Это позволит нашему JavaScript добавлять новые записи именно в этот блок.

Расширение функционала и советы по оптимизации

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

  • Кэширование результатов. Если у вас много трафика, подумайте о кэшировании AJAX ответов, чтобы снизить нагрузку на базу данных.
  • Лимит запросов. Чтобы избежать лишних запросов, добавьте флаг, который блокирует повторные запросы, пока предыдущий не завершился.
  • Обработка ошибок. Добавьте обработку ошибок в JavaScript, чтобы пользователь видел, если что-то пошло не так.
  • SEO. Поскольку контент подгружается динамически, поисковые роботы могут не увидеть все записи. Рассмотрите возможность реализации пагинации для поисковиков или использование серверного рендеринга.
  • Индикация загрузки. Добавьте индикатор загрузки, чтобы пользователь понимал, что идет подгрузка новых записей.

Пример добавления индикатора загрузки

В HTML шаблоне добавьте элемент для индикатора:

<div id="wpcore-loader" style="display:none; text-align:center; padding:20px;">Загрузка...</div>

И в JavaScript покажем/скроем его:

// В функции wpcore_load_more_posts
$('#wpcore-loader').show();

// В success и error
$('#wpcore-loader').hide();

Заключение

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

Как создать постоянные содержимые в WordPress с помощью Transient Cache
22.03.2026
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
04.06.2026
Как создать свой shortcode в WordPress
01.11.2025
WooCommerce: оптимальные настройки для очистки базы от старого кода и данных
28.05.2026
Как автоматизировать создание резервных копий в WordPress через Cron
18.12.2025