В работе с 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-функционала для динамического обновления контента. Используя описанные примеры и рекомендации, вы сможете реализовать гибкий и производительный инструмент вывода контента на вашем сайте.