Параметры WP_query для диапазона дат
Я использую плагин 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
в базе данных.
Однако я предполагаю, что есть какой-то простой способ обратиться к датам событий, потому что дата, автоматически отображаемая на главной странице, является не датой публикации записи, а датой начала события, без каких-либо модификаций.

Скопировано с 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
поддерживает эти запросы по дате.

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

Похоже, вам нужен 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

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

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

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

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

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

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

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

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

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

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

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