WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

query_posts() WP 1.5.0

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


Важно: использовать query_posts() может быть опасно

query_posts() предназначена для самого WordPress и должна использоваться для изменения основного Цикла WordPress, если нужно создать еще одни цикл, то используйте get_posts() или WP_Query. С версии 3.0 эти функции могут принимать все те же параметры что и query_posts().

Пример использования get_posts() вместо query_posts():

$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );
foreach( $lastposts as $post ){ setup_postdata($post);
	?>
	<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
	<?php 
	the_content(); 
}
wp_reset_postdata();

Пример использования WP_Query вместо query_posts():

$args = array( 'posts_per_page' => 3 );
$query = new WP_Query( $args );
while ( $query->have_posts() ) {
	$query->the_post();

	the_title(); // выведем заголовок поста
}
wp_reset_postdata();

Почему query_posts() нужно использовать очень аккуратно?

Основной запрос WordPress — это запрос, который выполняется до вывода какого-либо текста на страницу (на раннем этапе). Параметры такого запроса собирает сам WP опираясь на: запрошенный URL; настройки ЧПУ (постоянных ссылок) и др. Так WordPress определяет сколько записей показать на странице, записи из какой рубрики показывать и т.д.

А вторичный запрос это тот, который создается пользователем (темой, плагином) и выполняется дополнительно к основному. Например: Вывод в сайдбаре списка популярных записей; Вывод комментируемых записей.

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

Разница между query_posts() и WP_Query в том, что query_posts() создает новый WP_Query объект и связывает его с глобальной переменной $wp_query, тогда как get_posts() или WP_Query() создает новый WP_Query объект, без изменения каких-либо глобальных данных.

Давайте рассмотрим на примере:

// Пример 1: Дополнительный запрос с помощью query_posts
query_posts( $args );
while ( have_posts() ) {
	the_post();

	the_title(); // вывести название
}

// Пример 2: Дополнительный запрос с помощью WP_Query
$second_query = new WP_Query( $args );
while ( $second_query->have_posts() ) { $second_query->the_post();

	the_title();
}

Тут, первый пример переписывает глобальные переменные $wp_query, $post, $posts, а второй работает автономно и ничего глобального не трогает.

Чтобы более детально понять разницу прочитайте заметку: 3 способа построения циклов в WordPress.

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

Если не сбросить цикл с помощью wp_reset_query(), то, например, может сломаться пагинация (это самый яркий пример из жизни) — это когда первая страница работает, а остальные показывают 404 страницу.


меню

О query_posts()

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

Благодаря этой функции можно изменить стандартный вывод постов в WordPress. Вывод формируется на основе того, какая страница показывается (главная, архив по дате, категория, архив автора и т.п.). Например, можно изменить цикл так:

  • Показывать только один пост на главной странице блога;
  • Показывать последние посты только на главной странице блога;
  • Изменить порядок сортировки постов;
  • Показывать или не показывать посты из определенной категории.
Работает на основе: WP_Query()

Хуков нет.

Возвращает

Объект. Глобальный объект WP_Query.

меню

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

<?php
// Запрос. $args - параметры запроса
query_posts( $args );

// Цикл WordPress
if( have_posts() ){ 
	  while( have_posts() ){ 
		   the_post();
		   // здесь оформляем данные для каждого поста в цикле
	  }
	  wp_reset_query();
} else {
   // текст/код, если постов нет
}
?>

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

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

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

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

Так же параметры можно передать в виде массива:

global $query_string;
// добавляем базовые параметры в массив $args
parse_str($query_string, $args);
// добавляем/заменяем параметр post_type в массиве
$args['post_type'] = array('post','video');
query_posts( $args );
меню

На заметку

Можно использовать следующие фильтры для внедрения непосредственно в сам SQL запрос:

  • posts_distinct - Изменяет SQL 'DISTINCTROW';
  • posts_groupby - Изменяет SQL 'GROUP BY';
  • posts_join - Изменяет SQL 'JOIN';
  • post_limits - Изменяет SQL 'LIMIT';
  • posts_orderby - Изменяет SQL 'ORDER BY';
  • posts_where - Изменяет SQL 'WHERE';
  • posts_join_paged - Изменяет SQL 'JOIN' во время пагинации;
  • posts_where_paged - Изменяет SQL 'WHERE' во время пагинации;
  • posts_clauses (с версии 3.1) - Изменяет весь SQL запрос в одной строке.

Параметры Категорий (рубрик)

Получает посты относящиеся к определенным категориям.

cat(число/строка/массив)
ID категории. Можно указать несколько ID в строке через запятую или в массиве. Чтобы исключить рубрики укажите минус (-) перед ID категории - это исключит и все вложенные рубрики. Чтобы не исключить вложенные, используйте параметр category__not_in.
category_name(строка)
Имя категории. Используйте слаг (альтернативное имя), а не само название категории.
category__and(массив)
Получить посты, которые входят одновременно в несколько категорий.
category__in(массив)
Получить посты, которые входят в одну из указанных категорий.
category__not_in(массив)

Получить посты, которые не входят в указанную категорию.

Этот параметр не учитывает вложенные рубрики. Чтобы исключить рубрику и вложенные рубрики, укажите ID рубрик через запятую со знаком минус в параметре cat: cat=-25,-32.

Посты из одной категории

Вывод постов из одной категории (записи из дочерних категорий так же будут выбраны):

query_posts('cat=4');

Вывод постов из одной категории по ярлыку (альтернативному названию категории):

query_posts('category_name=staff');

Выведем посты только из категории 4 (дочерние категории не затрагиваются):

query_posts( 'category__in=4' );

Посты из нескольких категорий

Вывод постов из категорий по ID категорий:

query_posts('cat=2,6,17,38');

Выведем посты из категорий по слагу категорий:

query_posts( 'category_name=staff,news' );

Исключим посты принадлежащие категориям

Выведем все посты, кроме постов из категорий 12,34,56:

query_posts( 'cat=-12,-34,-56' );

Показать все посты, кроме тех, что принадлежать категории 3:

query_posts('cat=-3');

Посты из нескольких категорий одновременно

Показать посты, которые находятся сразу в двух категориях:

query_posts( array( 'category__and' => array(2,6) ) );

Показать посты, которые находятся хотя бы в одной из категорий (дочерние категории не будут учитываться):

query_posts(array('category__in' => array(2,6)));

Можно исключить несколько категорий, таким образом:

query_posts( array('category__not_in' => array(2,6)) );
меню

Параметры Меток

Получает посты относящиеся к определенным меткам.

tag(строка)
slug метки.
tag_id(число)
ID метки.
tag__and(массив)
Посты одновременно из нескольких меток. Нужно указывать ID.
tag__in(массив)
Посты из хотя бы одной указанной метки. Нужно указывать ID.
tag__not_in(массив)
Посты не относящиеся к указанным меткам. Нужно указывать ID.
tag_slug__and(массив)
Тоже что и tag__and, только указываются альт. названия (slug) меток.
tag_slug__in(массив)
тоже что и tag__in, только указываются альт. названия меток.

Посты с одной меткой

Получить посты с меткой. Указывать нужно альтернативное название метки (слаг).

query_posts('tag=cooking');

Получить посты, имеющие хотя бы одну указанную метку:

