Calendario de Eventos All-in-One: Consulta personalizada - Obteniendo cada instancia del evento
Estoy usando el calendario All-in-One Event Calendar de Timely, y me gustaría mostrar los próximos eventos del calendario en un carrusel en una página separada, necesitando obtener la información de los eventos.
Utilizo los helpers de ai1ec y get_events_between para obtener los eventos dentro de un rango de fechas (entre hoy y un año a partir de ahora), y puedo ver en el array (de get_events_between que recorro para obtener los IDs de posts) que estoy obteniendo la cantidad correcta de eventos (cada uno es un objeto).
Luego uso una consulta de WP para mostrar la información con Ai1ec_Events_Helper. Puedo obtener la fecha de inicio, hora, etc.
Puedes ver el código aquí: http://pastebin.com/dhJjyw1y
Sin embargo, el problema es que aunque el array de eventos contiene 50+ eventos, solo obtengo 7 de mi consulta WP - los 7 eventos individuales que he creado, mostrando la fecha de inicio original del evento (ej. si un evento comenzó el 6 de marzo y se repite mensualmente, solo obtengo el evento una vez con la fecha del 6 de marzo). El enlace a cada página de detalles del evento también enlaza a la fecha original ("?instance_id=" en la URL está vacío).
¿Alguien sabe cómo puedo obtener cada instancia de cada evento para mostrar los 50+ eventos?
¡Gracias!
ACTUALIZACIÓN:
Esta es la salida que obtengo de $get_events para el primer objeto del 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) "Otro Evento Nuevo" ["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) "otro-evento-nuevo" ["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) "La ubicación" ["country"]=> string(9) "Australia" ["address"]=> string(44) "La Dirección, 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) "Nombre de Contacto" ["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 }
El evento solo tiene datos de relleno. Como puedes ver en el bucle foreach del código que enlacé, puedo obtener el ID del post y el ID de instancia de los eventos, almacenarlos en arrays e imprimirlos. Así que veo que está capturando más de 7 eventos, y los IDs de post se duplican mientras que los IDs de instancia son únicos.
Intenté modificar el bucle foreach en dos para iterar a través de los objetos (si es que esa es la manera de hacerlo?!), pero no mostraba cosas como el ID de instancia, aunque podía obtener el título del post y el guid. Además, en el objeto no tiene las fechas de inicio/fin correctas de los eventos (["start"]=> int(1363838400) ["end"]=> int(1363924800)) así que me pregunto si necesito usar la consulta WP y el Ai1ec_Events_Helper para obtener las fechas en el formato correcto.
ACTUALIZACIÓN 2:
Después de analizar más de cerca lo que $get_events realmente me está dando, he modificado el bucle foreach en el pastebin anterior a:
foreach($get_events as $event) {
echo '<p>Evento: ' . $event->post->post_title . '<br />';
echo 'ID: ' . $event->post->ID . '<br />';
echo 'Instancia: ' . $event->instance_id . '<br />';
echo 'Guid: ' . $event->post->guid . '<br />';
echo 'Enlace: <a href="' . $event->post->guid . $event->instance_id . '">Ir al evento</a></p>';
}
Puedo obtener el título del evento, ID, ID de instancia, GUID, y combinar el GUID con el ID de instancia para crear una URL correcta al evento apropiado, sin usar la consulta WP en absoluto. ¡Hurra! También parecen estar ordenados correctamente por fecha (aunque los eventos de todo el día se muestran primero).
También puedo obtener las fechas y horas de los eventos con $event->start y $event->end y pasándolos por la función date().
Parece que he respondido mi propia pregunta... Publicaré mi código final como respuesta una vez que esté completo.

Finalmente tengo la oportunidad de publicar mi solución. Ten en cuenta que los eventos muestran primero los eventos de Todo el Día si hay alguno. Desafortunadamente no conozco una forma de evitarlo ya que está codificado así en una consulta SQL dentro de uno de los archivos del plugin (e incluso está comentado en el archivo que los eventos de Todo el Día van primero).
También estoy usando la información del evento recopilada en atributos de datos de imagen ya que es para un carrusel usando Cycle2. Pero puedes simplemente cambiar esa parte para mostrar la información o formatearla como prefieras.
¡Espero que esto ayude a alguien más si necesita obtener eventos del plugin AI1EC!
<?php
// Obtiene la hora localizada
$time = $ai1ec_events_helper->gmt_to_local( Ai1ec_Time_Utility::current_time() );
$bits = $ai1ec_events_helper->gmgetdate( $time );
// Establece la hora de inicio al día actual
$start = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']);
// Establece la hora de fin a un año desde hoy, es decir, $bits['year']+1
$end = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']+1);
// Consulta class-ai1ec-calendar-helper.php para más detalles
$get_events = $ai1ec_calendar_helper->get_events_between($start, $end, $filter, $spanning = false);
date_default_timezone_set('America/Toronto'); // Coincide con la zona horaria configurada en WP
// Para cada evento
foreach($get_events as $event) {
// ID del evento
$eventID = $event->post->ID;
// Título del evento
$eventTitle = $event->post->post_title;
// URL del evento
$eventURL = $event->post->guid . $event->instance_id;
// Fecha del evento
$eventMonth = date( 'M', $event->start );
$eventDay = date( 'd', $event->start );
// Imagen del evento
$imgID = get_post_thumbnail_id( $eventID );
// Hora del evento
if( $event->allday == 1 ) {
$timeSpan = 'Todo el Día';
} 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 );
}
?>

¡Este ha sido un punto de partida extremadamente útil! ¿Sabrías cómo agregar un filtro para consultar por categoría de evento por casualidad? ¡Gracias de nuevo!

La salida de $get_events tiene las categorías de eventos si las hay, y luego podrías verificar si los eventos tienen la categoría X, y mostrarlos... o lo que quieras hacer.
De lo contrario, $get_events simplemente obtiene todos los eventos y sus datos, no estoy seguro si puedes filtrarlos al recuperar los datos ($filter? Pero no estoy seguro de cómo funciona eso). Podría haber pistas en los archivos del plugin, aunque el plugin se ha actualizado desde que se publicó este código.
