Хук pre_get_posts — один из самых мощных и гибких в WordPress, позволяющий изменить параметры основного запроса до его выполнения. Это открывает широкие возможности для фильтрации, сортировки и ограничения отображаемых записей без необходимости создавать дополнительные запросы.
Что такое pre_get_posts и зачем он нужен
Когда WordPress формирует страницу с записями, он создает объект WP_Query с параметрами по умолчанию. Хук pre_get_posts позволяет перехватить этот объект перед выполнением запроса и изменить параметры выборки — например, добавить таксономию, изменить количество записей, исключить посты из определенных категорий и многое другое.
Это особенно полезно, если нужно настроить главную страницу, архивы, результаты поиска или любые другие запросы без дублирования кода и дополнительных запросов к базе.
Основные параметры WP_Query для фильтрации
Перед тем как менять параметры через pre_get_posts, нужно понимать, какие аргументы WP_Query доступны для фильтрации. Среди самых популярных:
post_type— тип записей (post, page, custom post type);posts_per_page— количество записей на страницу;category_nameилиcat— фильтрация по категориям;tagилиtag_slug__in— по тегам;meta_query— фильтрация по метаданным;tax_query— фильтрация по таксономиям;orderbyиorder— сортировка.
Можно комбинировать несколько условий, чтобы получить именно те записи, которые нужны.
Пример 1: Фильтрация главной страницы по определенной категории
Допустим, на главной странице сайта нужно показывать только записи из категории с ярлыком novosti. Для этого добавим следующий код в файл functions.php вашей темы:
function wp24_filter_home_category( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'category_name', 'novosti' );
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'wp24_filter_home_category' );Здесь мы проверяем, что запрос не из админки, основной и для главной страницы, и задаем параметры выборки — категория и количество постов. Это простой и эффективный способ контролировать контент главной страницы.
Пример 2: Исключение определенных записей из архива
Иногда нужно исключить из вывода записи по их ID, например, скрыть определенный материал из архива блога. Вот код для этого:
function wp24_exclude_posts_from_archive( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_archive() ) {
$exclude_ids = array( 10, 25, 36 ); // ID записей для исключения
$query->set( 'post__not_in', $exclude_ids );
}
}
add_action( 'pre_get_posts', 'wp24_exclude_posts_from_archive' );Это позволит убрать нежелательные записи из архивных страниц без удаления их из базы или создания дополнительных фильтров.
Пример 3: Фильтрация записей по метаполю
Если у записей есть пользовательское поле, например, featured со значением yes, можно вывести на главной только такие записи:
function wp24_filter_featured_posts( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$meta_query = array(
array(
'key' => 'featured',
'value' => 'yes',
'compare' => '=',
),
);
$query->set( 'meta_query', $meta_query );
}
}
add_action( 'pre_get_posts', 'wp24_filter_featured_posts' );Так вы можете динамически управлять контентом на сайте, используя метаполя.
Советы и лучшие практики при работе с pre_get_posts
1. Всегда проверяйте контекст запроса. Используйте методы is_main_query(), is_home(), is_archive() и другие, чтобы не менять запросы в админке и на сторонних страницах.
2. Не создавайте бесконечные циклы. Избегайте вызова query_posts() внутри функции с pre_get_posts — это может привести к ошибкам.
3. Для сложных фильтров используйте tax_query и meta_query. Они позволяют гибко комбинировать условия.
4. Оптимизируйте запросы. Слишком сложные запросы могут замедлить сайт. Используйте кэширование и минимизируйте количество условий.
Использование плагинов для расширения возможностей фильтрации
Если хочется упростить работу с фильтрами, можно использовать плагины, которые расширяют функциональность WP_Query и интерфейс админки.
Например:
- Clearfy Pro — оптимизирует работу сайта и улучшает запросы;
- WPRemark — добавляет расширенные возможности комментариев и фильтрации;
- ABC Pagination — улучшает пагинацию и навигацию по записям.
Интеграция таких инструментов с кастомными фильтрами через pre_get_posts позволяет создать мощный и удобный сайт на WordPress.
Заключение
Хук pre_get_posts — незаменимый инструмент для разработчика WordPress, который дает полный контроль над выборкой записей. Правильное его применение позволяет оптимизировать сайт, улучшить пользовательский опыт и реализовать любые нестандартные задачи по отображению контента.
Используйте приведённые примеры и рекомендации в своих проектах, и вы увидите, как легко можно управлять контентом без громоздких решений и плагинов.