Eigene WordPress Datenbankabfragen mit WP_Query schreiben

In diesem Tutorial erkläre ich, wie du in WordPress eigene Datenbankabfragen mit WP_Query schreiben kannst, um bestimmte WordPress Beiträge und Seiten aus der Datenbank zu holen. Neben der Erstellung von Custom Queries zeige ich auch, wie du das Ergebnis der Abfrage in einem Custom Loop anzeigen lassen kannst.

Warum individuelle Abfragen mit WP_Query?

Zu Beginn des Artikels möchte ich erst einmal klären, wann eine individuelle Abfrage der Datenbank mit WP_Query überhaupt sinnvoll ist. Denn nicht immer wird ein eigener Custom Query benötigt, um WordPress Posts anzuzeigen.

WordPress führt mit dem Main Query bei jedem Seitenaufruf eine Datenbankabfrage aus.

Custom Queries sind dann sinnvoll, wenn neben dem Main Query zusätzliche oder andere Inhalte von der Datenbank geholt und angezeigt werden soll. Beispielsweise wenn unter einem einzelnen Beitrag eine Liste der letzten Artikel angezeigt werden soll oder die Sidebar auf einer statische Seite alle Child-Pages dieser Seite ausgeben soll.

Nicht nötig ist eine eigene Abfrage, wenn die dargestellten Inhalte lediglich etwas angepasst werden sollen. Hier ist es aus Performance-Gründen ratsam, den Main Query mit entsprechenden Filtern anzupassen, anstatt einen zusätzlichen Custom Query zu erstellen.

Beispiele dafür: Die Kategorien sollen neben Beiträgen auch CPTs zeigen, die Reihenfolge von Posts soll geändert werden oder eine bestimmte Kategorie soll im Blog ausgeschlossen werden. Für diese Anwendungsfälle reicht es aus, den Main Query zu modifizieren.

Zur Erstellung einer eigenen Datenbankabfrage zur Anzeige von bestimmten WordPress Posts kannst du die Klasse WP_Query nutzen. Mehr dazu im nächsten Abschnitt.

Die Klasse WP_Query

Die Klasse WP_Query ist eine der wichtigsten Bestandteile von WordPress.

Sie dient zur Abfrage von Inhalten aus der Tabelle wp_posts der WordPress Datenbank. Alle Beiträge, statische Seiten und Custom Post Types deiner WordPress-Website werden mithilfe dieser Klasse aus der Datenbank geholt. Auch der Main Query wird damit initialisiert.

WP_Query ist dabei eine Helper Class, um WordPress Datenbankabfragen zu erleichtern. Es reicht die Angabe eines Arrays mit Argumenten, ohne dass komplizierte SQL-Queries und Database Joins manuell erstellt werden müssen. Auch der Schutz vor SQL-Injections wird durch die Verwendung der Klasse sichergestellt.

Einschränkungen:
Die Klasse existiert zum Lesen von Posts und deckt daher nicht alle CRUD-Operationen ab. Dafür stehen Funktionen wie wp_insert_post oder wp_update_post bereit. Wer die Daten von anderen Tabellen als wp_posts abfragen möchte, muss auf die recht ähnlichen Klassen WP_Meta_Query, WP_Comment_Query oder WP_User_Query zurückgreifen.

Custom Query mit WP_Query erstellen

Zur Erstellung einer eigenen Datenbankabfrage für WordPress Posts kann ein neues Objekt bzw. Instanz der Klasse WP_Query erzeugt werden:

$custom_query = new WP_Query( $args );

Zur Definition unseres Custom Queries übergeben wir der Klasse eine Array von Argumenten. Detaillierte Kenntnisse in SQL sind daher nicht nötig. Das folgende Beispiel liefert uns die fünf neuesten Beiträge aus der Kategorie mit dem Slug featured:

// Get Posts from Database.
$query_arguments = array(
    'category_name'       => 'featured',
    'posts_per_page'      => 5,
    'ignore_sticky_posts' => true,
);
$custom_query = new WP_Query( $query_arguments );

Eine vollständige Liste aller Parameter findest du in der Code Reference zu WP_Query.

Ergebnis der Datenbankabfrage im Loop ausgeben

Das Resultat unseres Custom Queries kann anschließend in einem eigenen WordPress Loop dargestellt werden. In diesem Beispiel wird für jeden Beitrag der Titel ausgegeben:

// The Query
$custom_query = new WP_Query( $args );

// The Loop
if ( $custom_query->have_posts() ) {

	while ( $custom_query->have_posts() ) {
		$custom_query->the_post();

        // Display Post Title
        the_title( '<h2 class="entry-title">', '</h2>' );
    }
	wp_reset_postdata();
}

Wichtig: Beim Einsatz eines zusätzlichen Custom Queries und Custom Loops muss dieser mit der Funktion wp_reset_postdata() abgeschlossen werden. Dadurch wird die globale Variable $post zurückgesetzt und der aktuelle Post des Main Queries wiederhergestellt.