Основой структуры wordpress является запрос к базе данных и вывод данных в цикл. Какие бывают циклы, когда лучше применять тот или иной цикл, рассмотрим в данной статье.
Стандартный цикл wordpress (index.php, category.php, tag.php, архивы)
Обратите внимание: в стандартном Цикле мы не указываем никаких данных для выборки записей, а сразу начинаем цикл с if( have_posts() ){… Это говорит о том, что данные уже существуют и их нужно просто обработать и вывести на экран.
<?php if (have_posts()) : ?> <?php while (have_posts() ) : the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; ?> <?php endif; ?>
Цикл на основе query_posts()
Преимущества такого изменения в том, что если мы, например, изменим количество выводимых записей на странице с 10 (по умолчанию) на 20, то пагинация на странице автоматически подстроиться под это изменение, потому что query_post() меняет данные глобальной переменной $wp_query, а пагинация строиться именно на основе этих данных.
<?php global $query_string; // параметры базового запроса query_posts($query_string.'&cat=-6,-9&order=ASC&posts_per_page=20'); // базовый запрос + свои параметры ?>
[СТАНДАРТНЫЙ ЦИКЛ WORDPRESS]
<?php wp_reset_query();// сброс запроса?>
Не нужно использовать query_posts() для создания нескольких циклов на одной странице, для вывода в сайдбар списка постов, для создания дополнительного вывода записей и т.п., для этих целей используйте циклы на основе get_posts(). К тому же, обе функции понимают параметры одинаково! Так зачем «платить» больше?..
Пользовательские типы записей в шаблоне категорий (&post_type=video) — не очень хорошая идея, т.к. ломается пэйджинация. Типы записей лучше делать архивами.
Цикл на основе WP_Query()
Особенность циклов на WP_Query() в том, что мы создаем новый объект ( $query ), который никак не связан с аналогичным глобальным объектом $wp_query и поэтому мы никак не нарушаем структуру текущей страницы.
<?php $query = new WP_Query( 'cat=9&nopaging=1' );// указываем категорию 9 и выключаем разбиение на страницы (пагинацию) ?> <?php if ($query ->have_posts()) : ?> <?php while ($query->have_posts() ) : $query->the_post(); ?> <h2><a href="<?php the_permalink(); ?>"> <?php the_title(); ?></a></h2> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); // сбрасываем переменную $post ?>
Цикл на основе get_posts()
Самый удобный вариант выводить нужные записи в нужном порядке — это выводить их с помощью get_posts(). get_posts() в 99% случаев полностью заменяет WP_Query()
<?php global $post; $args = array( 'posts_per_page' => 5, 'offset'=> 0, 'category' => 48 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail(thumbnail); ?><?php the_title(); ?></a> <?php endforeach; ?> <?php wp_reset_postdata() ?>
Где и какой из 3-х вариантов циклов использовать:
- query_posts() — если нужно изменить/подправить стандартный вывод записей на страницах WordPress. Можно использовать 1 раз на странице;
- get_posts() — если нужно вывести записи из Базы Данных. Можно использовать сколько угодно раз на странице;
- Класс WP_Query() — во всех других случаях когда не подошли query_posts() и get_posts().

Инфографика по данной теме
И еще раз тезисно:
query_posts — основной (базовый) запрос wordpress, влияет в каком месте (запись, категория, поиск и т.д.) сайта мы находимся. Если необходимо незначительно скорректировать используем query_posts.
Если нужно создать какой-либо масштабный запрос, используем WP_Query — это независимый полноценный запрос.
get_posts является легковесной служебной функцией для создания выборки постов.
Любопытно, но на деле, если всего один цикл, у query_posts меньше обращений к БД чем у get_posts. Расчет был сделан на основе функции замера количества запросов к БД.
Изменение основного цикла
Нужно добавлять перед if ( have_posts() ) :
<?php // Изменяем основной запрос
global $wp_query;
$params = array(
'posts_per_page' => -1
);
$params = array_merge( $wp_query->query, $params );
query_posts( $params ); ?>
Дальнейшая тема для изучения — глобальные переменные.