Если Вы работали с WordPress некоторое время, вы должны знать как трудно было раньше создавать списки записей на основе большого количества критериев и в то же время в соответствии со стандартами WordPress. Но за последние нескольких лет платформа прошла долгий путь. И сейчас, с помощью мощного класса WP_Query , мы можем создавать списки сообщений ни в чем себя не ограничивая.
Класс WP_Query является одной из важнейших частей в движке WordPress. Среди прочего, он определяет запросы, которые вам необходимы на любой странице и выводит сообщения в соответствии с заданными критериями. Он также сохраняет много информации о запросах которые делает, что помогает при оптимизации страниц (и устранении ошибок).
WP_Query позволяет нам выполнять сложные запросы к базе данных безопасно, просто и модульным способом.
Безопасность
На протяжении всего нашего взаимодействия с этим объектом, мы указываем лишь параметры и используем функции для достижения нашей цели. Внутренние объекты сами заботятся о многих проблемах, таких как защита от SQL-инъекций и проверка использования правильного типа данных.
Простота
При использовании этого объекта нам не нужно изучать особенности нашей базы данных. Поскольку мы используем массив, чтобы передавать наши параметры, нет нужды вручную писать запросы с join или вложенные запросы, нужно просто создать массив аргументов и экземпляр класса!
Модульность
WP_Query позволяет избежать использования SQL-запросов в коде, класс использует ассоциативный массив в качестве аргумента. Это позволяет получить множество преимуществ: вы можете объединить аргументы из разных мест кода, запустить массив функций и управлять ими всевозможными способами.
"Стандартный" цикл в WordPress
Давайте посмотрим вначале на обычный цикл, и затем создадим такой же цикл, используя WP_Query . Давайте предположим, что мы создаем файл category.php для своей темы.
if
(have_posts()
)
:
while
(have_posts()
)
:
the_post()
;
?>
То же цикл, используя WP_Query:
$args
=
array
("cat"
=>
4
)
;
$category_posts
=
new
WP_Query($args
)
;
if
($category_posts
->
have_posts
()
)
:
while
($category_posts
->
have_posts
()
)
:
$category_posts
->
the_post
()
;
?>
Как вы можете видеть, на первый взгляд нет большой разницы! Давайте рассмотрим его подробнее:
Построение запросов
На странице категории мы хотим получить список сообщений из этой категории. Так как мы строим запрос с нуля, используя WP_Query, мы должны определить это сами. Мы немного углубимся в это чуть позже.
Создание экземпляра класса и запросов для сообщений
С помощью экземпляра класса и массива аргументов, WP_Query будет пытаться получить указанные сообщения.
Создание цикла
Вы можете использовать любые обычные функции, только не забудьте использовать их в качестве методов объекта:
Вместо have_posts()
, используйте $category_posts->have_posts()
.
Вместо the_post()
, используйте $category_posts->the_post()
.
После того как вы сделали всё что указано выше, вы можете использовать любые теги шаблонов, которые мы знаем и любим.
Если вы посмотрите на это подробнее, то вы увидите, что глобальный объект $post также доступен. Это означает, что если вы используете пользовательский цикл, что-нибудь может пойти не так. Обязательно сохраните первоначальное значение объекта $post и восстановите его после цикла.
Легкость, с которой мы можем создавать циклы очевидна, но как на самом деле создавать запросы для записей? Позвольте мне показать вам распространенный метод, который часто используют при создании слайдеров в коммерческих темах.
Очень часто пользователи вашей темы хотят видеть на своих сайтах великолепно выглядящие слайдеры, но они могут быть немного ленивы при создании контента. Многие пользователи также хотят показать будущие записи, которые планируется опубликовать. Давайте создадим запрос для получения предстоящих (т.е. неопубликованых) сообщений, которые имеют изображение.
$args
=
array
(
"post_status"
=>
"future"
,
"meta_query"
=>
array
(
array
(
"key"
=>
"_thumbnail_id"
,
"value"
=>
""
,
"compare"
=>
"!="
)
)
;
$slider_posts
=
new
WP_Query($args
)
;
?>
have_posts () ) : ?>
Короткий и совершенно понятный код - просто и красиво.
Значения по умолчанию
Вы, возможно, заметили, что я не уточнил количество необходимых записей в моём запросе. А сколько сообщений в списке? И что за статус поста в первом запросе, который мы сделали?
Значения по умолчанию устанавливаются для многих из наиболее распространенных аргументов. Вот несколько, которые вы не обязаны указывать, если только вы не хотите изменить их:
posts_per_page
По умолчанию используется значение, указанное в параметрах сайта о количестве сообщений на странице.
post_type
По умолчанию используется post
.
post_status
По умолчанию используется publish
.
Вы можете найти полный список параметров в документации !
Во многих случаях вам нужно будет указать несколько значений, которые может принимать аргумент. И WP_Query позволяет использовать массивы, чтобы сделать вашу жизнь проще. Вот несколько примеров:
Вы можете использовать массив для post_status , чтобы получить сообщения с различными статусами. Обратите внимание, что вы можете использовать строку any , чтобы получить сообщения со всевозможными статусами.
Вы уже видели, что WP_Query отлично справляется с мета-данными - мы использовали meta_query во втором примере, когда строили слайдер с записями, которые имеют изображения.
Представим, что мы создаем тему WordPress, которая будет использоваться для сайта сдающего квартиру(ы) в аренду. Мы будем хранить квартиры в пользовательском типе записей и использовать мета-данные для хранения дополнительной информации. Таким образом, мы можем легко получать, например, все квартиры, которые могут вместить четырех или более человек, или те у которых есть балкон, или только квартиры на сутки с джакузи.
$args
=
array
(
"post_type"
=>
"apartment"
,
"meta_query"
=>
array
(
"relation"
=>
"AND"
,
"="
=>
"="
)
)
;
?>
Чтобы узнать больше о параметрах, которые можно использовать, просто зайдите в раздел Custom Field Parameters в документации по WP_Query.
Как только Вы сделали запрос, можно вытянуть много информации из Вашего объекта. Вы можете найти полный список "Методов и свойств " в документации. Вот те, которые я предпочитаю использовать чаще всего:
$query
Показывает строку запроса, которая передается в объект $wp_query. Это очень полезно для устранения неполадок в некоторых случаях.
$query_vars
Показывает ассоциативный массив аргументов, которые вы передали. Если вы делаете много смешиваний и сопоставлений перед передачей аргументов, этот инструмент может быть полезным, чтобы проверить, что все передано правильно.
$post
Содержит запрошенные записи из базы данных.
$found_posts
Удобная вещь, которая показывает общее число найденных элементов (без ограничения установленного аргументом posts_per_page).
WP_Query дает вам большие возможности, но у него есть свои недостатки. Многие люди "сходят с ума", когда они понимают, как легко можно вызывать запросы повсюду.
Имейте в виду, что чем больше запросов, тем больше нагрузка на сервер. При создании сложных запросов могут возникнуть проблемы с RAM на хостинге, которая, вероятно, является ограниченным ресурсом у вас.
Убедитесь в том, что запрос по умолчанию выполняется на каждой странице. Какой смысл в создании нового запроса для получения последних сообщений на главной странице, если он там есть по умолчанию? Используйте кэширование результатов, чтобы снизить нагрузку на сервер.
Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим
Если вы следили за нашей серией статей, то уже наверняка знаете, как устроен класс WP_Query , и как его можно использовать для создания собственных запросов. Чтобы определять, какие именно данные вы хотите извлечь из базы данных, нужно ознакомиться с аргументами этого класса и научиться правильно их применять.
Сегодня мы познакомимся с аргументами для произвольных полей (custom fields ), но сначала вспомним, как использовать аргументы в WP_Query .
Когда вы используете WP_Query
в темах оформления или плагинах, приходится включать в код четыре основных элемента:
На практике это выглядит следующим образом:
have_posts()) { // начало цикла обработки данных из результатов запроса while ($query->have_posts()) { $query->the_post(); // содержимое опрашиваемой записи } } // восстановление исходных данных записи wp_reset_postdata(); ?>
Аргументы сообщают WordPress , какие данные нужно извлекать из базы данных:
$args = array(// Аргументы для вашего запроса);
Как видно, аргументы заключены в массив.
Существует специальный способ задания аргументов в массиве:
$args = array("parameter1" => "value", "parameter2" => "value", "parameter3" => "value");
Нужно заключать параметры и их значения в одинарные кавычки, а также использовать => между ними. Каждый аргумент разделяется запятой. Если здесь что-то сделать неправильно, то WordPress может опросить не все указанные вами аргументы, и на экран ничего не выведется.
Произвольные поля (также известные как метаданные записей ) могут использовать отдельный класс WP_Meta_Query . Поэтому для получения метаданных записи, можно использовать либо WP_Meta_Query , либо WP_Query (который все равно обращается к WP_Meta_Query ). Но если требуется сделать запрос метаданных и других элементов (вроде типа записи ), то следует использовать только WP_Query .
Основное отличие в применении этого класса и WP_Query заключается в том, что WP_Query позволяет вам создавать простые аргументы без необходимости использовать вложенные массивы.
Основные параметры WP_Query
для выполнения запросов к произвольным полям:
Используйте эти параметры для создания простых запросов к произвольным полям. Например, чтобы вывести записи, в которых имеются произвольные поля с ключом key1 (независимо от его значения ), нужно использовать следующий аргумент:
$args = array("meta_key" => "key1");
Этот аргумент позволит получить все записи с произвольным полем с ключом key1 , независимо от значения. Для присваивания конкретного значения нужно добавить дополнительный аргумент:
$args = array("meta_key" => "key1", "meta_value" => "value1");
Такой аргумент выведет все записи с произвольным полем, у которого имеется ключ key1 со значением value1 .
Также можно извлечь все записи с произвольным полем, значение которого будет value1 , независимо от ключа. Это необходимо, когда используется несколько ключей произвольного поля с повторяющимися значениями:
$args = array("meta_value" => "value1");
Как видно, можно направлять запрос к произвольному полю по ключу или по значению, и совсем необязательно каждый раз указывать оба аргумента.
Вы могли заметить, что для аргумента meta_compare
существует множество параметров. Давайте рассмотрим те, которые применяются чаще всего:
При помощи аргумента meta_compare вы можете исключить ключи или значения произвольного поля. Для того чтобы извлечь все записи, за исключением тех, в значении ключа которых используется key1 , нужно использовать следующий код:
$args = array("meta_key" => "key1", "meta_compare" => "!=");
Можно использовать значение ‘NOT IN’ в аргументе meta_compare , который также может применяться со строкой из нескольких значений:
$args = array("meta_key" => "key1, key2", "meta_compare" => "NOT IN");
Этот код выполняет запрос записей, у которых нет произвольных полей со значениями key1 или key2 . Если нужно запросить записи с определенным произвольным полем, но не с другим, то можно использовать вложенный массив, о котором я вам расскажу позже.
В приведенных выше примерах используются нецифровые значения. Вы можете использовать WP_Query с произвольными полями, в которых указаны числовые значения, не только для извлечения записей с этими значениями, но и для запросов к тем постам, значение произвольных полей которых выше или ниже указанных. Для примера, такое может пригодиться в интернет-магазине, когда нужно осуществить поиск товаров дешевле или дороже указанной стоимости.
Чтобы найти записи со значением произвольного поля выше заданного числа, нужно использовать следующий код:
$args = array("meta_key" => "numkey", "meta_value" => "100", "meta_compare" => ">");
Этот запрос позволит получить все записи, значением произвольного поля которых является значение выше 100. Если нужно запросить записи со значениями от 100 и выше, то можно использовать параметр "meta_compare" => ">=" .
Также при помощи аргумента BETWEEN и массива можно находить записи, в произвольных полях которых используются значения в определенном диапазоне:
$args = array("meta_key" => "numkey", "meta_value" => array ("100", "200"), "meta_compare" => "BETWEEN");
Такой запрос позволит найти все записи со значением произвольных полей между 100 и 200.
Если нужно выполнить запрос по нескольким произвольным полям или использовать более одного оператора, то можно воспользоваться вложенным массивом.
Структура запроса будет следующей:
$args = array("meta_query" => array("relation" => "", // Опциональный аргумент. array(// здесь будут аргументы `meta_query`.)));
Структура аргумента "meta_query" в классе WP_Query будет такой же, как и при использовании класса WP_Meta_Query , о котором мы подробно поговорим в следующих статьях.
После выхода WordPress версии 4.1 стало можно использовать несколько уровней вложенных массивов для создания еще более сложных и точных запросов. Структура таких запросов выглядит примерно так:
$args = array("meta_query" => array("relation" => "", // Опциональный аргумент. array("relation" => "", array (// Первый набор аргументов `meta_query`.), array (// Второй набор аргументов `meta_query`.))));
Такой подход позволяет использовать различные взаимосвязи на разных уровнях в запросе. К примеру, можно создать запрос записей с одним значением в одном произвольном поле, и обоими значениями в другом произвольном поле.
Применение класса WP_Query для создания запросов метаданных записей (или произвольных полей ) предоставляет гибкость при работе с множеством различных аргументов в сочетании с операторами.
Если в своем запросе вы хотите использовать только аргументы метаданных записей (и не комбинировать их с другими ), то можно также использовать класс WP_Meta_Query , о котором мы поговорим позже.
Перевод статьи “WP_Query Arguments: Custom Fields ” был подготовлен дружной командой проекта Сайтостроение от А до Я.
Prestashop представляет собой движок для управления интернет-магазином. В интернете можно найти множество как платных, так и бесплатных модулей Prestashop, которые помогают улучшить страницы товаров и увеличить количество переходов. В этой статье мы рассмотрим 5 лучших SEO-модулей.
init() Initialise the object, set all properties to null, zero or false. parse_query($query) Takes a query string defining the request, parses it and populates all properties apart from $posts , $post_count , $post and $current_post . parse_query_vars() Reparse the old query string. get($query_var) Get a named query variable. set($query_var, $value) Set a named query variable to a specific value. &get_posts() Fetch and return the requested posts from the database. Also populate $posts and $post_count . Note: This is called during construction if WP_Query is constructed with arguments. It is not idempotent and should not be called more than once on the same query object. Doing so may result in a broken query. next_post() (to be used when in ) Advance onto the next post in $posts . Increment $current_post and set $post to the (new) current post object (note: this does not set the global $post variable, only the WP_Query object"s instance variable.) Returns the current post object (This is deprecated pleases use "next_post_link()") the_post() (to be used when in ) Advance onto the next post, and set the global $post variable. have_posts() (to be used when in , or just before The Loop) Determine if we have posts remaining to be displayed. Calls rewind_posts() and returns false if don"t have posts remaining. Because of the rewind, you can"t rely on have_posts() staying false. See . rewind_posts() Reset $current_post and $post . &query($query) Call parse_query() and get_posts() . Return the results of get_posts() . get_queried_object() Set $queried_object if it"s not already set and return it. get_queried_object_id() Set $queried_object_id if it"s not already set and return it. WP_Query($query = "") (constructor) If you provide a query string, call query() with it.Show posts associated with certain author.
Show Posts for one Author
Display posts by author, using author id:
$query = new WP_Query(array("author" => 123));
Display posts by author, using author " user_nicename ":
$query = new WP_Query(array("author_name" => "rami"));
Show Posts From Several Authors
Display posts from several specific authors:
$query = new WP_Query(array("author" => "2,6,17,38"));
Exclude Posts Belonging to an Author
Display all posts except those from an author(singular) by prefixing its id with a "-" (minus) sign:
$query = new WP_Query(array("author" => -12));
Multiple Author Handling
Display posts from multiple authors:
$query = new WP_Query(array("author__in" => array(2, 6)));
You can also exclude multiple author this way:
$query = new WP_Query(array("author__not_in" => array(2, 6)));
Show posts associated with certain categories.
Show Posts for One Category
Display posts that have this category (and any children of that category), using category id:
$query = new WP_Query(array("cat" => 4));
Display posts that have this category (and any children of that category), using category slug:
$query = new WP_Query(array("category_name" => "staff"));
Display posts that have this category (not children of that category), using category id:
$query = new WP_Query(array("category__in" => 4));
Show Posts From Several Categories
Display posts that have these categories, using category id:
$query = new WP_Query(array("cat" => "2,6,17,38"));
Display posts that have these categories, using category slug:
$query = new WP_Query(array("category_name" => "staff,news"));
Display posts that have "all" of these categories:
$query = new WP_Query(array("category_name" => "staff+news"));
Exclude Posts Belonging to Category
Display all posts except those from a category by prefixing its id with a "-" (minus) sign.
$query = new WP_Query(array("cat" => "-12,-34,-56"));
Multiple Category Handling
Display posts that are in multiple categories. This shows posts that are in both categories 2 and 6:
$query = new WP_Query(array("category__and" => array(2, 6)));
To display posts from either category 2 OR 6, you could use cat as mentioned above, or by using category__in (note this does not show posts from any children of these categories):
$query = new WP_Query(array("category__in" => array(2, 6)));
You can also exclude multiple categories this way:
$query = new WP_Query(array("category__not_in" => array(2, 6)));
Show posts associated with certain tags.
Show Posts for One Tag
Display posts that have this tag, using tag slug:
$query = new WP_Query(array("tag" => "cooking"));
Display posts that have this tag, using tag id:
$query = new WP_Query(array("tag_id" => 13));
Show Posts From Several Tags
Display posts that have "either" of these tags:
$query = new WP_Query(array("tag" => "bread,baking"));
Note: If WP_Query determines that the result will be singular ( is true), it will ignore the tax_query parameter. To modify tax_query , use the filter to add the required SQL statements.
Important Note: tax_query takes an array of tax query arguments arrays (it takes an array of arrays). This construct allows you to query multiple taxonomies by using the relation parameter in the first (outer) array to describe the boolean relationship between the taxonomy arrays.
Simple Taxonomy Query:
Display posts tagged with bob , under people custom taxonomy:
$args = array("post_type" => "post", "tax_query" => array(array("taxonomy" => "people", "field" => "slug", "terms" => "bob",),),); $query = new WP_Query($args);
Multiple Taxonomy Handling:
Display posts from several custom taxonomies:
$args = array("post_type" => "post", "tax_query" => array("relation" => "AND", array("taxonomy" => "movie_genre", "field" => "slug", "terms" => array("action", "comedy"),), array("taxonomy" => "actor", "field" => "term_id", "terms" => array(103, 115, 206), "operator" => "NOT IN",),),); $query = new WP_Query($args);
Display posts that are in the quotes category OR have the quote :
$args = array("post_type" => "post", "tax_query" => array("relation" => "OR", array("taxonomy" => "category", "field" => "slug", "terms" => array("quotes"),), array("taxonomy" => "post_format", "field" => "slug", "terms" => array("post-format-quote"),),),); $query = new WP_Query($args);
Nested Taxonomy Handling:
The "tax_query" clauses can be nested, to create more complex queries. Example: Display posts that are in the quotes category OR both have the quote post format AND are in the wisdom category:
$args = array("post_type" => "post", "tax_query" => array("relation" => "OR", array("taxonomy" => "category", "field" => "slug", "terms" => array("quotes"),), array("relation" => "AND", array("taxonomy" => "post_format", "field" => "slug", "terms" => array("post-format-quote"),), array("taxonomy" => "category", "field" => "slug", "terms" => array("wisdom"),),),),); $query = new WP_Query($args);
Show posts based on a keyword search.
Show Posts based on a keyword search
Display posts that match the search term "keyword":
$query = new WP_Query(array("s" => "keyword"));
Prepending a term with a hyphen will exclude posts matching that term. Eg, "pillow -sofa" will return posts containing "pillow" but not "sofa" (available since ).
Display content based on post and page parameters. Remember that default post_type is only set to display posts but not pages.
Show Post by Type
Display only pages:
$query = new WP_Query(array("post_type" => "page"));
Display " any " post type (retrieves any type except revisions and types with "exclude_from_search" set to TRUE):
$query = new WP_Query(array("post_type" => "any"));
Display multiple post types, including custom post types:
$args = array("post_type" => array("post", "page", "movie", "book")); $query = new WP_Query($args);
Show Post by Status
Display only drafts:
$query = new WP_Query(array("post_status" => "draft"));
Display multiple post status:
$args = array("post_status" => array("pending", "draft", "future")); $query = new WP_Query($args);
Display all attachments:
$args = array("post_status" => "any", "post_type" => "attachment"); $query = new WP_Query($args);
Show Sticky Posts
Display just the first sticky post:
$sticky = get_option("sticky_posts"); $query = new WP_Query(array("p" => $sticky));
Display just the first sticky post, if none return the last post published:
$sticky = get_option("sticky_posts"); $args = array("posts_per_page" => 1, "post__in" => $sticky, "ignore_sticky_posts" =>
Display just the first sticky post, add this line to above block:
If ($sticky) { // insert here your stuff... }
Don"t Show Sticky Posts
Exclude all sticky posts from the query:
$query = new WP_Query(array("post__not_in" => get_option("sticky_posts")));
Return ALL posts within the category, but don"t show ("ignore") sticky posts at the top (They will still show in their natural position, e.g. by date):
$query = new WP_Query(array("ignore_sticky_posts" => 1, "posts_per_page" => 3, "cat" => 6);
Exclude sticky posts from a category. Return posts within the category, but exclude sticky posts completely, and adhere to paging rules:
$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 = new WP_Query($args);
Sort retrieved posts.
Show Posts sorted by Title, Descending order
Display posts sorted by post "title" in a descending order:
$args = array("orderby" => "title", "order" =>
Display posts sorted by "menu_order" with a fallback to post "title", in a descending order:
$args = array("orderby" => "menu_order title", "order" => "DESC",); $query = new WP_Query($args);
Show Random Post
Display one random post:
$args = array("orderby" => "rand", "posts_per_page" => 1,); $query = new WP_Query($args);
Show Popular Posts
Display posts ordered by comment count:
$args = array("orderby" => "comment_count"); $query = new WP_Query($args);
Show Products sorted by Price
Display posts with "Product" type ordered by "Price" custom field:
$args = array("post_type" => "product", "orderby" => "meta_value_num", "meta_key" => "price",); $query = new WP_Query($args);
Multiple "orderby" values
Display pages ordered by "title" and "menu_order". (title is dominant):
$args = array("post_type" => "page", "orderby" => "title menu_order", "order" => "ASC",); $query = new WP_Query($args);
Multiple "orderby" values using an array
Display pages ordered by "title" and "menu_order" with different sort orders (ASC/DESC) (available since ):
$args = array("orderby" => array("title" => "DESC", "menu_order" => "ASC")); $query = new WP_Query($args);
Mulitiple orderby/order pairs
$args = array("orderby" => array("meta_value_num" => "DESC", "title" => "ASC"), "meta_key" => "age"); $query = new WP_Query($args);
"orderby" with "meta_value" and custom post type
Display posts of type "my_custom_post_type", ordered by "age", and filtered to show only ages 3 and 4 (using meta_query).
$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 = new WP_Query($args);
"orderby" with multiple "meta_key"s
If you wish to order by two different pieces of postmeta (for example, City first and State second), you need to combine and link your meta query to your orderby array using "named meta queries". See the example below:
$q = new WP_Query(array("meta_query" => array("relation" => "AND", "state_clause" => array("key" => "state", "value" => "Wisconsin",), "city_clause" => array("key" => "city", "compare" => "EXISTS",),), "orderby" => array("city_clause" => "ASC", "state_clause" => "DESC",),));
Show posts associated with a certain time and date period.
Returns posts dated December 12, 2012:
$query = new WP_Query("year=2012&monthnum=12&day=12");
$args = array("date_query" => array(array("year" => 2012, "month" => 12, "day" => 12,),),); $query = new WP_Query($args);
Returns posts for today:
$today = getdate(); $query = new WP_Query("year=" . $today["year"] . "&monthnum=" . $today["mon"] . "&day=" . $today["mday"]);
$today = getdate(); $args = array("date_query" => array(array("year" => $today["year"], "month" => $today["mon"], "day" => $today["mday"],),),); $query = new WP_Query($args);
Returns posts for this week:
$week = date("W"); $year = date("Y"); $query = new WP_Query("year=" . $year . "&w=" . $week);
$args = array("date_query" => array(array("year" => date("Y"), "week" => date("W"),),),); $query = new WP_Query($args);
Return posts between 9AM to 5PM on weekdays
$args = array("date_query" => array(array("hour" => 9, "compare" => ">=",), array("hour" => 17, "compare" => "<=",), array("dayofweek" => array(2, 6), "compare" => "BETWEEN",),), "posts_per_page" =>
Return posts from January 1st to February 28th
$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 = new WP_Query($args);
Note that if a strtotime() -compatible string with just a date was passed in the before parameter, this will be converted to 00:00:00 on that date. In this case, even if inclusive was set to true, the date would not be included in the query. If you want a before date to be inclusive, include the time as well, such as "before" => "2013-02-28 23:59:59" , or use the array format, which is adjusted automatically if inclusive is set.
Return posts made over a year ago but modified in the past month
$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 = new WP_Query($args);
The "date_query" clauses can be nested, in order to construct complex queries. See for details on the syntax.
Show posts associated with a certain custom field.
This part of the query is parsed by , so check as well in case this list of arguments isn"t up to date.
meta_query also contains one or more arrays with the following keys:
The "type" DATE works with the "compare" value BETWEEN only if the date is stored at the format YYYY-MM-DD and tested with this format.
Important Note: meta_query takes an array of meta query arguments arrays (it takes an array of arrays) - you can see this in the examples below. This construct allows you to query multiple metadatas by using the relation parameter in the first (outer) array to describe the boolean relationship between the meta queries. Accepted arguments are "AND", "OR". The default is "AND".
Simple Custom Field Query:
Display posts where the custom field key is "color", regardless of the custom field value:
$query = new WP_Query(array("meta_key" => "color"));
Display posts where the custom field value is "blue", regardless of the custom field key:
$query = new WP_Query(array("meta_value" => "blue"));
Display where the custom field value is "blue", regardless of the custom field key:
$args = array("meta_value" => "blue", "post_type" => "page"); $query = new WP_Query($args);
Display posts where the custom field key is "color" and the custom field value is "blue":
$args = array("meta_key" => "color", "meta_value" => "blue"); $query = new WP_Query($args);
Display posts where the custom field key is "color" and the custom field value IS NOT "blue":
$args = array("meta_key" => "color", "meta_value" => "blue", "meta_compare" => "!="); $query = new WP_Query($args);
Display posts where the custom field value is a number. Displays only posts where that number is less than 10. (WP_Query uses this equation to compare: $post_meta . $args["meta_compare"] . $args["meta_value"] , where "$post_meta" is the value of the custom post meta stored in each post; the actual equation with the values filled in: $post_meta < 10)
$args = array("post_type" => "post", "meta_key" => "number", "meta_value_num" => 10, "meta_compare" => "<",); $query = new WP_Query($args);
Display posts where the custom field key is a set date and the custom field value is now. Displays only posts which date has not passed.
$args = array("post_type" => "event", "meta_key" => "event_date", "meta_value" => date("Ymd"), // change to how "event date" is stored "meta_compare" => ">",); $query = new WP_Query($args);
Display "product"(s) where the custom field key is 'price' and the custom field value that is LESS THAN OR EQUAL TO 22.
By using the 'meta_value' parameter the value 99 will be considered greater than 100 as the data are stored as 'strings', not 'numbers'. For number comparison use 'meta_value_num'.
$args = array('meta_key' => 'price', 'meta_value' => '22', 'meta_compare' => '<=', 'post_type' => 'product'); $query = new WP_Query($args);
Display posts with a custom field value of zero (0), regardless of the custom field key:
$args = array('meta_value' => '_wp_zero_value'); $query = new WP_Query($args);
Single Custom Field Handling:
Display posts from a single custom field:
$args = array('post_type' => 'product', 'meta_query' => array(array('key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE',),),); $query = new WP_Query($args);
(Note that meta_query expects nested arrays, even if you only have one query.)