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 Global WP_Query instance.

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

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

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

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

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

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

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

316 комментов
Полезные 9 Вопросы 4 Все
  • Антон smeshnoj.com

    Спасибо огромное!!! Столько мучался, чтобы случайный вывод сделать, а оказывается, всё это давно реализовано smile

    Ответить8.5 лет назад #
  • Вячеслав

    Хорошая статья. Подскажите есть ли плагин виджет в природе для организации выборки постов за определенный день из категории. Стандартный виджет архив не подходит так как он выводит посты из всех категорий и за месяц.

    Ответить8.5 лет назад #
    • Kama7601

      Насчет виджета не знаю, но без виджета можно вывести используя эту функцию: get_posts.

      query_posts в данном случае не очень подходит.

      Ответить8.5 лет назад #
  • EugeneC eugenec.myartsonline.com

    Спасибо за функцию вывода постов за последние 30 дней! Уже пару часов над этим бился. Думал, что в фукционале WordPress уже заложена такая возможность, а не тут-то было smile

    Ответить8.5 лет назад #
  • scamishka

    подскажите код как вывести на главную страницу посты только за текущую дату.

    я пробую такой код

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

    вставляю перед loop , но толи из-за множества запутанных функций в теме, толи неправильного кода, у меня пока не делает того, что мне хотелось бы

    Ответить8.3 лет назад #
    • Kama7601

      Во-первых, должно работать, я не знаю что не так, по коду все вроде правильно. Единственное, может нужно добавить $query_string .:

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

      Во-вторых, в начале статьи написано, косвенно, что в случаях как ваш (у вас это наверняка не главный вывод) лучше использовать get_posts(), чтобы не рушить основной цикл. Если заюзать query_posts то главная страница is_home() в данном случае, после использования вашего кода, уже не будет определяться как is_home(), а станет архивом по дате! Чтобы не рушить цикл, есть такой костыль как wp_reset_query().

      Не знаю поняли ли вы то что я написал, но в вашем случае лучше использовать что-нить вроде этого:

      <?php 
      $today = getdate();
      $posts = get_posts( 'numberposts=-1&year='. $today["year"] .'&monthnum=' . $today["mon"] .'&day=' . $today["mday"] );
      global $post;
      $pst = $post;
      foreach($posts as $post){ setup_postdata($post);
         // здесь обычный вывод как для query_posts 
      ?>
      	<li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>;
      <?php } 
      $post = $pst; 
      ?>
      Ответить8.3 лет назад #
  • Дмитрий v360.ru

    Приветствую, коллеги! Не подскажете ли можно ли как-то используя API отфильтровать записи по условию... Да так жестоко отфильтровать, чтобы и списки категорий и списки тегов формировались уже по отфильтрованным записям... Другими словами так чтобы двиг и не знал о существовании записей не попавших в фильтр.

    Ответить8.3 лет назад #
    • Kama7601

      Загадками разговариваете чет... smile
      В принципе, API очень гибок, да так очень, что можно отфильтровать практически как угодно, главное чтобы логика присутствовала...

      Ответить8.3 лет назад #
      • Дмитрий v360.ru

        Хорошо ok Попробую описать свой вопрос подробнее smile
        Есть сайт v360.ru где много записей... Часть из них я хочу показывать в другом субдомене spb.v360.ru на другой теме оформления. Для этого я подменяю тему на лету:

        //{Меняем тему на лету
        $sitetemplates = array(
        	"spb.v360.ru"       =>   array("template" => "twentyten", "stylesheet" => "spb"),
        );
        function getTemplate(){
        	global $sitetemplates;
        	define('WP_HOME','http://'.$_SERVER['SERVER_NAME']);
        	define('WP_SITEURL','http://'.$_SERVER['SERVER_NAME']);
        	//$query = new WP_Query( 'category_name=vnovgorod' );
        	return $sitetemplates[$_SERVER['SERVER_NAME']]["template"];
        }
        function getStylesheet(){
        	global $sitetemplates;
        	return $sitetemplates[$_SERVER['SERVER_NAME']]["stylesheet"];
        }
        if(isset($sitetemplates[$_SERVER['SERVER_NAME']])){
        	add_filter('pre_option_template', 'getTemplate');
        	add_filter('pre_option_stylesheet', 'getStylesheet');
        }
        //}Меняем тему на лету*/

        Теперь я хочу чтобы, скажем, панорамы Египта не показывались в этом субдомене ни при каких условиях... И облако тегов чтобы не содержало теги из Египетских панорам и дерево рубрик не содержало ветку о Египте (ну т.е. чтобы

        wp_list_categories('hide_empty=1');

        не выводила рубрики не попавшие в фильтр) т.д...Вот такая задача.

        Ответить8.3 лет назад #
        • Kama7601

          Задача нетривиальная, надо подумать. Насколько мне известно в текущей структуре вырезать можно, но не легким движением руки, а для каждого вывода отдельно, например, отдельно исключать категорию для wp_list_categories(); и т.п.

          В API такого нет, чтобы вообще исключить из публичного показа, отдельную категорию, так можно исключить таксономию или тип записи, что наводит на мысль: а не создать ли для панорам отдельный тип записи и в нужный момент присваивать аргументу 'publicly_queryable' функции register_post_type() значение false ('publicly_queryable' => false). Или тоже самое сделать с таксономией.

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

          Ответить8.3 лет назад #
          • Дмитрий v360.ru

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

            Ответить8.3 лет назад #
          • Kama7601

            Только вот могут ли записи принадлежать одновременно нескольким таксономиям?

            Да, могут.

            Можно создать новый тип записей прикрепить его к таксономии category и для этого типа записей будет работать та же таксономия что и для обычных постов (posts).

            Ответить8.3 лет назад #
  • Роман

    Доброго времени суток! Вопрос такой: как можно отсортировать записи по двум параметрам. Например, по автору и по дате. Спасибо за понимание.

    Ответить8.3 лет назад #
    • Kama7601

      Дополнил статью, добавил примеров, теперь в статье есть ответ на этот вопрос!

      А конкретно в вашем случае будет как-то так:

      query_posts( array( 'orderby' => 'author,date', 'order' => 'ASC' ) );
      Ответить8.3 лет назад #
      • Роман

        в итоге у меня вышло следующее:

        было:

        query_posts($query_string.'&orderby=author'.'&showposts=-1');

        стало:

        query_posts($query_string.'&orderby=author,date'.'&showposts=-1');

        всё оказалось очень просто smile

        Ответить8.3 лет назад #
        • Роман

          нет... sad поторопился... в данном варианте сортируется только по дате... буду дальше копать...

          Ответить8.3 лет назад #
          • Kama7601

            Мне кажется, надо сначала date затем author: date,author. По логике вещей должно быть так: сначала таблица сортируется по дате, затем в порядке авторов (как бы группируется по авторам). А если сделать наоборот, то логично, что сортировка по автору вообще пропадает!

            Ответить8.3 лет назад #
          • Роман

            как говорится, от перемены мест слагаемых... не помогло что-то... как только добавляю date, так сразу весь вывод сбивается... может с главным циклом у меня что-то не так... буду дальше копаться...

            Ответить8.3 лет назад #
  • Вячеслав

    Kama сделайте пожалуйста статью на русском как реализовать этот динамический архив http://digwp.com/2010/10/dynamic-archives/ Я все сделал как показано в примерах но почему-то не работает, где-то подводные камни.

    Ответить8.3 лет назад #
  • Юрий

    Интересная статья. Спасибо. Подскажите пожалуйста, а как можно реализовать такую функцию, как вывод постов за последнюю неделю (причем начиная с вторника, 09,00am)- на синем фоне (думаю, использование разных стилей), а записи более старые - на белом фоне.
    Думаю, частично подойдет эта функция

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

    Но как ее модифицировать, чтобы отображало таким образом.

    Спасибо.

    Ответить8.3 лет назад #
  • Юрий

    В принципе частично реализовал таким образом: 2 цикла.
    1-ый выводит посты за последнюю неделю

    <?php $temp_query = $wp_query; ?>
    <?php 
    $week = date('W');  
    	$year = date('Y');  
    query_posts('year=' . $year .'&w=' .$week . '&cat=23'); $ids = array(); ?>
    <?php while (have_posts()) : the_post(); $ids[] = get_the_ID(); ?>
    цикл
    <?php endwhile; ?>

    И второй цикл - вывод всех постов, что вошли в первый цикл

    <?php query_posts(array( 'cat' => 23, 'post__not_in' => $ids)); ?>
    <?php while (have_posts()) : the_post(); ?>
    цикл
    <?php endwhile; ?>

    Вот только как в первом цикле сделать привязку ко дню и времени. А именно, чтобы в первом цикле выводились записи, опубликованные начиная с вторника 10,30am и до следующего вторника 10,29am. Т.е. чтобы неделя не начиналась и заканчивалась воскресеньем, а вторником 10,30 ???

    Ответить8.3 лет назад #
    • Юрий

      И второй цикл - вывод всех постов, что вошли в первый цикл

      Имел ввиду - вывод всех постов, что не вошли в первый цикл

      Ответить8.3 лет назад #
  • Иван

    как вывести посты с определенным ID в нужном мне порядке.
    скажем есть посты с ID 123456789
    мне нужно вывести 5,7,2 (именно в таком порядке)
    я делаю так:

    <?php $posts = array(
    	'post__in' => array(5,7,2),
    	) ?>
    <?php query_posts($posts); ?>

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

    'orderby' => 'none'

    то все равно не получается (посты начинают выводиться почему-то от старого к новому)

    Ответить8.2 лет назад #
    • Kama7601

      Результат самого запроса получить в таком непонятном, хаотичном порядке не получится. Можно в самом цикле проверять ID и строить порядок. А ваще как-то так, вроде будет логичнее:

      $p_ids = array(23,27,24); //нужные ID в нужном порядке
      foreach( $p_ids as $id ){
      	$post = get_post($id);
      	//здесь выводим данные $post->post_title, $post->post_content
      }

      Правда такой подход создаст лишние запросы к БД, но они будут простыми.

      Ответить8.2 лет назад #
Здравствуйте, !     Войти . Зарегистрироваться