Использование запросов WP_Query в WordPress — часть 4 (хуки и фильтры)

Этим уроком мы продолжаем серию уроков по работе с запросами в базу данных 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(). С помощью этого фильтра вы можете изменить данную команду.

 

Фильтрация всего SQL запроса: 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.

 

Фильтрация условия JOIN запроса: 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.

 

Хуки (действия, экшены, actions), связанные с запросом 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, которые позволят вам иметь больше контроля над запросом.

 

Recent Posts

Использование запросов WP_Query в WordPress — часть 7 (аргументы для получения категорий, тегов)

Этот практический урок будет посвящен рассмотрению аргументов, которые можно использовать для получения публикаций определенных категорий…

2 часа ago

Использование запросов WP_Query в WordPress – часть 6 (аргументы для получения постов, страниц)

Сегодняшний урок практический и служит целью закрепить полученные теоретические знания из предыдущих уроков по запросу…

1 день ago

Использование запросов WP_Query в WordPress – часть 5 (методы и свойства)

Продолжаем серию уроков по работе с запросами в базу данных WP_Query в ВордПресс. Сегодняшний урок…

4 дня ago

Прокси: основы, виды и преимущества использования

В современном цифровом мире вопрос безопасности, анонимности и быстрого доступа к интернет-ресурсам становится все более…

1 неделя ago

Джеки Чан

Твоя ужасная работа — мечта каждого безработного. Твой непослушный ребенок — мечта каждого бездетного. Твой…

1 неделя ago

Использование запросов WP_Query в WordPress — часть 3 (основные функции класса)

Этот урок является продолжением серии о работе с запросами в базу данных WP_Query в ВордПресс.…

2 недели ago