query_posts() — модификация основного цикла

Когда я писал про циклы, я говорил, что если хотите как-то «по-особому» вывести записи, например в случайном порядке, используйте query_posts().

Итак, query_posts() видоизменяет основной цикл WordPress, то есть, если раньше на главной показывались последние 10 записей с блога, то теперь там может показываться что угодно и сколько угодно.

query_posts( $query )
$query
(строка|массив) все параметры такие же, как и у WP_Query()

Обычные примеры

Этот код выведет заголовки всех записей из рубрики с id=22:

query_posts("cat=22");
while (have_posts()) : the_post();
	echo'<p>'; the_title(); echo'</p>';
endwhile;
wp_reset_query();

Как и в случае с wp_list_categories(), параметры можно указывать в скобках, а можно выносить в отдельную переменную-массив (кстати, советую использовать именно двойные кавычки, как в примере).

Выводим записи из всех рубрик кроме id=1 и id=4:

query_posts("cat=-1,-4");

Выводим записи, опубликованные в текущем месяце.

$curr_year = date('Y'); // текущий год
$curr_month = date('m'); // текущий месяц
query_posts("year=$curr_year&monthnum=$curr_month");

Записи из рубрики с id=2, опубликованные в текущем месяце и отсортированные по заголовкам (в алфавитном порядке) по возрастанию:

$args = array(
	'cat'      => 2,
	'year'     => $curr_year,
	'monthnum' => $curr_month,
	'orderby'  => 'title',
	'order'    => 'ASC'
);
query_posts($args);

Примеры с модификацией основного цикла страницы

Честно говоря, все предыдущие примеры вообще как-то не в тему к этой функции, они больше подходят к использованию через WP_Query(). Ну да ладно, прост пост я писал давно, а сейчас жалко все это удалять. Короче я покажу, для чего на самом деле нужна функция query_posts().

Сортируем посты на странице по имени:

global $query_string; // глобальные параметры в виде строки
query_posts( $query_string . '&orderby=name' ); // делаем сортировку постов по имени, объединив параметры

Тот же самый пример, но только через массивы:

global $wp_query; // глобальные параметры, которые уже стоят по умолчанию на странице
$args = array_merge( $wp_query->query_vars, array( 'orderby' => 'name' ) ); // добавляем к ним сортировку по имени
query_posts( $args );

Вы наверное понимаете, что таким образом можно вытворять всё, что угодно, например сортировать товары по цене (и по возрастанию и по убыванию).

P.S. в самой документации WordPress не рекомендуется использовать несколько query_posts() на странице, они говорят, что это приводит к багам, хотя лично я ничего такого не замечал.

Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.