Как создать фильтрованный вывод постов в WordPress с помощью кода

Почему фильтрация постов важна для сайтов на WordPress

Фильтрация постов позволяет пользователям быстро находить интересующий контент на сайте. Например, если у вас блог с большим количеством статей или интернет-магазин на WooCommerce, возможность отфильтровать записи по категориям, тегам, дате или произвольным полям значительно улучшает пользовательский опыт. Кроме того, правильная реализация фильтров повышает время нахождения посетителей на сайте и влияет на SEO.

Несмотря на существование множества готовых плагинов, иногда требуется гибкая настройка или интеграция фильтров в уникальный дизайн и логику сайта. В таких случаях полезно уметь создавать фильтрацию с помощью собственного кода.

Создание базового фильтра вывода постов с WP_Query

Для выборки и фильтрации записей в WordPress используется класс WP_Query. Рассмотрим пример создания фильтра, который позволяет отбирать записи по категории и произвольному полю.

Допустим, у нас есть записи с таксономией category и произвольным полем price (например, для товаров или обзоров). Мы хотим вывести все записи из категории "gadgets" с ценой меньше 10000.

function wpset_filter_posts_example() {
    $args = [
        'post_type' => 'post',
        'tax_query' => [
            [
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => 'gadgets',
            ],
        ],
        'meta_query' => [
            [
                'key'     => 'price',
                'value'   => 10000,
                'type'    => 'NUMERIC',
                'compare' => '<',
            ],
        ],
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        echo '<ul>';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> - Цена: ' . get_post_meta(get_the_ID(), 'price', true) . '</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Посты не найдены.</p>';
    }

    wp_reset_postdata();
}

Этот код можно вставить в шаблон страницы или в кастомный шорткод, чтобы выводить отфильтрованные записи. Важно всегда использовать wp_reset_postdata() после работы с WP_Query, чтобы избежать конфликтов с основным циклом WordPress.

Добавление пользовательского фильтра через форму и обработку параметров

Чтобы дать пользователям возможность самим выбирать параметры фильтрации, можно создать HTML-форму и обрабатывать её данные в PHP.

Пример формы фильтрации

Добавим форму с выбором категории и диапазона цены:

<form method="GET" action="">
    <label>Категория:
        <select name="category">
            <option value="">Все</option>
            <option value="gadgets">Гаджеты</option>
            <option value="books">Книги</option>
        </select>
    </label>
    <label>Максимальная цена:
        <input type="number" name="max_price" min="0" />
    </label>
    <input type="submit" value="Фильтровать" />
</form>

Обработка параметров и вывод фильтрованных постов

function wpset_filter_posts_from_form() {
    $args = [
        'post_type' => 'post',
        'posts_per_page' => 10,
    ];

    if (!empty($_GET['category'])) {
        $args['tax_query'] = [[
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => sanitize_text_field($_GET['category']),
        ]];
    }

    if (!empty($_GET['max_price']) && is_numeric($_GET['max_price'])) {
        $args['meta_query'] = [[
            'key'     => 'price',
            'value'   => intval($_GET['max_price']),
            'type'    => 'NUMERIC',
            'compare' => '<=',
        ]];
    }

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        echo '<ul>';
        while ($query->have_posts()) {
            $query->the_post();
            $price = get_post_meta(get_the_ID(), 'price', true);
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> - Цена: ' . esc_html($price) . '</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Посты не найдены по заданным параметрам.</p>';
    }

    wp_reset_postdata();
}

Такой подход позволяет создавать удобные интерфейсы фильтров с минимальными знаниями PHP и WordPress.

Использование плагинов для расширенной фильтрации

Если вы хотите получить более мощные и готовые решения, обратите внимание на плагины с поддержкой AJAX и продвинутой фильтрацией:

  • Clearfy Pro — оптимизация и расширение функционала, включая фильтры.
  • ABC Pagination — умная пагинация в сочетании с фильтрами.
  • WPRemark — отзывы и рейтинги, которые можно использовать в фильтрах.

Эти инструменты помогут быстро внедрить сложные фильтры без глубокого погружения в код.

Рекомендации по оптимизации фильтров и запросов

При создании фильтрованного вывода важно учитывать производительность. WP_Query с большим количеством условий может замедлять сайт, особенно на больших базах данных.

Чтобы улучшить скорость:

  • Используйте индексы в базе данных для мета-полей и таксономий.
  • Кешируйте результаты фильтров с помощью Object Cache или внешних решений, например Redis.
  • Ограничивайте количество выводимых записей и добавляйте пагинацию.
  • Используйте AJAX-загрузку, чтобы загружать посты без перезагрузки страницы.

Также полезно проверять и тестировать запросы с помощью плагинов для отладки, например Query Monitor.

Заключение

Создание фильтрованного вывода постов в WordPress — важный навык для разработчиков, позволяющий создавать удобные интерфейсы и улучшать юзабилити сайтов. Использование WP_Query с правильными параметрами, обработка пользовательских данных и оптимизация запросов — ключевые шаги для успешной реализации.

Если нужен более простой путь, рекомендуем обратить внимание на плагины из каталога WPSHOP, которые помогут расширить функционал с минимальными усилиями.

Как сделать автоматический редирект после удаления записи в WordPress
17.12.2025
WooCommerce: автоматическое удаление неактивных вариаций товаров
02.06.2026
Как удалить неиспользуемые метаполя в WordPress: практическое руководство
12.02.2026
Как добавить собственный тип записи в WordPress
09.11.2025
Как удалить удалённые комментарии в WordPress: практическое руководство
07.12.2025