Как создать динамические шаблоны в WordPress на основе AJAX

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

Что такое AJAX и почему он важен для динамических шаблонов WordPress

AJAX (Asynchronous JavaScript and XML) — это технология, позволяющая асинхронно загружать данные с сервера и обновлять часть страницы без перезагрузки. В WordPress AJAX часто используется для фильтрации контента, подгрузки постов, обновления виджетов и других интерактивных функций.

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

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

Создаем AJAX-запрос в WordPress: базовые шаги

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

Регистрация AJAX-обработчика в functions.php шаблона или плагина

Добавим следующий код, который зарегистрирует два AJAX-хука — для авторизованных и неавторизованных пользователей (ajax-обработчики в WordPress разделяются по ролям):

add_action('wp_ajax_wpcommunity_load_posts', 'wpcommunity_load_posts_callback');
add_action('wp_ajax_nopriv_wpcommunity_load_posts', 'wpcommunity_load_posts_callback');

function wpcommunity_load_posts_callback() {
    // Проверка nonce для безопасности
    check_ajax_referer('wpcommunity_nonce', 'security');

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

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'paged' => $paged,
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            // Формируем HTML для каждого поста
            echo '<h2>' . get_the_title() . '</h2>';
            echo '<div>' . get_the_excerpt() . '</div>';
        }
    } else {
        echo '<p>Посты не найдены.</p>';
    }
    wp_reset_postdata();

    wp_die(); // обязательный вызов в конце AJAX-обработчика
}

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

В шаблоне или плагине подключим скрипт с функцией, которая будет отправлять запрос и обновлять контент на странице:

jQuery(document).ready(function($) {
    var paged = 1;
    $('#load-more').on('click', function(e) {
        e.preventDefault();
        paged++;
        $.ajax({
            url: wpcommunity_ajax_object.ajax_url,
            type: 'POST',
            data: {
                action: 'wpcommunity_load_posts',
                paged: paged,
                security: wpcommunity_ajax_object.nonce
            },
            success: function(response) {
                if($.trim(response) === '') {
                    $('#load-more').hide();
                } else {
                    $('#posts-container').append(response);
                }
            },
            error: function() {
                alert('Ошибка загрузки данных');
            }
        });
    });
});

Для передачи параметров AJAX в JavaScript используйте функцию wp_localize_script в PHP:

function wpcommunity_enqueue_scripts() {
    wp_enqueue_script('wpcommunity-ajax', get_template_directory_uri() . '/js/wpcommunity-ajax.js', ['jquery'], null, true);
    wp_localize_script('wpcommunity-ajax', 'wpcommunity_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpcommunity_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'wpcommunity_enqueue_scripts');

Создаем динамический шаблон страницы для вывода постов с AJAX

Создадим в теме файл шаблона, например template-ajax-posts.php, где будет контейнер для постов и кнопка для подгрузки:

<?php
/*
Template Name: AJAX Posts
*/
get_header(); ?>

<div id="posts-container">
    <?php
    // Загружаем первые 5 постов при загрузке страницы
    $args = [
        '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(); ?>
            <h2><?php the_title(); ?></h2>
            <div><?php the_excerpt(); ?></div>
        <?php endwhile; wp_reset_postdata(); endif; ?>
</div>

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

<?php get_footer(); ?>

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

Оптимизация и советы

Безопасность AJAX-запросов

Обязательно используйте check_ajax_referer для проверки nonce, чтобы защитить сайт от CSRF-атак. В JavaScript передавайте nonce при каждом запросе.

Кэширование и производительность

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

Использование плагинов для расширения функционала

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

  • WP AJAX Pagination — добавляет AJAX-пагинацию к стандартным архивам.
  • WPCommunity — тема с продвинутой поддержкой AJAX и динамического контента.
  • Expert Review — позволяет интегрировать динамические отзывы с подгрузкой через AJAX.

Пример расширения: фильтрация постов по категории через AJAX

Добавим возможность фильтровать посты по категориям без перезагрузки. В шаблоне создадим выпадающий список:

<select id="wpcommunity-category-filter">
    <option value="0">Все категории</option>
    <?php
    $categories = get_categories();
    foreach($categories as $category) {
        echo '<option value="' . esc_attr($category->term_id) . '">' . esc_html($category->name) . '</option>';
    }
    ?>
</select>

В JS добавим обработчик изменения фильтра:

$('#wpcommunity-category-filter').on('change', function() {
    var category = $(this).val();
    $.ajax({
        url: wpcommunity_ajax_object.ajax_url,
        type: 'POST',
        data: {
            action: 'wpcommunity_load_posts',
            category: category,
            paged: 1,
            security: wpcommunity_ajax_object.nonce
        },
        success: function(response) {
            $('#posts-container').html(response);
            $('#load-more').show(); // показать кнопку загрузки
        },
        error: function() {
            alert('Ошибка загрузки постов');
        }
    });
});

Изменим обработчик в PHP, чтобы учитывать фильтрацию по категории:

function wpcommunity_load_posts_callback() {
    check_ajax_referer('wpcommunity_nonce', 'security');

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

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'paged' => $paged,
    ];

    if ($category > 0) {
        $args['cat'] = $category;
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<h2>' . get_the_title() . '</h2>';
            echo '<div>' . get_the_excerpt() . '</div>';
        }
    } else {
        echo '<p>Посты не найдены.</p>';
    }
    wp_reset_postdata();

    wp_die();
}
Как автоматизировать удаление неиспользуемых вариативов в WooCommerce
18.05.2026
Автоподписка в WordPress: как автоматизировать подписку на рассылку
09.01.2026
Как использовать метод wpcommunity_database_cleanup для удаления пустых таблиц в базе данных WordPress
01.03.2026
Как создать динамические шаблоны в WordPress на основе AJAX
22.12.2025
Как создать свою систему ролей и разрешений в WordPress
30.11.2025

Задать вопрос о вордпресс, получить ответ - это все можно сделать в нашем сообществе WP. Сайт в данный момент в разработке, изучите ссылки ниже: