WordPress get_posts ist eine leistungsstarke Funktion, mit der Entwickler Inhalte aus der WordPress-Datenbank abrufen können. Du kannst bis ins kleinste Detail festlegen, welche Beiträge, Seiten und benutzerdefinierten Posttypen du suchst, deine benutzerdefinierte Ergebnismenge erhalten, dann die Elemente wie einen PHP/MySQL-Ninja filtern und ordnen.

Aber keine Angst, wenn du kein PHP-Profi bist, es gibt unzählige PHP-Tutorials, die du dir ansehen oder lesen und die Sprache lernen kannst. Du brauchst nur ein wenige PHP-Kenntnisse, um benutzerdefinierte Listen von Beiträgen zu erstellen, die auf deiner Website angezeigt werden sollen, da die Funktion get_posts eine Reihe von Parametern enthält, die es ermöglichen, einfache oder erweiterte Abfragen zu erstellen.

Die Verwendung von WordPress get_posts ist ein zweistufiger Prozess:

In diesem Beitrag werden wir zunächst auf die oben genannten Schlüsselkonzepte eingehen, insbesondere wie get_posts funktioniert, wie man eine benutzerdefinierte Abfrage erstellt und wie man Daten auf der Startseite anzeigt.
Dann werde ich ein Beispiel aus der Praxis mit einem Codeausschnitt liefern, den du in deiner Stagingumgebung für deine Tests und Entwicklungen kopieren, bearbeiten und verwenden kannst.

Hinweis: Wir unterscheiden in der Regel zwischen Beiträgen, Seiten und benutzerdefinierten Beitragsarten. In diesem Artikel verwenden wir den Begriff „Beiträge“ für regelmäßige Blog-Einträge sowie für Seiten und benutzerdefinierte Beitragsarten. Alle diese Posttypen werden in der Tabelle wp_posts‚ der Datenbank gespeichert. Der Hauptunterschied zwischen den Posttypen besteht im Wert des Feldes „post_type„. Aus Entwicklersicht sind Beiträge, Seiten und benutzerdefinierte Beiträge alle Beiträge.

Einführung in die WordPress get_posts Funktion

Der Kodex beschreibt die Funktion get_posts wie folgt:

Ruft ein Array der letzten Beiträge oder Beiträge ab, die den angegebenen Kriterien entsprechen.

Wir können get_posts auf diese Weise verwenden:

$args = array(
	'numberposts'	=> 20,
	'category'		=> 4
);
$my_posts = get_posts( $args );

if( ! empty( $my_posts ) ){
	$output = '<ul>';
	foreach ( $my_posts as $p ){
		$output .= '<li><a href="' . get_permalink( $p->ID ) . '">' 
		. $p->post_title . '</a></li>';
	}
	$output .= '<ul>';
}

Die obige Funktion ruft die letzten 20 Blog-Einträge in der angegebenen Kategorie ab (standardmäßig ist der ‚post_type‚ ‚post‚) und gibt ein Array von $post-Objekten zurück. Du kannst über das Array iterieren, um die Beiträge auf dem Bildschirm anzuzeigen. Es ist ziemlich einfach, oder?

get_posts verwendet WP_Query, um Postsendungen abzurufen, und es hält ein Array mit den gleichen Parametern in WP_Query verfügbar (mit wenigen Ausnahmen). So haben wir eine riesige Liste von Variablen, die wir verwenden können, um unsere eigenen Abfragen zu erstellen. Diese Parameter sind in den folgenden 15 Kategorien zusammengefasst:

Ein kurzer Blick auf die obige Liste kann dir eine Vorstellung von der Vielfalt der benutzerdefinierten Abfragen geben, die du erstellen und gegen die WordPress-Datenbank ausführen kannst. Tauchen wir also tiefer in die Query-Parameter ein und beginnen wir, unsere Listen der Beiträge zu erstellen.

Wie man Abfragen mit WordPress Erstellt get_posts

