Software & Infrastruktur

WordPress erweitern: Das Blogsystem um neue Funktionen ergänzen

Seite 3 / 3

Einstellungsdaten in der Datenbank ablegen

WordPress ermöglicht die Speicherung von Plugin-Daten in den bestehenden Tabellen, die Werte werden dabei in der Tabelle „options“ abgelegt. Besonders für die Konfigurationseinstellungen eines Plugins ist dies sinnvoll. Allerdings muss man nicht alle Daten dort speichern – besonders bei großen Datenmengen leidet der „normale“ Gebrauch von WordPress und eine eigene Tabelle ist sinnvoll. Es ist also im Vorfeld zu überlegen, welche Daten in welchen Mengen gespeichert werden sollen. Denkansätze dazu liefert der Artikel „Creating Tables With Plugins” [4] des WordPress-Codex.

Werden die Daten in der WordPress-Tabelle options hinterlegt, so bietet die Software unter anderem folgende Möglichkeiten:

  • Daten hinzufügen: add_option(NAME[Pflichtwert], WERT, BESCHREIBUNG, AUTOLOAD[default: yes]);
  • Daten lesen: get_option(NAME[Pflichtwert]);
  • Daten aktualisieren: update_option(NAME[Pflichtwert], NEUER\_WERT);
  • Daten löschen: delete_option(NAME[Pflichtwert]);

WordPress kann im Standard mit Arrays und Einzelwerten umgehen, es muss daher kein eigener Prozess zum Zerlegen von Arrays erstellt werden. Wenn Sie Inhalte in der Tabelle options speichern wollen, die inhaltlich zusammengehören, ist es sinnvoll, sie als Array in einem Feld abzulegen. Dies schafft nicht nur Übersicht und hält den Umfang der Tabelle kleiner, sondern ist auch wesentlich performanter und schont so die Ressourcen.

Es gibt eine ganze Reihe weiterer Funktionen, die den Zugriff auf Inhalte der Tabelle options ermöglichen, die aber meist für die Plugin-Entwicklung keine Bedeutung haben. Für einen detaillierteren Blick auf den Umgang mit Funktionen lohnt ein Blick in die „wp-includes/functions.php“.

Mit WordPress Version 2.8 werden neue Funktionen eingeführt, die speziell für Daten in der Tabelle options nützlich sind, die ständigen Veränderungen unterliegen oder nur für einen bestimmten Zeitraum nötig sind:

  • Daten setzen/aktualisieren: set_transient(NAME[Pflichtwert], WERT[Pflichtwert], ZEITRAUM IN SEKUNDEN[default: 0]);
  • Daten lesen: get_transient(NAME[Pflichtwert]);
  • Daten löschen: delete_transient(NAME[Pflichtwert]);

In der Tabelle werden diese Daten immer mit der Syntax „_transient+NAME“ abgelegt. Um diese Vereinbarung kümmert sich die Funktion, Sie müssen nur einen Namen übergeben.

Aber auch um eigene Tabellen einzurichten oder Werte in den WordPress-eigenen Tabellen zu beeinflussen, gibt es Möglichkeiten, die Arbeit mit der Datenbank einfach und sicher zu machen. Die Variable „$wpdb“ ermöglicht den Zugriff auf alle Inhalte der Datenbank, alle verfügbaren Funktionen finden sich in der „wp-includes/wp-dp.php“.

Bei allen Operationen sollten allerdings Sicherheitsaspekte nicht außer Acht gelassen werden – auch dafür gibt es in WordPress vorgefertigte Lösungen. Das Update von Werten in Tabellen wird beispielsweise mit Hilfe der Funktion „update“ erledigt, sämtliche Prüfungen werden dabei von WordPress übernommen.

PHP
$wpdb->update( $wpdb->posts, array( 'post_type' => $mytype ), array( 'ID' => $myID ));

Listing 4

Das Einbringen von neuen Inhalten geschieht mittels der Funktion „insert“.

PHP
$wpdb->insert( $wpdb->posts, array( 'post_title' => $mytitle ));

