В этой части серии «Освоение WP_Query
вы узнаете о некоторых аргументах, которые можно использовать с классом WP_Query
, а именно:
- положение дел
- заказ
- пагинация
Вы можете использовать эти аргументы для выборки запланированных постов из базы данных, запроса вложений, изменения порядка упорядочивания постов и порядка их размещения, указания количества отображаемых постов и многого другого.
Но прежде чем вы сможете это сделать, вам нужно понять, как работают аргументы в WP_Query
.
Резюме о том, как аргументы работают в WP_Query
Прежде чем мы начнем, давайте WP_Query
как работают аргументы в WP_Query
. Когда вы WP_Query
в своих темах или плагинах, вам нужно включить четыре основных элемента:
- аргументы для запроса, используя параметры, которые будут рассмотрены в этом руководстве
- сам запрос
- петля
- завершение: закрытие тегов if и while и сброс данных поста
На практике это будет выглядеть примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
$args = array(
// Arguments for your query.
);
// Custom query.
$query = new WP_Query( $args );
// Check that we have query results.
if ( $query->have_posts() ) {
// Start looping over the query results.
while ( $query->have_posts() ) {
$query->the_post();
// Contents of the queried post results go here.
}
}
// Restore original post data.
wp_reset_postdata();
?>
|
Аргументы — это то, что сообщает WordPress, какие данные нужно извлечь из базы данных, и это те, которые я расскажу здесь. Итак, все, на чем мы концентрируемся, это первая часть кода:
1
2
3
|
$args = array(
// Arguments for your query.
);
|
Как видите, аргументы содержатся в массиве. В этом уроке вы узнаете, как их кодировать.
Кодирование ваших аргументов
Существует специальный способ кодирования аргументов в массиве, который заключается в следующем:
1
2
3
4
5
|
$args = array(
‘parameter1’ => ‘value’,
‘parameter2’ => ‘value’,
‘parameter3’ => ‘value’
);
|
Вы должны заключить параметры и их значения в одинарные кавычки, использовать =>
между ними и разделить их запятой. Если вы ошиблись, WordPress может не добавить все ваши аргументы в запрос, или вы можете получить белый экран.
Параметры состояния
Как вы узнаете, если вы когда-либо конвертировали статус сообщения из черновика в опубликованный или, возможно, поместили его в корзину, WordPress назначает статус каждому сообщению. Вы можете использовать параметр post_status
для запроса сообщений с одним или несколькими статусами.
Доступны следующие аргументы:
-
publish
: опубликованный пост или страница. -
pending
: сообщение ожидает рассмотрения. -
draft
: пост в черновом статусе. -
auto-draft
: недавно созданный пост, без содержания. -
future
: публикация в будущем. -
private
: не виден пользователям, которые не вошли в систему. -
inherit
: пересмотр. -
trash
: сообщение находится в мусорном ведре. -
any
: Извлекает любой статус, кроме статусов пост-статусов, когда'exclude_from_search'
установлено значение true (т. е.trash
иauto-draft
).
Если вы не укажете статус в аргументах запроса, WordPress по умолчанию будет publish
; если текущий пользователь вошел в систему, он также будет содержать сообщения со статусом private
. Если вы запускаете запрос на страницах администратора, WordPress также включает защищенные статусы, которые по умолчанию являются future
, draft
и pending
.
Итак, предположим, что вы работаете с сайтом событий и используете пользовательский тип события, используя дату публикации в качестве даты, когда событие происходит. По умолчанию WordPress не будет отображать события, которые еще не произошли: хотя вы запланировали их, их запланированная дата находится в будущем, поэтому их статус публикации будет в будущем.
Чтобы обойти это, вы просто используете эти аргументы:
1
2
3
4
|
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => ‘future’
);
|
Это будет отображать только те события, которые еще не произошли, так как те будут иметь статус publish
. Но если вы также хотите отобразить события, которые произошли, вы можете использовать массив пост-статусов, чтобы включить более одного:
1
2
3
4
5
6
7
|
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
)
);
|
Параметр post_status
необходим, когда вы запрашиваете вложения. Это потому, что они имеют статус inherit
, а не publish
. Таким образом, чтобы запросить все вложения, вы должны использовать это:
1
2
3
4
|
$args = array(
‘post_type’ => ‘attachment’,
‘post_status’ => ‘inherit’
);
|
В качестве альтернативы вы можете заменить inherit
any
который будет иметь тот же эффект.
Параметры заказа
Есть два параметра, которые вы используете для заказа сообщений, полученных WP_Query
: order
и orderby
. Как и следовало ожидать, order
определяет порядок, в котором сообщения будут выводиться в цикле, а orderby
определяет, по какому полю в базе данных они будут отсортированы.
Давайте начнем с рассмотрения аргументов для order
.
Параметр заказа
Для этого можно использовать только два аргумента:
-
ASC
: возрастающий порядок от минимального до максимального значения (1, 2, 3; a, b, c). -
DESC
: нисходящий порядок от самых высоких до самых низких значений (3, 2, 1; c, b, a).
Это довольно очевидно. Если вы не включите аргумент для order
, WordPress по умолчанию будет DESC
.
Параметр orderby
Вы можете сортировать свои сообщения по ряду полей:
-
none
: нет заказа (доступно в версии 2.8 ). -
ID
: Заказ по почтовому идентификатору. Обратите внимание на заглавные буквы. -
author
: заказ автора. -
title
: Сортировать по названию. -
name
: Заказ по почте слизень. -
type
: Заказ по типу поста. -
date
: упорядочить по дате. -
modified
: Заказ по дате последнего изменения. -
parent
: упорядочить по почте / идентификатору родителя -
rand
: случайный порядок. -
comment_count
: порядок по количеству комментариев. -
menu_order
: порядок по страницам. Чаще всего используется для страниц (используя значение, которое вы добавляете в метабокс на экране «Редактировать страницу») и для вложений (используя целочисленные поля в диалоговом окне «Вставить /menu_order
), но может использоваться для любого типа записи с включеннымmenu_order
. -
meta_value
: сортировка по значению мета-ключа (или пользовательского поля). Это работает, только если вы также включили параметрmeta_key
в свои аргументы. Мета-значения сортируются по алфавиту, а не по номерам (например, 34 будет идти до 4, например). -
meta_value_num
: порядок по числовому мета-значению. Как и в случаеmeta_value
, вы также должны включить в свой запрос аргументmeta_key
. -
post__in
: сохранить порядок идентификаторовpost__in
указанный в массивеpost__in
.
По умолчанию используется date
, то есть дата публикации сообщения.
Так, например, если вы хотите отсортировать свои посты по заголовку в порядке возрастания, вы должны использовать эти аргументы:
1
2
3
4
|
$args = array(
‘orderby’ => ‘title’,
‘order’ => ‘ASC’
);
|
Упорядочение по нескольким полям
Вам не нужно придерживаться только одного поля для сортировки ваших сообщений. Для сортировки по нескольким полям вы используете массив с параметром orderby
и (необязательно) с параметром order
если хотите отсортировать каждое поле в другом порядке.
Допустим, у вас есть настраиваемое поле для оценок, которое вы хотите использовать для сортировки на сайте электронной коммерции. Вы можете отсортировать по рейтингу, а затем по названию, в порядке возрастания, следующим образом:
1
2
3
4
5
6
7
8
|
$args = array(
‘orderby’ => array(
‘meta_value_num’,
‘title’
),
‘order’ => ‘ASC’,
‘meta_key’ => ‘rating’
);
|
Обратите внимание, что я включил аргумент meta_key
чтобы WordPress знал, какое настраиваемое поле я использую. Вы делаете это из-за способа, которым WordPress хранит метаданные публикации : не в таблице wp_posts
, а в таблице wp_postmeta
.
Но что, если вы хотите упорядочить по рейтингу в порядке убывания, а затем по заголовку в порядке возрастания? Вы просто используете другой массив:
01
02
03
04
05
06
07
08
09
10
11
|
$args = array(
‘orderby’ => array(
‘meta_value_num’,
‘title’
),
‘order’ => array(
‘DESC’,
‘ASC’
),
‘meta_key’ => ‘rating’
);
|
Вы также можете сортировать по нескольким полям, когда не используете метаданные поста, например, сортировать по типу поста, а затем по дате:
01
02
03
04
05
06
07
08
09
10
|
$args = array(
‘orderby’ => array(
‘type’,
‘date’
),
‘order’ => array(
‘ASC’,
‘DESC’
)
);
|
Это будет сортировать по типу поста в порядке возрастания, а затем по каждому типу поста, по дате в порядке убывания.
Параметры пагинации
Следующий набор параметров, к которым мы пришли, предназначен для нумерации страниц. Они помогут вам определить, сколько постов будет запрошено и как будет работать разбиение на страницы при их выводе.
Доступные параметры:
-
nopaging
( логическое ): Показать все сообщения или использовать нумерацию страниц. По умолчанию используется значение'false'
, т.е. используется разбиение на страницы. -
posts_per_page
( int ): Количество сообщений для отображения на странице. -
posts_per_archive_page
( int ): Количество сообщений, отображаемых на странице — только на страницах архива. -
offset
( int ): Количество сообщений, которые нужно сместить или передать. -
paged
( int ): страница в архиве, с которой отображаются сообщения. -
page
( int ): количество страниц для статической главной страницы. Показать сообщения, которые обычно отображаются только на странице X статической главной страницы. -
ignore_sticky_posts
( boolean ): игнорировать липкость поста — по умолчаниюfalse
.
Давайте посмотрим на некоторые примеры.
Количество постов и смещений постов
Например, для отображения пяти последних сообщений:
1
2
3
|
$args = array(
‘posts_per_page’ => ‘5’
);
|
Или отобразить пять последних сообщений, исключая самый последний:
1
2
3
4
|
$args = array(
‘posts_per_page’ => ‘5’,
‘offset’ => ‘1’
);
|
Обратите внимание, что, хотя вы выбираете посты из последних шести постов в базе данных, вы все равно используете 'posts_per_page' => '5'
как это количество постов, которые будут выводиться.
Пойдя дальше, вы можете написать два запроса: один для отображения самого последнего сообщения, а второй для отображения еще десяти сообщений, исключая этот пост:
01
02
03
04
05
06
07
08
09
10
11
12
|
$args = array(
‘posts_per_page’ => ‘1’
);
// Query and loop go here as well as resetting posts.
$args = array(
‘posts_per_page’ => ’10’,
‘offset’ => ‘1’
);
// Second query, loop, and resetting go here.
|
Вы также можете использовать posts_per_page
для отображения всех сообщений:
1
2
3
|
$args = array(
‘posts_per_page’ => ‘-1’
);
|
Липкие Посты
Обычно ваши липкие сообщения будут отображаться первыми в любом запросе: если вы хотите переопределить это, используйте ignore_sticky_posts
:
1
2
3
4
|
$args = array(
‘posts_per_page’ => ‘5’,
‘ignore_sticky_posts’ => true
);
|
Приведенные выше аргументы будут возвращать последние пять сообщений независимо от того, являются они липкими или нет.
Обратите внимание, что если вы хотите отображать только прикрепленные записи, вам нужно использовать get_option()
и аргумент post__in
следующим образом:
1
2
3
4
5
6
|
$sticky = get_option( ‘sticky_posts’ );
$args = array(
‘posts_per_page’ => ‘5’,
‘post__in’ => $sticky
);
|
В приведенном выше отображении будут отображаться последние пять прикрепленных сообщений: если имеется менее пяти (например, трех) прикрепленных сообщений, то будут отображаться не прикрепленные сообщения, а только последние три прикрепленных сообщения.
Нумерация страниц в архивах
Помимо определения количества постов, извлекаемых из базы данных, вы также можете использовать параметры разбиения на страницы, чтобы определить, как результирующие посты будут разбиты на страницы на страницах архива и поиска.
Например, на странице архива вы можете использовать этот код для отображения 20 сообщений на странице в архиве:
1
2
3
|
$args = array(
‘posts_per_archive_page’ => ’20’
);
|
Примечание: аргумент posts_per_page
переопределит posts_per_page
.
Вы также можете выбрать вывод только тех страниц, которые будут отображаться на данной странице в разбивке на страницы. Так, например, если вы хотите показать 20 сообщений, которые будут отображаться на третьей странице в приведенном выше примере, вы должны использовать это:
1
2
3
4
|
$args = array(
‘posts_per_archive_page’ => ’20’,
‘paged’ => ‘3’
);
|
Альтернативный способ запросить те же сообщения будет использовать аргумент offset
:
1
2
3
4
|
$args = array(
‘posts_per_page’ => ’20’,
‘offset’ => ’40’
);
|
Это пропускает первые 40 постов (которые будут на первых двух страницах архива) и выбирает следующие 20 постов (которые будут на третьей странице архива. Одна из вещей, которые мне нравятся в WordPress, — это то, что он так часто дает вам больше, чем один способ чего-то достичь!
Вы также можете полностью отключить нумерацию страниц, чтобы все записи отображались на одной странице:
1
2
3
|
$args = array(
‘nopaging’ => true
);
|
Резюме
Класс WP_Query
дает вам большую гибкость, когда дело доходит до определения, сколько постов вы хотите запросить, в каком порядке вы хотите их отображать, и какой статус поста вы хотите показать.
Некоторые из этих аргументов важны для запросов к определенным типам 'post_status' => 'inherited'
(например, 'post_status' => 'inherited'
для вложений), в то время как другие просто дают вам больше контроля над тем, как выполняются ваши запросы.
Используя эти параметры, вы можете создавать собственные запросы, которые делают намного больше, чем просто вывод самых последних опубликованных постов.