WP_Query — это один из самых мощных классов WordPress для выборки записей из базы данных. Однако стандартный вывод результатов часто требует доработки под конкретные задачи. В этой статье мы подробно рассмотрим, как с помощью фильтров изменить вывод WP_Query, чтобы получить гибкое и кастомное отображение контента без избыточного дублирования кода.
Что такое фильтры в WordPress и почему они важны для WP_Query
Фильтры в WordPress — это хуки, позволяющие изменить данные в процессе их обработки. В случае WP_Query фильтры дают возможность вмешаться в SQL-запрос, параметры выборки, а также в формирование HTML-вывода. Это намного удобнее, чем писать полностью собственный цикл с нуля, особенно если нужно адаптировать существующие шаблоны.
Основные фильтры, связанные с WP_Query:
pre_get_posts— позволяет изменить параметры запроса перед выполнением.the_posts— фильтрует массив записей после выборки.posts_where,posts_join,posts_orderby— дают возможность подкорректировать SQL-запрос.
Разберем на примерах, как использовать эти фильтры для решения реальных задач.
Используем filter pre_get_posts для изменения параметров запроса
Частая задача — изменить количество отображаемых постов на главной странице или в категории без изменения шаблона. Для этого удобно использовать фильтр pre_get_posts. Вот пример функции, которая изменяет количество постов в главном запросе:
function wpcompany_pre_get_posts_modify(\WP_Query $query) {
if ( !is_admin() && $query->is_main_query() ) {
if ( is_home() ) {
$query->set('posts_per_page', 5);
$query->set('post_type', 'post');
}
}
}
add_action('pre_get_posts', 'wpcompany_pre_get_posts_modify');Здесь мы проверяем, что это не админка и главный запрос, затем меняем параметры. Этот способ позволяет гибко настраивать выборку без дублирования кода в шаблоне.
Изменение параметров выборки по пользовательским условиям
Можно даже фильтровать по мета-полям или таксономиям. Например, выводить только посты с кастомным полем featured:
function wpcompany_filter_featured_posts(\WP_Query $query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$meta_query = array(
array(
'key' => 'featured',
'value' => '1',
'compare' => '='
)
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wpcompany_filter_featured_posts');Это простое решение, позволяющее без изменения шаблонов выводить только нужные записи.
Фильтрация массива записей с помощью the_posts
Иногда нужно не менять параметры запроса, а обработать уже полученный массив постов. Для этого используется фильтр the_posts. Рассмотрим пример, где мы исключаем из вывода записи с определенным ID:
function wpcompany_exclude_posts_from_loop($posts) {
foreach ($posts as $key => $post) {
if (in_array($post->ID, array(10, 20))) {
unset($posts[$key]);
}
}
return $posts;
}
add_filter('the_posts', 'wpcompany_exclude_posts_from_loop');Этот способ полезен, если нужно динамически исключать записи из любого запроса, например, при использовании плагинов или виджетов.
Модификация SQL-запроса через posts_where, posts_join и другие фильтры
Для продвинутых случаев можно модифицировать SQL-запрос напрямую. Например, добавим условие в WHERE для выборки постов, где заголовок содержит определенное слово:
function wpcompany_posts_where_title( $where, \WP_Query $query ) {
global $wpdb;
if ( $query->get('wpcompany_title_filter') ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title LIKE %s", '%Special%');
}
return $where;
}
add_filter( 'posts_where', 'wpcompany_posts_where_title', 10, 2 );Чтобы использовать этот фильтр, нужно передать параметр wpcompany_title_filter в аргументы WP_Query:
$args = array(
'post_type' => 'post',
'wpcompany_title_filter' => true,
);
$query = new WP_Query($args);Такой метод дает максимальную гибкость, но требует аккуратности, чтобы не привести к ошибкам SQL.
Пример комплексного решения: кастомный вывод постов с использованием фильтров и шаблонов
Представим, что нам нужно вывести на странице блога посты с определенным мета-полем, исключая некоторые категории, и поменять порядок сортировки. Можно объединить несколько фильтров:
function wpcompany_custom_blog_query(\WP_Query $query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('meta_key', 'highlight');
$query->set('meta_value', '1');
$query->set('category__not_in', array(5, 9));
$query->set('orderby', 'date');
$query->set('order', 'DESC');
}
}
add_action('pre_get_posts', 'wpcompany_custom_blog_query');Далее, чтобы изменить HTML-вывод, можно переопределить шаблон content.php в своей теме или добавить фильтр на the_content для дополнительной обработки контента.
Рекомендуемые плагины для работы с WP_Query и фильтрами
Для удобства можно использовать плагины, которые облегчают работу с запросами и фильтрами:
- Clearfy Pro — оптимизация и управление запросами.
- WPRemark — добавление отзывов с кастомной логикой вывода.
- WPStories — для создания интерактивных историй с гибким выбором контента.
Использование таких плагинов вместе с фильтрами WP_Query позволит создать мощный и адаптивный сайт на WordPress.