Как использовать AJAX в WordPress для динамического обновления контента

Что такое AJAX и зачем он нужен в WordPress

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

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

В WordPress AJAX работает через специальные обработчики на стороне сервера и JavaScript на клиенте. Важно понимать, как правильно зарегистрировать AJAX-обработчики и правильно передавать данные.

Регистрация AJAX обработчиков в WordPress

WordPress предлагает два специальных экшена для AJAX-запросов:

  • wp_ajax_{action} — для авторизованных пользователей;
  • wp_ajax_nopriv_{action} — для неавторизованных пользователей.

Здесь {action} — это имя вашего действия, которое будет указываться в JavaScript.

Пример регистрации обработчика AJAX для неавторизованных пользователей:

add_action('wp_ajax_nopriv_wptour_load_posts', 'wptour_load_posts_callback');
add_action('wp_ajax_wptour_load_posts', 'wptour_load_posts_callback');

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

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

    $query = new WP_Query([
        'post_type' => 'post',
        'paged' => $paged,
        'posts_per_page' => 5
    ]);

    if ($query->have_posts()) {
        ob_start();
        while ($query->have_posts()) {
            $query->the_post();
            ?>
            <article>
                <h2><?php the_title(); ?></h2>
                <div><?php the_excerpt(); ?></div>
            </article>
            <?php
        }
        wp_reset_postdata();
        $result = ob_get_clean();
        wp_send_json_success(['html' => $result]);
    } else {
        wp_send_json_error('Посты не найдены');
    }

    wp_die();
}

В этом коде мы создаём обработчик wptour_load_posts_callback, который принимает номер страницы через POST и возвращает HTML с постами. Обязательно используйте check_ajax_referer для безопасности.

Клиентская часть: JavaScript для вызова AJAX

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

Пример простого скрипта с использованием jQuery:

jQuery(document).ready(function($) {
    let page = 1;
    $('#load-more').on('click', function(e) {
        e.preventDefault();
        page++;

        $.ajax({
            url: wptour_ajax_object.ajax_url,
            method: 'POST',
            data: {
                action: 'wptour_load_posts',
                nonce: wptour_ajax_object.nonce,
                page: page
            },
            success: function(response) {
                if(response.success) {
                    $('#posts-container').append(response.data.html);
                } else {
                    alert('Больше постов нет');
                    $('#load-more').hide();
                }
            },
            error: function() {
                alert('Ошибка загрузки');
            }
        });
    });
});

Обратите внимание, что мы используем объект wptour_ajax_object, который необходимо локализовать в PHP, чтобы передать URL AJAX и nonce в скрипт.

Локализация скрипта и подключение JavaScript

В functions.php подключите скрипт и передайте необходимые данные:

function wptour_enqueue_scripts() {
    wp_enqueue_script('wptour-ajax-script', get_template_directory_uri() . '/js/wptour-ajax.js', ['jquery'], null, true);
    wp_localize_script('wptour-ajax-script', 'wptour_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wptour_ajax_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'wptour_enqueue_scripts');

Так мы передаём URL для AJAX и nonce в JavaScript, что делает запросы безопасными и правильными.

Пример плагинов для расширения AJAX-функционала в WordPress

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

  • Ajax Load More — плагин для бесконечной подгрузки постов и контента с помощью AJAX. Позволяет создавать кастомные шаблоны и фильтры.
  • WPForms — популярный конструктор форм с поддержкой AJAX-отправки, что улучшает UX при работе с формами.
  • WooCommerce AJAX Cart — плагин для динамического обновления корзины без перезагрузки страницы.

Эти плагины помогут внедрить AJAX быстро и без глубокой кастомизации.

Безопасность и отладка AJAX в WordPress

При работе с AJAX важно учесть несколько моментов безопасности:

  • Используйте nonce для проверки легитимности запросов — это защищает от CSRF-атак.
  • Проверяйте права пользователя, если запросы должны быть доступны только авторизованным.
  • Обрабатывайте данные строго по типам, валидируйте и санитизируйте входящие данные.
  • Для отладки используйте wp_send_json_success и wp_send_json_error для возвращения структурированного JSON.

Для отладки AJAX-запросов удобно использовать инструменты разработчика в браузере (вкладка Network) и логи WordPress.

Расширенные примеры: AJAX фильтрация записей по таксономии

Частая задача — динамическая фильтрация записей по категориям или тегам без перезагрузки страницы. Вот пример функции для обработки AJAX с фильтрацией:

add_action('wp_ajax_nopriv_wptour_filter_posts', 'wptour_filter_posts_callback');
add_action('wp_ajax_wptour_filter_posts', 'wptour_filter_posts_callback');

function wptour_filter_posts_callback() {
    check_ajax_referer('wptour_ajax_nonce', 'nonce');

    $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';

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

    if ($category) {
        $args['tax_query'] = [
            [
                'taxonomy' => 'category',
                'field' => 'slug',
                'terms' => $category,
            ],
        ];
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        ob_start();
        while ($query->have_posts()) {
            $query->the_post();
            ?>
            <article>
                <h2><?php the_title(); ?></h2>
                <div><?php the_excerpt(); ?></div>
            </article>
            <?php
        }
        wp_reset_postdata();
        $result = ob_get_clean();
        wp_send_json_success(['html' => $result]);
    } else {
        wp_send_json_error('Посты не найдены');
    }

    wp_die();
}

Этот обработчик принимает параметр категории и возвращает посты, соответствующие фильтру. В JS достаточно изменить data для передачи нужной категории.

Как использовать хуки в WordPress: практические примеры и советы
09.11.2025
Как удалить атрибуты width и height из изображений WordPress без плагинов
24.04.2026
Как автоматически удалять временные файлы в WordPress
09.12.2025
WooCommerce: как добавить собственный тип доставки с условиями
09.06.2026
Как создать автоматические редакции постов в WordPress
26.03.2026

Уроки со скриншотами, подробные руководства