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