Leitfaden: Wie man Beiträge in WordPress abfragt
Welche Methoden stehen zum Erstellen einer benutzerdefinierten Post-Abfrage zur Verfügung, und wann werden sie am besten verwendet? Dieser Beitrag zielt darauf ab, ein solides Verständnis für zwei Methoden zum Abfragen von Beiträgen zu schaffen, wie man auf die Ergebnisse zugreift, wie man Argumente baut und schließlich, wie man danach aufräumt. Die beiden Methoden, die wir uns ansehen werden, sind get_posts()
und WP_Query
.
Wenn es darum geht, eine neue Post-Abfrage zu stellen, gibt es eigentlich zwei Möglichkeiten (zum Zeitpunkt des Schreibens). Die Wahl hängt wirklich nur von Ihren Vorlieben ab (und einigen geringfügigen Leistungseffekten). Eine Option kann die globale Schleife/Abfrage, in der Sie sich gerade befinden, durcheinanderbringen, wenn Sie sie nicht richtig handhaben. Mit einer Option handhaben Sie Objekte und mit der anderen Option handhaben Sie ein Array. Die Argumente zum Anpassen der Post-Abfrage sind jedoch identisch.
Globale Abfrage?
Wenn Sie sich nicht sicher sind, was ich mit „die globale Abfrage durcheinander bringen” meine, ist es das. WordPress macht immer eine globale Abfrage, je nachdem, auf welcher Seite Sie sich befinden. Wenn ein Besucher ein Kategoriearchiv besucht, hat WordPress eine Post-Abfrage dafür gemacht Das Thema würde normalerweise auf Posts in der Abfrage zugreifen, indem es „die Schleife” verwendet.Wenn wir eine neue Abfrage mit einer eigenen Schleife innerhalb dieser Schleife erstellen, müssen wir sicherstellen, dass die globale Abfrage von WordPress und unsere Abfrage getrennt behandelt werden.
Wenn Sie jedoch die Post-Abfrage von WordPress ändern möchten, ist das eine andere Geschichte. Ich habe einen anderen Beitrag, der ausführlich darauf eingeht, wie man das macht.
Schauen wir uns die beiden Optionen an, die wir haben, und wie wir damit umgehen. Danach sehen wir uns die Argumente zum Anpassen der Abfrage an. Beachten Sie, dass die Argumente für beide identisch sind.
Die zwei Methoden zum Abfragen von Beiträgen
Sie können Beiträge entweder mit der Funktion abfragen get_posts()
oder eine neue Instanz von erstellen WP_Query.
. Die erste Option gibt ein Array von Beiträgen zurück und in der zweiten behandeln Sie ein Objekt. Da get_posts()
ein Array nur der Posts zurückgegeben wird, ist es normalerweise einfacher, dies überall dort zu verwenden, wo Sie möchten. Wenn Sie Ihre Abfrage jedoch paginieren möchten, sollten Sie unbedingt eine WP_Query
Instanz erstellen.
Die Funktion get_posts
ist eine Wrapper-Funktion, WP_Query
was bedeutet, dass sie die gleichen Argumente akzeptiert, aber get_posts
einige zusätzliche „Alias”-Argumente hat. Die WordPress-Dokumentationsseite für get_posts listet keine möglichen Argumente auf (außer den Alias-Argumenten), sondern verweist für die Argumente auf die Dokumentationsseite für WP_Query. Wir werden uns die Argumente später genauer ansehen.
Wenn die Leistung ein Problem ist (dh die Website hat viele Posts), get_posts
ist dies schneller als die Verwendung, WP_Query
da die Berechnung für die Paginierung übersprungen wird.
Die Methode zum Durchlaufen Ihrer benutzerdefinierten Post-Abfrage unterscheidet sich je nach gewählter Methode. Sie sollten mit der gemeinsamen WordPress-Schleife vertraut sein, die in fast allen Designvorlagen verwendet wird:
if (have_posts()) {
while (have_posts()): the_post();
// Access to each post; you can use template tags here
endwhile;
}
Schleifen mit WP_Query
Das Schleifen der Ergebnisse von using WP_Query
ist genau das gleiche, außer dass wir uns speziell auf das Instanzobjekt in der Schleife beziehen. Wir müssen auch daran denken, den Status zurückzusetzen, nachdem wir mit der Schleife fertig sind, damit das globale Post-Objekt auf den vorherigen Zustand zurückgesetzt wird. Dazu verwenden wir wp_reset_postdata()
.
$custom_query = new WP_Query([/ Arguments here /]);
if ($custom_query->have_posts()) {
while ($custom_query->have_posts()): $custom_query->the_post();
// Access to each post; you can use template tags here
endwhile;
wp_reset_postdata();
}
WP_Query
Wenn Sie das von (im obigen Beispiel) instanziierte Objekt ausgeben $custom_query
, finden Sie die vollständige Abfrage und die verwendeten Argumente. Die interessanten Teile hier sind die Eigenschaften ‘ found_posts
‘ und ‘ posts
‘. Die posts
Eigenschaft ‘ ‘ enthält das Ergebnis von Post-Objekten, die die Schleife durchlaufen wird. Die Anzahl der Posts, die Ihrer Suchanfrage entsprechen, wird in „ found_posts
” zurückgegeben und ist nützlich, wenn Sie eine benutzerdefinierte Paginierung erstellen möchten. Teilen Sie diesen Wert mit der WordPress-Einstellung für die Anzahl der Beiträge pro Seite, um herauszufinden, wie viele Seiten Sie für Ihre Abfrage benötigen, oder beziehen Sie sich einfach auf die Eigenschaft „ max_num_pages
“.
Hinweis: Wenn Sie get_posts
WordPress verwenden, wird nur die posts
Eigenschaft „ ” (die ein Array ist) vom WP_Query
Objekt zurückgegeben.
Schleife mit get_posts
Bei Verwendung verwenden get_posts
wir nicht die übliche „WordPress-Schleife”, sondern verwenden eine normale PHP-Array-Schleife. Jedes Element im Array sind Post-Objekte, und es ist kein Zurücksetzen erforderlich, nachdem Sie mit der Schleife fertig sind. Denken Sie daran, dass Template-Tags (wie the_title()
, the_permalink()
usw.) innerhalb dieser Schleife nicht verfügbar sind. Sie müssen sich auf die Eigenschaften des Post-Objekts beziehen (z. B. $custom_post->ID
).
$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $custom_post) {
// Template tags are not available here, refer to the post object properties, for example:
echo $custom_post->post_title;
}
Ich empfehle, dass Sie Ihre Post-Objekte anders als benennen $post
. Es können Probleme auftreten, wenn Sie versuchen, auf Post-Eigenschaften zuzugreifen (es bezieht sich möglicherweise auf das globale Post-Objekt und nicht auf den Post in der Schleife).
Wenn Sie Vorlagen-Tags für einen einfacheren Zugriff auf Beitragsinformationen verwenden möchten (z. B. the_title()
und the_permalink()
), können Sie dies tun. Tun Sie dies, indem Sie WordPress anweisen, das globale Post-Objekt innerhalb der Schleife mit einzurichten setup_postdata()
. Wenn Sie dies tun, müssen Sie den Status mit wp_reset_postdata()
nach der Schleife zurücksetzen.
$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $post) {
setup_postdata($post);
// Template tags are available here, for example:
the_title();
}
wp_reset_postdata();
Denken Sie daran, setup_postdata
dass die Objekte, die Sie durchlaufen (der „ as
“-Teil in der foreach-Schleife), benannt werden müssen $post
! Im ersten Beispiel habe ich die Post-Objekte benannt $custom_post
und das würde mit nicht funktionieren setup_postdata()
.
Wenn Sie jedoch nur Zugriff auf grundlegende Beitragsinformationen benötigen, können Sie das Einrichten des globalen Beitragsobjekts auch überspringen und stattdessen die entsprechenden „ get_
“-Vorlagen-Tags und die Beitrags-ID verwenden. Beispielsweise the_permalink()
funktioniert das Tag nur korrekt, wenn das globale Post-Objekt eingerichtet ist, aber Sie können den Post-Permalink ohne das globale Post-Objekt einfach mit anfordern echo get_the_permalink($custom_post->ID)
.
Argumente abfragen
Die vollständige Liste aller möglichen Argumente finden Sie auf der Dokumentationsseite von WP_Query. Beispiele für Parameter sind Beiträge mit bestimmten Begriffen aus einer Taxonomie, Beitragsmetawerte, Beitragstypen, Ein- oder Ausschluss bestimmter Beiträge und eine ganze Reihe von Optionen zum Sortieren der Ergebnisse. Es gibt zu viele, um sie im Detail durchzugehen, aber hier sind einige gängige Beispiele für Argumente zum Abfragen von Beiträgen.
Beispiel 1: Verwandte Beiträge aus derselben Kategorie
Angenommen, Sie möchten am Ende eines einzelnen Beitrags „verwandte Beiträge” anzeigen. Es sollte eine zufällige Auswahl von 3 Beiträgen anzeigen, die sich in derselben Kategorie wie der aktuelle Beitrag befinden, und der aktuelle Beitrag sollte aus dem Ergebnis ausgeschlossen werden.
$post_id = get_the_ID(); // current post ID
$custom_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 3,
'category__in' => wp_get_post_categories($post_id),
'post__not_in' => [$post_id],
'orderby' => 'rand'
]);
Die Argumente sind ziemlich selbsterklärend. Ich frage nur nach ‘ post
‘ in ‘ post_type
und maximal 3 Posts in ‘ posts_per_page'
.
Zum Abfragen von Posts in Kategorien können Sie eine tax_query erstellen oder das einfachere ‘ category__in
‘ verwenden (NB: funktioniert nur für die Post-Kategorie). Im obigen Beispiel verwende ich wp_get_post_categories()
, um ein Array von Begriffs-IDs zu erhalten, die dem bereitgestellten Beitrag zugewiesen sind, und verwende dies für das Argument „ category__in
“.
Sie können Beitrags-IDs mit „ post__not_in
” ausschließen, während ich die aktuelle Beitrags-ID angegeben habe. Schließlich habe ich um eine zufällige Reihenfolge der Posts gebeten, indem ich ‘ rand
‘ in ‘ orderby
‘ gesetzt habe. Sie könnten zB ‘ title
‘ oder ‘ date
‘ angeben, um sie anders anzuordnen. Werfen Sie einen Blick in die Dokumentation zur Bestellung, um zu sehen, was möglich ist.
Beispiel 2: Alle Beiträge eines benutzerdefinierten Beitragstyps mit mehreren Sortierargumenten
In diesem Beispiel gehen wir davon aus, dass Sie einen benutzerdefinierten Beitragstyp „ book
” haben und in einer benutzerdefinierten Seitenvorlage alle veröffentlichten Bücher anzeigen möchten. Sie möchten die Beiträge in erster Linie nach menu_order (das Seitenattribut, es ist eine Zahl, die Sie pro Beitrag festlegen können) und zweitens nach dem Titel des Beitrags ordnen.
$custom_query = new WP_Query([
'post_type' => 'book',
'posts_per_page' => -1,
'orderby' => ['meny_order' => 'ASC', 'title' => 'DESC']
]);
Auch hier sind die Argumente ziemlich selbsterklärend. Ich fordere den Beitragstyp ‘ book
‘ als ‘ post_type
‘ an. Wenn Sie ‘ posts_per_page
‘ auf -1 setzen, werden alle (veröffentlichten Posts) abgerufen, es sei denn, Sie geben im post_status
Argument ‘ ‘ etwas anderes an. Schließlich stelle ich ein Array für ‘ orderby
‘ bereit, um WordPress anzuweisen, die Beiträge primär nach Menüreihenfolge in aufsteigender Reihenfolge und zweitens nach Titel in absteigender Reihenfolge zu sortieren.
Beispiel 3: Beiträge mit benutzerdefinierten Metadaten
Angenommen, Sie haben einen benutzerdefinierten Beitragstyp „ book
” und möchten alle Bücher abfragen, die entweder unveröffentlicht sind oder zwischen den Jahren 1990 und 2019 veröffentlicht wurden.
$custom_query = new WP_Query([
'post_type' => 'book',
'posts_per_page' => -1,
'meta_query' => [
'relation' => 'OR',
[
'key' => 'book_status',
'value' => 'unpublished',
'compare' => '='
],
[
'key' => 'year_published',
'value' => [1990, 2019],
'type' => 'numeric',
'compare' => 'BETWEEN'
]
]
]);
Das Erstellen einer Abfrage mithilfe von Post-Meta erfolgt am besten mit meta_query
(für sehr einfache Meta-Argumente können Sie direkt meta_key
und verwenden). meta_value
Das meta_query
Argument ‘ ‘ erfordert ein Array, wobei jedes Argument ein Array ist. Sie können die Beziehung zwischen jedem Argument mit ‘ relation
‘ steuern, das ich OR
im obigen Beispiel auf ” gesetzt habe.
Ich gebe zwei Metadaten-Argumente für ‘ meta_query
‘ an. Der erste vergleicht einfach den Metaschlüssel „ book_status
” mit dem Text „ unpublished
“, und wenn er gleich ist, wird er eingeschlossen. Im zweiten Argument sage ich WordPress, dass es jeden Wert im Metaschlüssel „ year_published
” erhalten soll, der zwischen den Zahlen 1990 und 2019 liegt.
Fazit
Sie sollten nun ein grundlegendes Verständnis der beiden Methoden zum Abfragen von Beiträgen haben. Es gibt keinen großen Unterschied, da Sie dieselbe Abfrage mit beiden erstellen können, aber die Art und Weise der Handhabung der beiden ist unterschiedlich. Die drei bereitgestellten Beispiele für Abfrageargumente berühren nur die Oberfläche dessen, was Sie Abfragen erstellen können. Eine vollständige Übersicht mit vielen Beispielen finden Sie in der WP_Query-Dokumentation .
Wenn Sie neugierig sind, wie Sie die globale Abfrage ändern können, die WordPress durchführt, habe ich einen separaten Beitrag, der sich ausführlich damit befasst.