WordPress Plugin de-/installieren

WP Logo

Durch die aktuelle Arbeit am Plugin Adminimize sind mir wieder einige Punkte aufgefallen, die ich sinnvoll finde und in Plugins integriere.
Es ist Mehrwert, der sich aber zum Standard für Plugin-Autoren entwickeln sollte und daher lege ich es mal mit kurzer Erläuterung hier ab. Drei Lösungen sollen zeigen, wie man mit einfachen Mitteln und WordPress Hooks die Datenbank für die Einstellungen des Plugins vornimmt, optimiert und klein hält. Ebenso ist es mir wichtig, dass die Einträge in der Datenbank gelöscht werden, wenn das Plugin deaktiviert wird.
Die Nutzer des Plugins sind sicher dankbar für diese kleinen aber feinen Codeschnippsel im Plugin.

Plugin deaktiveren, Datenbankeinträge löschen

Im ersten Punkt soll es darum gehen, die Felder, welche man in der Datenbank ablegt, auch zu entfernen, wenn das Plugin deinstalliert wird. Die Datenbank sollte schlank sein und nur die Inhalte haben, die sie auch benötigt. Daher stellt WordPress auch eine Funktion bereit, die die Desintallation einfach macht - register_deactivation_hook(). Dieser Hook wird angesprochen, wenn das Plugin deinstalliert wird. Damit könnte die Deinstallation von Einträgen in der Tabelle options wie folgt aussehen.


register_deactivation_hook(__FILE__, 'my_example_deinstall');

/**
 * Delete options in database
 */
function my_example_deinstall() {
	delete_option('my_example_option_1');
	delete_option('my_example_option_n');
}

Plugin aktiveren, Datenbankeinträge setzen

Ähnliches gibt es auch für die Aktivierung des Plugins, der Hook register_activation_hook(). Der Codex gibt Aufschluss und die Verwendung ist analog dem obigen Beispiel mit einer Funktion für die Installation von Optionen in der Datenbank.


register_activation_hook(__FILE__, 'my_example_install');

/**
 * Install options in database
 */
function my_example_install() {
	add_option('my_example_option_1', '', '');
	add_option('my_example_option_n', array(), '');
}

Datenbank optimieren

Hat man die Einträge aus der Datenbank entfernt, dann ist es ein schöner Zug, diese wieder zu optimieren. MySQL stellt dafür eine Funktion zur Verfügung und das Einbinden in die Funktion zum Deinstallieren der Einträge ist schnell getan.
Dazu muss die Variable der WordPress-Datenbank $wpdb global sein und die Optimierung via OPTIMIZE TABLE.


/**
 * Delete options in database
 */
function my_example_deinstall() {
	global $wpdb;

	add_option('my_example_option_1', '', '');
	add_option('my_example_option_n', array(), '');

	$wpdb->query("OPTIMIZE TABLE $wpdb->options");
}

Hat man eine Funktion innerhalb des Plugins, welches des öfteren Daten in der Datenbank verändert, dann kann man das Optimieren dieser auch öfters vornehmen. Dazu binde ich es in der Regel per Zufall ein und lasse die DB dann optimieren. Beispielsweise beim Löschen von Spam-Einträgen in der DB comments ist derartiges lohnend. Ich nutze es im Plugin SpamViewer.


$n = mt_rand(1, 1000);
if ( $n == 10 )
	$wpdb->query("OPTIMIZE TABLE $wpdb->options");

Update

Bei der Diskussion zu diesem Theme, siehe Kommentare, hat sich herausgestellt, dass man das Thema der Datenbank-Optimierung vorsichtig angehen sollte, denn Optimieren in Massen und zu ungünstigen Zeiten kann auch nachteilig sein. Daher bitten ich, diese Empfehlung überlegt zu nutzen. Ich für meinen Teil werde sie aus Deaktivierungsfunktionen entfernen und bei bspw. dem Löschen von großen Mengen von Daten, Beispiel Spam-Einträge, drin lassen.

Nicht benötigte Einträge löschen

Nutz das Plugin Optionen aus der Datenbank und arbeitet für jede Option einen eigenen Eintrag ab, dann ist es sinnvoll, die Einträge nicht zu speichern, die leer in den Einstellungen des Plugins sind. Am Beispiel Checkbox: wenn der User den Haken der Checkbox nicht setzt, dann wird als Übertrag 0 genommen und in der DB abgelegt, je nach Abfrage des Plugins passiert dann aufgrund dieser Einstellung etwas. Im Grunde ist es der Abfrage aber egal ob 0 oder nicht vorhandener DB-Eintrag und daher kann man diese Option auch leeren. Dies geht mir der folgenden kleinen Funktion. Dabei werden nach dem Senden der POST-Daten lediglich die Felder in der DB gespeichert, die man auch benötigt.


// for a smaller database
function my_example_get_update($option) {
	if ( ($_POST[$option] == '0') || $_POST[$option] == '') {
		delete_option($option);
	} else {
		update_option($option , $_POST[$option]);
	}
}

my_example_get_update('my_example_option_1');
my_example_get_update('my_example_option_n');

Kommentare sind geschlossen.