WordPress как на ладони

query_posts()WP 1.5.0

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

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

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

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

Читайте обязательно: Использовать query_posts() опасно

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

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

Хуков нет.

Возвращает

WP_Post[]|int[]. Глобальный объект 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 );

Параметры

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

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

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

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) ));

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

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

{tax}(строка) (устарел с версии 3.1)
Имя таксономии и ярлык термина: array( 'category'=>'wordpress' ).
tax_query(массив)

Параметры запроса для таксономий. См. WP_Tax_Query::__construct(). Может принимать следующий ряд вложенных аргументов:

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

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

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

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

    • 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:

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

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 = [ 'term-slug', 'term-slug-two', 'term-slug-three' ];

$myposts  = get_posts( [
	'posts_per_page' => -1,
	'post_type' => $post_type,
	'tax_query' => [
		[
			'taxonomy' => $tax,
			'terms' => $terms,
			'field' => 'slug',
			'operator' => 'NOT IN',
		]
	],
] );

$i = 0;
foreach( $myposts as $mypost ){
	echo sprintf( '%d <a href="%s">%s</a>',
		++$i, get_permalink( $mypost ), esc_html( $mypost->post_title )
	);
}

#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>';
}

#9 Выборка записей из таксономии и сортировка по мета-полю

Получим записи типа 'func', которые находятся в любом элементе таксономии 'tplcat' и отсортируем эти записи по числовому метаполю 'views_prev_month'.

query_posts( [
	'post_type'      => 'func',
	'posts_per_page' => -1,
	'tax_query' => [
		[
			'taxonomy' => 'tplcat',
			'operator' => 'EXISTS',
		]
	],
	'meta_key' => 'views_prev_month',
	'orderby'  => [ 'meta_value_num'=>'DESC' ],
] );

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

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

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(число)
ID родительской страницы, дочерние страницы для которой надо получить (post_parent=27). По умолчанию пустая строка - не обрабатывается.
post_parent__in(массив)
Выберет посты родители которых указаны в массиве.
post_parent__not_in(массив)
Выберет посты родители которых не указаны в массиве.
post__in(массив)

Укажите массив ID постов, которые нужно получить post__in => [5,12,2,14,7].

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

Полезный совет. Если при выводе нескольких постов через post__in публикации выводятся не в том порядке, который вам нужен, а стандартные свойства orderby не помогают, используйте 'orderby' => 'post__in'.

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

Заметка: Ticket #28099: Передача пустого массива в post__in, post_parent__in вернет последние записи, но не пустой результат. Чтобы обойти это поведение, вам нужно проверить переданный массив заранее и если он пуст, не запускать WP_Query.

Справедливо для версии WP 6.4.

Получим пост по 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( [
	'post_type' => 'page',
	'post__in'  => [ 2, 5, 12, 14, 20 ]
] );

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

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

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

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

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

