All-in-One Event Calendar: Interogare Personalizată - Obținerea Fiecărei Instanțe de Eveniment

15 mar. 2013, 01:55:56
Vizualizări: 13.7K
Voturi: 3

Folosesc All-in-One Event Calendar de la Timely și doresc să afișez evenimente viitoare din calendar într-un carusel pe o pagină separată, având nevoie să obțin informațiile despre evenimente.

Folosesc ajutoarele ai1ec și get_events_between pentru a obține evenimentele dintr-un anumit interval de date (între astăzi și peste un an), iar în array-ul (din get_events_between pe care îl parcurg pentru a obține ID-urile postărilor) văd că obțin numărul corect de evenimente (fiecare fiind un obiect).

Apoi folosesc o interogare WP pentru a afișa informațiile cu Ajutorul Ai1ec_Events_Helper. Pot obține data de început, ora etc.

Puteți vedea codul aici: http://pastebin.com/dhJjyw1y

Totuși, problema este că, deși array-ul de evenimente conține peste 50 de evenimente, eu obțin doar 7 din interogarea WP - cele 7 evenimente individuale pe care le-am creat, afișând data originală de început a evenimentului (de exemplu, dacă un eveniment a început pe 6 martie și se repetă lunar, obțin evenimentul o singură dată cu data de 6 martie). Link-ul către pagina de detalii a fiecărui eveniment se leagă și el de data originală ("?instance_id=" din URL este gol).

Știe cineva cum pot obține fiecare instanță a fiecărui eveniment, astfel încât să afișez toate cele peste 50 de evenimente?

Mulțumesc!


Actualizare:

Acesta este rezultatul pe care îl obțin din $get_events pentru primul obiect din 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 }

Evenimentul conține doar date de umplutură. După cum puteți vedea în bucla foreach din codul la care am dat link, pot obține ID-ul postării și ID-ul instanței evenimentelor, le stochez în array-uri și le afișez. Deci văd că preia mai mult de 7 evenimente, iar ID-urile postărilor se repetă, în timp ce ID-urile instanțelor sunt unice.

Am încercat să modific bucla foreach în două bucle pentru a itera prin obiecte (dacă asta e calea corectă?!), dar nu puteam obține lucruri precum ID-ul instanței, deși puteam obține titlul postării și guid-ul. De asemenea, în obiect nu am datele corecte de început/sfârșit ale evenimentelor (["start"]=> int(1363838400) ["end"]=> int(1363924800)) așa că mă întreb dacă trebuie să folosesc interogarea WP și Ajutorul Ai1ec_Events_Helper pentru a obține datele în formatul corect?


Actualizare 2:

După ce am analizat mai atent ce oferă de fapt $get_events, am modificat bucla foreach din pastebin în:

foreach($get_events as $event) {
    echo '<p>Eveniment: ' . $event->post->post_title . '<br />';
    echo 'ID: ' . $event->post->ID . '<br />';
    echo 'Instanță: ' . $event->instance_id . '<br />';
    echo 'GUID: ' . $event->post->guid . '<br />';
    echo 'Link: <a href="' . $event->post->guid . $event->instance_id . '">Vezi eveniment</a></p>';
}

Pot obține titlul evenimentului, ID-ul, ID-ul instanței, GUID-ul și pot combina GUID-ul cu ID-ul instanței pentru a crea un URL corect către evenimentul potrivit, fără a folosi deloc interogarea WP. Ura! De asemenea, par să fie ordonate corect după dată (deși evenimentele pe toată ziua apar primele).

Pot obține și datele și orele evenimentelor cu $event->start și $event->end, rulându-le prin funcția date().

Se pare că mi-am răspuns singură la întrebare... Voi posta codul final ca răspuns odată ce este complet.

4
Comentarii

Când aduni evenimentele în $post_ids, ce date obții? Poți să le postezi aici? (Presupun că datele recurente nu sunt postări reale, ci un fel de metadate ale postării originale.)

jfacemyer jfacemyer
15 mar. 2013 03:49:34

Am editat întrebarea mea cu o parte din rezultate.

CourtFantinato CourtFantinato
15 mar. 2013 18:31:32

Super! Mă bucur că ai reușit să rezolvi!

jfacemyer jfacemyer
18 mar. 2013 21:49:04

PS - Codul din răspunsul de mai jos nu funcționează în versiunile mai noi ale pluginului. Iată un fragment de cod care ar funcționa, preluat din acest post de pe forumul de suport (există și altele).

montrealist montrealist
28 dec. 2014 19:32:52
Toate răspunsurile la întrebare 1
2

În sfârșit am ocazia să postez soluția mea. Rețineți că evenimentele afișează mai întâi evenimentele pe toată ziua dacă există. Din păcate, nu cunosc o metodă de a ocoli acest lucru, deoarece este codificat astfel într-o interogare SQL din unul dintre fișierele pluginului (și chiar este comentat în fișier că evenimentele pe toată ziua sunt afișate primele).

De asemenea, folosesc informațiile despre eveniment colectate în atributele de date ale imaginii, deoarece este pentru un carusel care utilizează Cycle2. Dar puteți schimba acea parte pentru a afișa informațiile sau oricum doriți să le formatați.

Sper că acest lucru va ajuta pe altcineva dacă întâlnește nevoia de a obține evenimente din plugin-ul AI1EC!

<?php

    // Obține ora localizată
    $time = $ai1ec_events_helper->gmt_to_local( Ai1ec_Time_Utility::current_time() );
    $bits = $ai1ec_events_helper->gmgetdate( $time );

    // Setează ora de început la ziua de astăzi
    $start = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']);

    // Setează ora de sfârșit la un an de la astăzi, adică $bits['year']+1
    $end = gmmktime(0,0,0,$bits['mon'],$bits['mday'],$bits['year']+1);

    // Consultați class-ai1ec-calendar-helper.php pentru detalii
    $get_events = $ai1ec_calendar_helper->get_events_between($start, $end, $filter, $spanning = false);

    date_default_timezone_set('America/Toronto'); // Potriviți setările de fus orar din WP

    // Pentru fiecare eveniment
    foreach($get_events as $event) {

        // ID-ul evenimentului
        $eventID = $event->post->ID;

        // Titlul evenimentului
        $eventTitle = $event->post->post_title;

        // URL-ul evenimentului
        $eventURL = $event->post->guid . $event->instance_id;

        // Data evenimentului
        $eventMonth = date( 'M', $event->start );
        $eventDay = date( 'd', $event->start );

        // Imaginea evenimentului
        $imgID = get_post_thumbnail_id( $eventID );

        // Ora evenimentului
        if( $event->allday == 1 ) {
            $timeSpan = 'Toată ziua';
        } 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 apr. 2013 01:56:40
Comentarii

Acesta a fost un punct de plecare extrem de util! Știi cum să adaugi un filtru pentru a interoga după categoria evenimentului, cumva? Mulțumesc din nou!

RCNeil RCNeil
27 ian. 2014 21:23:34

Rezultatul din $get_events conține categoriile evenimentelor, dacă există, și apoi ai putea verifica dacă evenimentele au categoria X și să le afișezi... sau orice altceva dorești să faci.

Altfel, $get_events obține doar toate evenimentele și datele lor, nu sunt sigur dacă poți filtra la preluarea datelor ($filter? Dar nu sunt sigur cum funcționează). Ar putea exista indicii în fișierele plugin-ului, deși plugin-ul a fost actualizat de când a fost postat acest cod.

CourtFantinato CourtFantinato
29 ian. 2014 07:00:41