Этим уроком мы продолжаем серию уроков по работе с запросами в базу данных 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
, которые позволят вам иметь больше контроля над запросом.
В последние годы интерес к саунам в Киеве заметно вырос. Это связано не только с…
В современном ритме мегаполиса отдых стал неотъемлемой частью заботы о здоровье и эмоциональном состоянии. Особенно…
В современном мире цифрового маркетинга Facebook (Meta) остается одной из самых мощных платформ для продвижения…
Этот прибор стал незаменимым элементом арсенала представителей множества профессий, но особенно актуален среди военных. Тепловизор…
Постоянный поток новостей, рабочих задач и личных забот часто приводит к тому, что в голове…
В 2025 году конкуренция в e-commerce стала жесткой как никогда. Клиенты выбирают не только по…