Работать с датами в запросах 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— год, например 2013
- month— месяц, 1-12
- week— неделя, 0-53
- day— день, 1-31
- dayofweek— день недели, 1-7
- hour— час, 0-23
- minute— минута, 0-60
- second— секунда, 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 — мы с радостью вам поможем.