// Правильно
$exclude_ids = array( 1, 2, 3 );
query_posts( [ '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 - это массив массивов.

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

$args = [
	'meta_query' => [
		'relation' => 'OR',
		[
			'key' => 'color',
			'value' => 'blue'
		],
		[
			'key' => 'price',
			'value' => 20
		]
	]
];

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

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

meta_key(строка)
Ключ(название) произвольного поля.
meta_compare_key(строка) (с версии 5.1)
Оператор указывающий то, как нужно искать указанный в meta_key ключ. Может быть: = или LIKE.
По умолчанию: '='
meta_type_key(строка) (с версии 5.3)
Можно задать значение BINARY, работает только если meta_compare_key равен REGEXP.
По умолчанию: ''
meta_value(строка)
Значение произвольного поля.
meta_type(строка)

Тип произвольного поля. Тип значения указанного в meta_value. Это нужно чтобы правильно сравнивать или сортировать значения. Может быть: NUMERIC, DECIMAL, SIGNED, UNSIGNED, CHAR, BINARY, DATETIME, DATE, TIME.

Подробнее читайте ниже параметр meta_query > type.

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_key, meta_value и meta_compare и заменяет их). С версии 3.1.
В массиве можно указать следующие параметры:

meta_query должен всегда содержать массив массивов, даже если делается один запрос. Например:

// правильно
'meta_query' => [ [
	'key' => 'meta_key',
	'value' => 'val',
] ],

// НЕправильно
'meta_query' => [
	'key' => 'meta_key',
	'value' => 'val',
],
  • relation(строка)
    Определяет логическую связь между вложенными массивами. Этот параметр указывается как строка в главном массиве meta_query и указывает как сравнивать между собой вложенные параметры запроса (вложенные массивы с параметрами запроса). Может быть:

    OR - выбрать мета-поля подходящие хоты бы под один массив с параметрами запроса.
    AND - (по умолчанию) выбрать мета поля подходящие для всех массивов с параметрами запроса.

    • key(строка|массив)
      Ключ поля. Можно указать несколько ключей в массиве.
      NOTE: Если указывается регулярное выражение, когда compare_key = REGEXP, то тут значение нужно указать без оборачивания в /, иначе не будет работать.

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

      • = - равно.
      • != - не равно. (WP 5.3)
      • LIKE - содержит указанную подстроку.
      • NOT LIKE - НЕ содержит указанную подстроку. (WP 5.3)
      • IN - равно одному из значений. (WP 5.3)
      • NOT IN - НЕ равно одному из значений. (WP 5.3) (WP 5.3)
      • REGEXP - совпадает с регулярным выражениме. (WP 5.3). Например: 'key' => '^bar', (найдет строку которая начинается с: 'bar_is').
      • NOT REGEXP - НЕ совпадает с регулярным выражениме. (WP 5.3)
      • RLIKE - синоним REGEXP. (WP 5.3)
      • EXISTS - алиас =. (WP 5.3)
      • NOT EXISTS - алиас !=. (WP 5.3)

      По умолчанию: '=', или 'IN', когда в $key указан массив

    • type_key(строка) (с версии 5.3)
      Тип данных MySQL, который нужно использовать в функции CAST(). Используется только если параметр compare_key равен REGEXP. Если указано, то значение колонки meta_key будет сначала преобразовано в указанный тип и только потом будет сравниваться с указанным значением. Может быть:

      • BINARY - нужно когда в регулярных выражениях важен регистр символов.

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

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

    • 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(строка)
      Тип произвольного поля. Тип значения указанного в meta_value. Это нужно чтобы правильно сравнивать или сортировать значения. Например когда в значениях находятся числа, то в БД они хранятся как строки и чтобы MYSQL обрабатывал их как числа, ему нужно явно указать что это числа - нужно использовать NUMERIC. Это мы и можем сделать в параметре type

      Указанный тут тип напрямую передается в mysql функцию CAST().

      Может быть:

      • NUMERIC - целые числа. Можно указать точность NUMERIC(p,s).
      • DECIMAL - дробные числа. Можно указать точность DECIMAL(p,s). Например: DECIMAL(5,2) - число с макс 5 цифрами всего (3 до разделителя) и 2 цифры после разделителя.
      • SIGNED - целые числа, положительные и отрицательные
      • UNSIGNED - целые числа, только положительные
      • CHAR - строка не чувствительна к регистру
      • BINARY - строка чувствительная к регистру
      • DATETIME - дата и время
      • DATE - только дата
      • TIME - только время

      Если указать любое другое значение (или вообще не указать значение), то оно превратиться в CHAR.

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

    Тип DATE работает при сравнении BETWEEN только если дата указывается в формате Y-m-d и сравнивается с аналогичным форматом. Для типа DATETIME это формат Y-m-d H:i:s.

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

Примеры (без meta_query)

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

Недостаток такого подхода в том что, мы не сможем создавать сложные мета-запросы, а сможем создать запрос только с использованием одного мета ключа. Если нужно сделать более сложный запрос с несколькими мета ключами нужно использовать 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 = [
	'post_type' => 'product',
	'meta_query' => [
		[
			'key' => 'color',
			'value' => 'blue',
			'compare' => 'NOT LIKE'
		]
	]
];
query_posts( $args );

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

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

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

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

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

$args = [
	'post_type'    => 'product',
	'meta_query'   => [
		'relation' => 'OR',
		[
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE'
		],
		[
			'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 можно указывать ключи, чтобы затем сортировать по этому ключу. Т.е. для сортировки по полю, нужно указать ключ поля, и затем использовать этот ключ в параметре orderby:

$args = [
	'post_type'  => 'book',
	'meta_query' => [
		'book_color' => [
			'key'     => 'color',
			'value'   => 'blue',
			'compare' => 'NOT LIKE',
		],
	],
	'orderby' => 'book_color',
];

query_posts( $args );

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

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

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

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

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

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

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

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

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' );

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

// Создадим новую функцию которая добавит условие where в запрос
function filter_where( $where = '' ) {
	// с 1 марта по 15 марта 2010 года
	$where .= " AND post_date_gmt >= '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' );

Запросы выше возвращают посты за указанный период в истории: "Посты за Х месяц, Х день". Они не могут получать посты за произвольный промежуток времени по отношению к настоящему. Поэтому запросы типа "Посты за последние 30 дней" или "Посты за последний год" не возможны в базовом варианте, для таких запросов нужно использовать фильтр "posts_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 = [
	'date_query' => [
		[
			'hour'      => 9,
			'compare'   => '>=',
		],
		[
			'hour'      => 17,
			'compare'   => '<=',
		],
		[
			'dayofweek' => [ 2, 6 ],
			'compare'   => 'BETWEEN',
		],
	],
	'posts_per_page' => -1,
];
query_posts( $args );

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

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

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

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

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

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

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

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

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

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

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

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

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.
  • relevance — по условию поиска (параметр s). Сортировка идет в следующем порядке: 1) соответствует ли все предложение. 2) все условия поиска в заголовке записи. 3) какие-либо слова из запроса поиска в заголовке записи. 4) полное предложение найдено в контенте записи.
  • 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. Параметр order игнорируется.
  • post_name__in — учитывает порядок указанных имен в параметре post_name__in. Параметр order игнорируется.
  • post_parent__in — учитывает порядок указанных ID в параметре post_parent__in. Параметр order игнорируется.

