Статьи

Освоение WP_Query: действия и фильтры

Добро пожаловать в третью часть нашей серии под названием «Мастеринг WP_Query». В предыдущей части мы рассмотрели 13 функций WordPress, связанных с классом WP_Query . В этой части мы рассмотрим хуки WordPress (фильтры и действия), которые вы можете использовать вместе с WP_Query .

Итак, без лишних слов, давайте начнем!

В «Справочнике по фильтрам» Кодекса есть 16 фильтров WordPress, перечисленных под заголовком «Фильтры WP_Query». В этом разделе мы поговорим о них. Это будет довольно быстрый раздел, потому что большинство фильтров относятся к разным «предложениям» запроса к базе данных, сделанного классом WP_Query .

Мы вернемся к ним сразу после прохождения фильтров, которые не связаны с пунктами.

Этот фильтр позволяет изменять количество найденных элементов без ограничения, которое posts_per_page аргументом posts_per_page .

Этот фильтр особенно полезен для создания пользовательской нумерации страниц. Давайте посмотрим, что говорит Кодекс :

Например, если вы объявляете пользовательское значение смещения в своих запросах, WordPress НЕ вычтет смещение из параметра $ wp_query-> found_posts (например, если у вас есть 45 используемых сообщений после смещения 10, WordPress будет игнорировать смещение и по-прежнему дают found_posts значение 55).

Имеет смысл.

Количество найденных элементов рассчитывается с помощью команды SELECT FOUND_ROWS() в MySQL. Этот фильтр позволяет вам изменить эту команду на что-то другое, если вам нужно рассчитать количество найденных предметов другим способом.

Если вы хотите изменить завершенный SQL-запрос, вам следует использовать этот фильтр. В основном он переопределяет весь SQL-запрос, составленный классом WP_Query .

Если вы хотите изменить array PHP, который WP_Query генерирует с помощью запроса SQL, вы можете использовать этот фильтр. На Кодексе есть хороший пример, чтобы вы могли увидеть, как он работает.

(Обратите внимание, что этот фильтр обрабатывает необработанный массив, сгенерированный из запроса SQL.)

В отличие от posts_results , фильтр the_posts ожидает внутренней обработки массива, что означает, что массив будет проверяться на the_posts неопубликованных и липких записей. Используйте этот, если вы не хотите, чтобы неопубликованные или сообщения в вашем массиве.

Предложение SELECT запроса SQL определяет, какие поля базы данных будут выбраны из результирующих строк базы данных, и этот фильтр помогает вам отфильтровать его.

Предложение LIMIT SQL-запроса устанавливает ограничения для запроса, и этот фильтр помогает вам его фильтровать.

Предложение DISTINCT запроса SQL указывает, что запрос должен возвращать только разные результаты, и этот фильтр помогает вам его фильтровать. Естественно, WP_Query не возвращает отличных результатов, но когда вы используете этот фильтр с функцией, которая возвращает "DISTINCT" , запрос будет скорректирован так, чтобы он возвращал только разные результаты.

Предложение WHERE запроса SQL используется для фильтрации SELECT , INSERT , UPDATE или DELETE в MySQL, и этот фильтр помогает фильтровать этот фильтр. Хотя класс WP_Query выполняет всю работу, необходимую для фильтрации результатов, вы можете продвинуться дальше, используя этот фильтр.

Этот фильтр является итерацией к фильтру posts_where , который можно использовать с запросами подкачки.

Другой итерацией к фильтру posts_where является этот фильтр, который можно использовать для изменения WHERE запроса, который используется для получения результатов поиска в WordPress.

Предложение JOIN запроса SQL позволяет вам работать с командой SQL в нескольких таблицах базы данных, а этот фильтр помогает фильтровать ее. Это одна из продвинутых частей MySQL, поэтому я не рекомендую использовать этот фильтр, если вы не очень хорошо знаете, как работает MySQL JOIN .

Так же, как posts_where_paged — это итерация posts_where , это итерация фильтра posts_join который работает с запросами на пейджинг

Предложение ORDER BY запроса SQL упорядочивает порядок запроса, и этот фильтр помогает фильтровать порядок.

Предложение GROUP BY запроса SQL заставляет запрос возвращать «сгруппированные» результаты по полю базы данных, и этот фильтр помогает фильтровать способы группировки результатов.

Если вы хотите работать со всеми предложениями одновременно, для этого тоже есть фильтр: posts_clauses . Этот фильтр охватывает WHERE , GROUP BY , JOIN , ORDER BY , DISTINCT , SELECT и LIMITS .

Теперь мы рассмотрели фильтры, связанные с WP_Query , давайте перейдем к другому виду хуков: действиям.

Перед анализом запроса вы можете взаимодействовать с ним (например, вводить дополнительные переменные запроса) с помощью этого действия. Давайте посмотрим на быстрый пример Тома Макфарлина, чтобы узнать, как исключить категорию из основного цикла:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
function tutsplus_exclude_category( $wp_query ) {
 
    /*
     * Add the category to an array of excluded categories.
     * it’s really just one.
     */
    $excluded = array( ‘-1’ );
 
    /*
     * Note that this is a different, perhaps, cleaner way to write:
     *
     * $wp_query->set( ‘category__not_in’, $excluded );
     */
    set_query_var( ‘category__not_in’, $excluded );
 
}
 
add_action( ‘pre_get_posts’, ‘tutsplus_exclude_category’ );
 
?>

В отличие от pre_get_posts , который вмешивается в запрос до установки переменных запроса, действие parse_query обрабатывает процесс после установки переменных запроса. Таким образом, вам следует использовать это действие, если вы хотите проверить текущие переменные и выполнить действие в соответствии с ними.

Термин the_action немного сбивает с толку, потому что это имя ловушки действий, WP_Query с WP_Query функции, а также метод класса WP_Query .

Это действие, как говорит Кодекс, позволяет нам изменять объект post сразу после запроса и настройки. Используя это действие, вы можете изменить вывод напрямую. Давайте посмотрим на быстрый пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
function tutsplus_featured_badge( $post ) {
 
    if ( is_single() && in_category( ‘featured’ ) ) {
         
        echo ‘<div class=»featured-badge»>’ .
 
    }
 
}
 
add_action( ‘the_post’, ‘tutsplus_featured_badge’ );
 
?>

Действия и фильтры — это всегда веселая тема для разговоров и написания. (Я точно знаю, что мои две серии о действиях WordPress и фильтрах WordPress было весело писать, и наш читатель получил отличную реакцию.) Надеюсь, вам понравилась эта часть так же, как мне понравилось ее писать.

Хотите добавить что-нибудь в статью? Снимите комментарий в разделе комментариев ниже. И если вам понравилась статья, не забудьте поделиться ею с друзьями!

WP_Query встречи в следующей части, где мы будем говорить о свойствах и методах класса WP_Query !