wpcompany.ru wordpress WPCompany

Как использовать фильтры для изменения вывода WP_Query в WordPress

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.

×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре