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

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

Что такое WP_Query и как он работает

WP_Query — это класс WordPress, который позволяет получать посты из базы данных с гибкими параметрами: по типу записи, таксономиям, мета-полям, дате и многим другим критериям. Он возвращает объекты записей, которые затем можно вывести в любом формате.

Пример базового WP_Query:

$args = array(<br>    'post_type' => 'post',<br>    'posts_per_page' => 5,<br>    'orderby' => 'date',<br>    'order' => 'DESC'<br>);<br>$query = new WP_Query($args);<br>if ($query->have_posts()) {<br>    while ($query->have_posts()) {<br>        $query->the_post();<br>        echo '<h2>' . get_the_title() . '</h2>';<br>        echo get_the_excerpt();<br>    }<br>}<br>wp_reset_postdata();

Это основной способ получить посты для вывода в шаблоне. Но иногда нужно подгружать данные без перезагрузки — здесь на помощь приходит AJAX.

AJAX в WordPress: основы и настройка

AJAX (Asynchronous JavaScript and XML) позволяет делать запросы к серверу из браузера и получать ответ без обновления страницы. В WordPress для удобства есть специальные хуки и функции для обработки AJAX-запросов.

Чтобы использовать AJAX, нужно:

  • подключить JavaScript с правильным ajaxurl и nonce;
  • создать PHP-функцию-обработчик запроса и привязать её к хукам wp_ajax_ и wp_ajax_nopriv_;
  • отправить запрос из JS, получить ответ и отобразить данные.

Пример подключения скрипта с передачей ajaxurl и nonce

function wpma_enqueue_scripts() {<br>    wp_enqueue_script('wpma-ajax-script', get_template_directory_uri() . '/js/wpma-ajax.js', array('jquery'), null, true);<br>    wp_localize_script('wpma-ajax-script', 'wpma_ajax_object', array(<br>        'ajax_url' => admin_url('admin-ajax.php'),<br>        'nonce' => wp_create_nonce('wpma_ajax_nonce')<br>    ));<br>}<br>add_action('wp_enqueue_scripts', 'wpma_enqueue_scripts');

Создание обработчика AJAX с WP_Query

Далее создаём PHP-функцию, которая будет принимать параметры из AJAX-запроса, формировать WP_Query и возвращать HTML с результатами.

function wpma_ajax_load_posts() {<br>    check_ajax_referer('wpma_ajax_nonce', 'security');<br><br>    $paged = isset($_POST['paged']) ? intval($_POST['paged']) : 1;<br>    $posts_per_page = 5;<br><br>    $args = array(<br>        'post_type' => 'post',<br>        'posts_per_page' => $posts_per_page,<br>        'paged' => $paged,<br>        'orderby' => 'date',<br>        'order' => 'DESC'<br>    );<br><br>    $query = new WP_Query($args);<br>    if ($query->have_posts()) {<br>        ob_start();<br>        while ($query->have_posts()) {<br>            $query->the_post();<br>            ?><br>            <article class="post-item"><br>                <h2><?php the_title(); ?></h2><br>                <div class="excerpt"><?php the_excerpt(); ?></div><br>            </article><br>            <?php<br>        }<br>        wp_reset_postdata();<br>        $html = ob_get_clean();<br>        wp_send_json_success(array('html' => $html));<br>    } else {<br>        wp_send_json_error(array('message' => 'Посты не найдены'));<br>    }<br>    wp_die();<br>}<br>add_action('wp_ajax_wpma_load_posts', 'wpma_ajax_load_posts');<br>add_action('wp_ajax_nopriv_wpma_load_posts', 'wpma_ajax_load_posts');

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

Создадим файл wpma-ajax.js с кодом, который отправляет AJAX-запрос и вставляет полученный HTML в контейнер.

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

Оптимизация и безопасность AJAX-запросов

Для защиты запросов используем nonce — одноразовый ключ. Функция check_ajax_referer проверяет его. Это предотвращает CSRF-атаки.

Также важно контролировать передаваемые параметры, например, приводить к типу integer с помощью intval. Никогда не используйте входящие данные без проверки в WP_Query, чтобы избежать SQL-инъекций.

Для повышения производительности используйте кэширование результата WP_Query, если данные часто повторяются, но это уже тема для отдельной статьи.

Пример использования в шаблоне WordPress

В шаблоне достаточно добавить контейнер и кнопку:

<div id="wpma-posts-container"><br>    <!-- Здесь будут загружаться посты --><br></div><br><button id="wpma-load-more">Загрузить ещё</button>

При клике на кнопку будут подгружаться следующие посты без перезагрузки страницы.

Дополнительные возможности и плагины для AJAX в WordPress

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

Для сложных форм и запросов подойдёт плагин My Popup, который поддерживает AJAX-запросы и валидацию.

Но если нужна максимальная кастомизация, лучше писать собственные обработчики, как показано в статье.

WooCommerce: устранение проблем с корзиной и оплатой на WordPress
04.05.2026
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
03.06.2026
Как создать автоматический sitemap в WordPress с помощью кода
27.12.2025
Как автоматически удалять старые изображения в WordPress
06.02.2026
Как добавить автоматические уведомления о обновлениях плагинов в WordPress
22.02.2026