von | Blog, PHP, WordPress

Welche Möglichkeiten habe ich, Daten aus der WordPress-Datenbank zu lesen, wenn WP_Query nicht mehr ausreicht?

Über dass Datenbankobjekt $wpdb welches global verfügbar ist, bietet WP drei Möglichkeiten, auf die Datenbank zuzugreifen:

1) Der Zugriff auf einen einzelnen Wert: $wpdb->get_var()
Soll nur ein einzelner Wert aus der DB gelesen werden, z.B. die Gesamtanzahl der publizierten Posts, kann $wpdb->get_var() genutzt werden:

<?php 
$pc = $wpdb->get_var($wpdb->prepare(
  "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish';", 0
));
 
echo "<p>Anzahl publizierter Posts: $pc</p>"; 
?>

Es kann natürlich auch direkt auf ein Datenbankfeld zugegriffen werden, z.B. um die Anzahl der Posts in der Kategorie mit der ID=11 zu ermitteln. Es wird auf das Datenbankfeld count zugegriffen, in dem WP die Anzahl der Posts zur jeweiligen Kategorie bereithält:

<?php 
$pc = $wpdb->get_var($wpdb->prepare(
  "SELECT count FROM $wpdb->term_taxonomy WHERE term_id = 11;", 0
));
 
echo "<p>Anzahl der Posts in Kategorie mit ID=11: $pc</p>"; 
?>

2) Der Zugriff auf eine Zeile: $wpdb->get_row()
Soll auf eine einzelne Tabellenzeile zugegriffen werden, kommt $wpdb->get_row() zum Einsatz. Z.B. um den Post mit gegebenem Permalink zu ermitteln:

<?php
$permalink = 'willy-will-wurst'; 
$row = $wpdb->get_row($wpdb->prepare(
  "SELECT * FROM $wpdb->posts WHERE post_name = %s AND post_type = 'post';", $permalink
));
 
echo "<p>Titel des Posts mit Permalink '$permalink': $row->post_title</p>"; 
?>

In diesem Fall (standard) wird ein Objekt zurückgegeben. Es muss also mit dem Pfeil (->) auf das gewünschte Element zugegriffen werden.

Alternativ kann die Funktion auch ein Array zurückgeben. Hierzu muss $wpdb->get_row() mit einem zweiten Parameter aufgerufen werden. Dieser Parameter ist eine Konstante. Standard ist OBJECT.
[php]$wpdb->get_row($query, ARRAY_A)[/php] sorgt für ein assoziatives Array als Rückgabewert,
[php]$wpdb->get_row($query, ARRAY_N)[/php] sorgt für ein numerisches Array.

2) Der Standardzugriff bei einer Ergebniserwartung von mehreren Zeilen: $wpdb->get_result()
Die meisten Datenbankanfragen liefern ein mehrzeiliges Ergebnis, welches dann mit einer Schleife durchlaufen wird. Wenn z.B. alle Posts mit einem Postdatum ab dem 1.5.2015 gesucht werden sollen, könnte dies folgendermaßen geschehen:

<?php
$dat= '2015-05-01'; 
$rows = $wpdb->get_result($wpdb->prepare(
  "SELECT * FROM $wpdb->posts WHERE post_date <= %s AND post_type = 'post' ORDER BY post_dat DESC;", $dat
), ARRAY_A);
 
foreach ($rows as $row) {
  echo substr($dat, 8, 2) . '.' . substr($dat, 5, 2) . '.' . substr($dat, 0, 4) . ': ' . $row['post_title'] . '<br />';
}
?>

Hinweis: In den Beispielen nutze ich die Methode $wpdb->prepare() zur Parameterübergabe. Diese sollte für die Parameterübergabe an alle Datenbankfunktionen genutzt werden. Eigentlich werden die Variablen nach dem Vorbild von sprintf() oder vprintf() hinter dem Querystring angegeben, so dass die Funktion mindestens zwei Parameter erwartet. Da es in den ersten beiden Abfragen keine Variablen gab, habe ich zur Vermeidung einer Warnung eine 0 (die Ziffer) als zweiten Parameter angegeben.

Weitere Informationen (engl.) im WordPress Codex: https://codex.wordpress.org/Class_Reference/wpdb

Danke für’s Lesen!

 

 

 

Kommentare sind geschlossen.