Support » Allgemeine Fragen » while(have_posts) lädt nicht alles

  • Hi Leute,

    ich lerne gerade neu WordPress und finde aktuell auf eine Frage keine Antwort.

    Also ich habe 3 Beiträge regulär erstellt. In meiner index.php habe ich die while-Schleife eingebaut, die wie folgt aussieht:

    <?php 
    
    while(have_posts)){
    
    the_post();
    the_title();
    the_content(); ?>;

    Liest sich also wie folgt:

    Solange wir Beiträge (3) haben, zeigen Sie deren Titel und Inhalt.

    Da wir 3 Beiträge haben, werden 3 Titel mit deren Inhalt angezeigt. Macht Sinn.

    Nun habe ich genau den gleichen Schleifencode in die Datei single.php eingefügt. Doch statt 3 Posts wird hier nur einer angezeigt. Warum?
    Warum wird hier nur ein Titel und ein Inhalt angezeigt, obwohl wir 3 Beiträge haben? Wo ist der Unterschied zu der index.php, die ja 3 Beiträge anzeigt?

Ansicht von 3 Antworten - 1 bis 3 (von insgesamt 3)
  • Das hat mit der Template-Hierarchie zu tun: Vereinfacht ausgedrückt prüft WordPress bei jedem Aufruf einer URL, um welche Art von Inhalt es sich handelt und versucht, dazu ein möglichst passendes Template zu laden. Wird z.B. ein URL für das Archiv der Beiträge mit der Kategorie „News“ aufgerufen, prüft WordPress zuerst, ob es ein Template category-news.php gibt. Falls nicht, wird nach category-{id}.php gesucht, dann nach dem allgemeineren category.php, wenn es das nicht gibt nach archive.php und zuallerletzt wird für die Anzeige, wenn gar kein passendes Template vorhanden ist, die index.php genutzt. Das kannst du in dieser Grafik schön (von links nach rechts) ablesen (für eine größere, lesbare Ansicht bitte anklicken):

    Templatehierarchy

    Nun zurück zu deiner Frage: ein Template single.php wird nur zur Darstellung einzelner Beiträge verwendet. Deshalb spuckt die Loop auch nicht mehr aus. Möchtest du zusätzlich zum Beispiel die neuesten 3 Beiträge ausgeben, musst du eine weitere WP-Query einfügen:

    // The Query
    $args = array(
      'post_type'     => 'post',
      'post_status'   => 'publish',
      'posts_per_page'=> 3,
      'order'         =>'DESC',
      'orderby'       =>'ID',
    );
    $the_query = new WP_Query( $args );
     
    // The Loop
    if ( $the_query->have_posts() ) {
        echo '<ul>';
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
        }
        echo '</ul>';
    } else {
        // no posts found
    }
    /* Restore original Post Data */
    wp_reset_postdata();
    Thread-Starter efaq

    (@efaq)

    Hi,

    sorry!! ich hatte gar nicht mehr geantwortet. Okay cool. Danke, dass hilft mir schon mal weiter.

    1) Danke für deine Erläuterung. Werden die Parameter in der Queue auch ausgebgen?

    2) Wenn ich folgenden Code auf der front-page.php ausgebe, lädt die Seite aber unendlich:

    <?php
    
      while(have_posts()) {
    
        the_content();
    }
        ?>
    

    Warum? Wieso iteriert er hier nicht nur so lange, so lange es Posts gibt? Ich mein klar, er gibt ja die ganze Zeit den content aus, weil die Bedingung true ist. Aber wieso wird es hier unendlich mal ausgegeben, während es wo anders nur so lange ausgegeben wird, solange posts enthalten sind?

    Die Loop sollte so aussehen:

    <?php 
    if ( have_posts() ) {
    	while ( have_posts() ) {
    		the_post(); 
    		//
    		// Post Content here
    		//
    	} // end while
    } // end if
    ?>

    vgl. The Loop

    Die Parameter für eine Query geben an, was abgerufen werden soll. Sie werden eigentlich nicht mit ausgegeben, wenn du es nicht ausdrücklich möchtest.

Ansicht von 3 Antworten - 1 bis 3 (von insgesamt 3)
  • Das Thema „while(have_posts) lädt nicht alles“ ist für neue Antworten geschlossen.