Как использовать AJAX для фильтрации постов в WordPress

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

Почему AJAX важен для фильтрации постов в WordPress

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

Использование AJAX для фильтрации постов в WordPress решает несколько задач:

  • Сокращение времени отклика для пользователя;
  • Снижение нагрузки на сервер, так как обновляются только нужные данные;
  • Улучшение SEO, благодаря правильной настройке URL и подгрузке контента;
  • Возможность создавать сложные интерфейсы с множеством фильтров.

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

Для начала необходимо зарегистрировать AJAX обработчики в functions.php вашей темы или в собственном плагине. В WordPress есть два типа AJAX вызовов: для авторизованных пользователей и для гостей. Регистрируем оба:

add_action('wp_ajax_wpdemo_filter_posts', 'wpdemo_filter_posts_callback');
add_action('wp_ajax_nopriv_wpdemo_filter_posts', 'wpdemo_filter_posts_callback');

function wpdemo_filter_posts_callback() {
    // Обработка запроса и вывод результата
    // Подробнее ниже
    wp_die();
}

Здесь 'wpdemo_filter_posts_callback' — функция, которая будет обрабатывать AJAX запрос. Префикс wpdemo_ помогает избежать конфликтов с другими функциями.

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

Чтобы отправить AJAX запрос при выборе фильтра, нужно подключить JS скрипт. В нем соберём параметры фильтра и отправим их на сервер.

jQuery(document).ready(function($) {
    $('#filter-form').on('change', 'select, input', function() {
        var filterData = $('#filter-form').serialize();
        $.ajax({
            url: wpdemo_ajax_object.ajax_url,
            type: 'POST',
            data: filterData + '&action=wpdemo_filter_posts',
            beforeSend: function() {
                $('#posts-container').html('<p>Загрузка...</p>');
            },
            success: function(response) {
                $('#posts-container').html(response);
            },
            error: function() {
                $('#posts-container').html('<p>Ошибка загрузки данных.</p>');
            }
        });
    });
});

Не забудьте локализовать скрипт из PHP, чтобы передать URL для AJAX:

function wpdemo_enqueue_scripts() {
    wp_enqueue_script('wpdemo-filter', get_template_directory_uri() . '/js/filter.js', array('jquery'), null, true);
    wp_localize_script('wpdemo-filter', 'wpdemo_ajax_object', array(
        'ajax_url' => admin_url('admin-ajax.php')
    ));
}
add_action('wp_enqueue_scripts', 'wpdemo_enqueue_scripts');

Обработка запроса на сервере: фильтрация постов

В функции wpdemo_filter_posts_callback нужно собрать параметры фильтра, выполнить WP_Query и вернуть HTML с результатами.

function wpdemo_filter_posts_callback() {
    // Получаем параметры из $_POST
    $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';
    $tag = isset($_POST['tag']) ? sanitize_text_field($_POST['tag']) : '';

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

    if ($category) {
        $args['category_name'] = $category;
    }

    if ($tag) {
        $args['tag'] = $tag;
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<div class="post-item">';
            echo '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
            echo '<div>' . get_the_excerpt() . '</div>';
            echo '</div>';
        }
    } else {
        echo '<p>Посты не найдены.</p>';
    }
    wp_reset_postdata();
    wp_die();
}

Пример HTML формы фильтра

Форма фильтра может выглядеть так:

<form id="filter-form">
    <select name="category">
        <option value="">Все категории</option>
        <option value="news">Новости</option>
        <option value="reviews">Обзоры</option>
    </select>
    <select name="tag">
        <option value="">Все теги</option>
        <option value="wordpress">WordPress</option>
        <option value="plugin">Плагины</option>
    </select>
</form>

<div id="posts-container"></div>

Советы по улучшению фильтрации AJAX

Добавление пагинации

Чтобы не выводить все посты сразу, добавьте пагинацию. Передавайте параметр страницы через AJAX и используйте его в WP_Query как paged. В ответе возвращайте HTML с пагинацией и JS для её обработки.

Чистка URL и SEO

Для SEO полезно обновлять URL при фильтрации с помощью History API (history.pushState). Это позволит пользователям делиться ссылками с фильтрами и улучшит индексацию.

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

Следите, чтобы WP_Query содержал только нужные параметры. Используйте кэширование, например, с помощью transient API или плагина Clearfy Pro (https://wpshop.ru/clearfy-pro/?utm_source=wpdemo.ru&utm_medium=article&utm_campaign=kak-ispolzovat-ajax-dlya-filtracii-postov-v-wordpress), чтобы ускорить ответ сервера.

Использование плагинов для AJAX фильтров

Если хочется готовое решение, можно рассмотреть плагины, например:

  • WPF Filter — простой в настройке AJAX фильтр для постов.
  • FacetWP — мощный инструмент для фильтрации с AJAX, поддерживает кастомные типы записей.
  • WPRemark (https://wpshop.ru/wpremark/?utm_source=wpdemo.ru&utm_medium=article&utm_campaign=kak-ispolzovat-ajax-dlya-filtracii-postov-v-wordpress) — плагин с расширенными возможностями AJAX взаимодействия, можно использовать для создания кастомных фильтров.

Однако, написание собственного решения даёт максимальную гибкость и понимание работы системы.

Как использовать WooCommerce REST API для управления заказами в WordPress
25.12.2025
Автоматическое обновление данных в реальном времени в WordPress
01.12.2025
Как изменить регистр текста в WordPress автоматически
02.03.2026
Как создать собственный блок Гутенберг в WordPress
15.12.2025
Как использовать хук WooCommerce 'woocommerce_order_status_changed' для автоматизации
25.04.2026