Как мне искать события между двумя установленными датами внутри WP?


Я создаю WP-сайт с функцией событий. Страница событий была создана с использованием пользовательских типов записей.

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

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

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

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

Заранее благодарю.

Author: Sosthenes Kwame Boame, 2011-11-28

2 answers

Для этого вам нужно сделать две вещи:

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, чтобы получить соответствующий диапазон дат. Этот метод предполагает, что ваш мета_кей "_my-дата-время-от". Например, вы можете получить сообщения в октябре и ноябре 2011 года с помощью следующее:

// Set arguments for events
$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'
        )
    )
);
// Make the query
$events_query = new WP_query();
$events_query->query($args);
 11
Author: tollmanz, 2011-11-28 03:50:33

Как вы сохраняете дату события: используя поле по умолчанию post_date публикации или пользовательское мета-поле?

Если вы используете значение по умолчанию post_date, вы можете использовать фильтр posts_where, чтобы добавить условия для поиска, например:

// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
    // posts for March 1 to March 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' );

Для получения дополнительных примеров, пожалуйста, ознакомьтесь с Кодексом .

В случае использования пользовательского поля, я думаю, вам придется писать свои собственные пользовательские запросы MySQL. Это немного сложнее. Вот пример:

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 );
    // Do something
}
wp_reset_postdata();
 2
Author: Anh Tran, 2011-11-28 03:43:14