Как искать события между двумя заданными датами в WordPress?

28 нояб. 2011 г., 05:09:09
Просмотры: 33.5K
Голосов: 4

Я создаю сайт на WordPress с функционалом событий. Страница событий была создана с использованием пользовательских типов записей (custom post types).

Я хочу дать людям возможность искать/фильтровать события по датам. Например, они могут искать все события, происходящие между 2 декабря 2011 года и 1 марта 2012 года, и получать результаты событий, даты которых находятся между месяцами декабрь и март (то есть декабрь, январь, февраль и март).

Я хочу узнать лучший способ реализации этого. Есть какие-нибудь идеи?

Вы можете увидеть пример того, чего я хочу достичь, посмотрев функцию "Search events by date" на этой странице http://www.londontown.com/events

Если это невозможно, есть ли способ позволить им искать события, происходящие между определенными месяцами, например, между декабрем и февралем (исключая дни)?

Заранее спасибо.

0
Все ответы на вопрос 2
2
11

Для реализации этого потребуется выполнить два действия:

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);
28 нояб. 2011 г. 05:50:33
Комментарии

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

Sosthenes Kwame Boame Sosthenes Kwame Boame
29 нояб. 2011 г. 04:13:44

Кажется, я близок к решению. Вот что у меня сейчас в файле 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 Но результаты по-прежнему не отображаются. Есть идеи, что может мешать показу записей? Спасибо.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 дек. 2011 г. 17:47:40
3

Как вы храните дату события: используя стандартное поле 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();
28 нояб. 2011 г. 05:43:14
Комментарии

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

tollmanz tollmanz
28 нояб. 2011 г. 05:52:06

@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 Тем не менее, результаты не возвращаются. Есть идеи, что может мешать отображению записей? Спасибо.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 дек. 2011 г. 17:48:40

вы жестко закодировали значения дат. как сделать это динамически, безопасным способом?

ahnbizcad ahnbizcad
10 сент. 2015 г. 10:44:30