Erweiterte benutzerdefinierte Felder zeigen die letzten drei Sub-Repeater-Zeilen an

Lesezeit: 6 Minuten

Benutzer-Avatar
Gordon Smith

Ich verwende Advanced Custom Fields (ACF), um Repeater-Informationen von einer Ereignisseite abzurufen und eine verkürzte Liste der Ereignisse auf der Homepage anzuzeigen.

Ich habe einen Repeater eingerichtet, damit der Benutzer eingeben kann, in welchem ​​​​Monat das Ereignis stattfinden wird (was ihm ermöglicht, mehrere Monate mit Ereignissen einzugeben), und dann einen Sub-Repeater, mit dem er mehrere Ereignisse für den angegebenen Monat hinzufügen kann. Beispiel unten:

Marsch

  • Veranstaltung am 9. März
  • Veranstaltung am 12. März
  • Veranstaltung am 28. März

April

  • Veranstaltung am 1. April
  • Veranstaltung am 28.04

Dies ist die aktuelle Ausgabe auf der Ereignisseite und funktioniert wie vorgesehen.

Auf der Startseite der Website muss ich die 3 neuesten Ereignisse abrufen (das Ereignis, das sich am Ende der Liste befindet, ist das neueste Ereignis) und sie auf der Startseite anzeigen.

Ich habe kein Problem mit dem Ziehen und Anzeigen der Ereignisse auf der Homepage. Womit ich ein Problem habe, ist die Anzeige der Ereignisse, wenn sich die letzten drei Ereignisse (der untergeordnete Repeater) zwischen den Monaten (der übergeordnete Repeater) kreuzen.

Durch einfaches Begrenzen der Ereignisausgabe mit einer PHP-Schleife über die if-, while-, Anweisungen wird nur die Anzahl der in diesem Monat ausgegebenen Ereignisse begrenzt. Mein Code, den ich derzeit auf der Homepage verwende, ist unten.

<?php if( have_rows('event_month', 1263)): ?>
<ul>
    <?php while ( have_rows('event_month', 1263) ) : the_row(); ?>
        <?php if( have_rows('event', 1263)):;   ?>
            <?php while ( have_rows('event', 1263) ) : the_row(); ?>
                <li>
                    <h3>
                        <a href="https://stackoverflow.com/questions/43106718/<?php echo esc_url( home_url("https://stackoverflow.com/" ) ); ?>events/"><?php $summary = get_sub_field('event_title');
                            echo substr($summary, 0, 34),'...'; ?></a>
                            <span><?php the_sub_field('event_day_of_week');?>, <?php the_sub_field('event_sub_month');?> <?php the_sub_field('event_day');?></span>
                    </h3>
                </li>
            <?php endwhile; ?>
        <?php else: ?>
            <p>Show dates to be announced soon.</p><?php the_sub_field('event_title'); ?>
        <?php endif; ?>
    <?php endwhile; ?>
</ul>

Wie meine gewünschte Ausgabe auf der Startseite aussehen würde, wenn wir die drei letzten Ereignisse erfassen:

  • Veranstaltung am 28. März
  • Veranstaltung am 1. April
  • Veranstaltung am 28.04

  • Gibt es einen Grund, nicht nur einen einzelnen Repeater mit einem Datumseingabefeld zu verwenden? Sie können dann den Monat daraus extrahieren, um an anderer Stelle auf der Website gut mit Ihrem Code zu spielen, und es würde das Sortieren der neuesten Einträge auf der Homepage zu einem Kinderspiel machen.

    – Leland

    5. April 2017 um 3:32 Uhr

  • @Leland – Ich weiß es zu schätzen, dass Sie fragen, da ich das nicht in Betracht gezogen hatte. Hier ist ein Link zu der Seite, auf der die Ereignisse in jedem Monat angezeigt werden. ardentsolutionsllc.com/events Wenn ich nur einen Repeater verwenden würde, wüsste ich nicht, wie ich die Ereignisse jedem Monat zuordnen soll. Die Startseite zeigt die Liste der Ereignisse (unten rechts), die ich zu verkürzen versuche, um nur 3 der neuesten Ereignisse anzuzeigen, die normalerweise am Ende jedes Monats auf der Ereignisseite erscheinen.

    – Gordon Smith

    5. April 2017 um 16:36 Uhr

  • Okay, ich lese Ihren Beitrag noch einmal – Sie möchten auf der Homepage die 3 zuletzt hinzugefügte Veranstaltungen? Das heißt, Sie möchten auf der Startseite die 3 Ereignisse anzeigen, die zuletzt im WordPress-Admin erstellt wurden? Oder möchten Sie lieber die 3 Ereignisse, die am frühesten bis heute stattfinden?

    – Leland

    5. April 2017 um 17:25 Uhr

  • @Leland Ich hätte gerne die drei neuesten Veranstaltungen, die unten auf der Veranstaltungsseite erscheinen (über den Link oben). Normalerweise würde ich die von Elliott hier vorgeschlagene Methode verwenden support.advancedcustomfields.com/forums/topic/… aber es wird nicht funktionieren, da einige Ereignisse möglicherweise über Wiederholungsmonate hinweg abgerufen werden müssen (manchmal Beispiel: 2 im Mai veröffentlichte Ereignisse erfordern, dass 1 Ereignis aus dem April abgerufen wird, um 3 auf der Homepage zu erstellen).

    – Gordon Smith

    5. April 2017 um 20:49 Uhr

  • Hey, entschuldige die vielen Fragen – ich habe Code, bei dem ich helfen könnte, aber ich möchte nur etwas besser verstehen, wonach du suchst. Sie möchten die “drei neuesten Ereignisse … unten auf der Ereignisseite”. Mit anderen Worten, Sie wollen die 3 Ereignisse, die am weitesten in der Zukunft liegen? Ist das korrekt?

    – Leland

    5. April 2017 um 21:01 Uhr