С версии 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( [
	'orderby' => 'rand',
	'posts_per_page' => '1'
] );

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

query_posts( [ 'orderby' => 'comment_count' ] );

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

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

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

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

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

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

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

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

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

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

query_posts( [
	'post_type'  => 'my_custom_post_type',
	'meta_key'   => 'age',
	'orderby'    => 'meta_value_num',
	'order'      => 'ASC',
	'meta_query' => [
		[
			'key'     => 'age',
			'value'   => [ 3, 4 ],
			'compare' => 'IN',
		]
	]
] );

#8 Сортировка по нескольким метаполям

Чтобы отсортировать результат по двум разным метаполям, например, сначала по city , а затем по state, нужно указать ключи для массивов в массиве meta_query и затем использовать эти ключи в параметре orderby:

query_posts( [
	'meta_query' => [
		'relation'     => 'AND',
		'state_clause' => [
			'key'   => 'state',
			'value' => 'Wisconsin',
		],
		'city_clause' => [
			'key'     => 'city',
			'compare' => 'EXISTS',
		],
	],
	'orderby' => [
		'city_clause'  => 'ASC',
		'state_clause' => 'DESC',
	],
] );

Параметры Пагинации и Отступа

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(число)

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

Этот параметр перебивает параметр paged и может сломать пагинацию. Если такое случилось читайте решение проблемы.

paged(число)

Номер страницы пагинации. Показывает посты, которые в обычном режиме должны были быть показаны на странице пагинации Х.

Нельзя использовать совместно с параметром offset, потому что offset более приоритетный и заменит этот параметр.

page(число)
Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page).
ignore_sticky_posts(логический)

Игнорировать прилепленные посты или нет (true/false). Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.

caller_get_posts был переименован в параметр ignore_sticky_posts в WP 3.1. Использование caller_get_posts вызовет ошибку _deprecated_argument().

#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 ) );

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

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

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

query_posts( 'paged=6' );

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

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

query_posts( [ 'paged' => get_query_var( 'paged' ) ] );

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

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

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

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

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

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

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

if ( ! empty($sticky[0]) ) {

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

	// формируем вывод...
}
#5.5 последних прилепленных записей
$sticky = get_option( 'sticky_posts' ); // все Sticky записи

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

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

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

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

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

query_posts( [ 'post__not_in' => get_option( 'sticky_posts' ) ] );

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

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

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

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

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

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

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

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

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

#1 Посты, у которых есть 1 или более комментариев:

query_posts( [
	'comment_count' => [
		'value'   => 1,
		'compare' => '>=',
	],
] );
  • Поиск по умолчанию происходит по полям post_title, post_excerpt, post_content.

  • Если поисковая фраза состоит более чем из 10 слов, то она трактуется как целая фраза sentence=true.
s(строка)

Поисковая фраза. Фраза состоящая из нескольких слов по умолчанию делится на отдельные слова. Каждое слово участвует в поиске отдельно в таком виде: слово1 ИЛИ слово2 ИЛИ ....

Разделителем слов являются символы \t ",+ (tab, пробел, запятая, плюс, кавычка).

Регулярка которая разбивает фразу на слова:

".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+

SQL часть запроса для поиска создается методом WP_Query::parse_search(), он же разбирает фразу на слова.

