German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)
Jetzt, wo wir fast alles über die WP_Query
-Klasse gelernt haben, ist es Zeit, einige Beispiele auszuprobieren. In diesem Teil werden wir an 10 verschiedenen Szenarien arbeiten, um die WP_Query
-Klasse und verwandte Funktionen zu nutzen.
Es wird eine lustige Übung sein und ich hoffe, dass es ebenso lehrreich sein wird. Lass uns anfangen!
Eine kurze Erinnerung beim Erstellen einer Schleife mit WP_Query
Um diesen Artikel getrennt von der "Mastering WP_Query" -Serie verständlich zu machen, sollte ich ein Nano-Tutorial zum Erstellen von WordPress-Schleifen mit der WP_Query
-Klasse machen.
Es ist nicht anders als eine reguläre Schleife wirklich zu erstellen. Eine typische WordPress-Schleife läuft so:
<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); // Post data goes here. } } ?>
Und beim Erstellen einer Schleife mit der WP_Query
-Klasse gibt es nur wenige Unterschiede:
<?php $args = array( 'category_name' => 'news', 'posts_per_page' => 3 ); $my_query = new WP_Query( $args ); if ( $my_query->have_posts() ) { while ( $my_query->have_posts() ) { $my_query->the_post(); // Post data goes here. } } // Reset the `$post` data to the current post in main query. wp_reset_postdata(); ?>
Lassen Sie uns den Unterschied zwischen den beiden sehen:
- Wir haben einige Argumente für unsere
WP_Query
-Instanz festgelegt, - Wir haben die
WP_Query
-Klasse instanziiert, - Wir haben
$my_query->
am Anfang der Funktionenhave_posts()
undthe_post()
hinzugefügt (also sind sie jetzt die Methoden derWP_Query
-Klasse), - Und wir setzen die Daten von
$post
zurück, damit sie zur Hauptabfrage zurückkehren können.
Jetzt wissen wir, wie man eine Schleife mit WP_Query
und den Unterschied zwischen einer regulären Schleife und einer mit WP_Query
erstellten Schleife erstellt. Wir werden keine Schleifen in jedem Beispiel erstellen (um das Tutorial kurz und thematisch zu halten), so dass Sie in diesem Abschnitt nachsehen können, wenn Sie eine Schleife mit den folgenden Beispielen erstellen müssen.
Beispiel # 1: Die Beiträge eines Autors in diesem Jahr
Angenommen, Sie möchten die Beiträge eines bestimmten Autors im aktuellen Jahr in einem speziellen Abschnitt "Autorenbeiträge dieses Jahr" auflisten. Eine einfache Kombination von zwei WP_Query
-Parametern reicht aus:
<?php // Get the year we're in. $current_year = date( 'Y' ); // Setup arguments. $args = array( // Get the author with the nicename "john". 'author' => 'john', // Get his posts from this year. 'year' => $current_year ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Übergeben Sie diese Abfrage in einer Schleife und Sie können loslegen!
Beispiel # 2: "Neueste Beiträge aus dieser Kategorie" (außer der aktuellen Post)
Angenommen, Sie möchten unter jedem Post auf ihren einzelnen Post-Seiten eine Schleife erstellen und die neuesten Posts aus der Kategorie, in der sich der Post befindet, auflisten. Natürlich müssen Sie den aktuellen Beitrag ausschließen, falls es sich um einen der letzten Beiträge aus dieser Kategorie handelt. So erstellen Sie die Abfrage mit den Parametern 'cat'
und 'post__not_in'
:
<?php // Get the current post id. $current_post_id = get_the_ID(); // Get the current post's category (first one if there's more than one). $current_post_cats = get_the_category(); $current_post_first_cat_id = $current_post_cats[ 0 ]->term_id; // Setup arguments. $args = array( // Get category's posts. 'cat' => $current_post_first_cat_id, // Exclude current post. 'post__not_in' => array( $current_post_id ) ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Für die Schleife schlage ich vor, drei oder vier Spalten mit Post-Thumbnails über Posttiteln zu erstellen. Es wird sehr gut aussehen direkt unter der Post und vor dem Kommentarbereich.
Beispiel # 3: "Beliebteste Beiträge", sortiert nach Kommentaranzahl
WordPress hat kein integriertes "post view count" -System, und Plugins, die diese Funktionalität bieten, sind dafür bekannt, die Website zu verlangsamen (weil die Plugins in jeder Post-Ansicht immer wieder in die Datenbank schreiben, um die Ansicht aufzuzeichnen) zählt). Es gibt jedoch eine andere Art von Messung, um festzustellen, welche Beiträge am beliebtesten sind: Kommentare zählen. Anders als bei der Anzahl der Aufrufe befinden sich die Anzahl der Kommentare bereits in der Datenbank. Mit der WP_Query
-Klasse können Sie Posts ganz einfach nach Kommentaranzahl sortieren:
<?php // Setup arguments. $args = array( // Order by comment count. 'orderby' => 'comment_count' ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Siehst du wie einfach das ist? Stellen Sie sich nun vor, Sie erstellen eine benutzerdefinierte Seitenvorlage mit einer Schleife, die diese Abfrage ausführt - eine Seite mit den meisten kommentierten Posts.
Beispiel # 4: Ein einfaches Slider Setup
Wenn Sie WordPress verwenden, um Firmenwebsites, Portfolios oder Webmagazine zu erstellen, sind Schieberegler zu einem "Muss" Industriestandard geworden. Ich bin nicht wirklich ein Fan von Slidern (ich denke, es ist schlecht UX), aber das Web scheint es zu mögen, also kann ich nicht einfach Nein zu meinen Kunden sagen, während ich Webseiten für sie mache. Wenn sie Schieberegler verwenden möchten, verwende ich eine einfache Abfrage mit der WP_Query
-Klasse:
<?php // Setup arguments. $args = array( // Get the "slider" post type. 'post_type' => 'slider', // Get a specific slider category. 'category_name' => 'home-slides', // Get all slides and don't paginate. 'nopaging' => true ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Mit dem Argument 'cat'
können Folien aus verschiedenen Kategorien abgerufen werden, sodass Sie Foliengruppen trennen und mehrere Schieberegler auf mehreren Seiten verwenden können. Wenn Sie nur einen Schieberegler auf Ihrer Website verwenden möchten, können Sie diese Zeile löschen, und Sie können loslegen.
Beispiel # 5: Ein zufälliges Zitat in der Sidebar
Wenn Sie sich für Literatur oder Religion interessieren, möchten Sie vielleicht einige Ihrer Lieblingszitate in der Seitenleiste haben - es ist keine Platzverschwendung, wenn Sie den Bereich mit Absicht nutzen. Wenn Sie also in jeder Seitenansicht ein zufälliges Zitat in Ihrer Seitenleiste auflisten möchten, können Sie das folgende Code-Snippet verwenden, um den Post-Typ zu erstellen und die folgende Abfrage zu verwenden, um eine Schleife in Ihrer Seitenleiste zu erstellen:
<?php /* * Create new post type called "Quotes" * (refer to the `register_post_type` function to * learn more about creating custom post types). */ function quote_post_type() { $args = array( 'label' => 'Quotes', 'public' => true ); register_post_type( 'quotes', $args ); } add_action( 'init', 'quote_post_type' ); // Setup arguments. $args = array( // Get the "quotes" psot type. 'post_type' => 'quotes', // Randomize the order. 'orderby' => 'rand', // Get only one item. 'posts_per_page' => 1, ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Eine einfache und elegante Lösung.
Beispiel # 6: Produkte zwischen einem Preisbereich auflisten
Ich habe dieses Beispiel auf Scribu.net gefunden und muss sagen, es könnte der beste WP_Query
-Trick in diesem Tutorial sein. Es ist ein bisschen technischer als die anderen, weil es in diesem Kontext auf eine WordPress-basierte E-Commerce-Website angewendet werden kann.
Hier ist das Code-Snippet, das Sie verwenden möchten, wenn Sie Artikel aus einem benutzerdefinierten Postposttyp "Produkt" auflisten und die Ergebnisse mit den benutzerdefinierten Feldern "Preis" filtern möchten:
<?php // Source: http://scribu.net/wordpress/advanced-metadata-queries.html // Setup arguments. $args = array( // Get the "product" post type. 'post_type' => 'product', // Setup the "meta query". 'meta_query' => array( array( // Get the "price" custom field. 'key' => 'price', // Set the price values. 'value' => array( 100, 200 ), // Set the compare operator. 'compare' => 'BETWEEN', // Only look at numeric fields. 'type' => 'numeric', ) ) ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Ein großes Lob an Silviu-Cristian Burca!
Beispiel # 7: Ein Shortcode zum Einbetten von Posts innerhalb von Posts
Hier ist eine unterhaltsame Übung - und wir nutzen auch die Shortcode-API! In diesem Beispiel erstellen wir einen Shortcode, der einen Post in einen Post einbetten kann. (Ich habe mich kaum von der Benennung des Shortcodes [postception]
enthalten.) Im folgenden Code-Snippet erstellen wir eine Shortcode-Funktion, die es uns ermöglicht, Posts (oder einen beliebigen benutzerdefinierten Post-Typ) einzubetten und uns die Wahl zu geben, ob der vollständige Post oder nur ein Auszug angezeigt werden soll:
<?php /* * Usage: * * [embed_post slug="my-post"] * [embed_post slug="my-post" full="false"] * [embed_post type="movie" slug="inception"] */ function tutsplus_embedded_post_shortcode( $attributes ) { // Extract shortcode attributes. extract( shortcode_atts( array( 'type' => 'post', 'slug' => '', 'full' => true ), $attributes ) ); // Setup arguments. $args = array( // Get post type ("post" by default). 'post_type' => $type, // Get post by slug. 'name' => $slug ); // Instantiate new query instance. $my_query = new WP_Query( $args ); // Check that we have query results. if ( $my_query->have_posts() ) { // Begin generating markup. $output = '<section class="embedded-post">'; // Start looping over the query results. while ( $my_query->have_posts() ) { $my_query->the_post(); // Add title to output. $output .= '<h2 class="embedded-post-title">'; $output .= get_the_title(); $output .= '</h2>'; // Get full post if `$full` is true, otherwise, show the get excerpt if ( 'true' === $full ) { // Add full content to output. $output .= '<div class="embedded-post-content">'; $output .= get_the_content(); $output .= '</div>'; } else { // Add excerpt to output. $output .= '<div class="embedded-post-excerpt">'; $output .= get_the_excerpt(); $output .= '… <a href="' . get_permalink() . '">' . __( 'See full post', 'tutsplus' ) . ' »</a>'; $output .= '</div>'; } } // End generating markup. $output .= '</section>'; } else { // Output message to let user know that no posts were found. $output = '<section class="embedded-post-error">'; $output .= '<p>' . __( 'No posts found.', 'tutsplus' ) . '</p>'; $output .= '</section>'; } wp_reset_postdata(); return $output; } add_shortcode( 'embed_post', 'tutsplus_embedded_post_shortcode' ); ?>
Beispiel #8: Liste der aktuellen geplanten Beiträge (mit optionalen Auszügen)
Hier ist eine Idee: Warum zeigen Sie Ihren Besuchern nicht ein paar "Vorschaubilder" Ihrer kommenden Posts? Mit der folgenden Funktion können Sie Ihre geplanten Posts mit oder ohne Auszüge nach den Titeln auflisten:
<?php /* * Usage with Excerpts: * * <?php echo tutsplus_show_drafts(); ?> * * Usage without Excerpts: * * <?php echo tutsplus_show_drafts( false ); ?> */ function tutsplus_show_drafts( $show_excerpts = true ) { // Setup arguments. $args = array( 'post_status' => 'pending', 'nopaging' => true ); // Instantiate new query instance. $my_query = new WP_Query( $args ); // Check that we have query results. if ( $my_query->have_posts() ) { // Begin generating markup. $output = '<section class="pending-posts">'; // Start looping over the query results. while ( $my_query->have_posts() ) { $my_query->the_post(); // Output draft post title and excerpt (if enabled). $output .= '<div class="pending">'; $output .= '<h3 class="pending-title">' . get_the_title() . '</h3>'; $output .= get_the_title(); $output .= '</h3>'; if ( $show_excerpts ) { $output .= '<div class="pending-excerpt">'; $output .= get_the_excerpt(); $output .= '</div>'; } $output .= '</div>'; } // End generating markup. $output .= '</section>'; } else { // Let user know that nothing was found. $output = '<section class="drafts-error">'; $output .= '<p>' . __( 'Nothing found', 'tutsplus' ) . '</p>'; $output .= '</section>'; } wp_reset_postdata(); return $output; } ?>
Beispiel #9: "Beitrag von vor einem Jahr heute"
Wenn Ihr Blog älter als ein Jahr ist und Ihre Inhalte zeitlos sind (was bedeutet, dass sowohl eine Person aus den Jahren 2015 als auch 2025 den Artikel relevant findet), kann das Hinzufügen eines Abschnitts "Beitrag von einem Jahr vor heute" Ihre Seitenaufrufe erhöhen. Hier ist, wie Sie es tun:
<?php // Setup arguments. $args = array( // Day (1 - 31). 'day' => date( 'j' ), // Month (1 - 12). 'monthnum' => date( 'n' ), // Year (minus 1). 'year' => date( 'Y' ) - 1, // Show only one post. 'posts_per_page' => 1 ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Verwenden Sie diese Abfrage, um eine Schleife zu erstellen, die einen einzelnen Post von gestern anzeigt.
Beispiel # 10: Zeige Kinder der aktuellen Seite
Sie haben nichts anderes als die Titel von Unterseiten, die Sie in Ihre Seite "Services", "Unsere Werke" oder "Mein Portfolio" einfügen können? Vielleicht ein Intro-Absatz, aber Sie haben Recht, diese Seiten sind dazu verdammt, "Platzhalter" zu sein. Trotzdem ist es eine gute Idee, Unterseiten darin zu platzieren - vielleicht ein Raster mit quadratischen Miniaturansichten und Titeln darunter. Lassen Sie uns sehen, welche Abfrage wir verwenden sollten, wenn Sie eine solche Seitenvorlage erstellen:
<?php $current_page_id = get_the_ID(); // Setup arguments. $args = array( // Get children of current page. 'parent' => $current_page_id, // Disable pagination. 'nopaging' => true ); // Instantiate new query instance. $my_query = new WP_Query( $args ); ?>
Aufwickeln
Ich hoffe, Ihnen hat diese Beispiele genauso gut gefallen, wie ich sie vorbereitet habe. Ich habe besonders darauf geachtet, verschiedene Beispiele zu geben, sowohl um Spaß zu haben als auch um Ihre Kreativität zu fördern.
Wenn Sie beim Lesen dieser Artikel an bessere Beispiele gedacht haben oder Fragen haben, zögern Sie nicht, unten einen Kommentar zu verfassen. Und wenn Ihnen der Artikel gefallen hat, vergessen Sie nicht, ihn mit Ihren Freunden zu teilen!
Im nächsten Teil sprechen wir über WP_User_Query
, eine der Schwesterklassen von WP_Query
. Bis dann!