All-in-One Event Calendar: Кастомный запрос - Получение каждого экземпляра события
Я использую плагин All-in-One Event Calendar от Timely и хочу отображать предстоящие события из календаря в виде карусели на отдельной странице. Мне нужно получить информацию о событиях.
Я использую помощники ai1ec и get_events_between для получения событий в определенном диапазоне дат (от сегодняшнего дня до года вперед). В массиве (из get_events_between, который я перебираю для получения ID постов) видно, что я получаю правильное количество событий (каждое из них - это объект).
Затем я использую WP query для отображения информации с помощью Ai1ec_Events_Helper. Я могу получить дату начала, время и т.д.
Код можно посмотреть здесь: http://pastebin.com/dhJjyw1y
Однако проблема в том, что хотя массив событий содержит 50+ событий, мой WP query возвращает только 7 - это 7 отдельных событий, которые я создал, с отображением оригинальной даты начала события (например, если событие началось 6 марта и повторяется раз в месяц, я получаю только одно событие с датой 6 марта). Ссылка на страницу с деталями события также ведет на оригинальную дату (параметр "?instance_id=" в URL пуст).
Кто-нибудь знает, как получить каждый экземпляр каждого события, чтобы отображать все 50+ событий?
Спасибо!
Дополнение:
Вот вывод, который я получаю из $get_events для первого объекта массива:
array(56) { [0]=> object(Ai1ec_Event)#389 (51) { ["post"]=> object(stdClass)#388 (23) { ["ID"]=> string(3) "220" ["post_author"]=> string(1) "1" ["post_date"]=> string(19) "2013-03-06 14:00:18" ["post_date_gmt"]=> string(19) "2013-03-06 19:00:18" ["post_content"]=> string(440) "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nunc dolor, accumsan quis condimentum ut, quis tortor. Consectetur adipiscing elit. Etiam odio purus, imperdiet ac. Duis quis risus a odio sodales bibendum. In adipiscing quam est." ["post_title"]=> string(17) "Another New Event" ["post_excerpt"]=> string(0) "" ["post_status"]=> string(7) "publish" ["comment_status"]=> string(6) "closed" ["ping_status"]=> string(6) "closed" ["post_password"]=> string(0) "" ["post_name"]=> string(17) "another-new-event" ["to_ping"]=> string(0) "" ["pinged"]=> string(0) "" ["post_modified"]=> string(19) "2013-03-07 14:21:45" ["post_modified_gmt"]=> string(19) "2013-03-07 19:21:45" ["post_content_filtered"]=> string(0) "" ["post_parent"]=> string(1) "0" ["guid"]=> string(94) "...com/wp/?post_type=ai1ec_event&p=220&instance_id=" ["menu_order"]=> string(1) "0" ["post_type"]=> string(11) "ai1ec_event" ["post_mime_type"]=> string(0) "" ["comment_count"]=> string(1) "0" } ["post_id"]=> string(3) "220" ["instance_id"]=> string(3) "582" ["start"]=> int(1363838400) ["end"]=> int(1363924800) ["start_truncated"]=> NULL ["end_truncated"]=> NULL ["allday"]=> string(1) "1" ["instant_event"]=> NULL ["recurrence_rules"]=> string(23) "FREQ=MONTHLY;BYday=3TH;" ["exception_rules"]=> string(0) "" ["recurrence_dates"]=> string(0) "" ["exception_dates"]=> string(0) "" ["venue"]=> string(12) "The location" ["country"]=> string(9) "Australia" ["address"]=> string(44) "The Address, Hope Island QLD 4212, Australia" ["city"]=> string(11) "Hope Island" ["province"]=> string(10) "Queensland" ["postal_code"]=> string(4) "4212" ["show_map"]=> string(1) "1" ["show_coordinates"]=> NULL ["longitude"]=> NULL ["latitude"]=> NULL ["facebook_eid"]=> NULL ["facebook_user"]=> NULL ["facebook_status"]=> NULL ["contact_name"]=> string(12) "Contact Name" ["contact_phone"]=> string(12) "123-456-7890" ["contact_email"]=> string(10) "me@you.com" ["contact_url"]=> NULL ["cost"]=> string(6) "$10.00" ["ticket_url"]=> NULL ["ical_feed_url"]=> string(0) "" ["ical_source_url"]=> string(0) "" ["ical_organizer"]=> NULL ["ical_contact"]=> NULL ["ical_uid"]=> string(0) "" ["tags"]=> NULL ["categories"]=> NULL ["feed"]=> NULL ["category_colors":"Ai1ec_Event":private]=> NULL ["color_style":"Ai1ec_Event":private]=> NULL ["category_text_color":"Ai1ec_Event":private]=> NULL ["category_bg_color":"Ai1ec_Event":private]=> NULL ["faded_color":"Ai1ec_Event":private]=> NULL ["rgba_color":"Ai1ec_Event":private]=> NULL ["tags_html":"Ai1ec_Event":private]=> NULL ["category_blocks_html":"Ai1ec_Event":private]=> NULL ["category_inline_html":"Ai1ec_Event":private]=> NULL ["_is_multiday":"Ai1ec_Event":private]=> NULL ["request":"Ai1ec_Event":private]=> NULL }
Событие содержит тестовые данные. Как видно в foreach-цикле из прикрепленного кода, я могу получить ID поста и ID экземпляра событий, сохранить их в массивах и вывести. Видно, что выбирается больше 7 событий, ID постов дублируются, а ID экземпляров уникальны.
Я пробовал модифицировать foreach-цикл на два цикла для перебора объектов (если это правильный способ?!), но это не выводило такие вещи, как ID экземпляра, хотя я мог получить заголовок поста и GUID. Также в объекте нет правильных дат начала/окончания событий (["start"]=> int(1363838400) ["end"]=> int(1363924800)), поэтому я думаю, нужно ли использовать WP query и Ai1ec_Events_Helper, чтобы получить даты в правильном формате?
Дополнение 2:
При более внимательном изучении того, что на самом деле дает $get_events, я изменил foreach-цикл в pastebin на:
foreach($get_events as $event) {
echo '<p>Event: ' . $event->post->post_title . '<br />';
echo 'ID: ' . $event->post->ID . '<br />';
echo 'Instance: ' . $event->instance_id . '<br />';
echo 'Guid: ' . $event->post->guid . '<br />';
echo 'Link: <a href="' . $event->post->guid . $event->instance_id . '">Go to event</a></p>';
}
Я смог получить заголовок события, ID, ID экземпляра, GUID и объединить GUID с ID экземпляра для создания правильного URL к нужному событию, вообще не используя WP query. Ура! Также события, кажется, правильно упорядочены по дате (хотя события на весь день отображаются первыми).
Я также могу получить даты и времена событий через $event->start и $event->end, пропустив их через функцию date().
Похоже, я сам ответил на свой вопрос... Опубликую окончательный код как ответ, когда он будет готов.

Наконец-то у меня появилась возможность опубликовать свое решение. Обратите внимание, что события с пометкой "Весь день" отображаются первыми, если они есть. К сожалению, я не знаю, как это обойти, так как это заложено в SQL-запросе внутри одного из файлов плагина (и даже есть комментарий в файле о том, что события на весь день идут первыми).
Я также использую информацию о событиях, собранную в атрибуты данных изображения, так как это нужно для карусели с использованием Cycle2. Но вы можете просто изменить эту часть, чтобы выводить информацию или форматировать её по своему усмотрению.
Надеюсь, это поможет кому-то ещё, если возникнет необходимость получать события из плагина AI1EC!
<?php
// Получаем локализованное время
$time = $ai1ec_events_helper->gmt_to_local( Ai1ec_Time_Utility::current_time() );
$bits = $ai1ec_events_helper->gmgetdate( $time );
// Устанавливаем начальное время на сегодня
$start = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']);
// Устанавливаем конечное время на год вперед от сегодняшнего дня, т.е. $bits['year']+1
$end = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']+1);
// Подробности смотрите в class-ai1ec-calendar-helper.php
$get_events = $ai1ec_calendar_helper->get_events_between($start, $end, $filter, $spanning = false);
date_default_timezone_set('America/Toronto'); // Соответствуем настройкам временной зоны в WP
// Для каждого события
foreach($get_events as $event) {
// ID события
$eventID = $event->post->ID;
// Заголовок события
$eventTitle = $event->post->post_title;
// URL события
$eventURL = $event->post->guid . $event->instance_id;
// Дата события
$eventMonth = date( 'M', $event->start );
$eventDay = date( 'd', $event->start );
// Изображение события
$imgID = get_post_thumbnail_id( $eventID );
// Время события
if( $event->allday == 1 ) {
$timeSpan = 'Весь день';
} else {
$startTime = date( 'g:ia', $event->start );
$endTime = date( 'g:ia', $event->end );
$timeSpan = $startTime . ' - ' . $endTime;
}
$attr = array(
'alt' => get_post_meta( $imgID , '_wp_attachment_image_alt', true ),
'data-name' => $eventTitle,
'data-month' => $eventMonth,
'data-day' => $eventDay,
'data-time' => $timeSpan,
'data-url' => $eventURL
);
echo get_the_post_thumbnail( $eventID, 'full', $attr );
}
?>

Это было очень полезной отправной точкой! Не подскажете, как добавить фильтр для запроса событий по категории? Еще раз спасибо!

Вывод из $get_events содержит категории событий (если они есть), и затем вы можете проверить, есть ли у событий категория X, и отобразить их... или сделать что-то еще.
В противном случае, $get_events просто получает все события и их данные, я не уверен, можно ли их фильтровать при получении данных ($filter? Но я не знаю, как это работает). Возможно, подсказки есть в файлах плагина, хотя сам плагин обновился с момента публикации этого кода.
