Если вы ведёте образовательный сайт на WordPress, например, с курсами, то рано или поздно возникает задача — улучшить навигацию и дать пользователям возможность быстро находить нужные курсы по различным параметрам. В этой статье рассмотрим, как создать удобные фильтры для курсов на WordPress без использования тяжеловесных конструкторов, применяя собственный код и популярные плагины.
Зачем нужны фильтры на сайте с курсами
Фильтры помогают посетителям быстро отобрать курсы по категориям, уровню сложности, стоимости, длительности и другим параметрам. Это повышает конверсию, улучшает пользовательский опыт и снижает нагрузку на поддержку.
Типичные параметры фильтрации для курсов:
- Категории (например, дизайн, программирование, маркетинг)
- Уровень сложности (начальный, средний, продвинутый)
- Цена (бесплатные, платные)
- Формат (видео, текст, комбинированный)
- Продолжительность (до 5 часов, 5-10 часов, более 10 часов)
Как организовать курсы в WordPress для фильтрации
Для начала рекомендуем использовать собственный тип записи (custom post type) для курсов. Если вы ещё не сделали этого, можно быстро создать тип записи с помощью кода или плагина, например, Custom Post Type UI.
Далее создайте таксономии (так называемые категории и метки) для курсов. Например, таксономии «Категория курса» и «Уровень сложности».
Пример регистрации таксономии в functions.php темы:
function wpfreecourses_register_taxonomies() {
register_taxonomy('course_level', 'courses', array(
'label' => 'Уровень сложности',
'hierarchical' => true,
'show_ui' => true,
'rewrite' => array('slug' => 'level'),
));
}
add_action('init', 'wpfreecourses_register_taxonomies');
Создание формы фильтрации на фронтенде
Для фильтрации курсов можно использовать простой HTML с выпадающими списками (select) для каждой из таксономий и мета-полей. Далее отправлять форму методом GET и перехватывать параметры в запросе.
Пример формы фильтрации
<form method="GET" action="">
<label>Категория:</label>
<select name="course_cat">
<option value="">Все</option>
<?php
$terms = get_terms(array('taxonomy' => 'course_category', 'hide_empty' => false));
foreach ($terms as $term) {
$selected = (isset($_GET['course_cat']) && $_GET['course_cat'] == $term->slug) ? 'selected' : '';
echo "<option value=\"{$term->slug}\" $selected>{$term->name}</option>";
}
?>
</select>
<label>Уровень:</label>
<select name="course_level">
<option value="">Все</option>
<?php
$levels = get_terms(array('taxonomy' => 'course_level', 'hide_empty' => false));
foreach ($levels as $level) {
$selected = (isset($_GET['course_level']) && $_GET['course_level'] == $level->slug) ? 'selected' : '';
echo "<option value=\"{$level->slug}\" $selected>{$level->name}</option>";
}
?>
</select>
<input type="submit" value="Фильтровать" />
</form>
Такой фильтр даст пользователям возможность выбрать категорию и уровень курса.
Обработка фильтрации в запросе WP_Query
Чтобы вывести курсы с учётом выбранных фильтров, нужно изменить параметры запроса WP_Query. Пример функции, которая формирует запрос с фильтрами:
function wpfreecourses_get_filtered_courses() {
$tax_query = array('relation' => 'AND');
if (!empty($_GET['course_cat'])) {
$tax_query[] = array(
'taxonomy' => 'course_category',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['course_cat']),
);
}
if (!empty($_GET['course_level'])) {
$tax_query[] = array(
'taxonomy' => 'course_level',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['course_level']),
);
}
$args = array(
'post_type' => 'courses',
'posts_per_page' => 10,
'tax_query' => $tax_query,
);
$query = new WP_Query($args);
return $query;
}
Вывод результатов можно сделать через цикл:
$courses = wpfreecourses_get_filtered_courses();
if ($courses->have_posts()) {
while ($courses->have_posts()) {
$courses->the_post();
echo '<h3>' . get_the_title() . '</h3>';
echo get_the_excerpt();
}
wp_reset_postdata();
} else {
echo '<p>Курсы не найдены</p>';
}
Расширение фильтров с мета-полями (например, цена и длительность)
Если у курсов есть дополнительные данные, сохранённые в мета-полях, можно добавить фильтрацию по ним через meta_query.
Пример выбора бесплатных курсов (meta ключ 'price' = 0):
if (isset($_GET['price_free']) && $_GET['price_free'] == '1') {
$args['meta_query'][] = array(
'key' => 'price',
'value' => 0,
'compare' => '=',
'type' => 'NUMERIC',
);
}
Для диапазона длительности (например, от 5 до 10 часов) можно сделать так:
$meta_query[] = array(
'key' => 'duration',
'value' => array(5, 10),
'compare' => 'BETWEEN',
'type' => 'NUMERIC',
);
Добавьте эти условия в общий массив meta_query при формировании аргументов WP_Query.
Использование плагинов для удобства создания фильтров
Если не хочется писать код, можно воспользоваться плагинами, которые предоставляют удобные визуальные фильтры:
- FacetWP — мощный плагин для фильтрации по таксономиям, мета-полям, поиску.
- Advanced AJAX Product Filters — адаптируется под любые типы записей, поддерживает ajax.
- WPCommunity — если сайт сообщество, можно встроить фильтры для курсов и обсуждений.
Оптимизация и кеширование фильтров
При большом количестве курсов и сложных фильтрах важно оптимизировать запросы и использовать кеширование, чтобы не перегружать сервер. Для этого можно применять Transients API или плагины кеширования.
Пример сохранения результатов фильтрации в transient:
$transient_key = 'wpfreecourses_filter_' . md5(serialize($_GET));
$courses = get_transient($transient_key);
if (false === $courses) {
$courses = wpfreecourses_get_filtered_courses();
set_transient($transient_key, $courses, 3600); // кеш на 1 час
}
Это позволит значительно ускорить повторные запросы с одинаковыми параметрами фильтрации.
Вывод
Создание фильтров для курсов — важный этап в развитии образовательного сайта. Используя собственные типы записей, таксономии, мета-поля и WP_Query, можно реализовать гибкую и удобную систему фильтрации. При необходимости — подключить готовые плагины для расширенной функциональности. А кеширование поможет удерживать производительность сайта на высоком уровне.