В WordPress хук pre_get_posts является мощным инструментом для изменения параметров запросов перед их выполнением. Он позволяет разработчикам гибко управлять выборкой записей без необходимости писать сложные SQL-запросы. В этой статье подробно разберём, как правильно использовать pre_get_posts, чтобы фильтровать главные и дополнительные запросы, а также рассмотрим примеры с пользовательскими типами записей и таксономиями.
Что такое хук pre_get_posts и зачем он нужен
Хук pre_get_posts запускается непосредственно перед выполнением WP_Query — основного класса WordPress для выборки постов. С его помощью можно изменить параметры запроса, например, фильтровать посты по категориям, тегам, метаданным, изменять количество постов на странице и многое другое.
Основное преимущество этого хука в том, что изменения применяются глобально и автоматически, без необходимости создавать собственные запросы или шаблоны. Это упрощает кастомизацию сайта и повышает производительность, так как не нужно дублировать логику выборки.
Важно понимать, что pre_get_posts срабатывает для всех WP_Query, включая запросы в админке, поэтому нужно правильно фильтровать, к каким именно запросам применять изменения.
Основные рекомендации по использованию pre_get_posts
Чтобы избежать нежелательных изменений, при работе с хуком следует всегда проверять контекст запроса. Как минимум, стоит фильтровать запросы на фронтенде, игнорируя админку, и различать главный запрос (main query) от дополнительных.
Пример базовой проверки:
function wparticles_pre_get_posts_filter( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// Ваши изменения параметров запроса
}
add_action( 'pre_get_posts', 'wparticles_pre_get_posts_filter' );Такая конструкция гарантирует, что изменения применятся только к главному запросу на фронтенде.
Пример 1: Фильтрация главной страницы по категории
Допустим, нужно на главной странице сайта показывать только записи из категории "Новости". Для этого в хуке меняем параметр cat:
function wparticles_filter_home_category( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( is_home() ) {
// ID категории "Новости"
$news_cat_id = 5;
$query->set( 'cat', $news_cat_id );
}
}
add_action( 'pre_get_posts', 'wparticles_filter_home_category' );Теперь на главной странице будут отображаться только записи указанной категории.
Пример 2: Фильтрация пользовательского типа записей по таксономии
Если на сайте есть кастомный тип поста wparticles_article с таксономией wparticles_topic, можно выбрать только записи с нужным термином таксономии:
function wparticles_filter_custom_post_type( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( is_post_type_archive( 'wparticles_article' ) ) {
$tax_query = array(
array(
'taxonomy' => 'wparticles_topic',
'field' => 'slug',
'terms' => 'wordpress-tips',
),
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'wparticles_filter_custom_post_type' );В результате на архиве типа wparticles_article будут показываться только статьи с темой wordpress-tips.
Пример 3: Исключение определённых записей из главного запроса
Иногда нужно скрыть из главного потока записи с определёнными ID. Для этого можно использовать параметр post__not_in:
function wparticles_exclude_posts_from_main_query( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
$exclude_ids = array( 12, 34, 56 );
$query->set( 'post__not_in', $exclude_ids );
}
add_action( 'pre_get_posts', 'wparticles_exclude_posts_from_main_query' );Теперь записи с ID 12, 34 и 56 не будут выводиться на сайте в главном запросе.
Практические советы и подводные камни при работе с pre_get_posts
1. Проверяйте контекст запроса. Обязательно исключайте админку через is_admin(), чтобы не ломать запросы в панели управления.
2. Используйте is_main_query()
3. Не забывайте про пагинацию. Если меняете параметры, проверьте, что пагинация работает корректно, и параметр paged передаётся.
4. Для сложных условий формируйте массивы tax_query, meta_query и другие параметры, чтобы добиться точной фильтрации.
5. Тестируйте изменения тщательно, особенно если на сайте много кастомных типов, таксономий и плагинов, которые могут влиять на запросы.
Использование плагинов для упрощения работы с запросами
Если хочется визуально управлять фильтрацией запросов, можно обратить внимание на плагины, которые помогают создавать условия без программирования. Например:
- Clearfy Pro — оптимизация и расширение возможностей WordPress, включая управление запросами.
- WPRemark — оценка и улучшение контента с возможностью фильтрации и анализа.
Хотя эти плагины не заменят кастомный код, они могут помочь в комплексной работе с контентом и запросами.
Выводы
Хук pre_get_posts — это незаменимый инструмент для разработчика WordPress, позволяющий гибко управлять выборкой записей без изменения ядра и шаблонов. Правильное использование этого хука поможет создавать более динамичные и адаптированные под задачи сайта страницы. Внимательное тестирование и соблюдение рекомендаций обеспечат стабильную работу и удобство поддержки.