Динамические фильтры в WordPress позволяют пользователям быстро находить нужный контент по различным параметрам, таким как категории, теги, пользовательские поля и таксономии. Особенно актуально это для интернет-магазинов, каталогов и больших блогов. В этой статье мы подробно разберем, как добавить динамические фильтры на сайт WordPress с помощью кода и плагинов, а также рассмотрим примеры реализации.
Зачем нужны динамические фильтры в WordPress
Если на сайте много записей, товаров или материалов, пользователю сложно быстро найти то, что ему нужно. Динамические фильтры помогают:
- Сократить время поиска контента;
- Повысить удобство навигации;
- Улучшить пользовательский опыт;
- Повысить конверсию в интернет-магазинах;
- Сделать интерфейс более современным и интерактивным.
Для создания фильтров можно использовать готовые плагины, либо написать собственное решение, если нужны нестандартные функции.
Создание динамических фильтров через код в WordPress
Рассмотрим пример добавления динамического фильтра по пользовательской таксономии product_brand для типа записи product. Фильтр будет выводить список брендов, и при выборе будет показывать только записи с этим брендом.
Регистрация пользовательской таксономии
Если таксономия еще не создана, добавим её в файл functions.php вашей темы или в плагин:
function wptem_register_product_brand_taxonomy() {
$labels = array(
'name' => 'Бренды',
'singular_name' => 'Бренд',
'search_items' => 'Искать бренды',
'all_items' => 'Все бренды',
'edit_item' => 'Редактировать бренд',
'update_item' => 'Обновить бренд',
'add_new_item' => 'Добавить новый бренд',
'new_item_name' => 'Название нового бренда',
'menu_name' => 'Бренды',
);
register_taxonomy('product_brand', 'product', array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'brand'),
));
}
add_action('init', 'wptem_register_product_brand_taxonomy');Вывод фильтра в шаблоне
Добавим в файл шаблона (например, archive-product.php) вывод списка брендов с ссылками:
function wptem_get_product_brand_filter() {
$terms = get_terms(array(
'taxonomy' => 'product_brand',
'hide_empty' => true,
));
if (!empty($terms) && !is_wp_error($terms)) {
echo '<ul class="wptem-filter-brands">';
echo '<li><a href="'.esc_url(get_post_type_archive_link('product')).'">Все бренды</a></li>';
foreach ($terms as $term) {
$term_link = get_term_link($term);
echo '<li><a href="'.esc_url($term_link).'">'.esc_html($term->name).'</a></li>';
}
echo '</ul>';
}
}В нужном месте шаблона вызовите wptem_get_product_brand_filter().
Фильтрация записей по выбранной таксономии
WordPress сам обработает параметр в URL и выведет записи по выбранному термину таксономии благодаря стандартному запросу архива. Если нужно добавить дополнительные параметры или фильтровать по нескольким параметрам, используйте хук pre_get_posts:
function wptem_filter_products_by_brand($query) {
if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
if (!empty($_GET['brand'])) {
$query->set('tax_query', array(
array(
'taxonomy' => 'product_brand',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['brand']),
)
));
}
}
}
add_action('pre_get_posts', 'wptem_filter_products_by_brand');Теперь можно формировать URL вида https://your-site.ru/product/?brand=brand-slug для фильтрации.
Использование плагинов для динамических фильтров
Если хочется более гибкие и визуальные решения, рассмотрите плагины:
- Filter Everything — мощный плагин для создания фильтров по любым таксономиям, метаполям, типам записей. Позволяет строить AJAX-фильтры.
- WOOF – Products Filter for WooCommerce — отлично подходит для интернет-магазинов на WooCommerce, умеет фильтровать по атрибутам, ценам, категориям.
- FacetWP — платный, но очень удобный и быстрый фильтр с поддержкой AJAX, кэширования и сложных условий.
- Clearfy Pro — содержит оптимизации и дополнительные расширения, которые могут помочь с фильтрами и производительностью.
Для интеграции с WPShop-плагинами, например, с WPRemark, можно использовать фильтры для отзывов и рейтингов, улучшая взаимодействие с пользователем.
Добавление AJAX-фильтра для улучшения UX
Чтобы фильтр не перезагружал всю страницу, а обновлял результаты динамически, можно сделать AJAX-реализацию.
Пример AJAX фильтрации по таксономии
1. В шаблоне выводим фильтр с чекбоксами:
<form id="wptem-filter-form">
<?php
$terms = get_terms('product_brand');
foreach ($terms as $term) {
echo '<label><input type="checkbox" name="brand[]" value="'.esc_attr($term->slug).'">'.esc_html($term->name).'</label> <br>';
}
?>
<button type="submit">Фильтровать</button>
</form>
<div id="wptem-filter-results"></div>2. JavaScript для отправки AJAX-запроса:
jQuery(document).ready(function($) {
$('#wptem-filter-form').on('submit', function(e) {
e.preventDefault();
var brands = [];
$('input[name="brand[]"]:checked').each(function() {
brands.push($(this).val());
});
$.ajax({
url: wptem_ajax_object.ajax_url,
type: 'POST',
data: {
action: 'wptem_filter_products',
brands: brands
},
success: function(response) {
$('#wptem-filter-results').html(response);
}
});
});
});3. PHP обработчик AJAX в functions.php:
function wptem_filter_products_ajax() {
$brands = isset($_POST['brands']) ? array_map('sanitize_text_field', $_POST['brands']) : array();
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
);
if (!empty($brands)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'product_brand',
'field' => 'slug',
'terms' => $brands,
'operator' => 'IN',
),
);
}
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<div><a href="'.get_permalink().'">'.get_the_title().'</a></div>';
}
} else {
echo '<p>Товары не найдены.</p>';
}
wp_reset_postdata();
wp_die();
}
add_action('wp_ajax_wptem_filter_products', 'wptem_filter_products_ajax');
add_action('wp_ajax_nopriv_wptem_filter_products', 'wptem_filter_products_ajax');4. Не забудьте локализовать скрипт и передать AJAX URL:
function wptem_enqueue_scripts() {
wp_enqueue_script('wptem-filter', get_template_directory_uri() . '/js/wptem-filter.js', array('jquery'), null, true);
wp_localize_script('wptem-filter', 'wptem_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php'),
));
}
add_action('wp_enqueue_scripts', 'wptem_enqueue_scripts');Советы по оптимизации и безопасности динамических фильтров
При создании фильтров важно учитывать производительность и безопасность:
- Используйте
sanitize_text_fieldи другие функции очистки для входных данных. - Кэшируйте результаты запросов, особенно если фильтров много и запросы сложные.
- Используйте AJAX для улучшения UX, но не забывайте об обработке ошибок и fallback.
- Минимизируйте количество запросов к базе, оптимизируя WP_Query.
- Для крупных проектов рассмотрите использование плагинов с поддержкой индексации и быстрого поиска.
Заключение
Добавление динамических фильтров в WordPress — задача, которую можно решить как простым кодом, так и с помощью мощных плагинов. Важно выбирать подход, который соответствует именно вашим требованиям и объему сайта. Приведенные примеры кода помогут быстро стартовать с собственной реализацией, а рекомендации по плагинам позволят расширить функциональность без лишних затрат времени.
Для улучшения отзывов и рейтингов фильтров можно интегрировать WPRemark, что повысит доверие пользователей к вашему сайту.