Everything You Need to Know About WP_Query, WordCamp Russia 2014
1. Всё, что нужно знать о WP_Query
Сергей Бирюков
WordCamp Russia 2014
2. Обо мне
Сергей Бирюков
● Разработчик ядра WordPress
http://core.trac.wordpress.org
● Локализатор WP в России
http://ru.wordpress.org
http://sergeybiryukov.ru
@flash_usb
13. Обычный цикл
while ( have_posts() ) :
the_post();
if ( is_author() )
echo 'Страница автора';
endwhile;
14. Обычный цикл
while ( have_posts() ) :
the_post();
if ( $wp_query->is_author() )
echo 'Страница автора';
endwhile;
15. Вторичный цикл
$query = new WP_Query( … );
while ( $query->have_posts() ) :
$query->the_post();
if ( $query->is_author() )
echo 'Страница автора.';
endwhile;
16. Вторичный цикл
$query = new WP_Query( … );
while ( $query->have_posts() ) :
$query->the_post();
if ( $query->is_author() )
echo 'Страница автора.';
endwhile;
17. Вторичный цикл
$query = new WP_Query( … );
while ( $query->have_posts() ) :
$query->the_post();
if ( $query->is_author() )
echo 'Страница автора.';
endwhile;
18. Если мы создаём новый объект:
$my_query = new WP_Query( $query );
то можем вызывать его методы:
while ( $my_query->have_posts() ) :
$my_query->the_post();
endwhile;
wp_reset_postdata();
19. ● Зачем нужны wp_reset_postdata() и wp_reset_query()?
● Что насчёт query_posts()?
● Как изменить запрос?
● Как изменить основной запрос?
36. Тогда зачем делать так?
query_posts( 'author=-5' );
get_header();
while ( have_posts() ) :
the_post();
endwhile;
get_footer();
37. Получается в два раза больше запросов!
● Первый, который WordPress сделал по умолчанию.
● Второй, который мы будем использовать.
38. * В общем случае WP_Query выполняет
не один запрос, а четыре.
39. 1. Получаем записи:
SELECT
SQL_CALC_FOUND_ROWS …
FROM wp_posts LIMIT 0, 10
2. Сколько найдено записей?
SELECT FOUND_ROWS()
3. Получаем метаданные для этих записей.
4. Получаем элементы таксономий для этих записей.
54. Только главный запрос!
function alter_my_home_query( $query ) {
if ( $query->is_home() && $query->is_main_query() )
$query->set( 'author', '-5' );
}
add_action( 'pre_get_posts', 'alter_my_home_query' );
55. function alter_my_home_query( $query ) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( $query->is_home() )
$query->set( 'author', '-5' );
}
add_action( 'pre_get_posts', 'alter_my_home_query' );
56. Как работает WP_Query::is_main_query()?
● $wp_the_query никогда не меняется и всегда содержит
основной запрос.
● В $wp_query хранится ссылка на $wp_the_query, если
только не используется query_posts().
● Не путать с функцией is_main_query().
66. Выводы
● У каждого объекта WP_Query есть методы,
соответствующие глобальным условным тегам.
● Глобальные условные теги используют $wp_query —
основной или текущий запрос.
● $wp_query — это основной запрос, если не используется
query_posts(). Восстанавливайте его с помощью
wp_reset_query().
67. В заключение
● 'pre_get_posts' — мощный и гибкий инструмент (при
правильном использовании).
● Всегда проверяйте с помощью $query->is_main_query(), что
меняете именно основной запрос.