Benutzer-Avatar
Nishanth Matha

Wahrscheinlich sollten Sie verwenden for Anstatt von while. Und betrachten Sie den folgenden Algorithmus:

1) Holen Sie sich die last row from event_month

2) Zählen Sie die Anzahl der Ereignisse in diesem Monat

3) Wenn die Anzahl der Ereignisse größer oder gleich 3 ist.

3.1) Holen Sie sich die letzten 3 Ereignisse und zeigen Sie sie an

4) Andernfalls zählen Sie die Anzahl der verbleibenden Ereignisse (3-<<events in last month>>)

4.1) Holen Sie sich nun die vorletzte Reihe und wiederholen Sie die Schritte 2,3,4

Wenn Sie also die obige Logik verwenden, sollte Ihr Code ungefähr so ​​​​aussehen:

<?php 

function getEvents($rows, $noOfEvents){
    $resultArray = array();
    if($rows && count($rows > 0)) {
        $events = $rows[count($rows)-1]['event'];
        $events = is_array($events) ? $events : array();
        $eventCount = count($events);
        if($eventCount < $noOfEvents){
            $noOfOtherEvents = $noOfEvents-$eventCount;
            array_pop($rows);
            $iterate = getEvents($rows,$noOfOtherEvents);
            $resultArray = array_merge($events,$iterate);     
        }
        else{
            $resultArray =  array_slice($rows, 0-$eventCount, $eventCount);
        }
        return $resultArray;
}

$rows = get_field('event_month', 1263);
if($rows) {
    $requiredEvents = getEvents($rows,3);        //3 or how many ever last you want
    foreach($requiredEvents as $event){
        var_dump($event); //this should have all you need like $event['event_title'],$event['event_day'],ect... 
    }
}

  • Danke für deine Antwort. Ich habe versucht, Ihren Code in die Site zu implementieren, aber es hat die Seite beschädigt, die besagt, dass $requiredEvents => $event einen Syntaxfehler ‘unerwartet ‘=>’ (T_DOUBLE_ARROW)’ erzeugt. Ich kenne PHP nicht gut genug, um dieses Problem zu lösen. Ich könnte mich damit beschäftigen, dachte aber, Sie könnten mir weitere Ratschläge geben.

    – Gordon Smith

    5. April 2017 um 16:58 Uhr

  • @GordonSmith das war ein Tippfehler => sollte sein as siehe Bearbeiten! Und Sie müssen Ihre PHP-Kenntnisse verbessern!

    – Nishanth Matha

    6. April 2017 um 0:54 Uhr

  • Danke für die Bearbeitung. Ich stimme zu und verbessere mich täglich weiter. Ich probier das mal aus und melde mich wieder.

    – Gordon Smith

    6. April 2017 um 15:50 Uhr

Dies ist vielleicht nicht die Antwort, nach der alle gesucht haben, aber hier ist, was ich als Problemumgehung getan habe, was für mich gut genug funktioniert hat.

Am Ende habe ich das Problem außerhalb von PHP gelöst, indem ich CSS verwendet habe, um die letzten drei Listenelemente auszuwählen. Hier ist, was ich verwendet habe, hat super funktioniert.

.connect-list-wrapper ul li
{
    display: none;
}
.connect-list-wrapper ul li:nth-last-child(-n+3) 
{
    display: block;
}

1385670cookie-checkErweiterte benutzerdefinierte Felder zeigen die letzten drei Sub-Repeater-Zeilen an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy