All-in-One Event Calendar: Кастомный запрос - Получение каждого экземпляра события

15 мар. 2013 г., 01:55:56
Просмотры: 13.7K
Голосов: 3

Я использую плагин 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().

Похоже, я сам ответил на свой вопрос... Опубликую окончательный код как ответ, когда он будет готов.

4
Комментарии

Когда вы собираете события в $post_ids, какие данные вы получаете? Можете опубликовать их здесь? (Я предполагаю, что повторяющиеся даты — это не отдельные записи, а какой-то вид метаданных оригинальной записи.)

jfacemyer jfacemyer
15 мар. 2013 г. 03:49:34

Я отредактировал свой вопрос, добавив часть вывода.

CourtFantinato CourtFantinato
15 мар. 2013 г. 18:31:32

Отлично! Рад, что вы разобрались!

jfacemyer jfacemyer
18 мар. 2013 г. 21:49:04

Для справки - код в ответе ниже не работает в новых версиях плагина. Вот сниппет, который должен работать, взятый из этого поста на форуме поддержки (есть и другие).

montrealist montrealist
28 дек. 2014 г. 19:32:52
Все ответы на вопрос 1
2

Наконец-то у меня появилась возможность опубликовать свое решение. Обратите внимание, что события с пометкой "Весь день" отображаются первыми, если они есть. К сожалению, я не знаю, как это обойти, так как это заложено в 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 );
    }
?>
1 апр. 2013 г. 01:56:40
Комментарии

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

RCNeil RCNeil
27 янв. 2014 г. 21:23:34

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

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

CourtFantinato CourtFantinato
29 янв. 2014 г. 07:00:41