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

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

Основы создания фильтрованного списка постов в WordPress

Первый шаг — это формирование корректного запроса к базе данных с помощью класса WP_Query. Чтобы получить посты с нужными параметрами, используйте массив аргументов. Например, для вывода постов определённой категории с постраничной навигацией:

$args = [
    'post_type' => 'post',
    'posts_per_page' => 5,
    'category_name' => 'novosti',
    'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
];

$query = new WP_Query($args);

Здесь paged отвечает за номер текущей страницы пагинации. Важно корректно получать это значение, чтобы пагинация работала.

После создания объекта запроса необходимо вывести посты в цикле:

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        // Выводим заголовок и ссылку
        echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
        // Вывод краткого содержания
        the_excerpt();
    }
    wp_reset_postdata();
} else {
    echo '<p>Записей не найдено.</p>';
}

Добавление пагинации с поддержкой ЧПУ

Чтобы пагинация была удобной и SEO-дружественной, используйте функцию paginate_links(). Она генерирует ссылки с правильным форматированием и учитывает настройки постоянных ссылок WordPress.

$big = 999999999; // уникальное число для замены

echo paginate_links([
    'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
    'format' => '?paged=%#%',
    'current' => max(1, get_query_var('paged')),
    'total' => $query->max_num_pages,
]);

Разместите этот код после цикла вывода постов. Таким образом, пользователь сможет переключаться между страницами, а поисковики будут индексировать их корректно.

Расширение фильтрации: добавляем выбор по произвольному полю

Часто требуется фильтровать записи не только по категориям, но и по произвольным полям (метаполям). Например, выводить посты только с определённым значением метаполя event_date. Для этого в аргументах запроса добавим параметр meta_query:

$args['meta_query'] = [
    [
        'key' => 'event_date',
        'value' => date('Y-m-d'),
        'compare' => '>=',
        'type' => 'DATE'
    ]
];

Этот пример выберет только те посты, у которых дата события не меньше сегодняшней.

Можно комбинировать несколько условий в meta_query, используя ключи relation => 'AND' или 'OR'.

Добавление AJAX-фильтрации без перезагрузки страницы

Чтобы улучшить UX, можно реализовать AJAX-фильтрацию — пользователь выбирает фильтры, и список постов обновляется динамически без перезагрузки.

Ниже представлен упрощённый пример AJAX-запроса и обработки в плагине или functions.php темы.

JS код для отправки AJAX-запроса

jQuery(document).ready(function($) {
    $('#filter-form').on('submit', function(e) {
        e.preventDefault();
        var data = {
            action: 'wpblog_filter_posts',
            category: $('#category-select').val(),
            paged: 1
        };
        $.post(wpblog_ajax.url, data, function(response) {
            $('#posts-container').html(response);
        });
    });
});

PHP обработчик AJAX

add_action('wp_ajax_wpblog_filter_posts', 'wpblog_ajax_filter_posts');
add_action('wp_ajax_nopriv_wpblog_filter_posts', 'wpblog_ajax_filter_posts');

function wpblog_ajax_filter_posts() {
    $category = sanitize_text_field($_POST['category']);
    $paged = isset($_POST['paged']) ? intval($_POST['paged']) : 1;

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

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
            the_excerpt();
        }
    } else {
        echo '<p>Записей не найдено.</p>';
    }
    wp_die();
}

Не забудьте локализовать скрипт и передать параметр wpblog_ajax.url с помощью wp_localize_script.

Рекомендации по безопасности и производительности

При создании фильтров и пагинации стоит помнить о следующих моментах:

  • Всегда используйте функции очистки данных, такие как sanitize_text_field или intval, для входящих параметров.
  • Минимизируйте количество запросов к базе, используйте кеширование результатов (например, с помощью Transients API).
  • Для больших сайтов оптимизируйте запросы и индексы базы данных, особенно если часто фильтруете по метаполям.
  • Проверяйте корректность работы пагинации при изменении параметров пермалинков.

Пример полезного плагина для фильтрации и пагинации

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

Для расширенных фильтров можно использовать WPRemark, который позволяет создавать кастомные фильтры и формы для вывода постов.

Вывод

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

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как установить ограничения на загрузку файлов в WordPress
08.03.2026
WooCommerce: как правильно удалять товары с очисткой связанных данных
16.05.2026
Как автоматически удалять старый контент в WordPress по дате публикации
12.03.2026
Создать автоматические бэкапы WordPress без плагинов: практическое руководство
30.11.2025
Как отключить автовоспроизведение видео в WordPress: практическое руководство
19.03.2026
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