В WordPress хук pre_get_posts является мощным инструментом для изменения основного запроса WP_Query до выполнения запроса к базе данных. Это позволяет разработчикам гибко фильтровать и модифицировать выборку постов без необходимости создавать свои собственные запросы с нуля.
Что такое хук pre_get_posts и зачем он нужен
Хук pre_get_posts вызывается до того, как WordPress выполнит запрос к базе данных для получения постов. Это дает возможность изменить параметры запроса, например, изменить количество выводимых постов, добавить дополнительные условия фильтрации, изменить порядок сортировки и многое другое.
Основное преимущество использования этого хука — централизованное изменение запросов без необходимости вмешательства в шаблоны или создание новых WP_Query. Особенно полезно для изменения главной страницы, архивов, категорий и поисковых результатов.
Важно помнить, что хук срабатывает для каждого запроса, включая административные, поэтому нужно аккуратно фильтровать, когда и какие изменения применять.
Пример 1: Фильтрация постов на главной странице по категории
Допустим, вы хотите, чтобы на главной странице сайта отображались только посты из категории с ID 5. Для этого используем хук следующим образом:
function wpid_filter_home_posts_by_category( $query ) {
if ( !is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'cat', 5 );
}
}
add_action( 'pre_get_posts', 'wpid_filter_home_posts_by_category' );Разбираем по шагам:
!is_admin()— исключаем административную панель;$query->is_main_query()— проверяем, что это основной запрос WordPress;$query->is_home()— условие для главной страницы;$query->set('cat', 5)— задаем фильтр по категории с ID 5.
Таким образом, на главной странице будут показаны только посты из нужной категории.
Пример 2: Исключение определенных постов из архива
Предположим, нужно исключить из архива с типом записи post несколько постов по ID, например, 12, 34 и 56. Сделаем это так:
function wpid_exclude_posts_from_archive( $query ) {
if ( !is_admin() && $query->is_main_query() && $query->is_archive() && $query->get('post_type') === 'post' ) {
$query->set( 'post__not_in', array( 12, 34, 56 ) );
}
}
add_action( 'pre_get_posts', 'wpid_exclude_posts_from_archive' );Объяснение:
- Проверяем, что запрос на фронтенде, основной и относится к архиву;
- Дополнительно убеждаемся, что тип записей — стандартные посты;
- С помощью
post__not_inисключаем указанные ID из выборки.
Использование pre_get_posts для настройки пагинации и сортировки
Хук позволяет не только фильтровать по условию, но и менять параметры сортировки и количество постов на странице. Например, чтобы на странице категории выводить по 10 постов, отсортированных по дате в обратном порядке:
function wpid_customize_category_query( $query ) {
if ( !is_admin() && $query->is_main_query() && $query->is_category() ) {
$query->set( 'posts_per_page', 10 );
$query->set( 'order', 'DESC' );
$query->set( 'orderby', 'date' );
}
}
add_action( 'pre_get_posts', 'wpid_customize_category_query' );Так можно гибко управлять выводом контента в различных частях сайта без правок в шаблонах.
Советы по безопасности и производительности при работе с pre_get_posts
Несмотря на мощь хука, есть несколько важных моментов:
- Всегда ограничивайте действие хука проверками
is_main_query()и условиями типа страницы, чтобы не влиять на административные запросы или сторонние WP_Query. - Не добавляйте тяжелые вычисления или запросы внутри функции — это может замедлить загрузку страниц.
- Используйте кеширование, если добавляете сложные фильтры, чтобы снизить нагрузку на сервер.
Пример расширенного фильтра с учетом пользовательских типов записей
Если на сайте есть кастомные типы записей, например product, можно изменить запрос архива этого типа:
function wpid_filter_custom_post_type_archive( $query ) {
if ( !is_admin() && $query->is_main_query() && $query->is_post_type_archive( 'product' ) ) {
$query->set( 'meta_key', 'wpid_product_price' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'posts_per_page', 20 );
}
}
add_action( 'pre_get_posts', 'wpid_filter_custom_post_type_archive' );В данном случае мы сортируем товары по цене, которая хранится в произвольном поле wpid_product_price, и ограничиваем вывод 20 элементами на страницу.
Заключение
Хук pre_get_posts — это универсальный и эффективный способ изменить стандартные запросы WordPress под конкретные задачи без создания новых запросов вручную. С его помощью можно легко фильтровать, сортировать, группировать и исключать посты, что делает его незаменимым инструментом для разработчиков и администраторов сайтов на WordPress.
Для удобства работы с фильтрацией и оптимизации запросов рекомендуем обратить внимание на плагины, которые помогают управлять запросами и кэшированием, например, Clearfy Pro. Он позволит облегчить настройку и повысить производительность сайта.