query_posts()WP 1.5.0

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

query_posts() — это способ изменить основной запрос WordPress, который создается для отображения конетнта на странице. Это достигается, заменой основного запроса (делается еще одни запрос и заменяется основной).

Это важно!

Несмотря на то что функция проста в применении, её лучше не использовать, потому что в ней много потенциальных проблем, подробнее здесь: Использовать query_posts() опасно

Использование этой функции может увеличить время загрузки страницы (иногда вдвое, потому что делается еще один запрос поверх основного).

Эта функция полностью переопределяет основной запрос и поэтому не предназначена для использования в плагинах или темах.

Для обычных запросов используйте get_posts() или WP_Query - если нужна пагинация.

Чтобы восстановить основой запрос обратно, после вызова query_posts, нужно вызвать wp_reset_query().

Работает на основе: WP_Query()

Хуков нет.

Возвращает

WP_Post[]|int[]. Глобальный объект WP_Query.

Использование

Функция query_posts() должна вызываться перед Циклом WordPress, потому что при вызове query_posts() создается новый объект WP_Query, который затем будет использоваться в цикле. При этом WordPress игнорирует параметры, полученные через URL (например, номер страницы или категорию):

<?php
query_posts( $query );

// Цикл WordPress
if( have_posts() ){
	  while( have_posts() ){
		   the_post();
	  }
	  wp_reset_query();
} else {
   // текст, если постов нет
}
?>
$query(array|string) (required)

Массив или строка параметров запроса. Список возможных ключей смотрите в WP_Query.

Эта функция может принимать массу различных параметров, которые можно указывать как в виде массива, так и в виде строки: cat=4&posts_per_page=5.

WP_Query лежит в основе query_posts(), поэтому может получать все теже параметры.

Альтернатива

Для изменения основого запроса настоятельно рекомендуется использовать событие pre_get_posts с проверкой is_main_query().

Пример: вместо

query_posts('posts_per_page=5');

используйте в functions.php:

add_action( 'pre_get_posts', 'five_posts_on_homepage' );
function five_posts_on_homepage( $query ) {
	if ( $query->is_home() && $query->is_main_query() ) {
		$query->set( 'posts_per_page', 5 );
	}
}

Для изменения SQL запроса, можно использовать эти фильтры.

Предупреждения

Изменяет основной цикл

query_posts() заменяет основной запрос, влияя на глобальные переменные и теги шаблона, которые могут работать неправильно после query_posts().

Если использовать query_posts() в шаблоне, WordPress уже сделал основной запрос к базе. Использование query_posts() означает повторный SQL-запрос, игнорируя результаты предыдущего. Это может быть неэффективно на больших сайтах.

Вторичные циклы

Для вторичных списков (например, похожие записи внизу страницы или ссылки в сайдбаре) лучше использовать get_posts(). Если всё же используете query_posts(), обязательно вызовите wp_reset_query() после завершения.

Пагинация

Пагинация не будет работать правильно без правильной установки параметра paged.

Дополнительные SQL-запросы

Разработчикам крупных сайтов стоит рассмотреть альтернативы, например, фильтр request для изменения запроса до его выполнения, или фильтры parse_query и pre_get_posts для редактирования объекта $query.

Особенности

Сохраним существующие параметры запроса

После вызова query_posts() WordPress не будет учитывать параметры полученные через УРЛ (например, номер страницы или категории). Если нужно сохранить параметры основного запроса, то можно использовать глобальную переменную $query_string (содержит текущие параметры для query_posts).

Например, давайте изменим порядок сортировки постов, при этом не затрагивая остальные параметры запроса, для этого нужно написать такой код перед Циклом WordPress:

global $query_string;
query_posts( $query_string . '&order=ASC' );

В этом примере "порция" добавочных аргументов должна претворятся знаком амперсанд (&)

Также параметры можно передать в виде массива. Для этого смержим базовые параметры и наши састомные:

global $wp_query;
$custom_params = [
	'post_type' => 'product'
];
$args = array_merge( $wp_query->query_vars, $custom_params );
query_posts( $args );

Комбинирование параметров

#1. Комбинирование в строке

Вы наверняка заметили, что параметры соединяются между собой символом амперсанд - &, именно этим символом параметры комбинируются (объединяются).

query_posts( 'cat=3&year=2004' );

Получим посты из категории 1, имеющие метку apples:

query_posts( 'cat=1&tag=apples' );

#2. Комбинирование с переменными

Посты из категории 13 за текущий месяц на главной странице блога:

if ( is_home() ) {
	query_posts( $query_string . '&cat=13&monthnum=' . date( 'n', current_time('timestamp') ) );
}

#3. Комбинирование массивом

Вернет только 2 поста, из категории 1 и 3, отсортированные в обратном порядке по заголовку:

query_posts( [
   'category__and'  => [ 1, 3 ],
   'posts_per_page' => 2,
   'orderby'        => 'title',
   'order'          => 'DESC',
] );

Примеры

1

#1 Передача параметров в массиве

Параметры также можно передать в виде массива. Так они будут более наглядны и читаемы. Например, пример 2 можно записать так:

query_posts( [
	'cat'      => 22,
	'year'     => $current_year,
	'monthnum' => $current_month,
	'order'    => 'ASC',
] );