Jede Kategorie von Parametern bezieht sich auf die gleiche Information. Beispielsweise können wir eine Abfrage erstellen, um Beiträge von den angegebenen Autoren abzurufen oder den/die angegebenen Autor(en) auszuschließen und den Autor nach ID oder Nickname zu definieren. Auf die gleiche Weise können wir Abfragen erstellen, die Beiträge nach Kategorie, Tag, Taxonomie, Datum, benutzerdefinierten Feldern und noch mehr abrufen.

So Verwendest du Parameter zum Erstellen Einfacher Abfragen

Viele Parameter können in ähnlicher Weise verwendet werden, unabhängig davon, welcher Kategorie sie angehören. Die folgenden Parameter erlauben es beispielsweise, die Datenbank nach Postautor(en) abzufragen:

Wie können wir diese Parameter nutzen?

Im folgenden Beispiel gibt der Parameter 'author' an, dass wir die neuesten Blog-Einträge des Autors mit der ID = 1 haben möchten:

$my_posts = get_posts( array( 'author' => 1 ) );

Der gleiche Parameter ‚author‘ erlaubt es, die Datenbank auf verschiedene Weise abzufragen:

// return an array of posts from specific authors
$my_posts = get_posts( array( 'author' => '1,5,12' ) );
// return an array of posts excluding the specified author
$my_posts = get_posts( array( 'author' => -1 ) );

Je nach Wert des Parameters erhältst du also eine Ergebnismenge mit Beiträgen eines einzelnen Autors (Integer), mehrerer Autoren (eine Liste kommagetrennter Werte) oder einem Autor (negative Werte).

Andere Parameter sorgen für zusätzliche Flexibilität. Der folgende Aufruf von get_posts liefert beispielsweise ein Array der neuesten Blog-Einträge mehrerer Autoren:

// return an array of posts from multiple authors
$my_posts = get_posts( array( 'author__in' => array( 1, 5, 12 ) ) );

Und wir können auch mehrere Autoren ausschließen:

// return an array of posts from multiple authors
$my_posts = get_posts( array( 'author__not_in' => array( 1, 5, 12 ) ) );

Ebenso können wir Kategorieparameter, Tagparameter, Posttypparameter mit einigen spezifischen Unterschieden verwenden. Siehe z.B. Kategorieparameter:

Jedenfalls sind nicht alle Parameter so einfach zu bedienen wie diese Parameter. Zusätzlich können wir Kategorieparameter, Posttypparameter, Mime-Typparameter usw. in einer einzigen Abfrage verwenden. Dies bedeutet, dass wir eine detaillierte Kontrolle über die Elemente in der Ergebnismenge haben und wir können erweiterte Abfragen erstellen, die auf Post-Typen, benutzerdefinierten Taxonomien und benutzerdefinierten Feldern basieren.

Also, lasst uns tiefer tauchen!

Wie man Erweiterte Abfragen in WordPress Erstellt

Lasst uns einen Schritt vorwärts gehen mit einer erweiterten Abfrage, die auf benutzerdefinierten Posttypen und benutzerdefinierten Taxonomien basiert. Angenommen, du hast die folgende Postart:

name: book
taxonomy name: book_category, book_author
support for: title, editor, thumbnail, excerpt, custom-fields

Benutzerdefinierte Posttypen und Benutzerdefinierte Taxonomien

Angenommen, du möchtest eine Liste der neuesten Bücher in der angegebenen benutzerdefinierten Taxonomie book_category. Hier ist das Array der Argumente:

$args = array(
	'post_type'		=> 'book',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug',
			'terms'		=> 'sci-fi'
		)
	),
);

Die obigen Argumente sagen WordPress einfach, dass es alle Bücher in der 'sci-fi'  'book_category' abrufen soll.

