Параметры 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, в которой была добавлена эта поддержка?
That Brazilian Guy
Похоже, вам нужен 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'. Ничто не сработало. Даже при вставке конкретной даты события.
That Brazilian Guy
Ну, нет, потому что твой код ожидает даты в формате Unix time, я предположил (ошибочно?). Попробую сейчас.
That Brazilian Guy
Формат YYYY-MM-DD, с разделителями или без, будет сортироваться численно. Это единственный человекочитаемый формат даты, который сортируется численно так же, как и в календарном порядке. Я предпочитаю использовать UNIXTIME или колонки типа DATE/DATETIME, но считаю, что этот формат тоже подойдет.
s_ha_dum
Что мне указать в качестве значений $date1 и $date2? Мне нужно проверить, прошла ли уже дата окончания события, поэтому я должен сравнить сегодняшнюю дату и дату окончания события. Но как мне получить дату окончания события, чтобы установить ее в качестве одной из переменных?
That Brazilian Guy
@ruda.almeida вам нужна связь OR между ключами start и end - либо дата начала равна или больше сегодняшней даты, либо дата окончания равна или больше сегодняшней даты.
Milo
@Milo нет, я хочу, чтобы события, которые еще не начались, также отображались на главной странице. Я только хочу предотвратить показ прошедших событий.
That Brazilian Guy
@ruda.almeida да, это то, что я сказал - либо дата начала в будущем, ЛИБО дата окончания в будущем.
Milo
@Milo если конечная дата в будущем, полагаю, я могу проигнорировать начальную дату.
That Brazilian Guy
@ruda.almeida ага, верно, не подумал об этом! хотя если нужно сортировать по начальной дате, этот ключ должен быть частью запроса.
Milo
@s_ha_dum Это правка — код, который я сам пробовал, когда читал кодекс о meta_query. Тогда не сработало, я скопировал ваш код (заменив "date_key_name" на "event_end_date", очевидно, имя пользовательского поля). Не сработало. Думаю, я что-то делаю не так =/
That Brazilian Guy
Имя поля в базе данных — "_event_end_date", я думал, что нужно убрать первый символ "_", но оказывается, работает, если оставить его.
That Brazilian Guy