Listing 5

Eine sichere Abfrage von Daten, die nicht mit Standard-Funktionen erfüllt wird, kann mit „prepare“ gesetzt werden. Auch hierbei kümmert sich WordPress um die Sicherheit der MySQL-Abfrage.

PHP
$return = $wpdb->get_var     (
	$wpdb->prepare (
		"SELECT post_title
		FROM $wpdb->posts
		WHERE post_title = %s
		AND ID = %d",
		$title,
		$ID
	)
);

Listing 6

Funktion abfragen und prüfen

Um Komplikationen mit nicht aktivierten Plugins oder defekten Funktionen zu vermeiden, sollten Sie die Existenz der verwendeten Funktionen verifizieren.

PHP
if ( !function_exists('meine_kleine_funktion') ) {
...

Listing 7

Zusätzlich bietet sich das an, wenn klassenorientiert geschrieben wird und das Plugin eine eigene Klasse enthält. Damit kapseln Sie das Plugin und vermeiden Konflikte mit anderen Plugins.

PHP
if ( !function_exists('add_action') ) {
	header('Status: 403 Forbidden');
	header('HTTP/1.1 403 Forbidden');
	exit();
}
if ( !class_exists( 'ExamplePlugin' ) ) {
	class ExamplePlugin {

	// constructor
  function ExamplePlugin() {
  }
 }
 $ExamplePlugin = new ExamplePlugin();
}

Listing 8

Fazit: Das grundlegende Verständnis der Idee, die WordPress so flexibel macht,
sollte im Vorfeld klar sein. Es lohnt sich also, ein wenig im Quelltext von WordPress zu lesen, sich Zeit für das Kennenlernen der vorhandenen
Klassen, Funktionen und der Art und Weise, wie WordPress funktioniert,
zu widmen, bevor man mit dem Programmieren loslegt.

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

4 Kommentare
Crazy Girl

Ich habe in meiner WordPress Options Tabelle ziemlich viele Einträge für _transient_feed… _transient_feed_mod… _transient_timeout_feed… und _transient_timeout_feed_mod…
Zusammengerechnet dürfte da ein paar Hundert dabei rauskommen.
Kann ich die, evtl. bis auf den jeweils neuesten Eintrag, einfach löschen?

Florian Endres
Florian Endres

@Crazy Girl:

Der Autor ist momentan leider nicht erreichbar, deshalb habe ich unsere Techniker gefragt. Die Einträge stammen von der Transient API und können ignoriert werden. Das ist ein temporärer Cache, der irgendwann verfällt. Du kannst sie wohl auch löschen – sie tauchen aber erneut auf.

Crazy Girl

Vielen Dank für Deine Antwort. Ja, sie stammen von der Transient API und da ich so einige Feeds über meine Blogroll hole erhalte ich pro Feed 4 solche Einträge. Eigentlich sollten sie sich auch selbst wieder löschen, was sie aber nur hin und wieder tun und so schwillt die Options Tabelle auch recht unnett an. Deshalb habe ich mich die Tage entschieden – nach vorheriger Datensicherung – sie einfach mal zu löschen und zu kucken was passiert. Alles paletti. Sie legen sich zwar wieder an, wie Du geschrieben hast, aber es schadet auch nicht sie hin und wieder komplett rauszulöschen, um nicht gar so viele davon anzusammeln.
Vielleicht hilft diese Info ja auch jemanden, der in Zukunft hier vorbei kommt. Aber bitte vor dem Löschen immer eine Datensicherung machen, so dass im Notfall einfach nur wieder die Tabelle zurückgespielt werden kann. Man kann ja nie wissen ;-)

Frank

Sorry, bin nicht immer online und danke vielmals den Technikern – ja, diese neue Möglichkeit gibt es seit 2.8 und sollte vom User nicht angefasst werden (In der Regel macht das nix, sie werden neu erzeugt). Die Transient-Funktion lässt temporäre Daten in der DB zu, wobei sich der Bestand je nach Definition entfernt, WP kümmert sich darum.