query_posts('tag=bread,baking');

Посты с несколькими метками

Получить посты имеющие любую из меток:

query_posts( 'tag=bread,baking' );

Получить посты, имеющие сразу все указанные метки:

query_posts('tag=bread+baking+recipe');

Получить посты, имеющие сразу две метки (37 и 47). Этот вариант более предпочтителен вышеприведенному из-за быстродействия.

query_posts( array('tag__and' => array(37,47)) );

Получить посты, имеющие хотя бы одно метку 37 или 47. Этот вариант предпочтительнее т.к. указываются сразу ID.

query_posts( array('tag__in' => array(37,47)) );

Получить посты, НЕ связанные с метками 37 или 47:

query_posts(array( 'tag__not_in'=>array(37,47) ));
меню

Параметры Таксономий

Выводит посты связанные с определенной таксономией.

{tax}(строка)
Нужно указывать имя таксономии и слаг термина: array('category'=>'wordpress'). Запрещен с версии 3.1.
tax_query(массив)

С WP 3.1. Нужно указать параметры запроса по таксономии. Может принимать ряд вложенных аргументов, это:

  • relation (строка)
    Как выбирать записи из указанных таксономий. Может быть:

    • AND - записи которые одновременно входят в указанные термины таксономии.
    • OR - записи принадлежащие любому из указанных терминов таксономии.

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

    • taxonomy (строка)
      Название таксономии.

    • field (строка)
      Поле которое будет указывать в параметре terms. Может быть:

      • id или term_id - в terms указываем id терминов.
      • name - в terms указываем заголовок термина.
      • slug - в terms указываем ярлык термина.

        По умолчанию: 'term_id'

    • terms (число/строка/массив)
      Термины таксономии, из которых нужно вывести записи.

    • operator (строка)
      Оператор, указывающий как сравнивать указанные термины в параметре terms. Может быть:

      • IN - записи из указанных терминов (по умолчанию).
      • NOT IN - записи из всех терминов, кроме указанных.
      • AND - записи одновременно принадлежащие всем указанным терминам.
      • EXISTS - записи из таксономии (у которых есть любой термин таксономии). В этом случае параметр terms указывать не надо. С версии 4.1.
      • NOT EXISTS - записи НЕ из таксономии (у которых нет ни одного термина таксономии). В этом случае параметр terms указывать не надо. С версии 4.1.

        По умолчанию: 'IN'

    • include_children (логический)
      Включать или нет посты из дочерних терминов (для древовидных таксономий). true -включить.
      По умолчанию: true

tax_query это массив, элементами которого являются другие массивы, в каждом из которых указывается таксономия, её термины и то как использовать эти термины. Оператор relation указывается в первом массиве tax_query и определяет как сравнивать вложенные массивы между собой. Такая конструкция позволяет создавать запрос одновременно к нескольким таксономиям.

#1 Вывод записей из одной таксономии

Выведем записи из раздела (термина) bob, который является элементом таксономии people:

query_posts( array( 'people' => 'bob' ) );

#2 Выведем посты прикрепленные к термину bob из таксономии people:

$args = array(
	'post_type' => 'post',
	'people'    => 'bob'
);
query_posts( $args );

Сделаем тоже самое что и в примере выше, только с использованием аргумента tax_query:

query_posts( array(
	'tax_query' => array(
		array(
			'taxonomy' => 'people',
			'field'    => 'slug',
			'terms'    => 'bob'
		)
	)
) );

#3 Вывод из нескольких таксономий

Выведем посты из нескольких произвольных таксономий:

query_posts( array(
	'post_type' => 'post',
	'people'    => 'bob',
	'language'  => 'english'
) );

Аналог примера выше. Выведем записи, который одновременно относятся к нескольким произвольным таксономиям через tax_query:

query_posts( [
	'tax_query' => [
		'relation' => 'AND',
		[
			'taxonomy' => 'movie_janner',
			'field'    => 'slug',
			'terms'    => array( 'action', 'comedy' ),
		],
		[
			'taxonomy' => 'actor',
			'field'    => 'id',
			'terms'    => array( 103, 115, 206 ),
			'operator' => 'NOT IN',
		]
	]
] );

#4 Использование аргумента relation=OR

Выведем посты, которые находятся в рубрике quotes или которые имеют формат quote (форматы введены в версии 3.1). Для этого используем аргумент relation:

query_posts( [
	'post_type' => 'post',
	'tax_query' => [
		'relation' => 'OR',
		[
			'taxonomy' => 'category',
			'field' => 'slug',
			'terms' => [ 'quotes' ]
		],
		[
			'taxonomy' => 'post_format',
			'field' => 'slug',
			'terms' => [ 'post-format-quote' ]
		]
	]
] );

#5 Многоуровневый сложный запрос с использование оператора relation=OR

Допустим, нам нужно получить записи одной из групп элементов таксономии.

Например, надо получить автомобили марки ford черного цвета или автомобили марки bmw белого цвета:

В этом примере первый оператор relation=OR влияет на первые дочерние вложенные массивы. А оператор relation=AND во вложенных массивах влияет на массивы вложенных массивов.

query_posts(
	[
		'tax_query' => [
			'relation' => 'OR',
			[
				'relation' => 'AND',
				[
					'taxonomy' => 'brand',
					'field'    => 'slug',
					'terms'    => [ 'ford' ]
				],
				[
					'taxonomy' => 'color',
					'field'    => 'slug',
					'terms'    => [ 'black' ]
				]
			],
			[
				'relation' => 'AND',
				[
					'taxonomy' => 'brand',
					'field'    => 'slug',
					'terms'    => [ 'bmw' ]
				],
				[
					'taxonomy' => 'color',
					'field'    => 'slug',
					'terms'    => [ 'white' ]

				]
			]
		]
	]
);

query_posts( $args );

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

#6 Выведем заголовки всех типов записей countries из всех подрубрик термина 62, который относится к таксономии country:

$args = array(
	'tax_query' => array(
		array(
			'taxonomy' => 'country',
			'field'    => 'id',
			'terms'    => array( 62 )
		)
	),
	'post_type' => 'countries',
	'posts_per_page' => -1
);
$posts = get_posts( $args );

foreach( $posts as $pst ){
	echo $pst->post_title .'<br>';
}

#7 Выведем все записи произвольного типа (article) не относящиеся к указанным терминам ('term-slug', 'term-slug-two', 'term-slug-three') таксономии (artictag):

// получим все посты не относящиеся к указанным терминам

$post_type = 'article';
$tax   = 'artictag';
$terms = array('term-slug', 'term-slug-two', 'term-slug-three');

$psts  = get_posts( array(
	'posts_per_page' => -1,
	'post_type' => $post_type,
	'tax_query' => array(
			'relation' => 'AND',
			array(
				'taxonomy' => $tax,
				'terms' => $terms,
				'field' => 'slug',
				'operator' => 'NOT IN',
			)
		),
	'' => '',
) );

$i = 0;
foreach( $psts as $pst ){
	echo ++$i . ' <a href="'. get_permalink( $pst->ID ) .'">'. $pst->post_title .'</a><br>';
}

#8 Получим все записи типа func, которых нет в таксономии func_cat

Т.е. получим записи типа func, у которых нет ни одного термина из таксономии func_cat. Для этого используем параметр 'operator=NOT EXISTS'.