Как видите тут можно поставить каждую переменную на отдельную строку, а это более понятно и читаемо.

1

#2 Вставка переменных в параметры запроса

Можно создавать динамические параметры запроса, если нужно, чтобы запрос менялся в зависимости он каких либо обстоятельств, для этого значение параметра нужно записать в переменную, а затем переменную передать в параметры запроса, сделать это можно несколькими способами:

1) Сборка запроса с использованием одинарных кавычек ' ':
<?php
$category_var = $cat; // задаем переменной $category_var ID текущей категории
$query = 'cat=' . $category_var . '&orderby=date&order=ASC'; // собираем запрос
query_posts( $query ); // запускаем запрос к БД
?>
2) Сборка запроса с использованием двойных кавычек " "

Переменные внутри двойных кавычек интерпретируются PHP как переменные, а не как простой текст:

<?php
$current_month = date('m');
$current_year = date('Y');

query_posts("cat=22&year=$current_year&monthnum=$current_month&order=ASC");
?>
<!-- здесь идет Цикл WordPress -->
3) Использование глобальной переменной $query_string

Которая содержит в себе базовый запрос для функции query_posts. Если нам нужно не нарушать стандартный вывод постов WordPress (например, на странице категорий), но при этом убрать пагинацию (вывести все посты на одной странице), то мы может дополнить базовый запрос функции query_posts, параметром posts_per_page=-1:

<?php
global $wp_query;
$wp_query = new WP_Query( $query_string . '&posts_per_page=-1');
while( have_posts() ){
	the_post();
	// здесь идет Цикл WordPress
}

wp_reset_query(); // сброс глобальной $wp_query
?>

Можно измерить значение posts_per_page на конкретное число необходимых нам постов на одной странице. Например, posts_per_page=10 выведет только 10 постов, а если при этом в конце цикла поставить тег шаблона posts_nav_link(), то под циклом появится ссылка для перехода к следующим 10-ти постам (ссылка пагинации).

3) Добавление параметров в запрос

Сохранение базового запроса текущей страницы и добавление в него своих параметров

функция query_posts полностью переписывает запрос, если например, мы напишем query_posts ('cat=1'), то другие параметры запроса, которые используются для текущей страницы (например, сортировка, пагинация и т.д.), будут потеряны и будут выведены посты категории 1 с остальными параметрами по умолчанию. Чтобы сохранить базовые параметры запроса и дополнить/заменить их своими нужно использовать PHP функцию array_merge (объединяет 2 массива в один):

global $wp_query;

query_posts( array_merge(
	[ 'cat' => 1 ], // это параметр который добавили мы
	$wp_query->query   // это массив базового запроса текущей страницы
) );

Этот пример по сути тоже самое что и пример с использованием глобальной переменной $query_string, только в виде массива.

0

#3 На главной, исключим посты из рубрики 3

Для этого лучше использовать хук pre_get_posts.

Чтобы на главной странице блога исключить посты, которые находятся в категории 3, нужно вставить следующий код в файл front-page.php или home.php перед началом Цикла WordPress:

if ( is_home() ) {
	query_posts( 'cat=-3' );
}

Можно добавить еще несколько категорий к исключению:

if ( is_home() ) {
	query_posts( "cat=-1,-2,-3" );
}
0

#4 Получим только первую часть контента $more = 0

Если нужно использовать функцию "читать дальше" (read more) с новым запросом, то нужно переключить глобальную переменную $more на 0:

<?php

// retrieve one post with an ID of 5
query_posts('p=5');

global $more;

// set $more to 0 in order to only get the first part of the post
$more = 0;

// the Loop
while ( have_posts() ) {
	the_post();

	// the content of the post
	the_content( 'Read the full post »' );
}
?>
0

#5 Получить конкретный пост/страницу по ID или slug

Не рекомендуется использовать query_posts() для этой цели, вместо этого используйте get_posts() или get_post().

Получим определенный пост (пост с ID = 5):

<?php
query_posts( 'p=5' );
?>

Получаем определенную страницу (страницу 7):

<?php
query_posts( 'page_id=7' );
?>

Получить отдельную страницу по ее названию (ярлыку):

<?php
query_posts( 'pagename=o-saite' );
?>

Получение дочерней страницы.

Для дочерних страниц нужно указывать имя родительской страницы и самой дочерней страницы. Имена разделяются слэшем (/). Пример:

<?php
query_posts( 'pagename=o-saite/avtori' ); 
?>

Купить лайки в Одноклассниках с оптовыми скидками и гарантией Вы можете на сайте https://doctorsmm.com/. Здесь Вы найдете разнообразие критериев и условий предоставления услуг. Так, например, Вы самостоятельно сможете выбрать качество материала и скорость его прихода на страницу.

Заметки

  • Global. WP_Query. $wp_query WordPress Query object.

Список изменений

С версии 1.5.0 Введена.

Код query_posts() WP 6.8.1

function query_posts( $query ) {
	$GLOBALS['wp_query'] = new WP_Query();
	return $GLOBALS['wp_query']->query( $query );
}
324 комментария
Полезные - 10Вопросы - 1 Все
    Войти