ГлавнаяРазноеРабота с датами в WordPress с помощью WP_Date_Query

Работа с датами в WordPress с помощью WP_Date_Query

Работать с датами в запросах 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 — мы с радостью вам поможем.

Константин Ковшенин

Сооснователь журнала WP Magazine и первой конференции WordCamp в России. Работал в Automattic, WordPress.com, WooCommerce. Принимает активное участие в развитии ядра WordPress. Любимый язык программирования: Python.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!