$posts = get_posts( [
	'tax_query' => [
		[
			'taxonomy' => 'func_cat',
			'operator' => 'NOT EXISTS',
		]
	],
	'post_type' => 'func',
	'posts_per_page' => -1
] );

foreach( $posts as $pst ){
	echo $pst->post_title .'<br>';
}
меню

Параметры Авторов

Получает посты принадлежащие определенным авторам.

author(число)
ID автора.
author_name(строка)
Ник автора. Нужно указывать значение поля user_nicename.
author__in(массив)
Массив ID авторов, записи которых нужно получить.
author__not_in(массив)
Массив ID авторов, записи которых нужно исключить.

#1 Выведем посты для одного автора

Посты по ID автора:

query_posts( 'author=123' );

Посты по нику автора:

query_posts( 'author_name=rami' );

#2 Выведем посты нескольких авторов сразу

Посты четырех авторов по ID:

query_posts( 'author=2,6,17,38' );

#3 Исключим посты автора

Исключим посты автора 12 и покажем все посты, кроме его:

query_posts( 'author=-12' );

#4 Еще пример

Показать все страницы автора 1 (author=1), отсортировать по заголовку (orderby=title) в алфавитном порядке (order=ASC) и не показывать прикрепленные посты вверху.

query_posts('caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC');

#5 Несколько авторов одновременно

Получим все записи авторов с ID 2 и 6:

query_posts( array( 'author__in' => array( 2, 6 ) ) );

Получим записи всех авторов, кроме авторов с ID 2 и 6:

query_posts( array( 'author__not_in' => array( 2, 6 ) ) );
меню

Параметры Записей (постов, страниц)

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

p(число)
ID поста который нужно получить (p=27).
name(строка)
post_name (слаг) записи (поста). Пример: name=o-saite.
title(строка)
Заголовок записи (поста). Пример: name=О сайте. С версии 4.4.
page_id(число)
ID постоянной страницы, которую нужно получить (page_id=27)
pagename(строка)
Альт. название постоянной страницы (pagename=o-saite)
post_parent(число)
Вернет только дочерние страницы.
post_parent__in(массив)
Выберет посты родители которых указанны в массиве.
post_parent__not_in(массив)
Выберет посты родители которых не указанны в массиве.
post__in(массив)

Укажите через запятую ID постов, которые нужно получить (post__in=5,12,2,14,7).

Заметка: если есть прилепленные записи, они будут включены автоматом. Отключить их можно параметром ignore_sticky_posts.

post__not_in(массив)
Выберет все посты кроме указанных.
post_name__in(массив)
Выберет указанные посты. Указывать нужно post_name (slug) через запятую или в массиве. С версии 4.4.

Посты/страницы по ID

Выведем пост по ID:

query_posts('p=7');

Выведем страницу по ID:

query_posts( 'page_id=7' );

Посты/страницы по Слагу

Выведем пост по Слагу:

query_posts( 'name=about-my-life' );

Выведем страницу по Слагу:

query_posts( 'pagename=contact' );

Дочерние посты/страницы

Выведем дочернюю страницу, используя слаг родительской и дочерней страницы разделенные слэшом: parent_slug/child_slug

query_posts( 'pagename=contact_us/canada&post_type=page' );

Выведем дочерние страницы, используя ID родительской:

query_posts( 'post_parent=93&post_type=page' );

Выведем страницы верхнего уровня, исключим все дочерние:

query_posts( 'post_parent=0&post_type=page' );

Выведем посты родители которых указаны в массиве:

query_posts( array( 'post_parent__in' => array( 2, 5, 12, 14, 20 ) ) );

Множественные выводы постов/страниц

Выведем только указанные посты:

query_posts(
	array( 'post_type'=>'page', 'post__in' => array( 2, 5, 12, 14, 20 ) )
);

Выведем все посты, кроме указанных:

query_posts( array(
	'post_type' => 'post',
	'post__not_in' => array( 2, 5, 12, 14, 20 )
) );

Заметка: нельзя объединять post__in и post__not_in в одном запросе.

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

// не правильно
$exclude_ids = '1,2,3';
query_posts( array( 'post__not_in' => array( $exclude_ids ) ) );

// Правильно
$exclude_ids = array( 1, 2, 3 );
query_posts( array( 'post__not_in' => $exclude_ids ) );
меню

Параметры Типов записей

Показывает посты указанного типа.

post_type(строка/массив)

Записи какого типа нужно показывать. По умолчанию: post. Но если указан параметр tax_query, то по умолчанию ставиться any.

Может быть:

  • any - включает все типы, кроме revision и типов у которых указан параметр exclude_from_search=true.
  • attachment - по умолчанию WP_Query ставит статус 'post_status'=>'publish', а вложения имеют статус 'post_status'=>'inherit', поэтому чтобы вывести вложения нужно еще изменить параметр post_status на 'inherit' или 'any'.
  • page - страница.
  • post - пост.
  • revision - ревизия.
  • custom_type - название (ярлык) произвольного типа записи.
  • array('post','page') - сразу несколько типов в массиве.

По умолчанию: post

Посты по типу

Выведем только страницы:

query_posts( 'post_type=page' );

Выведем все посты, кроме ревизий и типов постов у которых при регистрации параметр exclude_from_search выставлен в true:

query_posts( 'post_type=any' );

Выведем 4 типа постов одновременно:

query_posts( array(
	'post_type' => array( 'post', 'page', 'movie', 'book' )
) );
меню

Параметры Произвольных полей (postmeta)

Основным параметром для работы с мета-данными в WP_Query является meta_query, который получает записи (посты) по существующим у них произвольным полям и их значениям. По принципу использования, meta_query похож на tax_query - массив, где каждый элемент в свою очередь является массивом с параметрами запроса, т.е. meta_query - это массив массивов:

$args = array(
	'meta_query' => array(
		'relation' => 'OR',
		array(
			'key' => 'color',
			'value' => 'blue'
		),
		array(
			'key' => 'price',
			'value' => 20
		)
	)
);

Такая конструкция позволяет использовать множественные запросы. Первый параметр relation во "внешнем" массиве описывает логическую связь между запросами. Он может принимать значения AND (используется по умолчанию. Совпадение со всеми запросами) или OR (совпадение с любым из запросов).

Старые переменные запроса мета-данных: meta_key, meta_value, meta_value_nummeta_compare по прежнему поддерживаются и могут быть использованы для простых запросов связанных с произвольными полями.

Список всех параметров связанных с мета-данными:

meta_key(строка)
Ключ(название) произвольного поля.
meta_value(строка)
Значение произвольного поля.
meta_value_num(число)
Значение произвольного поля, число.
meta_compare(строка)
Оператор для проверки значения произвольного поля. Может быть: =, !=, >, >=, <, <=, LIKE, NOT LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, EXISTS (с версии 3.5), NOT EXISTS (3.5), REGEXP (3.7), NOT REGEXP (3.7) и RLIKE (3.7);
По умолчанию '='
meta_query(массив)

