Работать с датами в запросах 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_datecompare— каким оператором стоит производить сравнение, например=,>=,BETWEENи т.д.relation— какой оператор будет использован при указании более одного массива с датами,AND(по умолчанию) илиOR
Далее в этом массиве указывается один или несколько элементов, которые указывают уже на какой-либо конкретный запрос даты. Каждый подобный элемент является так же многомерным массивом с несколькими возможными элементами:
column— см. выше, только для конкретной датыcompare— см. выше, только для конкретной датыbefore— строка или массив с датой «до»after— строка или массив с датой «после»inclusive— аргументыbeforeиafterобрабатываются включительно, еслиtrueyear— год, например 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 — мы с радостью вам поможем.