Der Parameter 'tax_query' nimmt ein Array von Argument-Arrays (d.h. ein Array von Arrays). Diese verschachtelten Arrays ermöglichen es, sehr komplexe Abfragen auf der Grundlage mehrerer Taxonomien zu erstellen, wie im folgenden Beispiel gezeigt:

$args = array(
	'numberposts'	=> 10,
	'post_type'		=> 'book',
	'relation'		=> 'AND',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug',
			'terms'		=> 'sci-fi'
		),
		array(
			'taxonomy'	=> 'book_author',
			'field'		=> 'term_id',
			'terms'		=> 22
		)
	)
);

Diese Parameter ermöglichen es uns, eine Liste der letzten 10 'book'-Posttypen in der ‚sci-fi','book_category' abzurufen, die vom 'book_author' mit der ID #22 geschrieben wurde. Der Parameter 'relation' legt die logische Beziehung zwischen jeder Taxonomie fest, die in 'tax_query' aufgeführt ist. Oben legen wir den Wert auf AND, da wir alle Bücher der Kategorie 'sci-fi' AND des Autors #22 abrufen müssen.

Wie man Meta-Abfragen mit Hilfe von Benutzerdefinierten Feldparametern Erstellt

Gelegentlich musst du Listen von Beiträgen erstellen, die auf einem bestimmten Schlüssel und/oder Wert eines benutzerdefinierten Feldes basieren.

$args = array(
	'meta_key'		=> 'cover',
	'meta_value'	=> 'paperback',
	'meta_compare'	=> '='
);

Diese Parameter erlauben es uns, alle Beiträge nach Schlüssel und Wert des benutzerdefinierten Feldes abzurufen. 'meta_compare' setzt den Operator, der den Wert des Parameters 'meta_value' testen soll. Hier ist 'meta_value' '=', was auch der Standardwert ist.

Verfügbare Werte sind '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' or 'RLIKE'.

Dies ist ein ziemlich einfaches Beispiel, aber wir können erweiterte Abfragen erstellen. Im nächsten Beispiel wird die Datenbank für Fantasy-Bücher abgefragt, die nach 2010 veröffentlicht wurden:

$args = array(
	'post_type'		=> 'book',
	'meta_key'		=> 'year_published',
	'meta_value_num'	=> 2010,
	'meta_compare'	=> '>',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug'
			'terms'		=> 'fantasy'
		)
	)
);

Und wir können noch weiter gehen. Im nächsten Beispiel mischen wir einen Post-Typ mit einer benutzerdefinierten Taxonomie und zwei benutzerdefinierten Feldern:

$args = array(
	'post_type'		=> 'book',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug'
			'terms'		=> array( 'fantasy' )
		)
	),
	'meta_query'	=> array(
		'relation'		=> 'AND',
		array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	)
);

Hier stellen wir eine Reihe von Parametern ein, um eine Liste von Fantasy-Büchern zu erhalten, die nach 2010 veröffentlicht wurden und BETWEEN $10 und $25 kosten.

Du kannst sehen, dass der Parameter 'meta_query' ähnlich wie der Parameter 'tax_query‚ funktioniert. Es hält ein Array von Arrays, so dass wir erweiterte Abfragen erstellen können, die auf mehreren Meta-Key/Wert-Paaren basieren. Eine umfassende Liste der Query-Parameter und eine Reihe von Beispielen findet man in der Dokumentation WP_Query.

Warum ist get_posts auf 5 WordPress Beiträge Beschränkt?

Die Funktion get_posts verwendet die gleichen Argumente wie WP_Query::parse_query() (siehe Codex), aber einige spezifische Parameter bewirken, dass sie etwas anders funktioniert als ein WP_Query-Objekt.

Vielleicht hast du den Parameter 'numberposts' nicht in deinen Abfragen verwendet und fragst dich, warum du nur 5 Elemente in deiner Liste siehst.

