Как создать фильтры для курсов в WordPress

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

Как создать автоматический импорт курсов из внешнего источника в WordPress
11.04.2026
WooCommerce: автоматическое удаление неактивных заказов по расписанию
11.06.2026
Как использовать хук WooCommerce order status change для автоматизации
26.04.2026
Безопасное удаление старого кода и функций из WordPress
15.02.2026
Как создать собственный виджет в WordPress: подробное руководство с примерами кода
18.11.2025