Benutzerdefinierte WordPress-Abfragen – Verwenden der WP_Query-Klasse

Veröffentlicht: 2021-02-06

WordPress bietet eine große Auswahl an vorgefertigten Funktionen, die in den meisten Fällen die notwendigen Informationen aus der Datenbank abrufen können. Bei der Entwicklung einer WordPress-Website gibt es jedoch zahlreiche Szenarien, in denen ein Filter oder eine Aktion nicht ausreicht, um das gewünschte Ergebnis zu erzielen. In diesen Fällen. Einen Workaround bietet WordPress in Form der Klasse WP_Query .

Werfen wir einen Blick darauf, wie die Klasse WP_Query verwendet werden kann!

Benutzerdefinierte Abfragefälle

HINWEIS: Dieser Artikel setzt voraus, dass Sie über einige Kenntnisse in PHP und MySQL/MariaDB verfügen und mit der Arbeit mit WordPress vertraut sind.

Welche Seite Sie auch besuchen, WordPress führt eine sogenannte „Hauptabfrage“ aus, um den Inhalt anzuzeigen. Wenn Sie also eine Seite wie beispielsweise eine Kategorieansicht besuchen, wird im Hintergrund ein WP_Query Objekt erstellt, das alle erforderlichen Daten aus der Datenbank abruft, um die Seite anzuzeigen.

Was WP_Query im Wesentlichen bietet, ist die Möglichkeit, Inhalte aus der Datenbank Ihrer Website abzurufen, ohne SQL-Abfragen verwenden zu müssen.

Dazu müssen wir lediglich die unseren Bedürfnissen entsprechenden Argumente definieren und schon wird ein neues WP_Query Objekt erstellt und in eine SQL-Abfrage übersetzt.

Ein Beispiel mit WP_Query

Wenn wir Posts aus einer bestimmten Kategorie innerhalb einer anderen Kategorievorlage anzeigen möchten, muss ein neues Abfrageobjekt erstellt werden.

Für die Zwecke dieses Beispiels haben wir das Design Twenty Twenty aktiviert und 2 Posts unter einer Kategorie namens „Kategorie 1“ und 2 Posts unter einer Kategorie namens „Services“ erstellt.

Darüber hinaus haben wir eine benutzerdefinierte Kategorieansichtsvorlage für die Posts der Kategorie 1 erstellt. Der Slug dieser Kategorie ist 'category-1', daher sollte die Datei im Ordner des Themes category-CATEGORYSLUG.php sein, was in unserem Fall category-category-1.php ist.

Bitte fügen Sie Folgendes in die Datei category-category-1.php .

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

Vor der Schleife verwenden wir die Methode have_posts , um festzustellen, ob weitere Beiträge in der Schleife verfügbar sind.

the_post() ist notwendig, damit die Schleife die Posts iteriert und WordPress anweist, zum nächsten Post des Posts-Arrays zu wechseln.

