Параметры WP_query для диапазона дат

7 июн. 2013 г., 21:26:17
Просмотры: 25.2K
Голосов: 6

Я использую плагин events manager для создания пользовательских записей событий. Мне не нужен блог, поэтому я модифицировал файл index.php моей темы (используя дочернюю тему), чтобы его запрос получал записи типа "event" на главной странице.

new WP_Query ( array( 'paged' => $paged, 'post_type' => 'event', 'posts_per_page' => 4 ) (Я включил только тип записи 'event').

Пока всё хорошо. Но он отображает текущие, прошедшие и будущие события на главной странице. Я хочу, чтобы отображались только текущие и будущие события (то есть, я хочу, чтобы события, которые еще не начались, также отображались на главной странице. Я хочу только предотвратить отображение прошедших событий). Я просмотрел страницу документации WP_Query и использовал следующий фрагмент кода:

// Создаем новую функцию фильтрации, которая добавит наше условие where к запросу
function filter_where( $where = '' ) {
    // записи с 1 по 15 марта 2010
    $where .= " AND post_date <  CURDATE() ";
    return $where;
}

add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' )

Это не дает желаемого результата, потому что дата события не хранится в поле post_date в базе данных.

Однако я предполагаю, что есть какой-то простой способ обратиться к датам событий, потому что дата, автоматически отображаемая на главной странице, является не датой публикации записи, а датой начала события, без каких-либо модификаций.

2
Комментарии

предположительно, данные хранятся в пост-мета, используйте get_post_custom для просмотра всей метаинформации, связанной с событием, и meta query для запроса по ключу даты.

Milo Milo
7 июн. 2013 г. 21:35:38

@Milo да, но я не знаю, как это анализировать. Вот вывод: http://pastebin.com/3er1WBMv

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 21:38:03
Все ответы на вопрос 2
2
12

Скопировано с StackOverflow:

WP_Query предоставляет параметр date_query, позволяющий задать диапазон с помощью before и after.

https://developer.wordpress.org/reference/classes/wp_query/#date-parameters

$args = array(
    'date_query' => array(
        array(
            'after'     => '1 января 2015',
            'before'    => '31 декабря 2015',
            'inclusive' => true,
        ),
    ),
);
$query = new WP_Query( $args );

Подробности смотрите в прикрепленной документации.

Обратите внимание, что другой ответ, использующий запрос к postmeta, устарел - сейчас никто не должен так делать, учитывая что WP_Query поддерживает эти запросы по дате.

23 апр. 2019 г. 22:34:38
Комментарии

Можете, пожалуйста, добавить версию WP, в которой была добавлена эта поддержка?

That Brazilian Guy That Brazilian Guy
23 апр. 2019 г. 23:43:49

Как указано в статье Codex, на которую я ссылался: date_query (array) - Параметры даты (доступно начиная с версии 3.7). Так что это действительно древняя функция, определённо безопасная для использования :)

jerclarke jerclarke
23 апр. 2019 г. 23:59:08
15

Похоже, вам нужен meta_query.

$query = new WP_Query ( 
  array( 
    'paged' => $paged, 
    'post_type' => 'event', 
    'posts_per_page' => 4,
    'meta_query' => array(
      array(
        'key' => 'date_key_name', // Ключ метаполя с датой
        'value' => date('Y-m-d'),   // Текущая дата для сравнения
        'compare' => '>=',          // Выбираем записи с датой >= текущей
      )
    )
  )
);

Убедитесь, что ваши даты представлены в формате, который может корректно обработать машина.

Ссылки

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

7 июн. 2013 г. 21:42:00
Комментарии

Произвольное поле хранится в формате YYYY-MM-DD. Я пробовал сравнивать, используя meta_key + meta_value, meta_query + key + value, операторы '=' и 'LIKE'. Ничто не сработало. Даже при вставке конкретной даты события.

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 08:08:19

Ты пробовал код, который я опубликовал?

s_ha_dum s_ha_dum
8 июн. 2013 г. 15:18:32

Ну, нет, потому что твой код ожидает даты в формате Unix time, я предположил (ошибочно?). Попробую сейчас.

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 21:39:23

Формат YYYY-MM-DD, с разделителями или без, будет сортироваться численно. Это единственный человекочитаемый формат даты, который сортируется численно так же, как и в календарном порядке. Я предпочитаю использовать UNIXTIME или колонки типа DATE/DATETIME, но считаю, что этот формат тоже подойдет.

s_ha_dum s_ha_dum
8 июн. 2013 г. 21:44:14

Что мне указать в качестве значений $date1 и $date2? Мне нужно проверить, прошла ли уже дата окончания события, поэтому я должен сравнить сегодняшнюю дату и дату окончания события. Но как мне получить дату окончания события, чтобы установить ее в качестве одной из переменных?

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 22:25:33

@ruda.almeida вам нужна связь OR между ключами start и end - либо дата начала равна или больше сегодняшней даты, либо дата окончания равна или больше сегодняшней даты.

Milo Milo
8 июн. 2013 г. 22:33:49

@Milo нет, я хочу, чтобы события, которые еще не начались, также отображались на главной странице. Я только хочу предотвратить показ прошедших событий.

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 22:36:05

@ruda.almeida да, это то, что я сказал - либо дата начала в будущем, ЛИБО дата окончания в будущем.

Milo Milo
8 июн. 2013 г. 22:52:45

@ruda.almeida : смотрите правку. Не могу сейчас.

s_ha_dum s_ha_dum
8 июн. 2013 г. 22:59:10

@Milo если конечная дата в будущем, полагаю, я могу проигнорировать начальную дату.

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 23:05:08

@ruda.almeida ага, верно, не подумал об этом! хотя если нужно сортировать по начальной дате, этот ключ должен быть частью запроса.

Milo Milo
8 июн. 2013 г. 23:07:36

@Milo ага, верно, не подумал об этом! ;-)

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 23:12:56

@s_ha_dum Это правка — код, который я сам пробовал, когда читал кодекс о meta_query. Тогда не сработало, я скопировал ваш код (заменив "date_key_name" на "event_end_date", очевидно, имя пользовательского поля). Не сработало. Думаю, я что-то делаю не так =/

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 23:14:26

Имя поля в базе данных — "_event_end_date", я думал, что нужно убрать первый символ "_", но оказывается, работает, если оставить его.

That Brazilian Guy That Brazilian Guy
8 июн. 2013 г. 23:17:16

Этот первый символ подчёркивания предотвращает отображение полей в выпадающем списке "Custom Meta".

s_ha_dum s_ha_dum
9 июн. 2013 г. 01:44:58
Показать остальные 10 комментариев