До версии движка 3.7, WP_Query имел весьма скудные параметры для получения постов по датам, ну правда ещё была небольшая хитрость, которая позволяла вывести посты, опубликованные в определенный промежуток времени.
Версия WordPress 3.7 принесла нам потрясающий date_query
, по сути это аналог meta_query и tax_query, но только для дат, который полностью развязывает нам руки в отношении фильтрации постов по дате/времени.
1. Заменяем старые параметры даты на date_query.
Так же, как и раньше, вы можете выводить посты, опубликованные в определенный год, месяц, день, час, минуту и так далее. Кроме того, старый вариант задания даты никуда не делся, вы спокойно можете использовать и его:
$params = array( 'year' => 2014, // год 'monthnum' => 12, // номер месяца, декабрь 'day' => 31 // число ); $dateq = new WP_Query( $params ); |
Но можете и перейти на новый формат задания даты через date_query
:
$params = array( 'date_query' => array( array( 'year' => 2014, 'month' => 12, // обратите внимание, раньше было monthnum, теперь просто month 'day' => 31, ), ), ); $dateq = new WP_Query( $params ); |
2. Вывод постов за определенный промежуток времени.
Пример 1. Посты по дням недели.
Вот тут определенно есть, где разгуляться. И начну я с простого примера — как выводить скажем посты, опубликованные с понедельника по пятницу, или наоборот, в выходные.
$params = array( 'date_query' => array( array( 'dayofweek' => array( 1, 5 ), // дни недели, 1 - понедельник, 5 - пятница 'compare' => 'BETWEEN' ) ) ); $dateq = new WP_Query( $params ); |
Параметр compare
, равный BETWEEN
означает, что нужно взять промежуток между, в данном случае между понедельником и пятницей.
Также, если вы уберете BETWEEN
, а также замените значение параметра dayofweek
на числовое (от 1 до 7), то тогда у вас будут выводиться посты за какой-то определенный день недели.
Если вам нужно вывести посты за несколько не идущих друг за другом дней недели, то не надейтесь указать массив в dayofweek
— он всё равно работать не будет, тем не менее ваша задача реализуема, вам лишь понадобится несколько условий, о них — в следующем примере.
Пример 2. Посты по дням недели и по временному промежутку
Окей, теперь давайте помимо условия выборки постов, опубликованных в будни, поставим также условие, чтобы эти посты были опубликованы в определенный промежуток времени.
Вы наверное уже заметили, что date_query
это массив массивов, так вот, каждый массив внутри date_query
— это условие, и сейчас нам как раз потребуется задать несколько таких условий.
$params = array( 'date_query' => array( array( 'hour' => 8, // с 8 часов утра (24-часовой формат времени) 'compare' => '>=', // больше либо равно ), array( 'hour' => 16, 'compare' => '<=', // меньше либо равно ), array( 'dayofweek' => array( 1, 5 ), // дни недели, 1 - понедельник, 5 - пятница 'compare' => 'BETWEEN' ), 'relation' => 'AND' // этот параметр равен AND по умолчанию и поэтому его можно не указывать ) ); $dateq = new WP_Query( $params ); |
По умолчанию, WP_Query будет возвращать посты, удовлетворяющие каждому из заданных условий. Если вам достаточно, чтобы хотя бы одно условие выполнялось, добавьте в конец date_query
параметр relation
, равный OR
.
Пример 3. Посты между двумя датами
Задать промежуток между скажем 8 январем 2016 года и 20 мартом 2016 проще простого, при помощи параметров before
и after
.
$params = array( 'date_query' => array( array( 'after' => array( // после этой даты 'year' => 2016, 'month' => 1, 'day' => 8, ), 'before' => array( // до этой даты 'year' => 2016, 'month' => 3, 'day' => 20, ), // 'inclusive'=> true ) ) ); $dateq = new WP_Query( $params ); |
Обратите внимание, в примере выше посты по умолчанию будут выводиться только в промежутке между указанными датами, сами же указанные даты в этот промежуток не входят. Если же вы хотите включить их в промежуток, то добавьте в date_query
параметр inclusive
равный true
.
Параметры before
и after
также позволяют задавать время в таком формате 2015-02-17 23:59:59
.
Пример 4. Вывод постов, опубликованных столько-то времени спустя
Что это значит?
Хорошо, давайте для начала выведем записи, опубликованные более двух лет назад (before
):
$params = array( 'date_query' => array( array( 'before' => '2 year ago' // можете указать и множественное число - 1 years ago, 2 years ago ) ) ); $dateq = new WP_Query( $params ); |
Подойдут также значения параметров: 2 week ago
, 3 hours ago
, 1 minute ago
, 5 month ago
.
Теперь к условию добавим ещё одно — из выбранных постов нам нужно выбрать те, которые обновлялись за последние 3 дня (after
).
$params = array( 'date_query' => array( array( 'before' => '2 year ago', ), array( 'column' => 'post_modified', // фильтруем не по дате публикации, а по дате обновления поста 'after' => '3 day ago', ) ) ); $dateq = new WP_Query( $params ); |
Все параметры
- date_query
- (массив)
- year
- Год, 4х-значное целое число, например 2015.
- month
- Номер месяца (целое, от 1 до 12).
- week
- Номер недели года (целое число, от 0 до 53).
- day
- День месяца, число (целочисленное, от 1 до 31).
- hour
- Час (значение от 0 до 23).
- minute
- Минута (0 — 59).
- second
- Секунда (0 — 59).
- dayofweek
- День недели. Целое число от 1 до 7, либо массив при использовании в качестве промежутка (когда
compare
равенBETWEEN
). - after
- Когда нужно вывести посты, опубликованные после указанного в этом параметре времени.
- before
- Когда нужно вывести посты, опубликованные до указанного в этом параметре времени. Значение можно задать в виде массива или строки, смотрите примеры выше.
- inclusive
- Только для параметров
before
иafter
, нужно ли включать конечные даты в промежуток. Логическое значение - compare
- (строка) оператор сопоставления, возможные значения: ‘=’ (по умолчанию), ‘!=’, ‘>’, ‘>=’, ‘
- column
- Благодаря этому параметры вы можете работать не только с обычной датой публикации постов (
post_date
, по умолчанию), но и с датой публикацией по GMT (post_date_gmt
), а также и с датой последнего обновления поста (post_modified
,post_modified_gmt
). - relation
- Логическое соотношение между условиями, может принимать два значения —
AND
(И — все условия должны выполняться),OR
(ИЛИ — достаточно, чтобы хотя бы одно условие выполнялось).
Источник: misha.blog