Каждое отдельное слово (термин) затем обрабатывается методом WP_Query::parse_search_terms().

  • Символ " — слова или фраза обрамленная двойными кавычками будет участвовать в поиске как есть.

    Например, мы хотим найти слово станция, по умолчанию будут найдены и те записи в которых есть слово электростанция, но если указать запрос поиска в кавычках и добавить пробел в начале, то этот пробел будет использоваться в поиске " станция".

    Или таким же образом мы можем искать по точному вхождению фразы, обрамив нужную часть поисковой фразы или всю фразу в кавычки (для всей фразы можно просто добавить кавычки в начало фразы), например:

    "Поиск в ВП не так прост    →   Поиск в ВП не так прост
    "Поиск в ВП не так прост"   →   Поиск в ВП не так прост
     Поиск в ВП "не так прост"  →   Поиск | в | ВП | не так прост
    "Поиск в ВП" не так прост   →   Поиск в ВП | не | так | прост
  • Символ - — Символ исключения слова. При добавлении в начале слова поиска дефиса будет указано что этого слова не должно быть в искомом тексте. Например: подушка -диван вернет посты, содержащие подушка, но не содержащие слово диван.

    Символ-исключения можно изменить через фильтр wp_query_search_exclusion_prefix.

  • Фильтрация слов — тире, отдельные буквы a-z и стоп слова удаляются из терминов (отдельных слов) поиска после разбиения фразы поиска на слова (термины).

    Стоп слова определяются методом WP_Query::get_search_stopwords(). По умолчанию в них входит локализованный список следующих слов:

    _x( 'about,an,are,as,at,be,by,com,for,from,how,'.
    	'in,is,it,of,on,or,that,the,this,to,was,what,'.
    	'when,where,who,will,with,www',
    	'Comma-separated list of search stopwords in your language'
    )

    Изменить список этих стоп слов можно через фильтр wp_search_stopwords.

exact(логический)

true - не добавлять на концы поисковых фраз % в SQL запросе.
Указывать true имеет смысл, если sentence=true и нам нужно найти пост в названии/контенте/описании которого находится точно указанная фраза и ничего больше.

Например слово будет обработано в SQL как = 'слово', а не LIKE '%слово%'.

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

sentence(true/false)

true — искать по полной поисковой фразе. фраза поиска будет обработано LIKE '%фраза поиска%', а не LIKE '%фраза%' AND LIKE '%поиска%'.
false — поисковая фраза делится на слова и поиск происходит по словам.

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

#1 Поиск постов со словами

Результат поиска вернет посты, которые содержат все слова search и phrase.

query_posts( 's=search phrase' );

#2 Поиск постов по предложению

Результат поиска вернет посты, которые содержат фразу search phrase.

query_posts( 's=search phrase &sentence=1' );

#2 Исключение слов

Результат поиска вернет посты, которые содержат слово search и не содержат слово phrase.

query_posts( 's=search -phrase' );

Параметры Возвращаемых полей

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

fields(строка)

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

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

true - не подсчитывать количество найденных строк.
false - добавит в SQL запрос SQL_CALC_FOUND_ROWS.

В некоторых случаях может ускорить запрос.
По умолчанию: false

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

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

С версии WP 6.1 все запросы к БД через WP_Query кэшируются. Подробнее читайте здесь.

cache_results(true/false)
Кэшировать ли информацию о посте.
По умолчанию: true
update_post_meta_cache(true/false)
Кэшировать ли информацию о мета данных поста.
По умолчанию: true
update_post_term_cache(true/false)
Кэшировать ли информацию о привязке поста к терминам и таксономиям.
По умолчанию: true
lazy_load_term_meta(true/false)
Следует ли «лениво» загружать метаданные термина.
false — отключит отложенную загрузку метаданных термина и каждый вызов get_term_meta() будет обращаться в базу данных.
По умолчанию: значение $update_post_term_cache
update_menu_item_cache(true/false) (WP 6.1)
Обновлять ли кэш элементов меню.
По умолчанию: false

#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 по умолчанию, так как нет необходимости обновлять кэш при каждой загрузке страницы.

Параметры Фильтров (хуков)

suppress_filters(true/false)

Следует ли отключать работу некоторых фильтров (хуков) в классе WP_Query. Включение этого параметра отменяет все фильтры изменения SQL запроса, такого типа posts_* или comment_feed_*.

true — отключить обработку следующих хуков:

posts_search
posts_search_orderby

posts_where
posts_join

posts_where_paged
posts_groupby
posts_join_paged
posts_orderby
posts_distinct
post_limits
posts_fields
posts_clauses

posts_where_request
posts_groupby_request
posts_join_request
posts_orderby_request
posts_distinct_request
posts_fields_request
post_limits_request
posts_clauses_request

posts_request
posts_results
the_posts

comment_feed_join
comment_feed_where
comment_feed_groupby
comment_feed_orderby
comment_feed_limits

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

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

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

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

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

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

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

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

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

Получим посты из категории 3 за 2004 год:

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

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

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

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

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

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

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

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

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

Примеры

0

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

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

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

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

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

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

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

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

<?php

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

global $more;

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

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

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

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

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

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

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

0

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

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

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

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

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

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

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

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

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

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

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

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

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

global $wp_query;

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

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

-1

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

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

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

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

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

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

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

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

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

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

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

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

Заметки

  • Global. WP_Query. $wp_query WordPress Query object.

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

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

Код query_posts() WP 6.5.2

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