Работать с датами в запросах WordPress — не самое простое дело, но в WordPress версии 3.7 появится новый класс WP_Date_Query
. Он уже поддерживается классами WP_Query
и WP_Comment_Query
, что позволяет работать с комплексными датами при запросе записей и комментариев в WordPress.
Работа с простыми датами в WordPress
С простыми датами в WordPress можно было ещё давно. Класс WP_Query
поддерживает аргументы: year
, monthnum
, day
, hour
и другие. Это позволяет нам искать записи с определённой датой публикации, например:
Получить записи опубликованные в 2013 году:
$query = new WP_Query( array( 'year' => 2013, ) );
Все записи опубликованные 10 сентября 2013 года:
$query = new WP_Query( array( 'year' => 2013, 'monthnum' => 9, 'day' => 10, ) );
Или получить записи опубликованные первого числа каждого месяца 2012 года:
$query = new WP_Query( array( 'year' => 2012, 'day' => 1, ) );
Эти аргументы уже давно не новшество в WordPress, но их гибкость оставляет желать лучшего. Например, получить все записи за последние 14 дней, все записи от 1-31 июля 2012 года, все записи с понедельника по пятницу за последние два месяца и т.д. — всё это невозможно реализовать без использования таких вещей, как например фильтр posts_where
, который позволяет изменять непосредственно SQL запрос.
К счастью в WordPress 3.7 появилась возможность составлять комплексные запросы с датами с помощью нового аргумента date_query
.
Работа с датами с помощью date_query
Аргумент date_query
реализован классом WP_Date_Query
и поддерживается для запросов с помощью WP_Query
и WP_Comment_Query
. Сам аргумент — многомерный массив с поддержкой немалого количества элементов:
column
— используемое поле в базе данных для запроса, по умолчанию используетсяpost_date
compare
— каким оператором стоит производить сравнение, например=
,>=
,BETWEEN
и т.д.relation
— какой оператор будет использован при указании более одного массива с датами,AND
(по умолчанию) илиOR
Далее в этом массиве указывается один или несколько элементов, которые указывают уже на какой-либо конкретный запрос даты. Каждый подобный элемент является так же многомерным массивом с несколькими возможными элементами:
column
— см. выше, только для конкретной датыcompare
— см. выше, только для конкретной датыbefore
— строка или массив с датой «до»after
— строка или массив с датой «после»inclusive
— аргументыbefore
иafter
обрабатываются включительно, еслиtrue
year
— год, например 2013month
— месяц, 1-12week
— неделя, 0-53day
— день, 1-31dayofweek
— день недели, 1-7hour
— час, 0-23minute
— минута, 0-60second
— секунда, 0-60
Подобных массивов может быть несколько для более комплексных запросов.
Примеры
Все записи опубликованные 10 сентября 2013 года:
$query = new WP_Query( array( 'date_query' => array( array( 'year' => 2013, 'month' => 9, 'day' => 10, ), ), ) );
Все записи опубликованные с 1-10 сентября 2013 года:
$query = new WP_Query( array( 'date_query' => array( array( 'year' => 2013, 'month' => 9, 'day' => 10, 'compare' => '<=', ), array( 'year' => 2013, 'month' => 9, 'day' => 1, 'compare' => '>=', ), ), ) );
Или в более простой форме с использованием аргументов before
и after
:
$query = new WP_Query( array( 'date_query' => array( before => array( 'year' => 2013, 'month' => 9, 'day' => 10 ), after => array( 'year' => 2013, 'month' => 9, 'day' => 1 ), inclusive => true, // включительно ), ) );
Так же стоит отметить, что аргументы before и after обрабатываются функцией PHP strtotime()
, поэтому можно указывать даты строками, что гораздо удобнее читать:
$query = new WP_Query( array( 'date_query' => array( before => 'September 10th, 2013', after => 'September 1st, 2013', inclusive => true, ), ) );
Эта же функция умеет обрабатывать и относительные даты, например так мы можем получить записи за последние две недели:
$query = new WP_Query( array( 'date_query' => array( after => '2 weeks ago', ), ) );
Или все записи за последние два месяца, опубликованные в будние дни
$query = new WP_Query( array( 'date_query' => array( after => '2 months ago', array( 'dayofweek' => array( 1, 5 ), 'compare' => 'BETWEEN', ), ), ) );
Новый аргумент date_query
поддерживается и другими функциями, использующие класс WP_Query
, например get_posts()
и query_posts()
, а так же функциями, которые работают с классом WP_Comment_Query
, как например get_comments()
.
Стоит так же отметить, что простые аргументы (year
, month
и т.д.) продолжают поддерживаться в новых версиях WordPress, но они являются лишь синонимами к новому аргументу date_query
.
Ещё раз напоминаем, что новый аргумент date_query
доступен только в WordPress версии 3.7 или выше. Если у вас есть вопросы по новому подходу при работе с датами — оставьте комментарий или напишите нам в Twitter — мы с радостью вам поможем.