Статьи

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