Хук 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, включая работу с запросами.