В серии статей, посвященных изучению класса WP_Query, вы узнаете о том, как использовать WP_Query для создания пользовательских запросов к файлам ваших тем или плагинов.

В этом уроке мы рассмотрим аргументы, необходимые для создания простых и сложных запросов с целью получения данных, относящихся к тому или иному периоду времени. С помощью этих аргументов вы сможете выводить записи, опубликованные до, после или между указанными датами.

Мы подробно поговорим о параметрах даты и о том, как их использовать при написании запроса.

Параметры даты

Параметры даты можно использовать для поиска записей по указанной дате публикации. При этом временной диапазон запрашиваемых данных вы регулируете самостоятельно, к примеру, поиск данных по годам и месяцам позволит в результате получить не одну, а ряд записей.

Здесь можно использовать как простые аргументы, так и параметр date_query для создания вложенных массивов и соответственно более сложных запросов. Начнем с более простых аргументов.

Простые параметры даты

  • year (число): четыре цифры года (напр. 2015).
  • monthnum (число): номер месяца (от 1 до 12).
  • w (число): неделя в году (от 0 до 53) – зависит от опции “start_of_week”, данные которой можно изменить на странице «Настройки» в админ-панели.
  • day (число): день месяца (от 1 до 31).
  • hour (число): час (от 0 до 23).
  • minute (число): минута (от 0 до 60).
  • second (число): секунда (от 0 до 60).
  • m (число): ГодМесяц (напр. 201502).

Предположим, ваш сайт использует дату публикации каждого события в качестве даты начала этого события. Для того чтобы вывести все события, прошлые и будущие за 2015 год, нам понадобятся следующие аргументы:

$args = array(
    'post_type' => 'event',
    'post_status' => array(
        'future',
        'publish'
    ),
    'year' => '2015'
);

Обратите внимание, что для статуса записи мы использовали аргументы future и publish, поскольку записи, относящиеся к будущему, по умолчанию не запрашиваются.

Если вы хотите, чтобы события за текущий год выводились автоматически, не обновляя при этом запрос для каждого года, можно включить сначала поиск за текущий год, а затем передать эти данные в аргументы запроса:

$current_year = the_date( ‘Y’ );
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘year’ => $current_year
);

Сложные аргументы даты

Для создания более сложных запросов с применением нескольких параметров вам понадобится аргумент date_query. В таких запросах можно использовать гораздо больше параметров:

  • year (число): четыре цифры года (напр. 2015).
  • monthnum (число): номер месяца (от 1 до 12).
  • w (число): неделя в году (от 0 до 53) – зависит от опции “start_of_week”, данные которой можно изменить на странице «Настройки» в админ-панели.
  • day (число): день месяца (от 1 до 31).
  • hour (число): час (от 0 до 23).
  • minute (число): минута (от 0 до 59).
  • second (число): секунда (от 0 до 59).
  • after (строка/массив): строка или массив с датой «после».
  • before (строка/массив): строка или массив с датой «до».
  • inclusive: (логический): для аргументов before/after, включать указанную дату или нет.
  • compare (строка): оператор для сравнения данных в базе данных с вашими аргументами. Возможные значения: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’,’LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’,’EXISTS’, и ‘NOT EXISTS’.
  • column (строка): столбец в базе данных для запроса. По умолчанию – ‘post_date’.
  • relation (строка): OR или AND, для сравнения подмассивов. По умолчанию – AND.

Параметр date_query имеет следующий формат:

$args = array(
    'date_query' => array(
        array(
            // Аргументы запроса.        
        )
    )
);

Можно также создавать несколько массивов и определять способ их сравнения с помощью параметра relation. В примере, приведенном ниже, мы возвращаем данные, которые совпадают со значениями обоих массивов:

$args = array(
'date_query' =&gt; array(
'relation' =&gt; 'AND',
array(
// Аргументы запроса.
),
array(
// Аргументы запроса.
)
)
);

А еще ниже мы получаем записи, совпадающие со значениями любого из массивов (или с обоими):

$args = array(
    'date_query' => array(
        'relation' => 'OR',
        array(
            // Аргументы запроса.
        ),
        array(
            // Аргументы запроса.
        )
    )
);

Давайте рассмотрим тоже самое, но на реальном примере. Предположим, вы работаете с сайтом некого колледжа и хотите вывести записи за текущий академический год. Академический год длится с 1 сентября 2014 до 31 августа 2015, таким образом вам нужно найти записи за соответствующие месяцы и годы:

$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

В качестве альтернативы выше приведенному фрагменту можно определять даты до и/или после которых, будут выводиться записи. В этом случае используются параметры before и after. Здесь есть три аргумента:

  • year (строка): четыре цифры года. По умолчанию – пустой.
  • month (строка): месяц года (от 1 до 12). По умолчанию – 12.
  • day (строка): день месяца (от 1 до 31). По умолчанию – последний день месяца.

Для указания даты можно использовать строку, поскольку такой вариант совместим с PHP форматом strtotime.

Но вернемся к нашему примеру с выводом записей за текущий академический год. У нас появилось еще две опции. Во-первых, мы могли бы использовать вложенный массив с параметрами year и month:

$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.Во-вторых, мы могли бы в этом запросе задать даты в виде строки:
    $args = array(
        'date_query' => array(
            array(
                'after' => 'August 31st, 2014',
                'before' => 'September 1st, 2015',
                'inclusive' => false,
            )
        )
    );
    

    Обратите внимание, что при использовании строки с датами, надежнее указывать исключающие даты. Если вы пишите даты в строке, то при конвертации будет учитываться время с 00:00 этого дня. Поэтому, для корректного выполнения запроса нужно либо в строке указывать точное время, либо дату за день до нужного вам времени (и дату после которой, записи уже запрашиваться не будут).

    Параметры даты можно использовать и для того, чтобы вывести записи, опубликованные сегодня. Вернемся снова к примеру, где мы выводили записи, касающиеся определенных событий. Предположим, я хочу, чтобы на главной странице сайта в день события отображался большой баннер мероприятия. Для этого мы напишем запрос и если в результате запроса соответствующее событие будет найдено, мы выведем его детали. Ниже приведены необходимые аргументы:

    $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 для того, чтобы включить в запрос и событие, которое произойдет в этот же день позже.

    Заключение

    Бывают ситуации, когда все опубликованные записи вам не нужны. С помощью класса WP_Queryможно создавать более точные запросы для вывода записей по дате, в том числе по указанной дате, до этой даты, после нее или между несколькими датами.
    Аргументdate_query необходимо использовать с другими параметрами, к примеру, с параметром post_status.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.