SebWeo
Этот урок является продолжением серии о работе с запросами в базу данных WP_Query в ВордПресс. В нем мы сосредоточимся на связанных с запросом функциях, а затем перейдем и к хукам (действия, actions) и фильтрам. Это позволит использовать запросы максимально мощно, и при необходимости расширять дефолтный функционал.
Кроме свойств, методов и параметров (которые мы будем рассматривать спустя некоторое время), при работе с классом 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 (числовой массив)<?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()Кодекс обозначает эту функцию как «итерирующую индекс публикации в цикле». Но она делает несколько других вещей:
$postin_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! А дальше речь пойдет о хуках и фильтрах.
В нашем путешествии по миру сокетов мы начали с "верхнего этажа" — WebSocket в браузере,…
В предыдущей статье мы говорили о WebSockets — технологии, позволяющей создавать интерактивные чаты в браузере.…
Кожа младенца – тонкая и нежная. Еще не справляется с защитой организма от внешних факторов.…
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно,…
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…