Standardmäßig bestimmt die Anzahl der Beiträge, die du auf der Admin-Seite Settings → Reading admin page festgelegt hast, die Anzahl der Beiträge, die von einer WordPress-Abfrage abgerufen werden sollen. Wie auch immer, wenn du keinen benutzerdefinierten Wert für 'numberposts' oder 'posts_per_page' angibst, gibt get_posts eine andere Anzahl von Beiträgen zurück.

Zusätzlich zu den 'numberposts' sind die folgenden Parameter spezifisch für get_posts:

Die Funktion get_posts ist in wp-includes/post.php definiert. Du kannst tief in die Funktionsweise von get_posts eintauchen, indem du den Quellcode entweder auf Track (WordPress 5.2) oder in deiner lokalen WordPress-Installation überprüfst.

Bestellpositionen

'orderby' und 'order' sortieren die Elemente in der Ergebnismenge. Du sortierst Beiträge nach 'ID', 'author', 'title', 'name', 'type', 'date', 'modified', 'parent', 'rand', 'comment_count' und in vielerlei anderer Hinsicht in aufsteigender oder absteigender Reihenfolge.

Wenn du eine einfache Abfrage hast, musst du nur einen Wert für 'order' und 'orderby' setzen. Im folgenden Beispiel werden die Beiträge nach Postnamen in aufsteigender Reihenfolge sortiert:

$args = array(
	'author'	=> '1,5,12',
	'orderby'	=> 'name',
	'order'		=> 'ASC'
);

Das ist ziemlich einfach. Aber was wäre, wenn du eine erweiterte Abfrage hättest? Z.B.: Können wir Elemente nach einem oder mehreren benutzerdefinierten Feldwerten in einer erweiterten Meta-Abfrage sortieren?

WordPress 4.0 und WordPress 4.2 brachten wichtige Verbesserungen für die Parameter 'orderby' und 'meta_query'. Wir haben nun eine neue Syntax für die Reihenfolge nach bestimmten Klauseln einer Meta-Abfrage. Dank der neuen Syntax können wir Indizes verwenden, um aus dem Parameter 'orderby' Verweise auf die spezifischen Klauseln der Metaabfrage zu erstellen.

Dank dieser Verbesserungen kann die Meta-Abfrage im obigen Beispiel wie folgt geschrieben werden:

$args = array(
	'meta_query'	=> array(
		'relation'		=> 'AND',
		'year_clause' => array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		'price_clause' => array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	),
	'orderby' => 'price_clause',
);

Im obigen Beispiel haben wir Elemente nach 'price_clause' geordnet.

Und wir können noch mehr tun. Ab WordPress 4.0 können wir an get_posts ein Array von Meta-Abfrage-Indizes anstelle eines einzelnen Index übergeben, wie im folgenden Beispiel gezeigt:

Bist du es leid, einen langsamen Host für deine WordPress-Seite zu haben? Wir bieten blitzschnelle Server und 24/7 Weltklasse-Support von WordPress-Experten. Schau dir unsere Pläne an

$args = array(
	'meta_query'	=> array(
		'relation'		=> 'AND',
		'year_clause' => array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		'price_clause' => array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	),
	'orderby' => array( 'price_clause' => 'ASC', 'year_clause' => 'DESC' ),
);

Herzlichen Glückwunsch, du hast eine erweiterte Meta-Abfrage erstellt und die Ergebnisse zuerst nach 'price_clause' in aufsteigender Reihenfolge, dann nach 'year_clause' in absteigender Reihenfolge sortiert.

Die vollständige Liste der Sortieroptionen findest du im Codex.

Es ist an der Zeit, dass wir Daten auf der Titelseite anzeigen.

Empfohlene Lektüre: How to Easily Create and Use a phpinfo Page.

Wie man get_posts Zurückgegebene Daten Anzeigt

WordPress get_posts gibt ein Array von WP_Post-Objekten zurück, das uns Zugriff auf eine Reihe von Variablen für jeden ausgewählten Beitrag gibt, der in der Datenbanktabelle wp_posts gespeichert ist:

wp_posts Tabellenstruktur in phpMyAdmin

wp_posts Tabellenstruktur in phpMyAdmin

Du kannst leicht auf diese Daten mit einem foreach wie dem folgenden zugreifen:

$custom_posts = get_posts( $args );

if( ! empty( $custom_posts ) ){
	$output = '<ul>';
	foreach ( $custom_posts as $p ){

		$output .= '<li><a href="' 
		. get_permalink( $p->ID ) . '">' 
		. $p->post_title . '</a></li>';
	}

	$output .= '</ul>';
}

return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';

Wenn get_posts mindestens einen Beitrag gefunden hat, gibt es eine Reihe von Elementen zurück, die wir durchlaufen können, um den Titel des Beitrags und einen Link zum ursprünglichen Beitrag anzuzeigen. Wir haben die Funktion get_permalink verwendet, um den Post-Permalink abzurufen, da wir keine entsprechende Variable WP_Post haben.

Das ist ziemlich einfach, aber wie können wir diesen Code implementieren und unsere eigenen Listen von Beiträgen mit WordPress get_posts erstellen?

Du kannst Listen von Beiträgen auf deinen Seiten auf verschiedene Weise anzeigen.

Beispiel aus der Praxis: So zeigt man eine Benutzerdefinierte Liste von Elementen Mit einer Kurznummer an

Ich werde dir zeigen, wie du einen schnellen und einfachen Shortcode erstellen kannst, den du in deinen Inhalt aufnehmen kannst. Wie auch immer, ich werde nicht tief in Shortcodes eintauchen, da wir dieses Thema bereits in einem früheren Blogbeitrag behandelt haben.

Erstelle zunächst ein neues Verzeichnis im Ordner wp-content/plugins deiner lokalen WordPress-Installation oder in einer Stagingumgebung. In diesem Beispiel habe ich das Verzeichnis kinsta-shortcodes benannt.

In wp-content/plugins/kinsta-shortcodes/ erstelle eine.php-Datei mit dem gleichen Namen wie das neue Verzeichnis: kinsta-shortcodes.php.

Öffne die neue Datei in deinem bevorzugten Texteditor und füge die folgende Überschrift hinzu:

<?php
/**
 * @package Kinsta_shortcodes
 * @version 1.0
 */
/*
Plugin Name: Kinsta shortcodes
Plugin URI: http://wordpress.org/extend/plugins/#
Description: This is an example plugin 
Author: Your Name
Version: 1.0
Author URI: https://yourwebsite.com/
*/

Jetzt haben wir ein brandneues Plugin, aber es tut immer noch nichts. Gehe zu Plugins Admin-Bildschirm in deinem WordPress Dashboard und aktiviere das neue Plugin, um sicherzustellen, dass du WP_DEBUG in deiner wp-config.php Datei auf true gesetzt hast.

Deine Sandbox ist nun bereit für deine Hacks. Der nächste Schritt besteht darin, einen Hook für einen benutzerdefinierten Shortcode zu registrieren:

/**
 * Add a hook for a shortcode tag
 */
function kinsta_shortcodes_init(){
	add_shortcode( 'kinsta_get_posts', 'kinsta_get_posts_cb' );
}
add_action('init', 'kinsta_shortcodes_init');

kinsta_get_posts ist der Shortcode-Name und kinsta_get_posts_cb ist der unten definierte Callback:

/**
 * Register a shortcode
 *
 * @param array $atts Array of shortcode attributes
 */
