19.5. Beispiel

Sehen wir uns das Beispiel aus dem Kapitel zum Thema Rewrite noch einmal genauer an. Sie erinnern sich vielleicht. Mit dem Plugin führten wir eine Möglichkeit ein, externe Links zu tracken. Hier können Sie das ganze Plugin auf Github noch einmal ansehen.

Datenbank-Tabellen erstellen

In der Datei boostrap.php finden Sie die Funktion plugin_activation() die wiederum die Funktion dbDelta() aufruft. Sie existiert in WordPress um Datenbank-Tabellen anzulegen (z.B. während des Installationsvorgangs) oder Updates für Tabellen durchzuführen (z.B. während eines WordPress Versionsupdates). Es kann aber auch in Plugins genutzt werden, wie Sie bereits gesehen habe.

<?php
function dbDelta( $queries = '', $execute = true ) {
	...
}
?>

Es gilt:

  • $queries (string|array)
    Die SQL-Abfrage(n) die durchgeführt werden soll(en).
  • $execute (bool)
    Ob die Anfragen sofort durchgeführt werden sollen.

Zurückgegeben wird ein array mit der Rückgabe der einzelnen Anfragen.

Hier noch einmal der Auszug der entsprechenden Stellen aus der boostratp.php:

You’re not allowed to see this content. Please log in first.

Wie Ihnen jetzt vielleicht auffällt, enthält der SQL-Befehl kein IF NOT EXISTS. Man würde erwarten, dass man folgendes übergeben muss um bei einer Plugin-Reaktivierung keinen Fehler zu erhalten:

CREATE TABLE {$wpdb->prefix}outgoing_links IF NOT EXISTS ...

Wer dbDelta() nutzt, muss sich darum allerdings nicht kümmern. Denn sie prüft unter anderem genau das. Zusätzlich aber noch ob sich die Spalten oder die Indizes verändert haben. WordPress reagiert auf diese einzelnen Veränderungen mit entsprechenden Datenbank-Abfragen die dann durchgeführt werden.

Das ist der Grund, warum die Abfrage funktioniert obwohl IF NOT EXISTS fehlt. Nach einer Plugin-Deaktivierung kann es also getrost reaktiviert werden ohne das man mit einem Fehler rechnen muss. Im vorliegenden Fall geschieht nichts (keine SQL-Abfrage, kein Update) da sich nichts verändert hat.

Daten auslesen

In der Klasse Link_Table hinterlegten wir die Methode get_links(). Dort nutzten wir die Methode get_results() der Klasse wpdb um alle Links auszulesen. Hier noch einmal der Code dazu:

You’re not allowed to see this content. Please log in first.

Es gilt auch hier:

  1. Die Variable $wpdb wird „globalisiert“.
  2. Danach wird eine oder mehrere Abfragen durchgeführt.

Zurückgegeben wird – wie es durch die Zeile

$result = $wpdb->get_results( $sql, 'ARRAY_A' );

definiert wurde – ein assoziatives Array.

You’re not allowed to see this content. Please log in first.

Daten schreiben

In der Datei inc/link-table.php findet man in process_bulk_action() die beiden Methoden zur Datenbank-Manipulation. Nämlich wpdb::insert() und wpdb::update(). Hier noch einmal die Auszüge:

You’re not allowed to see this content. Please log in first.

Im Kapitel zur Plugin-Sicherheit habe ich die einzelnen Parameter bereits erklärt. Die Formatierungsanweisung kann bei einem insert-Befehl für die einzelnen Werte, bei einem update-Befehl zusätzlich für die Werte des Teils nach WHERE angegeben werden.

Daten ersetzen

Rein theoretisch könnten wir statt den oben genannten zwei Methoden auch nur eine nutzen. Und zwar wpdb::replace(). Das sähe wie folgt aus:

You’re not allowed to see this content. Please log in first.

Macht das selbe und erspart Schreibarbeit. Klappt aber nur, wenn die Tabelle einen INDEX- oder eine UNIQUE-Spalte hat. Nur dann kann SQL überprüfen, ob ein Eintrag schon vorhanden ist oder nicht.

Daten löschen

Die Methode wpdb::delete() sollte Ihnen mittlerweile ebenfalls ein Begriff sein. Im Beispiel-Plugin nutzen wir sie in der Datei inc/link-table.php und dort in der statischen Methode delete_link(). Hier der Auszug:

You’re not allowed to see this content. Please log in first.

Escaping

Wie nun schon öfter erwähnt, sollten Daten immer gesäubert (escaped) werden um sicher zu gehen, dass nichts falsches an die Datenbank gelangen kann. Generell kann ich empfehlen, die Methode wpdb::prepare() zu nutzen, wenn die Nutzung von insert, replace, update etc. nicht möglich ist.

In unserem Beispiel-Plugin nutzen wir prepare() unter anderem in der Datei inc/rewrite.php und dort in der Methode perform_redirect(). Hier der Auszug:

You’re not allowed to see this content. Please log in first.