
Использование запросов WP_Query в WordPress — часть 3 (основные функции класса)
Этот урок является продолжением серии о работе с запросами в базу данных WP_Query в ВордПресс. В нем мы сосредоточимся на связанных с запросом функциях, а затем перейдем и к хукам (действия, actions) и фильтрам. Это позволит использовать запросы максимально мощно, и при необходимости расширять дефолтный функционал.
Кроме свойств, методов и параметров (которые мы будем рассматривать спустя некоторое время), при работе с классом WP_Query
мы можем также задействовать специальные функции, а также дополнительные хуки и фильтры. И сегодняшний практический урок посвящен именно этим функциям. А в дальнейших уроках разберем хуки и фильтры, связанные с WP_Query
.
Специальные функции, связанные с классом WP_Query
Давайте подробнее рассмотрим функции WordPress, специально «настроенные» под класс WP_Query
. В первой части серии мы уже касательно познакомились с некоторыми из них (query_posts()
, get_posts()
, get_pages()
), а сегодня продолжим и рассмотрим другие важные функции (а также условные тэги) класса.
Функция для получения переменных запроса: get_query_var()
Эта функция имеет описательное название, которое говорит само за себя: она берет глобальный объект $wp_query
и получает из него общедоступный переменный запрос. Она имеет два параметра: первый – это переменная, возвращающая значение, а второй – значение по умолчанию (если переменная не установлена):
<?php $page_number = get_query_var( 'paged', 1 ); $category_name = get_query_var( 'category_name' ); $taxonomy_name = get_query_var( 'taxonomy' ); ?>
Функция для получения отдельной публикации: get_post()
Если ранее рассмотренная функция get_posts()
позволяет выполнять запрос и хранить его в виде массива, то родственная функция get_post()
позволяет получить только одну публикацию. Эта функция имеет три дополнительных параметра:
- идентификатор публикации (по умолчанию идентификатор текущей публикации)
- определение типа представления полученного результата: это будет объект (
object
),ARRAY_A
(ассоциативный массив) илиARRAY_N
(числовой массив) - нужно ли фильтровать результат. По умолчанию установлено raw (необработано, то есть без фильтрации). Другие значения: edit (редактировать), display (отображать), attribute (атрибут) или js.
<?php $single_post = get_post( 1, ARRAY_A ); $post_title = $single_post['post_title']; $post_date = $single_post['post_date']; ?>
Здесь нужно кое-что уточнить. Если вы не знаете, что именно использовать для получения массива публикаций, WP_Query
или get_posts()
, то в Codex’е есть следующая рекомендация: если вам нужен комплексный запрос (который вернет данные публикации, его метаданные, данные автора и связанные комментарии), тогда вам нужен класс WP_Query
, а если вам нужны только основные данные публикации — тогда используйте функцию get_posts()
. И, соответственно, при необходимости в одной публикации, тогда вам функция get_post()
в помощь. Раньше еще была функция для получения данных одной страницы, но она уже устарела, вместо этого нужно использовать именно get_page()
get_post()
.
Функция для проверки, содержит ли запрос результаты: have_posts()
Эта функция просто возвращает TRUE (истина), если в результате запроса есть хотя бы одна публикация, иначе FALSE (ложь). Не принимает никаких параметров. Пример использования:
<?php if ( have_posts() ) { // TRUE } else { // FALSE } ?>
Функция для работы с результирующим циклом запроса: the_post()
Кодекс обозначает эту функцию как «итерирующую индекс публикации в цикле». Но она делает несколько других вещей:
- устанавливает данные глобальной переменной
$post
- устанавливает значение TRUE для параметра
in_the_loop
- получает следующую запись по запросу
<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); // ... } } ?>
Функция для настройки данных глобального $post
: setup_postdata()
Эта функция устанавливает глобальные данные публикации, заполняет глобальные переменные $id
, $authordata
, $currentday
, $currentmonth
, $page
, $pages
, $multipage
, $more
, $numpages
:
<?php global $post; setup_postdata($post); ?>
Функция для сброса запроса: wp_reset_query()
Используйте эту функцию, если вы изменяли основной запрос (с помощью функции query_posts()
или хука pre_get_posts
). Пример использования:
<?php // после того, как основной запрос был изменен wp_reset_query(); ?>
Функция для сброса глобальной переменной $post
: wp_reset_postdata()
Данная функция возвращает данные глобальной переменной $post
к первой публикации в основном запросе. Лучше применять ее, если вы используете последующие после основного запросы. Пример использования:
<?php // после последующих запросов wp_reset_postdata(); ?>
Функция для очистки текущего цикла: rewind_posts()
Функциональность этой функции состоит в том, что она просто «перематывает» (rewinds) цикл, чтобы вы могли запустить его снова позже. Например, так:
<?php // после цикла rewind_posts(); ?>
Функция проверки на «главность» текущего запроса: is_main_query()
Этот условный тег возвращает TRUE (истина), если текущий запрос является основным (главным), и FALSE (ложь) в противном случае:
<?php if ( is_main_query() ) { // основной запрос } else { // второстепенные запросы } ?>
Функция проверки на «нахождение в цикле»: in_the_loop()
Подобным предыдущему тегу является условный тег in_the_loop()
, возвращающий TRUE (истина), если ваш код выполняется внутри цикла, или FALSE (ложь) в противном случае:
<?php if ( in_the_loop() ) { // наш код выполняется в цикле } else { // наш код выполняется вне цикла } ?>
Вот и все, тема сегодняшнего урока исчерпана. Вы познакомились с функциями, непосредственно связанными с классом WP_Query
! А дальше речь пойдет о хуках и фильтрах.