WordPress Query Quick Tipps

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 15 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Der Loop von WordPress ist ein sehr mächtiges Werkzeug. Die meisten Nutzer werden wohl den Standard-Loop verwenden. Mit Hilfe einiger Funktionen kann man aber den Loop sehr schön an bestimmte Anforderungen und Bedürfnisse anpassen. Ein Beispiel habe ich schon im letzten Beitrag für Feeds gezeigt.

Einige Beispiele, die für mein Empfinden eher selten genutzt werden, was schade ist und immer wieder zu Fragen bei den Nutzern führt, möchte ich in diesem Beitrag aufzeigen; kurz und knapp – verwenden und lernen.

Seitenumbruch mit eigenem WP-Query

Nutzt man eigene Loops, die über die Variable $wp_query definiert werden, kreiert diese also mit dem WP-Query, dann wird im Standard keine Pagination (Seitenumbruch) dargestellt. Zwei Beispiele mit unterschiedlichen Herangehensweisen.


<?php
$my_query = new WP_Query('cat=-21&showposts=3&paged='.$paged);
if ($my_query->have_posts()) {
	while ( $my_query->have_posts() ) : $my_query->the_post();
?>

<?php if (have_posts()) : ?>
     <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
            query_posts("category_name=somecat&paged=$paged"); ?>
        <?php while (have_posts()) : the_post(); ?>

Wer den einen oder anderen Sonderfall mit dem Loop bauen will, der sollte sich den Array dieser Variable näher anschauen, denn viele nützliche Inhalte sind vorhanden und können die eine oder andere Lösung ersetzen. Die Ausgabe kann mich sich sehr schön mit folgendem einfach Syntax anschauen.

var_dump( $wp_query );

Für PHPler nichts neues, für den einen oder anderen Theme-Autor aber vielleicht doch.

Kategorien oder Tag nicht im Loop ausgeben

Nicht selten möchte man die eine oder andere Kategorie nicht im Loop haben. Ein typisches Beispiel ist, wenn man einen Side- oder Thumbler-Blog mit WordPress parallel bedient. Dafür braucht man kein Plugin. Man kann beispielsweise eine Kategorie nehmen, diese im Sidebar via extra Loop ausgeben und so seine kleinen Tipps und Links posten. Auf der Seite des Blog grenzt man diese Kategorie im Blog einfach aus und hat so dort nur die Beiträge mir mehr Inhalt.


<?php query_posts('cat=-2'); ?>

Ähnlich geht das auch für Tags, der Unterschied liegt hier in der Übergabe des Tag-Namen und nicht die ID.


<?php query_posts('tag=mytag'); ?>

Standard-Loop, der allerdings die Kategorie mit ID 21 nicht berücksichtigt

Im einfachsten Fall baut man den Loop wie folgt, nimmt die Kategorie raus und damit geht auch die Pagination. Hier mal der Loop im Ganzen, so dass man ihn nur mit Inhalt füllen muss.


<?php
$my_query = new WP_Query('cat=-21');
if ( $my_query->have_posts() ) :
	while ( $my_query->have_posts() ) : $my_query->the_post();
?>
		<div id="post-<?php the_ID(); ?>">
			. . .
		</div>
	<?php endwhile; else: ?>
	<p><?php _e('Nichts gefunden, was den Suchkriterien entspricht.'); ?></p>
<?php endif; ?>

Loop, der nur die Artikel ausgibt, die Tag mytag haben


<?php
$my_query = new WP_Query('tag=mytag');
if ( $my_query->have_posts() ) :
	while ( $my_query->have_posts() ) : $my_query->the_post();
?>
		<div id="post-<?php the_ID(); ?>"
			. . .
		</div>
	<?php endwhile; else: ?>
	<p><?php _e('Nichts gefunden, was den Suchkriterien entspricht.'); ?></p>
<?php endif; ?>

Eigener Loop, der Paged definiert


<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts($query_string . "&cat=-2&paged=$paged");
?>

Loop mit Paged nur für Tag mytag


<?php if ( have_posts() ) :
	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
	query_posts($query_string . "tag=mytag&paged=$paged");
	while ( have_posts() ) : the_post();
?>
		<div id="post-<?php the_ID(); ?>">
			. . .
		</div>
	<?php endwhile; else: ?>
	<p><?php _e('Nichts gefunden, was den Suchkriterien entspricht.'); ?></p>
<?php endif; ?>

Loop Beiträge aus der Zukunft


<?php
$my_query = new WP_Query('post_status=future&order=DESC&showposts=5');
if ( $my_query->have_posts() ) {
 
	_e('<h2>Vorgesehene Beiträge</h2>');
	echo '<ul>';
 
	while ( $my_query->have_posts() ) :
		$my_query->the_post();
		$do_not_duplicate = $post->ID;
		echo '<li>' . get_the_title() . __(' (erscheint am ') . get_the_time('d.m.Y') . __(')') . '</li>';
	endwhile; 
 
	echo '</ul>';
}
?>

Loop auf Basis benutzerdefinierten Felder


<?php query_posts( 'meta_key=my_type&meta_value=my_value' );
if (have_posts()) :
while ( have_posts() ) : the_post(); ?>

Loop auf Basis benutzerdefinierten Felder, der die nach diesen sortiert


query_posts('meta_key=my_type&meta_compare=<=&my_value=20&orderby=my_value');
if (have_posts()) :
while ( have_posts() ) : the_post(); ?>

Inhalt genauer einer Seite laden


// lade Seite mit Namen: kontakt; alternativ page_id oder name (slug)
<?php query_posts( 'pagename=kontakt' );
if (have_posts()) :
while ( have_posts() ) : the_post(); ?>

Reset Query

Probleme mit einem eigenen Query? Wenn man mehrere Loops einsetzt und dabei Fehler in der Ausgabe entdeckt, dann kann ein Reset helfen. Wenige dokumentiert, aber sehr nützlich, wie ich finde. Ich setze diesen immer ein, wenn ich mehrere Queries lade oder Probleme bei der Ausgabe habe.

Der klassische Reset geschieht mit der folgenden Funktion und wird nach einem query_posts() eingesetzt.


rewind_posts();

Dazu ein kleines Beispiel.


query_posts('category_name=cattest');
while ( have_posts() ) :
	the_post();
	// im loop
endwhile;

//loop reset
rewind_posts();

// 2. loop
while ( have_posts() ) :
	the_post();
	// im Loop
endwhile;

Reset $wp_query

Diese Funktion resetet den globalen $wp_query – also nach einem eigenen WP_Query zu nutzen. Nach oder vor einem Query query_posts() gesetzt, kann es wahre Wunder bewirken.


/**
 * Destroy the previous query and setup a new query.
 *
 * This should be used after {@link query_posts()} and before another {@link
 * query_posts()}. This will remove obscure bugs that occur when the previous
 * wp_query object is not destroyed properly before another is setup.
 *
 * @since 2.3.0
 * @uses $wp_query
 */
wp_reset_query();

Auch dazu ein kleines Beispiel. Der erste Loop gibt die Anzahl der Beiträge zurück, die man bei einer Suche erhält. Danach setze ich einen Reset und fahre dann mit einem Standard-Loop die Ausgabe. Zur Ausgabe der Suche gab es bereits einen Artikel, der Hintergründe darlegt.


<?php if (have_posts()) : ?>

	<h2>Search Results<br /><small>
	<?php /* Search Count */
		$allsearch = new WP_Query("s=$s&showposts=-1");
		$key = wp_specialchars($s, 1);
		$count = $allsearch->post_count;
		_e('term: ');
		echo $key;
		_e(' — ');
		echo $count . ' ';
		_e('posts'); wp_reset_query(); ?></small></h2>

	<?php while (have_posts()) : the_post(); ?>

Custom Post Type und Custom Taxonomie im Loop

Ab WordPress 3.0 stehen diese beiden Möglichkeiten zur Verfügung und können direkt im Loop berücksichtigt werden. Einiges zum Thema habe ich schon bei WPD und WPEngineer berichtet.


global $wp_query;

query_posts( array(
   'post_type' => 'message' ,
   "taxonomy_name" => "term_name",
   'showposts' => 10 )
);

Custom Post Type und multiple Taxonomie

Manchmal will man den Tag der taxonomie mit in den Loop bekommen, ein kleiner Trick im SQL hilft.


$result = new WP_Query( 'post_type=message&tax_terms=term_name:tag_1,term_name:tag_2' );
foreach ($result->posts as $post) {
      $title .= $post->post_title. "\n";
}

Von Frank Bültge

bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.