Массив параметров мета-данных определяющих вывод (этот параметр включает в себя meta_keymeta_value и meta_compare и заменяет их). С версии 3.1.
В массиве можно указать следующие параметры:

  • relation (строка)
    Этот параметр указывается как строка в главном массиве meta_query и указывает как сравнивать между собой несколько массивов с параметрами запроса, указанных в этом главном массиве.
    Параметр может принимать два значение:
    OR - выбрать мета-поля подходящие хоты бы под один массив с параметрами запроса;
    AND (по умолчанию) - выбрать мета поля подходящие для всех массивов с параметрами запроса.

    • key (строка)
      Ключ поля.

    • value (строка/массив)
      Значение поля. Указывать не нужно, если при сравнении используется: 'EXISTS' или 'NOT EXISTS' (с версии 3.9).

    • compare (строка)
      Как сравнивать указанное в value значение. Может быть: 

      • = - равно.
      • != - не равно.
      • > - больше.
      • >= - больше или равно.
      • < - меньше.
      • <= - меньше или равно.
      • LIKE - указанная в value подстрока имеется в строке. Как '%значение%' в sql запросе.
      • NOT LIKE - тоже что LIKE только наоборот.
      • IN - в value указываются несколько значений в массиве и поиск идет хотя бы по одному из значений.
      • NOT IN - любое значение, кроме тех что указанны в виде массива в value.
      • BETWEEN - в value указываются 2 значения в массиве: большее и меньшее и поиск идет между этих значений. , например: 'value' => array(5, 25) - от 5 до 25 (включительно).
      • NOT BETWEEN - любое значение, за пределами диапазона указанного в value, например: 'value' => array(5, 25) - меньше 5 и больше 25.
      • EXISTS - выведет всё где существует указанный в 'key' ключ. 'value' не указывается в этом случае. (с версии 3.5)
      • NOT EXISTS - выведет всё где указанный в 'key' ключ не существует. 'value' не указывается в этом случае. (с версии 3.5)
      • REGEXP - в value указывается регулярное выражение для поиска, например: 'value' => '^bar', (найдет строку: 'bar is'). (с версии 3.7)
      • NOT REGEXP - в value указывается регулярное выражение для поиска, найдет все что не входит в это выражение. (с версии 3.7)
      • RLIKE - синоним REGEXP. (с версии 3.7)

    По умолчанию 'IN', если value массив, '=' в других случаях.

    • type (строка)
      тип произвольного поля (если, например в поле указываются только числа то нужно использовать NUMERIC, чтобы числа не сравнивались как строки). Может быть:

      • NUMERIC - целые числа
      • DECIMAL - дробные числа
      • SIGNED - целые числа, положительные и отрицательные
      • UNSIGNED - целые числа, только положительные
      • CHAR - строка не чувствительна к регистру
      • BINARY - строка чувствительная к регистру
      • DATETIME - дата и время
      • DATE - только дата
      • TIME - только время

      По умолчанию: CHAR.

    Тип DATE работает при сравнении BETWEEN только если дата указывается в формате YYYY-MM-DD и сравнивается с аналогичным форматом.

Смотрите также отдельное описание класса мета запросов: WP_Meta_Query

Сортировка по произвольному полю

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

'meta_query' => array(
	'book_color' => array(
		'key'     => 'color',
		'value'   => 'blue',
		'compare' => 'NOT LIKE',
	),
),
'orderby' => 'book_color',
'order'   => 'DESC',

Если произвольное поле указывается через параметр meta_key и meta_value, то для сортировки по этому полю в параметре orderby укажите значения: meta_value или meta_value_num (для чисел). См. ниже описание параметра orderby.

'meta_key=color&meta_value=blue&orderby=meta_value&order=ASC'

Базовые примеры (без meta_query)

#1 Посты с ключом произвольного поля color, не обращая внимание на значение этого поля.

query_posts( 'meta_key=color' );

#2 Посты со значением произвольно поля blue, не обращая внимание на название ключа.

query_posts( 'meta_value=blue' );

#3 Посты с ключом поля color и значением этого поля blue:

query_posts( array( 'meta_key' => 'color', 'meta_value' => 'blue' ) );

#4 Посты у которых ключ равен color и значение поля не равно blue:

query_posts(
	 array( 'meta_key' => 'color', 'meta_value' => 'blue', 'meta_compare' => '!=' )
);

#5 Продукты с ключом price и значение произвольно поля меньше или равно 22.

При использовании параметра "meta_value" значение 99 будет больше 100, так как эти значения распознаются как строки, а не числа. Для того чтобы числа понимались как числа нужно использовать параметр "meta_value_num":

query_posts(
	 array( 'meta_key' => 'price', 'meta_value_num' => '22', 'meta_compare' => '<=', 'post_type' => 'product' )
);

#6 Посты со значением произвольного поля равным 0, не важно какой ключ.

query_posts( array ( 'meta_value' => '_wp_zero_value' ) );

Примеры с использованием meta_query

#1 Записи с одним произвольным полем

Выведем продукты (product) у которых ключ равен color и значение поля не равно blue:

$args = array(
	'post_type'  => 'product',
	'meta_query' => array(
		array(
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE'
		)
	)
);
query_posts( $args );

Заметка: для meta_query нужно указывать массив в массиве, даже если вы задаете один запрос.

#2 Записи имеющие одновременно два произвольных поля

Пример вывода постов с несколькими произвольными полями и указанием различных условий для значений этих произвольных полей:

