WPExperts

Как использовать хук pre_get_posts для фильтрации запросов в WordPress

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

Что такое хук pre_get_posts и зачем он нужен в WordPress

Когда WordPress загружает страницу, он формирует запрос к базе данных для получения нужных записей. По умолчанию этот запрос зависит от типа страницы: главная страница, архивы, страница категории, поиск и т.д. Хук pre_get_posts срабатывает до выполнения запроса и позволяет изменить параметры этого запроса.

Например, с помощью pre_get_posts можно:

  • Фильтровать записи по дополнительным параметрам;
  • Исключать определённые записи или категории из вывода;
  • Изменять порядок сортировки;
  • Выводить на главной странице записи определённого кастомного типа;
  • И многое другое.

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

Основные параметры запроса, которые можно изменить через pre_get_posts

Объект запроса передаётся в функцию обратного вызова как экземпляр класса WP_Query. Вот основные свойства и методы, которые часто меняются:

  • set('post_type', 'custom_post_type') — изменить тип записей для вывода;
  • set('posts_per_page', 10) — задать количество записей на странице;
  • set('orderby', 'meta_value_num') и set('meta_key', 'rating') — сортировка по метаполю;
  • set('tax_query', array(...)) — фильтрация по таксономиям;
  • set('meta_query', array(...)) — фильтрация по метаполям;
  • set('post__not_in', array(1, 2, 3)) — исключить записи по ID;
  • и другие параметры WP_Query.

Пример: вывод только опубликованных записей кастомного типа на главной странице

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

function wpexperts_pre_get_posts_main_query($query) {
    if (!is_admin() && $query->is_main_query() && is_home()) {
        $query->set('post_type', 'product');
        $query->set('post_status', 'publish');
        $query->set('posts_per_page', 12);
    }
}
add_action('pre_get_posts', 'wpexperts_pre_get_posts_main_query');

Здесь мы убедились, что изменения применяются только к главному запросу на фронтенде (не в админке) и только на главной странице.

Фильтрация записей по метаполю и таксономии одновременно

Допустим, нужно в архиве кастомного типа выводить записи, у которых метаполе featured равно 1, а таксономия product_cat равна определённому значению.

function wpexperts_pre_get_posts_filter_meta_tax($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
        $meta_query = array(
            array(
                'key' => 'featured',
                'value' => '1',
                'compare' => '=',
            )
        );
        $tax_query = array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => 'electronics',
            )
        );
        $query->set('meta_query', $meta_query);
        $query->set('tax_query', $tax_query);
        $query->set('posts_per_page', 20);
    }
}
add_action('pre_get_posts', 'wpexperts_pre_get_posts_filter_meta_tax');

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

Исключение определённых записей из вывода на страницах архива

Зачастую нужно исключить записи по ID или по категории. Рассмотрим пример исключения записей с ID 5 и 7 на странице архива новостей.

function wpexperts_pre_get_posts_exclude_ids($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('news')) {
        $exclude_ids = array(5, 7);
        $query->set('post__not_in', $exclude_ids);
    }
}
add_action('pre_get_posts', 'wpexperts_pre_get_posts_exclude_ids');

Обратите внимание, что post__not_in принимает массив ID записей, которые нужно исключить.

Особенности использования pre_get_posts с плагинами и темами

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

  • Всегда проверять, что ваша функция применяет изменения только к нужному запросу (через is_main_query() и условия по типу страницы).
  • Использовать префиксы в названиях функций, чтобы избежать коллизий.
  • Тестировать изменения на разных страницах сайта.

Для примера, если вы используете тему Reboot от WPShop, она может иметь собственные запросы, поэтому стоит изучить её код и настроить фильтры аккуратно.

Реальный кейс: изменение пагинации для кастомных архивов с помощью pre_get_posts

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

Пример для архива типа portfolio с 6 элементами на страницу:

function wpexperts_pre_get_posts_portfolio_pagination($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('portfolio')) {
        $query->set('posts_per_page', 6);
    }
}
add_action('pre_get_posts', 'wpexperts_pre_get_posts_portfolio_pagination');

Так вы обеспечите правильную работу пагинации и удобство просмотра для пользователей.

Заключение: почему важно освоить pre_get_posts

Мастерство работы с хукми, в частности pre_get_posts, даёт возможность создавать действительно гибкие и мощные решения на WordPress без избыточного написания собственных запросов и без изменения основного кода. Это сохраняет совместимость с другими плагинами и темами, снижает вероятность ошибок и повышает производительность.

Если хотите ещё больше автоматизировать и упростить работу с запросами, обратите внимание на плагин Clearfy Pro — он предлагает удобные инструменты для оптимизации и настройки WordPress, включая работу с запросами.

×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »