Если вы следили за нашей серией статей, то уже наверняка знаете, как устроен класс 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-модулей.
В сегодняшней статье из нашей серии, посвященной изучению класса WP_Query , вы узнаете о нескольких аргументах, которые можно использовать вместе с 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 может опросить не все указанные вами аргументы, и в итоге на экран ничего не выведется.
Как вы знаете, WordPress задает каждой записи отдельный статус. Можно использовать параметр post_status для запросов записей с одним или несколькими статусами.
Доступны следующие аргументы:
Если вы не укажете статус в аргументах вашего запроса, WordPress по умолчанию будет ориентироваться на publish ; если пользователь авторизован на сайте, то в запросе также будут учитываться записи со статусом private . Если вы запускаете запрос от имени администратора, то WordPress также будет учитывать защищенные статусы: future , draft и pending .
Предположим, что у вас есть сайт-афиша, на котором используется собственный тип записей event , и в качестве даты публикации используется дата, на которую запланировано то или иное мероприятие. По умолчанию, WordPress не будет отображать еще не состоявшиеся события. Несмотря на то, что вы запланировали, дата публикации находится в будущем, а, значит, статус записи будет future .
Чтобы обойти эту проблему, можно использовать следующие аргументы:
$args = array("post_type" => "event", "post_status" => "future");
Этот код позволит отобразить те события, которые еще не состоялись, так как для опубликованных записей используется статус publish . Но если необходимо показать и состоявшиеся мероприятия, то нужно использовать массив, в котором указано больше одного статуса:
$args = array("post_type" => "event", "post_status" => array("future", "publish"));
Параметр post_status важен при осуществлении запросов к вложениям, потому что используется статус inherit , а не publish . Чтобы осуществить запрос всех вложений, можно использовать следующий код:
$args = array("post_type" => "attachment", "post_status" => "inherit");
Но вы можете заменить inherit на любой другой статус, который позволит получить аналогичный результат.
Существует два параметра, которые можно использовать для сортировки записей, полученных при помощи WP_Query : order и orderby . Как вы уже поняли, order определяет порядок, в котором записи выводятся в цикле, а orderby определяет, по какому полю в базе данных они будут сортироваться.
Есть всего аргумента, которые можно использовать для сортировки:
ASC
: по возрастанию (1, 2, 3; a, b, c
).
DESC
: по убыванию (3, 2, 1; c, b, a
).
Если вы не включите аргумент для order, по умолчанию WordPress будет использовать DESC .
Вы можете сортировать записи по нескольким полям:
По умолчанию, для сортировки используется поле date . То есть, сортируется по дате публикации.
Если нужно сортировать записи по заголовку в порядке убывания, то можно использовать следующие аргументы:
$args = array("orderby" => "title", "order" => "ASC");
Чтобы отсортировать записи по нескольким полям, нужно воспользоваться массивом с параметром orderby и с параметром order , если нужна сортировка каждого поля в разном порядке.
Предположим, что у вас есть произвольное поле ratings , которое вы хотите использовать для сортировки в интернет-магазине. Вы можете осуществить сортировку по возрастанию рейтинга, а затем по заголовку при помощи следующего кода:
$args = array("orderby" => array("meta_value_num", "title"), "order" => "ASC", "meta_key" => "rating");
Я включила в запрос аргумент meta_key , и это позволит WordPress понять, какое произвольное поле мы используем. Это нужно делать именно потому, что WordPress хранит метаданные записей в таблице wp_postmeta , а не в wp_posts .
Но что если нужно выполнить сортировку по убыванию рейтинга, а затем по заголовку в порядке возрастания? В таком случае следует использовать другой массив:
$args = array("orderby" => array("meta_value_num", "title"), "order" => array("DESC", "ASC"), "meta_key" => "rating");
Также можно выполнить сортировку по нескольким полям, если не требуется использовать метаданные записи. Например, чтобы сортировать записи по типу, а затем по дате, можно использовать следующий код:
$args = array("orderby" => array("type", "date"), "order" => array("ASC", "DESC"));
Этот код позволит осуществить сортировку по типу записи в возрастающем порядке, а затем, в рамках каждого типа записи, по дате в порядке убывания.
Мы переходим к еще одному набору параметров, который связан с постраничным выводом контента, с пагинацией. Эти параметры помогают определять, сколько записей будет опрошено, и как будет происходить нумерация страниц.
Доступны следующие параметры:
Чтобы показать пять самых свежих записей, используем следующий код:
$args = array("posts_per_page" => "5");
Показываем пять самых свежих записей, за исключением самой последней опубликованной:
$args = array("posts_per_page" => "5", "offset" => "1");
Учтите, что, несмотря на то, что вы извлекаете записи из шести последних записей в базе данных, вы по-прежнему используете ‘posts_per_page’ => ‘5’ , так как именно такое количество записей должно быть отображено.
Можно создать два запроса: один для отображения самых свежих записей, а второй – для отображения еще 10 записей, за исключением той записи:
Для отображения всех записей можно использовать posts_per_page :
$args = array("posts_per_page" => "-1");
Обычно прикрепленные записи отображаются первыми в любом запросе. Если нужно переопределить эту установку, то воспользуйтесь параметром ignore_sticky_posts :
$args = array("posts_per_page" => "5", "ignore_sticky_posts" => true);
Приведенные выше аргументы позволят получить последние пять записей, независимо от того, являются они прикрепленными или нет.
Если нужно отобразить только прикрепленные записи, то нужно использовать функцию get_option() и аргумент post__in следующим образом:
$sticky = get_option("sticky_posts"); $args = array("posts_per_page" => "5", "post__in" => $sticky);
Приведенный выше код позволит получить пять последних прикрепленных записей. Если их будет меньше пяти (например, три ), то будет выведено только доступное количество прикрепленных записей.
Также можно использовать параметры пагинации для того, чтобы определить, каким образом полученные записи будут распределяться по нескольким страницам архива или на страницах поисках.
К примеру, следующий код можно использовать на странице архива, чтобы вывести по 20 записей на каждую страницу:
$args = array("posts_per_archive_page" => "20");
Примечание: аргумент posts_per_archive_page переопределяет posts_per_page .
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.)
Выбирает записи из базы данных по указанным критериям. На основе WP_Query работают функции get_posts() и query_posts() и все остальные запросы связанные с выбором записей из таблицы wp_posts.
Можно использовать следующие фильтры для внедрения непосредственно в сам SQL запрос.
Важно: если указан параметр , то все эти хуки работать не будут!
Миме тип записи. Используется только для вложений - записей с типом "attachment".
Этот параметр будет работать только когда параметр post_type = attachment и post_status = inherit . Т.е. MIME-тип может быть только у вложений.
Получает посты с указанным статусом.
Post_status(строка/массив)
Статус поста.
По умолчанию publish , а если пользователь авторизован добавляется еще и private . Если запрос запущен из админ части, добавляются еще и защищенные типы статусов: future , draft и pending . Все типы статусов:
По умолчанию: "publish"
Получим только черновики:
$query = new WP_Query("post_status=draft");
Получим посты с разными статусами:
$query = new WP_Query(array("post_status" => array("pending", "draft", "future")));
Получим все виды вложений:
$query = new WP_Query(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 для основного массива работают как параметры по умолчанию для вложенных массивов (если они есть).
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")
after (строка/массив)
- Дата записи "после" которой будут получены. Принимает строку которую поймет функция strtotime() : все возможные форматы . Или можно передать массив с индексами: year , month , day: array("year" => "2015", "month" => "5", "day" => "28")
Относительно текущего времени сайта (не UTC).
column (строка) - см. выше, только для конкретной даты. По умолчанию: значение верхнего массива.
compare (строка) - см. выше, только для конкретной даты. По умолчанию "=".
inclusive (логический) - аргументы before и after обрабатываются включительно, если true. По умолчанию: false.
В параметрах: year , month , week , dayofyear , day , dayofweek , dayofweek_iso , hour , minute , second можно указать несколько значений, в виде массива, если параметр compare соответствует.
Запросы выше возвращают посты за указанный период в истории: "Посты за Х месяц, Х день". Они не могут получать посты за произвольный промежуток времени по отношению к настоящему. Поэтому запросы типа "Посты за последние 30 дней" или "Посты за последний год" не возможны в базовом варианте, для таких запросов нужно использовать фильтр "posts_where". Примеры ниже показывают как это делать.
Параметр "m" может быть установлен только в списке постов в админ-панели. Он полезен когда вы выбираете из выпадающего списка select где дата установлена как число YYYYmm.
Даты можно указывать цифрами и строками, потому что аргументы before и after обрабатываются функцией PHP strtotime() , а она понимает строки.
$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);
Аргумент date_query работает и с классом WP_Comment_Query, поэтому его точно также можно использовать в функции: get_comments() .
Можно установить отступ от первого поста в результатах запроса. Например, стандартно запрос возвращает 6 постов, а если в тот же запрос добавить параметр offset=1 , то будут возвращены 5 постов (первый пост из запроса будет пропущен).
Offset(число) Сколько постов из результатов запроса пропустить.
Пропустим первый/один пост (offset=1) и вернем следующие 5:
$query = new WP_Query("posts_per_page=5&offset=1");
Сортирует и устанавливает направление сортировки.
Параметры сортировки не будут работать, если указать параметр fields = ids , потому что в этом случае, в запросе не будет полей по которым можно отсортировать результат.
Order(строка)
Направление сортировки по параметру orderby , может быть:
Поля по которым можно сортировать посты. Может быть
meta_value - по значения произвольного поля.
Важно: параметр meta_key так же должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).
С версии WordPress 4.0 в orderby можно указывать массив сочетающий в себе оба параметра: orderby и order . Сделано это для сортировки по нескольким колонкам одновременною Синтаксис такой:
"orderby" => array("title" => "DESC", "menu_order" => "ASC")
Отсортируем по порядку в меню, а затем по заголовку
$query = new WP_Query(array ("orderby" => "menu_order title", "order" => "DESC"));
Выведем посты отсортированные по двум полям: "title" и "menu_order" (title первостепенен):
$query = new WP_Query(array("post_type" => "page", "orderby" => "title menu_order", "order" => "ASC"));
Получим страницы отсортированные по заголовку (title) и номеру меню (menu_order) в разном порядке (ASC/DESC):
$query = new WP_Query(array("orderby" => array("title" => "DESC", "menu_order" => "ASC")));
Выведем посты типа "my_custom_post_type" отсортированные по ключу произвольного поля "age" и отфильтрованные, чтобы показывались только посты со значением поля 3 и 4:
$args = array("post_type" => "my_custom_post_type", "meta_key" => "age", "orderby" => "meta_value_num", "order" => "ASC", "meta_query" => array(array("key" => "age", "value" => array(3, 4), "compare" => "IN",))); $query = new WP_Query($args);
Чтобы отсортировать результат по двум разным метаполям, например, сначала по city , а затем по state , нужно указать ключи для массивов в массиве meta_query и затем использовать эти ключи в параметре orderby:
$query = new WP_Query([ "meta_query" => [ "relation" => "AND", "state_clause" => [ "key" => "state", "value" => "Wisconsin", ], "city_clause" => [ "key" => "city", "compare" => "EXISTS", ], ], "orderby" => [ "city_clause" => "ASC", "state_clause" => "DESC", ], ]);
Количество постов на одной странице. Если выставить -1 , то будут выведены все посты (без пагинации).
С версии 2.1 заменяет параметр showposts . Установите параметр paged , если пагинация не работает, после использования этого параметра.
Заметка: если запрос в feed части, WP перезаписывает этот параметр опцией posts_per_rss . Чтобы повлиять на вывод постов в фиде используйте фильтры post_limits или pre_option_posts_per_rss .
Posts_per_archive_page(число)
Количество постов для страниц архивов: для страниц, которые удовлетворяют условиям is_archive() или is_search() . Этот параметр перезаписывает параметры " posts_per_page " и " showposts ".
offset(число)
Сколько постов пропустить сверху выборки (верхний отступ).
Внимание:
Установка этого параметра переписывает/игнорирует параметр "paged" и ломает пагинацию (решение проблемы).
paged(число)
Номер страницы пагинации. Показывает посты, которые в обычном режиме должны были быть показаны на странице пагинации Х. Переписывает параметр posts_per_page
page(число)
Номер для статической домашней страницы. Показывает записи, которые в обычном режиме должны были быть показаны на странице пагинации Х главной статической странице (front page).
ignore_sticky_posts(логический)
Игнорировать прилепленные посты или нет (true/false). С версии 3.1. Заменяет параметр caller_get_posts.
Прилепленные посты не будут показываться в начале списка, но они не исключаются и будут выводиться в обычном порядке.
Получим 3 поста:
$query = new WP_Query("posts_per_page=3");
Получим все посты:
$query = new WP_Query("posts_per_page=-1");
Получим все посты и отключим пагинацию:
$query = new WP_Query("nopaging=true");
Получим посты начиная с четвертого (пропустим первые 3):
$query = new WP_Query("offset=3"));
Получим 5 постов, которые идут за тремя первыми постами:
$query = new WP_Query(array("posts_per_page" => 5, "offset" => 3));
Получим посты с текущей страницы пагинации. Полезно при построении произвольной пагинации:
$query = new WP_Query([ "paged" => get_query_var("paged") ]);
Получим посты с текущей страницы и установим параметр paged в 1, когда переменная не определена на первой странице пагинации:
$paged = get_query_var("paged") ? get_query_var("paged") : 1; $query = new WP_Query([ "paged" => $paged ]);
Используйте get_query_var("page") если нужно получить номер страницы пагинации статической главной страницы сайта - is_front_page() . Переменная page в этом случае, содержит номер пагинации на страницах типа post, когда в контенте используется тег разбиения контента на страницы .
Вывод текущей страницы пагинации на статической главной странице:
$paged = get_query_var("page") ?: 1; $query = new WP_Query([ "paged" => $paged ]);
Исключим все прилепленные посты из запроса:
$query = new WP_Query([ "post__not_in" => get_option("sticky_posts") ]);
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты не будут сверху, они будут выводится как обычные посты (по дате):
$query = new WP_Query([ "ignore_sticky_posts" => 1, "posts_per_page" => 3, "cat" => 6 ]);
Исключим прилепленные посты из категории. Вернет все посты рубрики, но прилепленные посты будут полностью исключены. Также добавим сюда правило для правильной пагинации:
$paged = get_query_var("paged") ?: 1; $sticky = get_option("sticky_posts"); $query = new WP_Query(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.
Посты найденные по поисковой фразе:
$query = new WP_Query("s=keyword");
Устанавливает какие данные должен возвращать запрос.
Fields(строка/массив)
Какие данные возвращать. По умолчанию возвращаются все.
Не добавляет данные в кэш при выполнении запросов.
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
Обычно эти функции использовать не нужно - кэш необходим! Однако, такой подход может пригодится в ряде случаев. Например, если нам нужно получить список заголовков постов и не нужна никакая другая информация о постах: ни о таксономиях ни о мета данных. Не загружая эту информацию мы может сохранить время на ненужных SQL запросах.
Заметка: если используется плагин постоянного кэширования, все эти флаги устанавливаются в 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 init() Активирует объект, выставляет все значение свойств в null, 0 или false. parse_query($query) Получает параметры запроса, анализирует их и выставляет базовые свойства класса: $posts , $post_count , $post и $current_post . parse_query_vars() Анализирует старый запрос заново. get($query_var) Получает переменную запроса по имени. set($query_var, $value) Устанавливает переменную запроса. Указываются: название переменной и её значение. &get_posts() Получает требуемые посты из БД. Также заполняет свойства $posts и $post_count . next_post() Используется во время цикла. Переходит к следующему посту в массиве $posts . Устанавливает $current_post и $post . Метод не устанавливает глобальную переменную $post , а влияет на переменную внутри класса. Возвращает данные текущего поста (объект). the_post() Используется во время цикла. Переходит к следующему посту и меняет глобальную переменную $post . have_posts() Используется прям перед циклом. Проверяет есть ли посты для вывода. rewind_posts() Сбрасывает переменные $current_post и $post . &query($query) Вызывает методы: parse_query() и get_posts() . Возвращает результат get_posts() . get_queried_object() Заполняет переменную $queried_object , если она еще не заполнена и возвращает её. get_queried_object_id() Заполняет переменную $queried_object_id , если она еще не заполнена и возвращает её. __construct($query = "") Конструктор класса. Если переданы данные запроса, вызывает метод query() и передает ему данные.