Использование запросов 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! А дальше речь пойдет о хуках и фильтрах.