SebWeo
Этим уроком мы продолжаем серию уроков по работе с запросами в базу данных WP_Query в ВордПресс. Сегодня мы сосредоточимся на связанных с запросом фильтрах (filters) и хуках (действия, actions). Это должно придать вам еще больше уверенности в своих силах в качестве WP-программиста.
Как вы уже знаете, при работе с классом WP_Query мы можем задействовать не только специальные функции, но и дополнительные хуки и фильтры. И сегодняшний практический урок посвящен именно этому.
WP_QueryДавайте подробнее рассмотрим фильтры WordPress, специально «настроенные» под класс WP_Query. В предыдущем уроке мы рассмотрели 10 специальных функций этого класса, а сегодня продолжим и рассмотрим основные фильтры и хуки WP_Query в WordPress.
found_postsЭтот фильтр позволяет изменять количество найденных элементов, несмотря на ограничения, установленные аргументом posts_per_page запроса WP_Query.
Использование этого фильтра будет особенно полезным, если необходимо создать, например, специальную разбивку результатов на отдельные страницы.
found_posts_queryКоличество найденных элементов в результате запроса вычисляется с помощью команды SQL SELECT FOUND_ROWS(). С помощью этого фильтра вы можете изменить данную команду.
posts_requestЕсли вы хотите внести изменения в уже сформированный SQL-запрос, то можете воспользоваться данным фильтром. Другими словами, этот фильтр полностью «перерабатывает» SQL-запрос, сформированный классом WP_Query.
posts_resultsЕсли вам нужно изменить результирующий PHP массив, полученный в результате запроса WP_Query (SQL-команды), воспользуйтесь этим фильтром. Обратите внимание, что данный фильтр работает с необработанным (row) массивом, полученным SQL запросом.
the_postsВ отличие от предыдущего фильтра posts_results, фильтр the_posts срабатывает после внутренней обработки массива. Это может быть полезно, например, если вам нужна проверка неопубликованных и закрепленных публикаций.
SELECT в запросе: posts_fieldsКоманда SELECT в запросе SQL определяет, какие поля базы данных будут выбраны из результирующих записей, а этот фильтр поможет «отфильтровать» ее.
LIMIT в запросе: post_limitsКоманда LIMIT запроса SQL устанавливает ограничения запроса, и этот фильтр поможет «отфильтровать» ее.
DISTINCT запроса: posts_distinctКоманда DISTINCT в запросе SQL указывает, что запрос должен возвращать только уникальные результаты, а этот фильтр поможет «отфильтровать» ее. Первоначально WP_Query не возвращает только уникальные результаты, но при использовании этого фильтра запрос будет скорректирован и возвращены только уникальные результаты.
WHERE в запросе: posts_whereКоманда WHERE в запросе SQL используется для операторов SELECT, INSERT, UPDATE или DELETE. Хотя в классе WP_Query сделана вся необходимая работа для фильтрации результатов, для большего контроля вы можете использовать этот фильтр.
ДОПОЛНИТЕЛЬНО: для фильтрации условия WHERE в запросе после вычисления пейджинга используйте фильтр posts_where_paged. Этот фильтр является итерацией к фильтру posts_where, который можно использовать с запросами разбивки на страницы (пейджинг, paging).
ДОПОЛНИТЕЛЬНО: для фильтрации условия WHERE в поисковом запросе используйте фильтр posts_search, который можно использовать для изменения SQL запроса при получении результатов поиска в WordPress.
posts_joinОператор JOIN SQL запрос позволяет работать с несколькими таблицами базы данных, а этот фильтр поможет «отфильтровать» его. Но нужно использовать его очень осторожно.
ДОПОЛНИТЕЛЬНО: для фильтрации условия JOIN запроса после вычисления пейджинга, используйте фильтр posts_join_paged, который подобно posts_where_paged работает с запросами разбивки на страницы.
ORDER BY в запросе: posts_orderbyПредложение (оператор) ORDER BY в SQL запросе используется для упорядочения запроса (сортировки), а этот фильтр поможет «отфильтровать» его.
GROUP BY в запросе: posts_groupbyОператор (предложение) GROUP BY запроса SQL заставляет запрос возвращать «сгруппированные» результаты за столбцами базы данных, а этот фильтр поможет «отфильтровать» его и указать, как вам нужно группировать результаты.
posts_clausesЕсли вы хотите иметь дело со всеми операторами одновременно, для этого случая есть соответствующий фильтр: posts_clauses. С помощью этого фильтра у вас будет контроль над элементами запроса SELECT, WHERE, DISTINCT, JOIN, GROUP BY, ORDER BY и LIMIT.
WP_QueryА теперь давайте перейдем от рассмотрения фильтров, связанных с классом WP_Query, к рассмотрению другого вида «зацепок»: хуков.
pre_get_postsПрежде чем запрос будет проанализирован, у вас есть возможность взаимодействовать с ним (например, чтобы добавить дополнительные переменные) с помощью этого хука. Ниже приведен практический пример возможного применения (если есть необходимость исключить определенную категорию из основного цикла):
<?php
add_action( 'pre_get_posts', 'sebweo_exclude_some_category' );
function sebweo_exclude_some_category( $wp_query ) {
// добавьте категорию к массиву категорий для исключения
$excluded = array( 25 ); // если нужно исключить из цикла категорию под ID 25
// $excluded = array('-1' ); // если нужно исключить самую первую категорию из цикла
set_query_var( 'category__not_in', $excluded );
// $wp_query->set( 'category__not_in', $excluded ); // другой вариант написания предыдущего предложения
}
?>
parse_queryВ отличие от предыдущего pre_get_posts, который вмешивается в запрос до установки переменных запроса, хук parse_query будет «вмешиваться» в процесс уже после установки всех переменных для запроса. Его можно использовать, например, если вам нужно проверить текущие переменные и при необходимости откорректировать это.
the_postТермин the_post может немного озадачить, поскольку это может быть названием хука действия, или связанной с классом WP_Query функции, или же методом WP_Query класса.
В данном случае речь пойдет о хуке, позволяющем изменять объект публикации сразу после формирования запроса и его установки. То есть, используя этот хук, вы можете напрямую изменить результат. Ниже показан простой практический пример этого:
<?php
add_action('the_post', 'sebweo_novinky_badge');
function sebweo_novinky_badge($post)
{
if (is_single() && in_category('novinky')) {
// если это одиночный пост и в категории с ID (или слагом) novinky – показать этот бейдж
echo '<div class="novinky-badge">' . __('НОВИНКИ', 'i18n') . '</div>';
}
}
?>
Вот и все, тема сегодняшнего урока исчерпана. Вы только поверхностно познакомились с хуками и фильтрами, ведь это не только интересная тема, но и очень комплексная, о которой можно много говорить и писать. Но это выходит за рамки текущего урока серии. В дальнейших уроках данная тема будет подробнее рассмотрена и раскрыта.
В следующей части уроков мы поговорим о свойствах и методах класса WP_Query, которые позволят вам иметь больше контроля над запросом.
В нашем путешествии по миру сокетов мы начали с "верхнего этажа" — WebSocket в браузере,…
В предыдущей статье мы говорили о WebSockets — технологии, позволяющей создавать интерактивные чаты в браузере.…
Кожа младенца – тонкая и нежная. Еще не справляется с защитой организма от внешних факторов.…
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно,…
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…