$args = array(
	'post_type'  => 'product',
	'meta_query' => array(
		array(
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE'
		),
		array(
			'key'     => 'price',
			'value'   => array( 20, 100 ),
			'type'    => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
 );
query_posts( $args );

#3 Записи имеющие хотя бы одно поле

Выведем посты с ключом color и значением не (NOT LIKE) blue или (OR) посты с ключом price со значениями поля от 20 до 100:

$args = array(
	'post_type'    => 'product',
	'meta_query'   => array(
		'relation' => 'OR',
		array(
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE'
		),
		array(
			'key'     => 'price',
			'value'   => array( 20, 100 ),
			'type'    => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
);
query_posts( $args );

#4 Записи с двумя полями отсортированные по третьему полю

Предположим у нас есть тип записей toys - игрушки, а в произвольных полях мы указываем материал: твердая мягкая и вес игрушки в граммах: 100 300 500.

Получим мягкие игрушки вес которых от 200 до 500 грамм и отсортируем их по цене по убыванию:

$args = array(
	'post_type'  => 'toys',
	'meta_query' => array(
		array(
			'key'   => 'type',
			'value' => 'soft',
		),
		array(
			'key'     => 'weight',
			'value'   => array( 200, 500 ),
			'compare' => 'BETWEEN',
			'type'    => 'NUMERIC',
		),
	),
	'meta_key' => 'price',
	'orderby'  => 'meta_value_num',
	'order'    => 'DESC'
);
query_posts( $args );

#5 Получим записи у которые есть произвольное поле

Этот пример показывает, как получить записи для которых установлены миниатюры (у которых есть произвольное поле _thumbnail_id):

$args = array(
	'posts_per_page' => 3,
	'post_type'  => 'post',
	'meta_query' => array(
		array(
			'key' => '_thumbnail_id',
			'compare' => 'EXISTS'
		)
	)
);
query_posts( $args );

#6 Вложенные сложные запросы

С версии 4.1 можно создавать вложенные запросы. Например, выполним такое условие: нужно показать продукты оранжевого цвета (color=orange) ИЛИ маленькие (size=small) продукты красного цвета (color=red):

$args = array(
	'post_type'  => 'product',
	'meta_query' => array(
		'relation' => 'OR',
		array(
			'key'     => 'color',
			'value'   => 'orange',
			'compare' => '=',
		),
		array(
				'relation' => 'AND',
				array(
						'key'     => 'color',
						'value'   => 'red',
						'compare' => '=',
				),
				array(
						'key'     => 'size',
						'value'   => 'small',
						'compare' => '=',
				),
		),
	),
);
query_posts( $args );

#7 Сортировка по произвольному полю

С версии 4.2 массивам в meta_query можно указывать ключи, чтобы затем сортировать по этому ключу:

$args = array(
	'post_type'  => 'book',
	'meta_query' => array(
		'book_color' => array(
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE',
		),
	),
	'orderby' => 'book_color',
);
query_posts( $args );
меню

Параметры MIME Типов записей

Выбирает вложения с указанным миме типом. Список миме типов смотрите в описании wp_get_mime_types().

post_mime_type(строка/массив)

Миме тип записи. Используется только для вложений - записей с типом 'attachment'.

Этот параметр будет работать только когда параметр post_type = attachment и post_status = inherit. Т.е. миме-тип может быть только у вложений.

Получим только картинки любого типа

query_posts( array(
	'post_mime_type' => 'image',
	'post_type'      => 'attachment',
	'post_status'    => 'inherit',
) );

Получим только картинки gif типа

query_posts( array(
	'post_mime_type' => 'image/gif',
	'post_type'      => 'attachment',
	'post_status'    => 'inherit',
) );

Получим все типы вложений, кроме картинок

query_posts( array(
	'post_mime_type' => array('application','text','video','audio'),
	'post_type'      => 'attachment',
	'post_status'    => 'inherit',
) );
меню

Параметры Статусов

Получает посты с указанным статусом.

post_status(строка/массив)

Статус поста.

По умолчанию publish, а если пользователь авторизован добавляется еще и private. Если запрос запущен из админ части, добавляются еще и защищенные типы статусов: future, draft и pending. Все типы статусов:

  • publish - опубликованный пост;
  • pending - пост на модерации;
  • draft - черновик;
  • auto-draft - черновик, сохраненный самим WordPress (авто-сохранение);
  • future - запланированный пост;
  • private - личный пост;
  • inherit - ревизия;
  • trash - удаленный пост (в корзине). С версии 2.9;
  • any - все статусы, кроме статусов в параметре которых указано exclude_from_search=true. См. register_post_status() и get_post_stati().

По умолчанию: 'publish'

Посты по статусам

Получим только черновики:

query_posts( 'post_status=draft' );

Получим посты с разными статусами:

query_posts(
	 array( 'post_status' => array( 'pending', 'draft', 'future' ) )
);

Получим все виды вложений:

query_posts(
	  array( 'post_status' => 'any', 'post_type' => 'attachment' )
);
меню

Параметры Даты (времени)

Выводит посты принадлежащие определенному периоду времени.

year(число)
4 цифры года (2013)
monthnum(число)
Номер месяцы (1 - 12)
w(число)
Неделя в году (с 0 до 53)
day(число)
День месяца (1 - 31)
hour(число)
Час (0 - 23)
minute(число)
Минута (0 - 60)
second(число)
Секунда (0 - 60)
m(число)
ГодМесяц (201306)
date_query(массив)

Параметры по которым будет отстроиться запрос. Работает на основе отдельного класса: WP_Date_Query.

Этот параметр указывается как массив, который может содержать вложенные массивы. Параметры: column, compare, relation для основного массива работают как параметры по умолчанию для вложенных массивов (если они есть).

Возможные форматы дат смотрите в документации PHP.

  • column — поле в базе данных для запроса. Может быть:
    post_date
    post_date_gmt
    post_modified
    post_modified_gmt
    comment_date
    comment_date_gmt
    user_registered
    По умолчанию: 'post_date'

  • compare — Оператор сравнения для всех вложенных массивов по умолчанию. Может быть: Может быть: =, !=, >, >=, <, <=, IN, NOT IN, BETWEEN, NOT BETWEEN.
    По умолчанию: '='

  • relation — оператор, если указаны несколько массивов с датами:
    AND (учитывать одновременно все указанные массивы).
    OR (если есть совпадения хотя бы с одним указанным массивом).
    По умолчанию - OR

    Параметры ниже должны использоваться во вложенных массивах. Они определяют запрос для отдельной даты.

    Также все параметры ниже, могут быть использованы в основном массиве.

    • before (строка/массив) — Дата записи "до" которой будут получены. Принимает строку которую поймет функция strtotime(): все возможные форматы. Или можно передать массив с индексами: year, month, day: array('year'=>'2015', 'month'=>'5', 'day'=>'28' )
      Относительно текущего времени сайта (не UTC).

    • after (строка/массив) — Дата записи "после" которой будут получены. Принимает строку которую поймет функция strtotime(): все возможные форматы. Или можно передать массив с индексами: year, month, day: array('year' => '2015', 'month' => '5', 'day' => '28' )
      Относительно текущего времени сайта (не UTC).

    • column (строка) — см. выше, только для конкретной даты. По умолчанию: значение верхнего массива.

    • compare (строка) — см. выше, только для конкретной даты. По умолчанию '='.

    • inclusive (логический) — аргументы before и after обрабатываются включительно, если true. По умолчанию: false.

    • year (число/массив) — год, например 2013
    • dayofyear (число/массив) — номер дня в году, 1-366.
    • month (число/массив) — месяц, 1-12
    • week (число/массив) — неделя, 0-53
    • day (число/массив) — день, 1-31
    • dayofweek (число/массив) — день недели, 1-7, где 1 - воскресенье
    • dayofweek_iso (число/массив) — день недели, 1-7, где 1 - понедельник
    • hour (число/массив) — час, 0-23
    • minute (число/массив) — минута, 0-60
    • second (число/массив) — секунда, 0-60

    В параметрах: year, month, week, dayofyear, day, dayofweek, dayofweek_iso, hour, minute, second можно указать несколько значений, в виде массива, если параметр compare соответствует.

#1. Получим посты за сегодня:

$today = getdate();
query_posts( 'year=' . $today["year"] . '&monthnum=' . $today["mon"] . '&day=' . $today["mday"] );

#2. Получим посты за последнюю неделю:

$week = date('W');
$year = date('Y');
query_posts( 'year=' . $year . '&w=' . $week );

#3. Получим посты за 20 Декабря:

query_posts( 'monthnum=12&day=20' );

Заметка: запросы выше возвращают посты за указанный период в истории: "Посты за Х месяц, Х день". Они не могут получать посты за произвольный промежуток времени по отношению к настоящему. Поэтому запросы типа "Посты за последние 30 дней" или "Посты за последний год" не возможны в базовом варианте, для таких запросов нужно использовать фильтр "posts_where". Примеры ниже показывают как это делать.

#4. Получим посты за промежуток времени с 1 марта по 15 марта 2010 года:

// Создадим новую функцию которая добавит условие where в запрос
function filter_where( $where = '' ) {
	// с 1 марта по 15 марта 2010 года
	$where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
	return $where;
}

add_filter( 'posts_where', 'filter_where' );
query_posts( $query_string );
remove_filter( 'posts_where', 'filter_where' );

#5. Получим посты за последние 30 дней:

// Создадим новую функцию которая добавит условие where в запрос
function filter_where( $where = '' ) {
	// за последние 30 дней
	$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}

add_filter( 'posts_where', 'filter_where' );
query_posts( $query_string );
remove_filter( 'posts_where', 'filter_where' );

#6. Получим посты за промежуток от 30 до 60 дней, до настоящего:

// Создадим новую функцию которая добавит условие where в запрос
function filter_where( $where = '' ) {
	// от 30 до 60 дней
	$where .= " AND post_date >= '" . date('Y-m-d', strtotime('-60 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}

add_filter( 'posts_where', 'filter_where' );
query_posts( $query_string );
remove_filter( 'posts_where', 'filter_where' );

Параметр "m" может быть установлен только в списке постов в админ-панели. Он полезен когда вы выбираете из выпадающего списка select где дата установлена как число YYYYmm.

Примеры с параметром date_query

#1. Получим посты между 9 и 17 часами:

$args = array(
	'date_query' => array(
		array(
			'hour'      => 9,
			'compare'   => '>=',
		),
		array(
			'hour'      => 17,
			'compare'   => '<=',
		),
		array(
			'dayofweek' => array( 2, 6 ),
			'compare'   => 'BETWEEN',
		),
	),
	'posts_per_page' => -1,
);
query_posts( $args );

#2. Получим посты за промежуток времени: 1 января по 28 февраля:

$args = array(
	'date_query' => array(
		array(
			'after'     => 'January 1st, 2013',
			'before'    => array(
				'year'  => 2013,
				'month' => 2,
				'day'   => 28,
			),
			'inclusive' => true,
		),
	),
	'posts_per_page' => -1,
);
query_posts( $args );

Даты можно указывать цифрами и строками, как видно из этого примера, потому что аргументы before и after обрабатываются функцией PHP strtotime(), а она понимает строки.

#3. Получим посты опубликованные год назад, но измененные в последний месяц:

$args = array(
	'date_query' => array(
		array(
			'column' => 'post_date_gmt',
			'before' => '1 year ago',
		),
		array(
			'column' => 'post_modified_gmt',
			'after'  => '1 month ago',
		),
	),
	'posts_per_page' => -1,
);
query_posts( $args );

#4. Получим посты за последние 2 недели, использовав строку '2 weeks ago':

query_posts( array(
	'date_query' => array(
		'after' => '2 weeks ago',
	),
) );

#5. Получим записи за последние 2 месяца, опубликованные в будние дни:

query_posts( array(
	'date_query' => array(
		'after' => '2 months ago',
		array(
			'dayofweek' => array( 1, 5 ),
			'compare' => 'BETWEEN',
		),
	),
) );

Аргумент date_query работает и с классом WP_Comment_Query, поэтому его точно также можно использовать в функции: get_comments().

меню

Параметры Отступов

Можно установить отступ от первого поста в результатах запроса. Например, стандартно запрос возвращает 6 постов, а если в тот же запрос добавить параметр offset=1, то будут возвращены 5 постов (первый пост из запроса будет пропущен).

offset(число)
Сколько постов из результатов запроса пропустить.

Пример использования

Пропустим первый/один пост (offset=1) и вернем следующие 5:

query_posts('posts_per_page=5&offset=1');

Параметры Сортировки и порядка

Сортирует и устанавливает направление сортировки.

order(строка)

Направление сортировки по параметру orderby, может быть:

  • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c).
  • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a) .
orderby(строка)

Поля по которым можно сортировать посты. Может быть

  • none - не сортировать, выводить как есть в БД. Равносильно сортировке по ID. С версии 2.8.
  • ID - сортировка по ID.
  • author - сортировка по ID авторов.
  • title - сортировка по заголовку.
  • name - по названию поста (ярлык, слаг поста).
  • date - сортировка по дате публикации.
  • modified - сортировка по дате изменения.
  • type - по типу поста (post_type). С версии 4.0
  • parent - сортировка по значению поля parent.
  • rand - случайный порядок.
  • RAND(x) - в случайном порядке для числовых значений. Тут "x" - это целое число.
  • comment_count - сортировка по количеству комментариев. С версии 2.9.
  • menu_order - стандартно используется для страниц и вложений. Порядковый номер указывается на странице редактирования поста.
  • meta_value - по значения произвольного поля.

    Важно: параметр meta_key так же должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).

  • meta_value_num - сортировка по произвольным полям, значения которых являются числами. С версии 2.8.
  • ключ массива из meta_query - в этом случае сортировка будет по значению произвольного поля указанного в массиве meta_query.
  • post__in - учитывает порядок указанных ID в параметре post__in.
  • post_name__in - учитывает порядок указанных имен в параметре post_name__in.
orderby = array()

С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order. Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:

'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )

#1 Сортировка по заголовку

query_posts( array ( 'orderby' => 'title', 'order' => 'DESC' ) );

Отсортируем по порядку в меню, а затем по заголовку

query_posts( array ( 'orderby' => 'menu_order title', 'order' => 'DESC' ) );

#2 Выведем один случайный пост:

query_posts( array ( 'orderby' => 'rand', 'posts_per_page' => '1' ) );

#3 Отсортируем посты по количеству комментариев:

query_posts( array( 'orderby' => 'comment_count' ) );

#4 Отсортируем продукты по цене (произвольное поле price):

query_posts(
	 array ( 'post_type' => 'product', 'orderby' => 'meta_value_num', 'meta_key' => 'price' )
);

#5 Множественная сортировка

Выведем посты отсортированные по двум полям: 'title' и 'menu_order' (title первостепенен):

query_posts(
	array( 'post_type' => 'page', 'orderby' => 'title menu_order', 'order' => 'ASC' )
);

#6 Множественная сортировка с использованием массива (с версии 4.0)

Получим страницы отсортированные по заголовку (title) и номеру меню (menu_order) в разном порядке (ASC/DESC):

query_posts( array( 'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' ) ) );

#7 Сортировка по 'meta_value' для нового типа поста (post_type)

Выведем посты типа 'my_custom_post_type' отсортированные по ключу произвольного поля "age" и отфильтрованные, чтобы показывались только посты со значением поля 3 и 4:

$args = array(
   'post_type' => 'my_custom_post_type',
   'meta_key' => 'age',
   'orderby' => 'meta_value_num',
   'order' => 'ASC',
   'meta_query' => array(
	   array(
		   'key' => 'age',
		   'value' => array(3, 4),
		   'compare' => 'IN',
	   )
   )
 );
 query_posts($args);
меню

Параметры Пагинации

nopaging(логический)
Выключит пагинацию, выведет все посты на одной странице.
posts_per_page(число)

Количество постов на одной странице. Если выставить -1, то будут выведены все посты (без пагинации).

С версии 2.1 заменяет параметр showposts. Установите параметр paged, если пагинация не работает, после использования этого параметра.

Заметка: если запрос в feed части, WP перезаписывает этот параметр опцией posts_per_rss. Чтобы повлиять на вывод постов в фиде используйте фильтры post_limits или pre_option_posts_per_rss.

posts_per_archive_page(число)
Количество постов для страниц архивов: для страниц, которые удовлетворяют условиям is_archive() или is_search(). Этот параметр перезаписывает параметры "posts_per_page" и "showposts".
offset(число)
Сколько постов пропустить сверху выборки (верхний отступ).
Внимание: Установка этого параметра переписывает/игнорирует параметр "paged" и ломает пагинацию (решение проблемы).
paged(число)
Номер страницы пагинации. Показывает посты, которые в обычном режиме должны были быть показаны на странице пагинации Х. Переписывает параметр posts_per_page
page(число)
Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page).
ignore_sticky_posts(логический)

Игнорировать прилепленные посты или нет (true/false). С версии 3.1. Заменяет параметр caller_get_posts.

Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.

#1 Посты на странице

Выведем 3 поста на странице:

query_posts( 'posts_per_page=3' );

Выведем все посты на странице:

query_posts( 'posts_per_page=-1' );

Выведем все посты и отключим пагинацию:

query_posts( 'nopaging=true' );

#2 Отступы сверху

Выведем посты начиная с четвертого (пропустим первые 3):

query_posts( 'offset=3' ) );

Выведем 5 постов которые идет за тремя последними:

query_posts( array( 'posts_per_page' => 5, 'offset' => 3 ) );

#3 Записи со страницы пагинации 6

query_posts( 'paged=6' );

#4 Записи с текущей страницы

Покажем посты с текущей страницы пагинации. Полезно при построении произвольной пагинации:

query_posts( array( 'paged' => get_query_var( 'paged' ) ) );

Выведем посты с текущей страницы и установим параметр paged в 1, когда переменная не определена на первой странице пагинации:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array( 'paged' => $paged ) );

