Добро пожаловать в третью часть нашей серии под названием «Мастеринг WP_Query». В предыдущей части мы рассмотрели 13 функций WordPress, связанных с классом WP_Query
. В этой части мы рассмотрим хуки WordPress (фильтры и действия), которые вы можете использовать вместе с WP_Query
.
Итак, без лишних слов, давайте начнем!
WP_Query-фильтры
В «Справочнике по фильтрам» Кодекса есть 16 фильтров WordPress, перечисленных под заголовком «Фильтры WP_Query». В этом разделе мы поговорим о них. Это будет довольно быстрый раздел, потому что большинство фильтров относятся к разным «предложениям» запроса к базе данных, сделанного классом WP_Query
.
Мы вернемся к ним сразу после прохождения фильтров, которые не связаны с пунктами.
Фильтрация количества найденных сообщений для запроса: found_posts
Этот фильтр позволяет изменять количество найденных элементов без ограничения, которое posts_per_page
аргументом posts_per_page
.
Этот фильтр особенно полезен для создания пользовательской нумерации страниц. Давайте посмотрим, что говорит Кодекс :
Например, если вы объявляете пользовательское значение смещения в своих запросах, WordPress НЕ вычтет смещение из параметра $ wp_query-> found_posts (например, если у вас есть 45 используемых сообщений после смещения 10, WordPress будет игнорировать смещение и по-прежнему дают found_posts значение 55).
Имеет смысл.
Фильтрация запроса для запуска для found_posts_query
найденных сообщений: found_posts_query
Количество найденных элементов рассчитывается с помощью команды SELECT FOUND_ROWS()
в MySQL. Этот фильтр позволяет вам изменить эту команду на что-то другое, если вам нужно рассчитать количество найденных предметов другим способом.
Фильтрация всего SQL-запроса: posts_request
Если вы хотите изменить завершенный SQL-запрос, вам следует использовать этот фильтр. В основном он переопределяет весь SQL-запрос, составленный классом WP_Query
.
Фильтрация массива, возвращаемого posts_results
: posts_results
Если вы хотите изменить array
PHP, который WP_Query
генерирует с помощью запроса SQL, вы можете использовать этот фильтр. На Кодексе есть хороший пример, чтобы вы могли увидеть, как он работает.
(Обратите внимание, что этот фильтр обрабатывает необработанный массив, сгенерированный из запроса SQL.)
Отфильтруйте массив полученных сообщений: the_posts
В отличие от posts_results
, фильтр the_posts
ожидает внутренней обработки массива, что означает, что массив будет проверяться на the_posts
неопубликованных и липких записей. Используйте этот, если вы не хотите, чтобы неопубликованные или сообщения в вашем массиве.
Фильтрация списка полей (и предложения SELECT
) запроса: posts_fields
Предложение SELECT
запроса SQL определяет, какие поля базы данных будут выбраны из результирующих строк базы данных, и этот фильтр помогает вам отфильтровать его.
Фильтрация предложения LIMIT
в запросе: post_limits
Предложение LIMIT
SQL-запроса устанавливает ограничения для запроса, и этот фильтр помогает вам его фильтровать.
Фильтрация предложения DISTINCT
в posts_distinct
: posts_distinct
Предложение DISTINCT
запроса SQL указывает, что запрос должен возвращать только разные результаты, и этот фильтр помогает вам его фильтровать. Естественно, WP_Query
не возвращает отличных результатов, но когда вы используете этот фильтр с функцией, которая возвращает "DISTINCT"
, запрос будет скорректирован так, чтобы он возвращал только разные результаты.
Фильтрация WHERE
в posts_where
: posts_where
Предложение WHERE
запроса SQL используется для фильтрации SELECT
, INSERT
, UPDATE
или DELETE
в MySQL, и этот фильтр помогает фильтровать этот фильтр. Хотя класс WP_Query
выполняет всю работу, необходимую для фильтрации результатов, вы можете продвинуться дальше, используя этот фильтр.
Фильтрация WHERE
в posts_where_paged
вычисления posts_where_paged
: posts_where_paged
Этот фильтр является итерацией к фильтру posts_where
, который можно использовать с запросами подкачки.
Фильтрация WHERE
поискового запроса: posts_search
Другой итерацией к фильтру posts_where
является этот фильтр, который можно использовать для изменения WHERE
запроса, который используется для получения результатов поиска в WordPress.
Фильтрация предложения запроса posts_join
: posts_join
Предложение JOIN
запроса SQL позволяет вам работать с командой SQL в нескольких таблицах базы данных, а этот фильтр помогает фильтровать ее. Это одна из продвинутых частей MySQL, поэтому я не рекомендую использовать этот фильтр, если вы не очень хорошо знаете, как работает MySQL JOIN
.
Фильтрация предложения JOIN
в posts_join_paged
вычисления posts_join_paged
: posts_join_paged
Так же, как posts_where_paged
— это итерация posts_where
, это итерация фильтра posts_join
который работает с запросами на пейджинг
Фильтрация предложения запроса ORDER BY
: posts_orderby
Предложение ORDER BY
запроса SQL упорядочивает порядок запроса, и этот фильтр помогает фильтровать порядок.
Фильтрация предложения запроса GROUP BY
: posts_groupby
Предложение GROUP BY
запроса SQL заставляет запрос возвращать «сгруппированные» результаты по полю базы данных, и этот фильтр помогает фильтровать способы группировки результатов.
Фильтрация всех пунктов запроса: posts_clauses
Если вы хотите работать со всеми предложениями одновременно, для этого тоже есть фильтр: posts_clauses
. Этот фильтр охватывает WHERE
, GROUP BY
, JOIN
, ORDER BY
, DISTINCT
, SELECT
и LIMITS
.
Действия, связанные с WP_Query
Теперь мы рассмотрели фильтры, связанные с WP_Query
, давайте перейдем к другому виду хуков: действиям.
Вмешиваться в запрос до его запуска: pre_get_posts
Перед анализом запроса вы можете взаимодействовать с ним (например, вводить дополнительные переменные запроса) с помощью этого действия. Давайте посмотрим на быстрый пример Тома Макфарлина, чтобы узнать, как исключить категорию из основного цикла:
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’ );
?>
|
Обработка parse_query
запроса: parse_query
В отличие от pre_get_posts
, который вмешивается в запрос до установки переменных запроса, действие parse_query
обрабатывает процесс после установки переменных запроса. Таким образом, вам следует использовать это действие, если вы хотите проверить текущие переменные и выполнить действие в соответствии с ними.
Изменить объект сообщения: the_post
Термин 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
!