function kinsta_get_posts_cb( $atts ){

	// safely extract custom arguments and set default values
	extract( shortcode_atts(
			array(
				'numberposts'		=> 3,
				'post_type'			=> 'post',
				'book_category'		=> 'fantasy',
				'year_published'	=> 1900,
				'price_min'			=> 0,
				'price_max'			=> 50
			),
			$atts,
			'kinsta_get_posts'
		) );

	// define the array of query arguments
	$args = array(
		'numberposts'	=> $numberposts,
		'post_type'		=> $post_type,
		'tax_query'		=> array(
			array(
				'taxonomy'	=> 'book_category',
				'field'		=> 'slug',
				'terms'		=> $book_category,
			)
		),
		'meta_query'	=> array(
			'relation'		=> 'AND',
			'year_clause'	=> array(
				'key'		=> 'year_published',
				'value'		=> $year_published,
				'type'		=> 'numeric',
				'compare'	=> '>',
			),
			'price_clause'	=> array(
				'key'		=> 'price',
				'value'		=> array( $price_min, $price_max ),
				'type'		=> 'numeric',
				'compare'	=> 'BETWEEN',
			)
		),
		'orderby' => array( 'price_clause' => 'ASC' )
	);

	$custom_posts = get_posts( $args );

	if( ! empty( $custom_posts ) ){
		$output = '<ul>';
		foreach ( $custom_posts as $p ){

			$output .= '<li><a href="' 
			. get_permalink( $p->ID ) . '">' 
			. $p->post_title . '</a> (' 
			. get_post_meta( $p->ID, 'year_published', true ) 
			. ') - Price: ' . get_post_meta( $p->ID, 'price', true ) . '</li>';
		}

		$output .= '</ul>';
	}

return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';

Wir setzen sechs Shortcode-Eigenschaften, die wir verwenden, um ein Array von Parametern zu definieren, das schließlich an die WordPress get_posts-Funktion übergeben wird. Wenn $custom_posts nicht leer ist, dann erzeugt ein foreach das HTML einer ungeordneten Liste von Elementen.

Jetzt kannst du und die Autoren deines Blogs Listen von Beiträgen mit einem Shortcode wie dem folgenden hinzufügen:

[kinsta_get_posts post_type="book" book_category="sci-fi" numberposts="4" price_min=1 price_max=250]

Natürlich kannst du die Reihe der Argumente nach Belieben ändern und deine Tests in jedem Beitrag oder jeder Seite deiner Entwicklungswebsite ausführen.

Eine erweiterte Liste von Beiträgen, die mit der Funktion get_posts erstellt wurden.

Eine erweiterte Liste von Beiträgen, die mit der Funktion get_posts erstellt wurden.

Musst du Listen mit Beiträgen, Seiten oder benutzerdefinierten Beitragsarten in WordPress erstellen? Erfahre, wie man es mit der Funktion get_posts macht! 📌👨‍💻👩‍💻Click to Tweet

Zusammenfassung

WordPress get_posts ist eine leistungsstarke Funktion, die es Entwicklern ermöglicht, Listen von Beiträgen überall auf dem Frontend deiner WordPress Website einzubinden. Es verwendet WP_Query, aber es ist einfacher zu bedienen und ist besser als WP_Query, wenn du nur Listen mit Beiträgen brauchst. Auf jeden Fall wird eine direkte Referenz auf WP_Query empfohlen, wenn du Beiträge in einer Schleife anzeigen musst.

Also, erstelle deine Listen, teste deinen Code, und wenn du sicher bist, dass er gut funktioniert, dann (und nur dann) schiebe ihn auf deine Live-Website (aber führe zuerst ein Backup durch).

Jetzt würden wir gerne von dir hören. Was sind deine Erfahrungen mit der WordPress get_posts function? Hast du irgendwelche Anwendungsfälle, die du mit uns teilen kannst? Tue dies in den Kommentaren unten!


Wenn Dir dieser Artikel gefallen hat, dann wirst du Kinsta’s WordPress Hosting-Plattform lieben. Beschleunige deine Webseite und erhalte 24/7 Support von unserem erfahrenen WordPress-Team. Unsere Google Cloud basierte Infrastruktur konzentriert sich auf die Bereiche Auto-Scaling, Performance und Sicherheit. Lass uns dir den Kinsta-Unterschied zeigen! Schau Dir hier unsere Pakete an