Как мне искать события между двумя установленными датами внутри WP?
Я создаю WP-сайт с функцией событий. Страница событий была создана с использованием пользовательских типов записей.
Я хочу, чтобы люди могли искать/фильтровать события по датам. Например, они могут искать все события, происходящие в период со 2 декабря 2011 года по 1 марта 2012 года, и получать результаты событий, даты которых находятся в промежутке между декабрем и мартом (т. е. декабрь, январь, февраль и март).
Я хочу знать, как лучше всего поступить этот. Есть какие-нибудь идеи?
Вы можете увидеть пример того, чего я хочу достичь, посмотрев на функцию "Поиск событий по дате" на этой странице http://www.londontown.com/events
Если это невозможно, могу ли я каким-либо образом заставить их искать события, происходящие между определенными месяцами, скажем, декабрем и февралем (исключая дни)?
Заранее благодарю.
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);
Как вы сохраняете дату события: используя поле по умолчанию 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();