До версии движка 3.7, WP_Query имел весьма скудные параметры для получения постов по датам, ну правда ещё была небольшая хитрость, которая позволяла вывести посты, опубликованные в определенный промежуток времени.
Версия WordPress 3.7 принесла нам потрясающий date_query
, по сути это аналог meta_query и tax_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 );
Вот тут определенно есть, где разгуляться. И начну я с простого примера — как выводить скажем посты, опубликованные с понедельника по пятницу, или наоборот, в выходные.
$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
— он всё равно работать не будет, тем не менее ваша задача реализуема, вам лишь понадобится несколько условий, о них — в следующем примере.
Окей, теперь давайте помимо условия выборки постов, опубликованных в будни, поставим также условие, чтобы эти посты были опубликованы в определенный промежуток времени.
Вы наверное уже заметили, что 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
.
Задать промежуток между скажем 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
.
Что это значит?
Хорошо, давайте для начала выведем записи, опубликованные более двух лет назад (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 );
compare
равен BETWEEN
).before
и after
, нужно ли включать конечные даты в промежуток. Логическое значениеpost_date
, по умолчанию), но и с датой публикацией по GMT (post_date_gmt
), а также и с датой последнего обновления поста (post_modified
, post_modified_gmt
).AND
(И — все условия должны выполняться), OR
(ИЛИ — достаточно, чтобы хотя бы одно условие выполнялось).
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.