Используйте get_query_var('page'); если нужно получить номер страницы пагинации для статической главной страницы сайта (is_front_page()). Переменная "page" раже содержит номер пагинации на отдельных страницах типа post, когда в контенте используется тег <!--nextpage--> для разбиения контента на страницы.

Вывод текущей страницы пагинации на статической главной странице:

$paged = (get_query_var('page')) ? get_query_var('page') : 1;
query_posts( array( 'paged' => $paged ) );

#5 Прилепленные записи (посты)

# Все прилепленные записи
$sticky = get_option( 'sticky_posts' );
query_posts( ('post__in'=>$sticky );
# Только первый прилепленный пост
$sticky = get_option( 'sticky_posts' );
query_posts( 'p=' . $sticky[0] );
# Первый прилепленный пост, если такого поста нет, то последний опубликованный
$args = array(
	'posts_per_page' => 1,
	'post__in'  => get_option( 'sticky_posts' ),
	'ignore_sticky_posts' => 1
);
query_posts( $args );
# Первый прилепленный пост, если такого поста нет, то ничего не выводим
$sticky = get_option( 'sticky_posts' );
$args = array(
	'posts_per_page' => 1,
	'post__in'  => $sticky,
	'ignore_sticky_posts' => 1
);
query_posts( $args );
if ( $sticky[0] ) {
	// формируем вывод...
}
# 5 последних прилепленных записей
$sticky = get_option( 'sticky_posts' ); // все Sticky записи

rsort( $sticky ); // отсортируем - новые вверху

$sticky = array_slice( $sticky, 0, 5 ); // получим первые 5

query_posts( array( 'post__in'=>$sticky, 'ignore_sticky_posts'=>1 ) );

#6 Скрытие прилепленных постов

Исключим все прилепленные посты из запроса:

query_posts( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты не будут сверху, они будут выводится как обычные посты (по дате):

query_posts( array( 'ignore_sticky_posts' => 1, 'posts_per_page' => 3, 'cat' => 6 );

Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты будут полностью исключены. Также добавим сюда правило для правильной пагинации:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
	'cat' => 3,
	'ignore_sticky_posts' => 1,
	'post__not_in' => $sticky,
	'paged' => $paged
);
query_posts( $args );
меню

Параметры Комментариев

В объект WP_Query добавляются данные комментариев записи, если это отдельная запись. В параметрах ниже, указывается как нужно получать комментарии в таких случаях.

comment_status(строка)
Статус комментария.
ping_status(число)
Статус пинга.
comments_per_page(число)
Число комментариев для получения на отдельной странице комментариев. По умолчанию опция: comments_per_page.
comment_count(число/массив)

Количество комментариев, которое должен иметь пост. С версии 4.9.

  • Если указать число, получит посты с указанным числом комментариев (оператор поиска =).
  • Массив позволяет указать вариант сравнения числа комментариев. В массиве можно указать параметры:
    • value (число) - количество комментариев для сравнения.
    • compare (строка) - как сравнивать кол-во комментов. Может быть: =, !=, >, >=, <, <=. По умолчанию: =.
меню

Параметры Поиска

s(строка)
поисковая фраза.
exact(логический)
true - искать по точной фразе указанной в параметре s.
По умолчанию: false

Посты найденные по поисковой фразе.

query_posts( 's=keyword' );

Параметры Доступа

Показывает посты если пользователь имеет достаточные права.

perm(строка)
Доступ пользователя.

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

query_posts(
	  array( 'post_status' => array( 'publish', 'private' ), 'perm' => 'readable' )
);

Параметры Кэширования

Не добавляет данные в кэш при выполнении запросов.

cache_results(логический)
Кэшировать ли информацию о посте.
update_post_meta_cache(логический)
Кэшировать ли информацию о мета данных поста.
update_post_term_cache(логический)
Кэшировать ли информацию о привязке поста к терминам и таксономиям.

#1 Выведем 50 постов, но не будет добавлять информацию о постах в кэш:

query_posts( array( 'posts_per_page' => 50, 'cache_results' => false ) );

#2 Выведем 50 постов, но не будем добавлять мета данные поста в кэш

query_posts( array( 'posts_per_page' => 50, 'update_post_meta_cache' => false ) );

#3 Выведем 50 постов, но не будем добавлять в кэш информацию о терминах постов

query_posts( array( 'posts_per_page' => 50, 'update_post_term_cache' => false ) );

Обычно эти функции использовать не нужно - кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.

Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в false по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.

меню

Параметры Возвращаемых данных

Устанавливает какие данные должен возвращать запрос.

fields(строка/массив)

Какие данные возвращать. По умолчанию возвращаются все.

  • ids - вернет массив с ID постов.
  • id=>parent - вернет ассоциативный массив [ parent => ID, … ].
  • Вставка любых других параметров, вернет все поля (по умолчанию) - массив объектов постов.
no_found_rows(логический)
true - не подсчитывать количество найденных строк. В некоторых случаях может ускорить запрос.
По умолчанию: false
меню

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

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

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

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

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

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

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

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

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

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

#4. Записи из категории и с меткой

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

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

Примеры

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

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

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

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

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

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

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

#3. Если нужно использовать функцию "читать дальше" (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 »');
endwhile;
?>

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

<?php
query_posts( 'page_id=7' );      // получит только страницу с ID 7
?>

или

<?php
query_posts( 'pagename=o-saite' ); // получит только страницу "o-saite"
?>

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

<?php
query_posts( 'pagename=o-saite/avtori' ); // получит страницу "avtori", которая является дочерней к "o-saite"
?>

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

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

#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-ти постам (ссылка пагинации).

#4. Параметры также можно передать в виде массива

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

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

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

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

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

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

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

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

-

То есть грубо говоря на странице два раза алфавита

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

Заметки

  • Global. WP_Query. $wp_query WordPress Query object.

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

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

Код query posts: wp-includes/query.php WP 5.3.1

<?php
function query_posts( $query ) {
	$GLOBALS['wp_query'] = new WP_Query();
	return $GLOBALS['wp_query']->query( $query );
}

Cвязанные функции

Из метки: query (запрос)

Еще из раздела: Запросы

316 комментов
Полезные 9 Вопросы 4 Все
  • avense6 videovegas.ru

    А можно как то используя строковой параметр вывесть несколько страниц по их ID?
    Типо как для категорий это возможно, перечисляя ID через запятую, пример: "cat=1,2,3,4,5"

    1
    Ответить21.Дек.2017 в 15:43 #
    • Kama7641

      Так можно: post__in=5,12,2,14,7 и возможно тип записи нужно будет указать, например: post_type=page, если там не стандартный post, а то ничего не получишь...

      1
      Ответить25.Дек.2017 в 09:31 #
  • Богдан

    Здравствуйте!

    Подскажите, пожалуйста - возникла проблема с пагинацией при использование query_posts на кастомной таксономии. Дело в том, что данные для $args - беруться из $_GET запроса: т.е. на станице таксономии организована форма с "фильтрами" (стиль: doom, gothic, folk; года: 1991, 199Х, 2ХХХ; и так далее). Проставляя чекбоксы по своему вкусу - подбираеться, соответственно и нужная музыка, т.е. идёт управление выборкой результатов этого query_posts. И, надо отдать должное - всё фильтруется как надо, но при переходе на уже вторую страницу - выдаёт "Oops! That page can’t be found.", но УРЛ строки - верный:

    test.loc/section/metal/page/2/?mf_doom[]=38&mf_doom[]=39&mf_folk[]=51&filters_submit=Применить фильтр

    Но, к сожалению - на второй станице никаких кастомных записей уже нет...
    Подскажите, хоть куда рыть, а то я уже весь день на вашем сайте сижу. help

    Ответить07.Фев.2018 в 22:29 #
  • Вывод топа в виджете не работает

    Ответить18.Авг.2018 в 00:56 #
  • Добрый день. Столкнулся с такой задачей: есть вывод похожих объявлений недвижимости по типу недвижимости, захотел улучшить релевантность и выводить не только по типу но и по статусу операции.

    Получить ID терма статуса операции недвижимости удалось по аналогии c типом недвижимости и дальше столкнулся с проблемой как добавить выборку по статусу операции(ID терма, который не входит в таксономию $similer_type)

    Покопался в интернете, но примеров tax_query подходящей выборки из двух таксономий не нашел. PHP только начал изучать, и хочу сам понять и разобраться но не хватает знаний и опыта.

    Помогите примером, или советом, или подскажите в какую сторону копать. help

    <?php
    
    global $post_meta_data;
    
    $show_similer = houzez_option( 'houzez_similer_properties' );
    $similer_type = houzez_option( 'houzez_similer_properties_type' );
    $similer_view = houzez_option( 'houzez_similer_properties_view' );
    $similer_count = houzez_option( 'houzez_similer_properties_count' );
    
    if( $show_similer ) {
    
    	$term_ids = Array ();
    	$city_ids = Array ();
    	$status_ids = Array ();
    	$terms = get_the_terms(get_the_ID(), $similer_type, 'string');
    	$prop_city = get_the_terms( get_the_ID(), 'property_city', 'string' );
    	$prop_status = get_the_terms( get_the_ID(), 'property_status', 'string' );
    
    	if ( !empty( $terms ) ) :
    
    		$term_ids = wp_list_pluck($terms, 'term_id');
    
    	endif;
    
    	if ( !empty( $prop_city ) ) :
    
    		$city_ids = wp_list_pluck( $prop_city, 'term_id' );
    
    	endif;
    
    	if ( !empty( $prop_status ) ) :
    
    		$status_ids = wp_list_pluck( $prop_status, 'term_id' ); //Получили ID терма статуса у текущего объекта недвижимости
    
    	endif;
    
    	$tax_query = Array ();
    
    	$tax_query[] = array(
    		'taxonomy' => $similer_type,
    		'field' => 'id',
    		'terms' => $term_ids,
    		'operator' => 'IN' //Or 'AND' or 'NOT IN'
    	);
    
    	$tax_count = count( $tax_query );
    
    	if ($tax_count > 1) :
    
    		$tax_query['relation'] = 'AND';
    
    	endif;
    
    	$second_query = array(
    		'post_type' => 'property',
    		'tax_query' => $tax_query,
    		'posts_per_page' => $similer_count,
    		'orderby' => 'rand',
    		'post__not_in' => array(get_the_ID())
    	);
    print_r($second_query);
    	$wp_query = new WP_Query($second_query);
    
    	if ($wp_query->have_posts()) : ?>
    
    		<div class="property-similer">
    			<div class="detail-title">
    				<h2 class="title-left"><?php esc_html_e('Similar Properties', 'houzez'); ?></h2>
    			</div>
    
    				<div class="property-listing <?php echo esc_attr($similer_view); ?>">
    					<div class="row">
    
    						<?php
    						while ($wp_query->have_posts()) : $wp_query->the_post();
    
    							get_template_part('template-parts/property-for-listing');
    
    						endwhile;
    						?>
    
    					</div>
    				</div>
    			<hr>
    		</div>
    		<?php
    		endif;
    		wp_reset_query();
    }?>
    Ответить21.Окт.2018 в 13:41 #
  • Леонид

    Добрый день.
    Нежданно возникла проблема с сортировкой по произвольному полю.
    Используется код, такой-же как и у вас в примере

    query_posts( 
    	 array ( 'post_type' => 'product', 'orderby' => 'meta_value', 'meta_key' => 'price' ) 
    );

    Но сортировка не работает.
    Подобное использовал много раз и проблем не возникало.
    А пару дне назад сортировка перестала работать.
    Сортирует только по дате и ID. Игнорируются orderby по meta_value', meta_value_num, post__in

    Может кто-то сталкивался с подобным.

    Ответить29.Ноя.2018 в 11:43 #
  • Volod

    Не получается вывести посты с определенным названием по маске.
    'key' => 'post_name', 'value' => 'Результат', 'compare' => 'LIKE'

    Query Monitor показивает что mt5.meta_value LIKE '%Результат%' ) ) ) но посты не выводит

    'name' => 'Результат%'. Query Monitor показивает что post_name = 'rezul-tat', съедая тем самим знак процента.

    При заполнении полного названия поста. 'name' => 'Результат за первый месяц'. Выводит только одну запись на которую я указал.

    Как заставить правильно передать 'name' => 'Результат%' чтобы знак процента не исчезал. и производился поиск по всех постах где встречается название "Результат"

    Ответить29.Апр.2019 в 19:12 #
    • Kama7641

      LIKE запросы в name параметре недопустимы, тебе надо либо писать запрос отдельно либо попробуй заюзать параметр поиска s, но там тоже могут быть неточности, но это наиболее подходящий для твоей задачи параметр.

      Ответить29.Апр.2019 в 19:45 #
Здравствуйте, !     Войти . Зарегистрироваться