Как искать события между двумя заданными датами в WordPress?
Я создаю сайт на WordPress с функционалом событий. Страница событий была создана с использованием пользовательских типов записей (custom post types).
Я хочу дать людям возможность искать/фильтровать события по датам. Например, они могут искать все события, происходящие между 2 декабря 2011 года и 1 марта 2012 года, и получать результаты событий, даты которых находятся между месяцами декабрь и март (то есть декабрь, январь, февраль и март).
Я хочу узнать лучший способ реализации этого. Есть какие-нибудь идеи?
Вы можете увидеть пример того, чего я хочу достичь, посмотрев функцию "Search events by date" на этой странице http://www.londontown.com/events
Если это невозможно, есть ли способ позволить им искать события, происходящие между определенными месяцами, например, между декабрем и февралем (исключая дни)?
Заранее спасибо.
Для реализации этого потребуется выполнить два действия:
1) Создать метаданные для каждого события
2) Запросить записи с использованием meta_query
Для пункта #1 необходимо добавить метабокс, позволяющий пользователю указывать дату события. Эти данные должны сохраняться как метаданные с помощью функций add_post_meta
или update_post_meta
. Рекомендую изучить документацию по добавлению метаданных, если вы с этим не знакомы:
http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/
Для пункта #2, предполагая что значения дат сохранены в сортируемом формате (например, ГГГГ-ММ-ДД), вы можете использовать параметр meta_query в новом экземпляре WP_Query для получения нужного диапазона дат. Этот метод предполагает, что ваш meta_key имеет значение "_my-datetime-from". Например, вот как можно получить записи за октябрь и ноябрь 2011 года:
// Устанавливаем аргументы для событий
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
'post_type' => 'my-event-type',
'posts_per_page' => -1,
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_key' => '_my-datetime-from',
'meta_query' => array(
array(
'key' => '_my-datetime-from',
'value' => array($start, $end),
'compare' => 'BETWEEN',
'type' => 'DATE'
)
)
);
// Выполняем запрос
$events_query = new WP_query();
$events_query->query($args);

Хорошо. Понял. Но как мне добавить это в форму поиска, чтобы не приходилось вручную вводить даты в код? Это должно быть интегрировано в форму поиска, чтобы пользователи могли получать события, выбирая даты. Спасибо.

Кажется, я близок к решению. Вот что у меня сейчас в файле search.php: http://www.pastebin.com/zMRwRihz, а вот что в форме поиска: http://www.pastebin.com/nZePhPHV. Я использую jQuery UI Datepicker для выбора дат во фронтенде (поле ввода даты для поиска). Вот что я получаю в URL после отправки поиска: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Но результаты по-прежнему не отображаются. Есть идеи, что может мешать показу записей? Спасибо.

Как вы храните дату события: используя стандартное поле post_date
записи или пользовательское мета-поле?
Если вы используете стандартное поле post_date
, вы можете применить фильтр posts_where
для добавления условий поиска, например:
// Создаем новую фильтрующую функцию, которая добавит условие WHERE к запросу
function filter_where( $where = '' ) {
// записи с 1 по 15 марта 2010 года
$where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );
Больше примеров можно найти в Кодексе.
Если используется пользовательское поле, вероятно, придется писать собственные SQL-запросы. Это немного сложнее. Вот пример:
global $wpdb;
$post_ids = $wpdb->get_col( "
SELECT ID FROM {$wpdb->posts}
JOIN {$wpdb->postmeta}
WHERE ID=post_id
AND meta_key='your_custom_meta_key'
AND meta_value >= '2010-03-01'
AND meta_value < '2010-03-16'
" );
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
// Делаем что-то с записью
}
wp_reset_postdata();

Вам не обязательно использовать пользовательский запрос для этого. Можно просто использовать "meta_query".

@rilwis Хорошо, кажется, я близок к решению. Сейчас у меня в файле search.php вот это: http://www.pastebin.com/zMRwRihz а это в моей форме поиска: http://www.pastebin.com/nZePhPHV Я использую jquery ui datepicker для выбора дат во фронтенде (поле ввода для поиска по дате). Вот что я получаю в URL после отправки поиска: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Тем не менее, результаты не возвращаются. Есть идеи, что может мешать отображению записей? Спасибо.