An diesem Punkt sieht unsere Frontend-Ansicht der Kategorie ( https://mycompanyname.com/category/category-1/ ) in etwa so aus:

Ich weiß, dass wir bei der Verwendung dieses Codes versäumt haben, viele Post-Informationen einzufügen, aber für dieses Beispiel ist es besser, es einfach zu halten und nur Post-Titel anzuzeigen.

Um die Abfrageobjekteigenschaften anzuzeigen, die WordPress für diese Ansicht erstellt hat, können wir einfach diese Zeile in unserem Code nach dem endif; Aussage.

 var_dump ( $wp_query->query_vars );

Wenn Sie jetzt Ihre Seite aktualisieren, werden diese Informationen unter der Beitragsliste angezeigt:

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

Angenommen, wir möchten die Liste der Beiträge anzeigen, die zur Kategorie „Dienste“ unter den oben abgebildeten Beiträgen gehören. Da die Seite bereits ein Abfrageobjekt für die aktuelle Kategorie erstellt hat, müssen wir dies umgehen, indem wir die vorhandenen Hauptabfrageargumente manipulieren.

Werfen wir einen Blick auf die Möglichkeiten, die WordPress uns ermöglicht, dies zu erreichen.

Die query_posts-Funktion

Die Funktion query_posts() ist eine Möglichkeit, die Hauptabfrage zu ändern, die WordPress zum Anzeigen von Beiträgen verwendet. Dies geschieht, indem die Hauptabfrage beiseite gelegt und durch eine neue Abfrage ersetzt wird. Sie können dies selbst in der Datei wp-includes/query.php , wo es eingeführt wird.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

Wir werden versuchen, eine weitere Schleife hinzuzufügen, um die 'Services'-Posts anzuzeigen, indem wir die folgenden Zeilen unter dem endwhile; der aktuellen Standardschleife.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Und los gehts:

Es gibt jedoch einen Nachteil bei dieser Methode. Wenn wir versuchen, die im Abfrageobjekt enthaltene Kategorie zu drucken, werden wir feststellen, dass sie geändert wurde.

Versuchen Sie, var_dump ( $wp_query->query_vars["category_name"] ); nach der Services-Abfrage und aktualisieren Sie die Seite. Sie sollten dieses Ergebnis sehen:

 string(8) "services"

Dies geschah, weil die Abfrage geändert, aber nie zurückgesetzt wurde. Dieser Ansatz kann viele Probleme mit den Inhalten verursachen, die unseren Abfragen folgen.

Um diese Konflikte zu vermeiden und nach einem Aufruf von query_posts , rufen wp_reset_query() auf, und die ursprüngliche Hauptabfrage wird wiederhergestellt. Ihr Code sollte also so aussehen:

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

Beim Aktualisieren Ihrer Seite sehen Sie nun, dass die anfängliche Seitenkategorie wieder in der Abfrage enthalten ist.

 string(10) "category-1"

Abschließend sollten wir erwähnen, dass query_posts vermieden werden sollte, da es Ihrer Abfrage Overhead hinzufügt, da es tatsächlich dazu führt, dass die Hauptabfrage erneut ausgeführt wird.

Die Funktion get_posts()

Das gleiche Ergebnis kann mit der Verwendung der Funktion get_posts() werden, um ein Array von Beiträgen abzurufen, die den angegebenen Kriterien entsprechen.

Ersetzen Sie die unten gezeigte Services-Schleife…

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

…mit diesem:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

Wie Sie sehen, mussten wir dieses Mal mit der Kategorie-ID anstelle des Kategorienamens arbeiten, gemäß den von WordPress definierten get_posts() Argumenten.

Eine weitere wichtige Sache, die hier zu beachten ist, ist, dass, obwohl wir die Abfrage nicht zurückgesetzt haben, die var_dump Ausgabe der Abfragekategorie immer noch intakt war und nicht in „Dienste“ geändert wurde. Das liegt daran, dass get_posts() selbst die Hauptabfrage nicht ändert. Wir haben gerade eine neue Variable ' $my_query ' verwendet, um eine neue Instanz des Abfrageobjekts zu erstellen, ohne es zu ersetzen.

Die Funktion get_posts() verwendet die gleichen Parameter wie query_posts() und wird empfohlen, wenn Sie statische benutzerdefinierte Schleifen an beliebiger Stelle in Ihrer Vorlage hinzufügen möchten, da sie sicher und einfach zu verwenden ist.

Erstellen Sie ein neues WP_Query-Objekt

$wp_query ist ein Objekt der Klasse WP_Query und ruft den notwendigen Datenbankinhalt für die aktuelle Seite ab. Durch das Überschreiben dieser Klasse können wir die Ergebnisse anpassen und andere Inhalte anzeigen.

Dies ist das Stück Code, das wir verwenden werden:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

Wir haben das Argument „category_name“ verwendet, um den Slug der Kategorie zu definieren, deren Beiträge angezeigt werden sollen.

Wir haben das neue Objekt new WP_Query( 'category_name=services' ); in der $services_query Variablen.

Dann haben wir eine While-Schleife verwendet, um den Inhalt anzuzeigen, und danach haben wir die Schleife mit wp_reset_postdata(); zurückgesetzt. um die Originaldaten der Hauptabfrage wiederherzustellen.

Wenn Sie mit anderen Argumenten der WordPress-Klasse WP_Query experimentieren möchten, finden Sie die vollständige Liste auf der WordPress-Codex-Seite.