All-in-One Event Calendar: Query Personalizzata - Ottenere ogni Istanza di Evento
Sto utilizzando il plugin All-in-One Event Calendar di Timely e vorrei visualizzare i prossimi eventi dal calendario in un carousel su una pagina separata, ottenendo le informazioni sugli eventi.
Utilizzo gli helper di ai1ec e get_events_between per ottenere gli eventi in un determinato intervallo di date (tra oggi e un anno da oggi), e vedo nell'array (da get_events_between che ciclo per ottenere gli ID dei post) che sto ottenendo il numero corretto di eventi (ognuno è un oggetto).
Poi uso una query WP per visualizzare le informazioni con Ai1ec_Events_Helper. Riesco a ottenere la data di inizio, l'ora, ecc.
Puoi vedere il codice qui: http://pastebin.com/dhJjyw1y
Tuttavia, il problema è che anche se l'array di eventi contiene 50+ eventi, ottengo solo 7 dalla mia query WP - i 7 singoli eventi che ho creato, mostrando la data di inizio originale dell'evento (es. se un evento inizia il 6 marzo e si ripete mensilmente, ottengo solo l'evento una volta con la data del 6 marzo). Il link alla pagina dei dettagli di ogni evento punta anche alla data originale ("?instance_id=" nell'URL è vuoto).
Qualcuno sa come posso ottenere ogni istanza di ogni evento in modo da visualizzare tutti i 50+ eventi?
Grazie!
Aggiornamento:
Questo è l'output che ottengo da $get_events per il primo oggetto dell'array:
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 }
L'evento contiene solo dati di esempio. Come puoi vedere nel ciclo foreach del codice che ho linkato, posso ottenere l'ID del post e l'ID dell'istanza degli eventi, memorizzarli in array e stamparli. Quindi vedo che sta recuperando più di 7 eventi, e gli ID dei post si duplicano mentre gli ID delle istanze sono univoci.
Ho provato a modificare il ciclo foreach in due per iterare attraverso gli oggetti (se è questo il modo giusto?!), ma non riuscivo a ottenere cose come l'ID dell'istanza, anche se potevo ottenere il titolo del post e il guid. Inoltre, nell'oggetto non ci sono le date corrette di inizio/fine degli eventi (["start"]=> int(1363838400) ["end"]=> int(1363924800)) quindi mi chiedo se devo usare la query WP e Ai1ec_Events_Helper per ottenere le date nel formato corretto?
Aggiornamento 2:
Dopo aver esaminato più da vicino ciò che $get_events mi sta effettivamente restituendo, ho modificato il ciclo foreach nel pastebin sopra in:
foreach($get_events as $event) {
echo '<p>Evento: ' . $event->post->post_title . '<br />';
echo 'ID: ' . $event->post->ID . '<br />';
echo 'Istanza: ' . $event->instance_id . '<br />';
echo 'Guid: ' . $event->post->guid . '<br />';
echo 'Link: <a href="' . $event->post->guid . $event->instance_id . '">Vai all\'evento</a></p>';
}
Riesco a ottenere il titolo dell'evento, ID, ID istanza, GUID e combinare GUID e ID istanza per creare un URL corretto all'evento giusto, senza usare affatto la query WP. Evviva! Sembrano anche essere ordinati correttamente per data (anche se gli eventi che durano tutto il giorno vengono visualizzati per primi).
Posso anche ottenere le date e gli orari degli eventi con $event->start e $event->end e passandoli attraverso la funzione date().
Sembra che abbia risposto da solo alla mia domanda... Pubblicherò il mio codice finale come risposta una volta completato.

Finalmente ho l'opportunità di pubblicare la mia soluzione. Nota che gli eventi mostrano prima gli eventi "Tutto il giorno" se ce ne sono. Purtroppo non conosco un modo per aggirare questo aspetto poiché è codificato in questo modo in una query SQL all'interno di uno dei file del plugin (e nel file è persino commentato che gli eventi "Tutto il giorno" vengono per primi).
Sto anche utilizzando le informazioni dell'evento raccolte negli attributi dati dell'immagine poiché è per un carosello che utilizza Cycle2. Ma puoi semplicemente modificare quella parte per visualizzare le informazioni o nel formato che preferisci.
Spero che questo aiuti qualcun altro se si trova nella necessità di ottenere eventi dal plugin AI1EC!
<?php
// Ottiene l'ora localizzata
$time = $ai1ec_events_helper->gmt_to_local( Ai1ec_Time_Utility::current_time() );
$bits = $ai1ec_events_helper->gmgetdate( $time );
// Imposta l'ora di inizio a oggi
$start = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']);
// Imposta l'ora di fine a un anno da oggi, cioè $bits['year']+1
$end = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']+1);
// Cerca in class-ai1ec-calendar-helper.php per i dettagli
$get_events = $ai1ec_calendar_helper->get_events_between($start, $end, $filter, $spanning = false);
date_default_timezone_set('America/Toronto'); // Imposta il fuso orario come in WP
// Per ogni evento
foreach($get_events as $event) {
// ID evento
$eventID = $event->post->ID;
// Titolo evento
$eventTitle = $event->post->post_title;
// URL evento
$eventURL = $event->post->guid . $event->instance_id;
// Data evento
$eventMonth = date( 'M', $event->start );
$eventDay = date( 'd', $event->start );
// Immagine evento
$imgID = get_post_thumbnail_id( $eventID );
// Ora evento
if( $event->allday == 1 ) {
$timeSpan = 'Tutto il giorno';
} 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 );
}
?>

Questo è stato un punto di partenza estremamente utile! Sapresti per caso come aggiungere un filtro per interrogare per categoria di evento? Grazie ancora!

L'output da $get_events ha le categorie degli eventi se presenti, e poi potresti verificare se gli eventi hanno la categoria X, e mostrarli... o qualsiasi altra cosa tu voglia fare.
Altrimenti, $get_events ottiene semplicemente tutti gli eventi e i loro dati, non sono sicuro se puoi filtrarli durante il recupero dei dati ($filter? Ma non sono sicuro di come funzioni). Potrebbero esserci indizi nei file del plugin, anche se il plugin è stato aggiornato da quando questo codice è stato pubblicato.
