while ( have_posts() )
— это цикл перебора постов из глобального запроса
the_post()
— функция устанавливает переменную $post для работы функций
the_title()
,
the_content()
и подобные
Если цикл образуется с помощью экземпляра
WP_Query()
, то и переменные устанавливаются из этого же запроса (
$query->have_posts(),
$query->the_post() )
// Задаем нужные нам критерии выборки данных из БД
$args = array(
'posts_per_page' => 5,
'orderby' => 'comment_count'
);
$query = new WP_Query( $args );
// Цикл
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title(); // Заголовок
the_content(); // Контент
}
} else {
// Постов не найдено
}
// Возвращаем оригинальные данные поста. Сбрасываем $post
wp_reset_postdata();
get_posts()
— это обертка для класса
WP_Query
с несколькими предустановленными параметрами. Установка переменной
$post делается с помощью функции
setup_postdata()
и в целом тот же цикл выглядит немного по другому
// Задаем нужные нам критерии выборки данных из БД
$args = array(
'posts_per_page' => 5,
'orderby' => 'comment_count'
);
$my_posts = get_posts( $args );
// Цикл
if ( $my_posts ) {
foreach ( $my_posts as $key => $post ) {
setup_postdata( $post );
the_title(); // Заголовок
the_content(); // Контент
}
} else {
// Постов не найдено
}
// Возвращаем оригинальные данные поста. Сбрасываем $post
wp_reset_postdata();
Еще раз хочу акцентировать внимание на том, что установка переменной
$post нужна для работы функций
the_title()
,
the_content()
,
get_template_part()
и т.д., вместо их использования вы можете доставать данные напрямую из объекта. Например, такая конструкция тоже будет работать
$args = array(
'posts_per_page' => 5,
'orderby' => 'comment_count'
);
$my_posts = get_posts( $args );
foreach ( $my_posts as $key => $post ) {
echo $post->post_title; // Заголовок
echo $post->post_content; // Контент
}