В этой серии статей о WP_Query
вы узнали, как использовать класс 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 может не добавить все ваши аргументы в запрос, или вы можете получить белый экран.
Параметры даты
Вы также можете использовать параметры для запроса сообщений с датой публикации на данную дату. Вы можете быть точными с датами, используя, например, годы и месяцы для получения ряда сообщений.
Вы можете написать простой набор аргументов или использовать date_query
для создания вложенных массивов и выполнения более сложных запросов. Давайте начнем с более простых аргументов.
Аргументы простой даты
Параметры, которые вы можете использовать для запроса по дате:
-
year
( int ): Четырехзначный год (например,2015
). -
monthnum
( int ): номер месяца (от1
до12
). -
w
( int ): неделя года (от0
до53
). Режим зависит от опции"start_of_week"
которую вы можете редактировать на странице настроек в админке. -
day
( int ): день месяца (от1
до31
). -
hour
( int ): час (от0
до23
). -
minute
( int ): минута (от0
до60
). -
second
( int ): Second (от0
до60
). -
m
( int ): YearMonth (например,201502
).
Итак, представьте, что вы используете сайт событий, который использует дату публикации для каждого события, чтобы обозначить дату начала события. Чтобы отобразить все события прошлого и будущего, произошедшие в 2015 году, вам понадобятся следующие аргументы:
1
2
3
4
5
6
7
8
|
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘year’ => ‘2015’
);
|
Обратите внимание, что я использовал future
и publish
для статуса поста, поскольку посты, запланированные на будущую дату, по умолчанию не запрашиваются.
Или, если вы хотите автоматически отображать события, происходящие в этом году, а не обновлять запрос каждый год, вы можете сначала получить текущий год, а затем передать его в аргументах запроса:
01
02
03
04
05
06
07
08
09
10
|
$current_year = the_date( ‘Y’ );
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘year’ => $current_year
);
|
Сложные даты Аргументы
Чтобы использовать несколько параметров даты для создания более сложных запросов, используйте параметр date_query
. Это дает вам доступ к большему количеству параметров:
-
year
( int ): Четырехзначный год (например,2015
). -
month
( int ): номер месяца (от1
до12
). -
week
( int ): неделя года (от0
до53
). -
day
( int ): день месяца (от1
до31
). -
hour
( int ): час (от0
до23
). -
minute
( int ): минута (от0
до59
). -
second
( int ): Second (от0
до59
). -
after
( строка / массив ): дата получения сообщений после. -
before
( строка / массив ): дата для получения сообщений до. -
inclusive
( булево ): для после / до того, должно ли совпадать точное значение или нет. -
compare
( строка ): оператор, который вы используете для сравнения данных в базе данных с вашими аргументами. Возможные значения:'='
,'!='
,'>'
,'>='
,'<'
,'<='
,'LIKE'
,'NOT LIKE'
,'IN'
,'NOT IN'
,'BETWEEN'
,'NOT BETWEEN'
,'EXISTS'
и'NOT EXISTS'
. -
column
( строка ): столбец базы данных для запроса: по умолчанию'post_date'
. -
relation
( строка ):OR
илиAND
, как следует сравнивать подмассивы. По умолчанию используетсяAND
.
Параметр date_query
отформатирован так:
1
2
3
4
5
6
7
|
$args = array(
‘date_query’ => array(
array(
// Arguments go here.
)
)
);
|
Вы также можете создать несколько массивов и определить, как они будут сравниваться с помощью параметра отношения. В приведенном ниже примере будут возвращаться запросы, соответствующие аргументам в обоих массивах:
01
02
03
04
05
06
07
08
09
10
11
|
$args = array(
‘date_query’ => array(
‘relation’ => ‘AND’,
array(
// Arguments go here.
),
array(
// Arguments go here.
)
)
);
|
Хотя приведенный ниже код будет извлекать сообщения, соответствующие аргументам в любом массиве (или в обоих):
01
02
03
04
05
06
07
08
09
10
11
|
$args = array(
‘date_query’ => array(
‘relation’ => ‘OR’,
array(
// Arguments go here.
),
array(
// Arguments go here.
)
)
);
|
Давайте проиллюстрируем это на примере. Допустим, вы работаете над сайтом колледжа и хотите отображать сообщения этого учебного года. Учебный год длится с 1 сентября 2014 года по 31 августа 2015 года, поэтому вам нужно будет найти посты в соответствующие месяцы и годы:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$args = array(
‘date_query’ => array(
‘relation’ => ‘OR’,
array(
‘year’ => ‘2014’,
‘month’ => ( ‘9, 10, 11, 12’ )
),
array(
‘year’ => ‘2015’,
‘month’ => ( ‘1, 2, 3, 4, 5, 6, 7, 8’ )
)
)
);
|
Обратите внимание, что параметр month
принимает в качестве аргументов строку, а не массив.
Параметры до и после
Альтернативой приведенному выше примеру является определение дат до и / или после которых вы хотите отображать сообщения, используя параметры before
и after
. Они принимают три аргумента:
-
year
( строка ): принимает любой четырехзначный год: по умолчанию пуст. -
month
( строка ): месяц года (от1
до12
). По умолчанию12
. -
day
( строка ): день месяца (от1
до31
). По умолчанию это последний день месяца.
Вы также можете использовать строку для даты, если она совместима с форматом php strtotime
.
Итак, возвращаясь к моему примеру отображения постов в этом учебном году, у меня есть еще два варианта. Во-первых, я мог бы использовать вложенный массив с параметрами year и month:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
$args = array(
‘date_query’ => array(
‘relation’ => ‘AND’,
array(
‘after’ => array(
‘year’ => ‘2014’,
‘month’ => ‘9’
),
‘inclusive’ => true
),
array(
‘before’ => array(
‘year’ => ‘2015’,
‘month’ => ‘8’
),
‘inclusive’ => true
)
)
);
|
Здесь следует отметить пару вещей:
- Я использовал
'relation' => 'AND'
потому что сообщения должны быть опубликованы после моей даты начала и до моей даты окончания. - Для каждого из вложенных массивов я использовал
'inclusive' => true
чтобы WordPress выбирал публикации, опубликованные в сентябре 2014 года и августе 2015 года.
Я также мог бы написать этот запрос, используя строку для дат:
1
2
3
4
5
6
7
8
9
|
$args = array(
‘date_query’ => array(
array(
‘after’ => ‘August 31st, 2014’,
‘before’ => ‘September 1st, 2015’,
‘inclusive’ => false,
)
)
);
|
Обратите внимание, что из-за того, как работают строки даты, более надежно использовать эксклюзивные даты. Это потому, что если вы используете строку даты, она будет преобразована в 00:00 в эту дату. Поэтому, чтобы это работало, либо используйте время в вашей строке, либо делайте так, как я, и используйте день до даты, когда вы хотите показывать сообщения (и после даты, когда вы хотите показывать сообщения до).
Что-то еще, что вы можете сделать с параметрами даты, это просмотреть опубликованные сегодня публикации. Возвращаясь к своему сайту событий, скажем, я хочу разместить большой баннер на моей домашней странице в день, когда происходит событие. Я могу написать запрос для этого, а затем вывести подробности о событии, если оно найдено. Вот аргументы:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘date_query’ => array(
array(
‘year’ => date( ‘Y’ ),
‘month’ => date( ‘M’ ),
‘day’ => date( ‘D’ )
)
)
);
|
Использование функции date()
возвращает текущую дату — я использовал это три раза, чтобы убедиться, что я получил правильный день, месяц и год. Обратите внимание, что я также включил аргумент post_status
чтобы обеспечить post_status
события, происходящего позже сегодня.
Резюме
Иногда вы не просто хотите запросить все опубликованные сообщения. Используя класс WP_Query
вы можете создавать гораздо более конкретные запросы для вывода сообщений по дате, включая публикации, которые вы опубликовали в определенную дату, до даты, после даты или между парой дат.
Аргументы date_query
объединяются с другими параметрами, такими как post_status
, который более подробно рассматривается в других разделах этой серии.