Как создать динамический фильтрованный список статей в WordPress

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

Использование WP_Query для выборки статей по параметрам

Основой для создания кастомного списка статей служит класс WP_Query. Он позволяет гибко настраивать выборку записей по любым параметрам — категориям, таксономиям, мета-полям, дате и другим.

Например, чтобы вывести список статей из категории «Технологии» с 5 записей на странице, можно использовать такой код:

function wpexpert_get_filtered_posts($args = []) {
    $default_args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'category_name' => 'technologies',
    ];
    $query_args = array_merge($default_args, $args);
    $query = new WP_Query($query_args);
    
    if ($query->have_posts()) {
        echo '<ul class="wpexpert-post-list">';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Статьи не найдены.</p>';
    }
    wp_reset_postdata();
}

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

Добавление AJAX для динамической фильтрации

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

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

Добавьте в functions.php следующий код:

add_action('wp_ajax_wpexpert_filter_posts', 'wpexpert_ajax_filter_posts');
add_action('wp_ajax_nopriv_wpexpert_filter_posts', 'wpexpert_ajax_filter_posts');

function wpexpert_ajax_filter_posts() {
    $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';
    $posts_per_page = isset($_POST['posts_per_page']) ? intval($_POST['posts_per_page']) : 5;

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

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

    ob_start();
    wpexpert_get_filtered_posts($args);
    $html = ob_get_clean();

    wp_send_json_success(['html' => $html]);
    wp_die();
}

Этот обработчик принимает POST-параметры и возвращает HTML списка статей.

JavaScript для отправки запросов и обновления страницы

Добавим скрипт, который будет отправлять AJAX-запросы при смене фильтров. Пример на jQuery:

jQuery(document).ready(function($) {
    $('.wpexpert-filter-select').on('change', function() {
        var category = $('#wpexpert-category-filter').val();
        var postsPerPage = $('#wpexpert-posts-per-page').val();

        $.ajax({
            url: wpexpert_ajax_object.ajax_url,
            method: 'POST',
            data: {
                action: 'wpexpert_filter_posts',
                category: category,
                posts_per_page: postsPerPage
            },
            success: function(response) {
                if (response.success) {
                    $('.wpexpert-post-list-container').html(response.data.html);
                }
            },
            error: function() {
                alert('Ошибка при загрузке статей');
            }
        });
    });
});

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

function wpexpert_enqueue_scripts() {
    wp_enqueue_script('wpexpert-filter', get_template_directory_uri() . '/js/wpexpert-filter.js', ['jquery'], null, true);
    wp_localize_script('wpexpert-filter', 'wpexpert_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php')
    ]);
}
add_action('wp_enqueue_scripts', 'wpexpert_enqueue_scripts');

Формы фильтра и дополнительные параметры

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

<div class="wpexpert-filters">
    <select id="wpexpert-category-filter" class="wpexpert-filter-select">
        <option value="">Все категории</option>
        <option value="technologies">Технологии</option>
        <option value="news">Новости</option>
        <option value="reviews">Обзоры</option>
    </select>
    
    <select id="wpexpert-posts-per-page" class="wpexpert-filter-select">
        <option value="5">5 записей</option>
        <option value="10">10 записей</option>
        <option value="20">20 записей</option>
    </select>
</div>
<div class="wpexpert-post-list-container">
    <!-- Сюда подгружается список -->
</div>

Такой интерфейс позволит пользователю моментально изменять фильтры и получать свежие данные.

Фильтрация по пользовательским полям и мета-данным

Если у вас есть статьи с дополнительными мета-полями, например, рейтингом, датой события или уровнем сложности, можно добавить их в фильтр. WP_Query поддерживает параметр meta_query.

Пример выборки статей с рейтингом 4 и выше:

$args = [
    'post_type' => 'post',
    'meta_query' => [
        [
            'key' => 'wpexpert_rating',
            'value' => 4,
            'type' => 'NUMERIC',
            'compare' => '>='
        ]
    ]
];
$query = new WP_Query($args);

Можно расширить AJAX-обработчик и форму фильтров, чтобы принимать и передавать эти параметры.

Оптимизация и кеширование для производительности

При больших объемах контента динамическая фильтрация может нагрузить сервер. Рекомендуется использовать кеширование результатов запросов — например, через Transients API или внешние кеш-плагины.

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

Рекомендации по плагинам для расширения фильтрации

Если хочется быстро реализовать интерфейс без программирования, обратите внимание на плагины:

  • Clearfy Pro — оптимизация и расширенные возможности настройки запросов;
  • WPRemark — для улучшения отзывов и рейтингов, которые можно использовать в фильтрах;
  • FacetWP (платный) — мощный инструмент для создания фильтров с AJAX.

Однако для полного контроля над логикой и дизайном лучше реализовать собственное решение, как описано в статье.

Как успешно обновлять WooCommerce без потери данных
26.04.2026
WooCommerce: как устранить ошибку «Невозможно создать заказ» при оформлении
26.05.2026
Как отлаживать REST API WordPress: практические методы и примеры
08.03.2026
Как удалить все незавершённые заказы WooCommerce через функции без плагинов
13.05.2026
WooCommerce: использование хука woocommerce_checkout_update_order_review для дополнительной валидации на этапе оформления
29.05.2026