Support » Allgemeine Fragen » Beiträge über Content ausgeben

  • morgana17

    (@morgana17)


    Hallo,

    ich habe folgende Frage. Ich möchte über der loop Abfrage, meine Beiträge ausgeben. Hier wird mir aber dann im Content Bereich nicht mehr der Inhaltstext angezeigt sondern auch ein Beitragstext.

    Wenn ich die Beiträge unterhalb der Loop Abfrage ausgeben lasse. Geht es.

    Anbei der Code, wo es falsch ausgegeben wird.

    <aside id="sidebar" class="twelve-col margin-right-none" role="complementary">
    
        <article id="startseite_beitraege" class="clearfix ohneAufzaehlungspunkt">
    
    <?php query_posts('category_name=Allgemein&posts_per_page=-3'); ?>
    <ul class="startseiten_posts">
    <?php while (have_posts()) : the_post(); ?>
    <li class="four-col">
    <div class="beitragsbild_vorschau_startseite"><?php the_post_thumbnail(array( 400,9999 ), array( 'class' => 'recent-thumbs' )); ?></a><div>
    <div class="beitragstext_auszug_startseite"><h1 class="beitragsueberschrift_vorschau_startseite"><?php the_title(); ?></h1></a>
    <div class="beitragstext_auszug"><?php the_content(); ?>
    </div>
    </li>
    <?php endwhile;?>
    </ul>
    
    </article>
    
         </aside><!-- .sidebar .widget-area -->
    
    <div id="content" class="twelve-col">
    
    		<?php
    		// Start the loop.
    		while ( have_posts() ) : the_post();
    
    			// Include the page content template.
    			get_template_part( 'template-parts/content', 'page' );
    
    			// If comments are open or we have at least one comment, load up the comment template.
    			if ( comments_open() || get_comments_number() ) {
    				comments_template();
    			}
    
    			// End of the loop.
    		endwhile;
    		?>
    
    </div><!--Content-->

    Wenn ich es aber so schreibe, geht es. Aber ich will die Beiträge darüber ausgeben.

    <div id="content" class="twelve-col">
    
    		<?php
    		// Start the loop.
    		while ( have_posts() ) : the_post();
    
    			// Include the page content template.
    			get_template_part( 'template-parts/content', 'page' );
    
    			// If comments are open or we have at least one comment, load up the comment template.
    			if ( comments_open() || get_comments_number() ) {
    				comments_template();
    			}
    
    			// End of the loop.
    		endwhile;
    		?>
    
    </div><!--Content-->
    
    <aside id="sidebar" class="twelve-col margin-right-none" role="complementary">
    
        <article id="startseite_beitraege" class="clearfix ohneAufzaehlungspunkt">
    
    <?php query_posts('category_name=Allgemein&posts_per_page=-3'); ?>
    <ul class="startseiten_posts">
    <?php while (have_posts()) : the_post(); ?>
    <li class="four-col">
    <div class="beitragsbild_vorschau_startseite"><?php the_post_thumbnail(array( 400,9999 ), array( 'class' => 'recent-thumbs' )); ?></a><div>
    <div class="beitragstext_auszug_startseite"><h1 class="beitragsueberschrift_vorschau_startseite"><?php the_title(); ?></h1></a>
    <div class="beitragstext_auszug"><?php the_content(); ?>
    </div>
    </li>
    <?php endwhile;?>
    </ul>
    
    </article>
    
         </aside><!-- .sidebar .widget-area -->
Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Hm, da ist so einiges im Argen.

    Wenn ein Besucher deiner Website eine Adresse eingibt, startet WordPress eine Abfrage der vorhandenen Beiträge und packt das Ergebnis in ein Objekt $post. Erst dann wird je nachdem, was eigentlich angezeigt werden soll (eine statische Seite, ein einzelner Beitrag, ein Archiv …) ein passendes Template geöffnet. Wenn du nun in dieses Template eine neue Abfrage steckst, verwirfst du die bereits vorher gestartete Abfrage und machst statt dessen eine neue Abfrage – was der Performance nicht gut tut.

    Besser ist es, die Abfrage schon im Vorfeld anzupassen. WordPress bietet dafür einen spezielle Hook pre_get_posts. (Dazu findest im bei Google einige Tutorials.) Wenn es aber eine neue Query sein soll, dann bitte mit new WP_Query().

    Die Loop ist eine Schleife, die das $post-Objekt näher untersucht und so lange läuft, wie das $post-Objekt Beiträge enthält (was von der ursprünglichen Abfrage abhängt). Ist dieser Prozess abgeschlossen und man startet die Schleife erneut, kommt es zu ungewollten Ergebnissen. Deswegen sollte nach Durchlauf der Schleife das $post-Objekt zurückgesetzt werden. WordPress bietet dafür die Funktion wp_reset_postdata(); – die fehlt in deinem ersten Code-Beispiel.

    Um eine neue Query zu erzeugen, ist der WP Query Generator sehr hilfreich. Der Code könnte dann z.B. so aussehen:

    // WP_Query arguments
    $args = array (
    	'category_name'          => 'Allgemein',
    	'posts_per_page'         => '3',
    );
    
    // The Query
    $query = new WP_Query( $args );
    
    // The Loop
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    		// do something
    	}
    } else {
    	// no posts found
    }
    
    // Restore original Post Data
    wp_reset_postdata();

    Du solltest aus Performance-Gründen nicht query_posts nutzen.

    Siehe: http://stephenharris.info/die-query_posts-die/

    Entweder den Query mit pre_get_posts() ändern oder einen neuen Query anlegen.

    Gruß, Torsten

    Bego war schneller und ausführlicher 🙂

    Thread-Ersteller morgana17

    (@morgana17)

    Vielen vielen Dank. Ich bin Anfänger was das Programmieren betrifft, von dem her tu ich mich noch etwas schwer alles zu verstehen. Ich habe es jetzt noch so ergänzt.

    <article id="startseite_beitraege" class="clearfix ohneAufzaehlungspunkt">
    
    <?php
    
    // WP_Query arguments
    $args = array (
    	'category_name'          => 'Allgemein',
    	'posts_per_page'         => '3',
    );
    
    // The Query
    $query = new WP_Query( $args );
    
    // The Loop
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    
    // do something
    echo '<ul class="startseiten_posts">';
    		echo '<li class="four-col">';
    		echo '<div class="beitragsbild_vorschau_startseite">' . the_post_thumbnail ($post_id, '400,9999') . '<div>';
    		echo '<div class="beitragstext_auszug_startseite">';
    		echo '<h1 class="beitragsueberschrift_vorschau_startseite">' . get_the_title() . '</h1>' ;
    		echo '<div class="beitragstext_auszug">'. the_content() .'</div>';
    		echo '</div">';
    	}
    	echo '</li>';
    	echo '</ul>';
    
    } else {
    	// no posts found
    }
    
    // Restore original Post Data
    wp_reset_postdata();
    
    ?>
    
    </article>
    
         </aside><!-- .sidebar .widget-area -->
    
    <div id="content" class="twelve-col">
    
    		<?php
    		// Start the loop.
    		while ( have_posts() ) : the_post();
    
    			// Include the page content template.
    			get_template_part( 'template-parts/content', 'page' );
    
    			// If comments are open or we have at least one comment, load up the comment template.
    			if ( comments_open() || get_comments_number() ) {
    				comments_template();
    			}
    
    			// End of the loop.
    		endwhile;
    		?>
    
    </div><!--Content-->

    Der Content unter den Beiträgen wird jetzt auch richtig ausgegeben. Die Beiträge darüber werden auch ausgegeben. Der erste Beitrag wird mir jetzt auch von der Formatierung richtig ausgegeben, bei den anderen beiden Beiträgen werden aber die Bilder in einer anderen Größe ausgegeben. Muss ich hier noch etwas ergänzen. So dass jeder Beitrag in dem li ausgegeben wird?

    Du hast the_post_thumbail( $size, $attr ); den falschen Parameter übergeben. Wenn du eine Größe verwenden möchtest geht das so:

    the_post_thumbnail();                  // ohne Parameter -> 'post-thumbnail'
    
    the_post_thumbnail( 'thumbnail' );       // Thumbnail
    the_post_thumbnail( 'medium' );          // Mittel
    the_post_thumbnail( 'large' );           // Groß
    the_post_thumbnail( 'full' );            // Originalgröße
    
    the_post_thumbnail( array(100, 100) );  // Andere Größe

    Bei solchen Fragen hilft ein Blick in die Dokumentation. 😉

    Wenn du übrigens nur eine Auszug des Beitrags ausgeben möchtest (zumindest deutet die CSS-Klasse darauf hin), solltest du statt the_content() die Funktion the_excerpt() nutzen.

    Thread-Ersteller morgana17

    (@morgana17)

    Vielen Dank. Ich habe es geändert. Aber geht leider trotzdem nicht.
    Alle Beiträge werden in einem li ausgegeben, es soll aber jeder Beitrag in einem extra li stehen.. also:

    ul
    li
    li
    li
    ul

    ist das möglich?

    Ja. Wobei es hier ein wenig übers Ziel hinausschießt, das zu programmieren.
    Aber … was soll’s. Schau mal hier.

    (Wobei ich nicht ganz verstehe, wieso Blogbeiträge ein Listenelement sein sollen?)

    Thread-Ersteller morgana17

    (@morgana17)

    Juuuhuu 🙂 jetzt geht es 🙂 vielen vielen Dank

    Ich dachte ich nehme eine Listenelement da es eine Aufzählung der Beiträge ist… Hättest Du jeden Beitrag in einem div ausgegeben?

    Ich will die Beiträge dann in dreier Reihe nebeneinander anordnen..
    Ginge im Grunde auch ohne li´s, da hast du recht…

    Man spricht gerne davon HTML semantisch zu verwenden. Ursprünglich war HTML dazu gedacht, Dokumente zu strukturieren. Zwischendurch wurden dann Tabellen mal als Instrument zur Gestaltung verwendet, was nicht nur scheußlich zu programmieren war. Inzwischen wird aber eigentlich für alle gestalterischen Elemente CSS verwendet. Kurz: Wenn Beiträge nebeneinander stehen sollen, hat das mit … äh – Listen?! … nichts zu tun. 🙂

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „Beiträge über Content ausgeben“ ist für neue Antworten geschlossen.