Eigenes WordPress Plugin erstellen — objektorientiert mit Klassen
Jeder der schon mal tiefer in die “tiefsten Tiefen” von WordPress geschaut hat, kam eventuell mal auf die Idee, das System zu erweitern. Nun gibt es ja endlich plus ein WordPress Plugin. Aber was, wenn die gewünschte Funktionalität eventuell mal nicht so abgedeckt wird, wie man es vielleicht gern möchte? Naja … dann gibt’s im Regelfall nur folgende Optionen:
- man fragt einen Bekannten, der sich mit PHP und WordPress auskennt, ob er einem hilft
- in einschlägigen Foren einen Anfrage stellen
- auf freelancer Foren das Gesuch gegen Bezahlung aufgeben (bäääähh
) - man setzt sich auf seinen Hintern und versucht es selbst
Jetzt kann natürlich jeder selbst entscheiden, was er / sie gern selbst machen würde. Wer Option 1 — 3 wählt, kann hier eigentlich schon aufhören mit lesen.
Alle anderen angehenden WordPress Profis sind herzlich dazu eingeladen hier zu erfahren, wie man sich selbst ein Plugin schreibt. Und zwar auf die harte Tour: objektorientiert — yeah!
An wen richtet sich dieses Tutorial? Wie geht’s los?
Dieser Artikel richtet sich grundsätzlich an Personen, die bereits Kenntnisse im Umgang mit PHP haben und denen das grundlegende Konzept der objektorientierten Programmierung nicht unbekannt ist.
So, was brauchen wir hier so? Erstmal ein Grundlagenwissen in PHP — logisch. Dann sollte man sich etwas mit dem System WordPress an sich auskennen. Hier empfiehlt es sich mal in den WordPress Codex reinzuschauen. In diesem Codex findet man eine verhältnismäßig gute Dokumentation darüber, wie man seinen Blog erweitert oder eben ein WordPress Plugin aufbauen kann. Dann brauchen wir noch die Seite von Adam Brown — WordPress hooks database. Auf der Seite findet man sämtliche Hooks von WordPress inkl. Revisionen.
Hook? Captain Hook oder was??
WordPress hat die tollen Eigenschaft, dass man sich nahezu an jeder Stelle ins System “einhängen” kann um den Ablauf seinen Bedürfnissen anzupassen. Es gibt zwei Arten von Hooks: Actions und Filter.
Actions
Ein Action Hook ist ein Hook, der sich zu einem bestimmten Zeitpunkt ins System einklinkt. Dabei kann man dann z.B. eine eigene PHP-Funktion aufrufen. Die reagieren also auf bestimmte Aktionen des Systems.
Filter
Filter dienen der hauptsächlich der Änderung von Texten. Erst nach diesen Änderungen werden sie dann z.B. in der Datenbank gespeichert, oder angezeigt.
So, das war ein absolut minimaler und oberflächlicher Exkurs in die Hooks von WordPress. Detailwissen gibt es dann im WordPress Codex. Aber jetzt legen wir mal los. Unser WordPress Plugin soll mal etwas Quelltext bekommen.
Das Grundgerüst — die Klasse
/*
Plugin Name: Mein erstes WordPress Plugin
Plugin URI: http://www.guardian-online.de
Description: Das ist mein allererstes WordPress Plugin
Author: Benno Mielke
Author URI: http://www.guardian-online.de
Version: 0.0.1
*/
if( !class_exists( 'myPlugin' ) ) {
class myPlugin {
function __construct() {
register_activation_hook( __FILE__, array( &$this, 'activate' ) );
register_deactivation_hook( __FILE__, array( &$this, 'deactivate' ) );
}
function activate() {
// hier setzen wir unsere Hooks, z.B.:
add_action( 'edit_category_form', array( &$this, 'myHookCategory' ) );
}
function deactivate() {
// hier räumen wir wieder auf, wenn das Plugin deaktiviert wird, z.B.:
remove_action( 'edit_category_form', array( &$this, 'myHookCategory' ) );
}
function myHookCategory() {
// hier kommt der Quelltext, den wir ins System bringen wollen
echo '<h3>Mein erster Hook, yay!</h3>';
}
}
}
Also eigentlich sollte der Aufbau bisher nicht sonderlich verwunderlich sein. Jeder der schon mal etwas mit objektorientierter Programmierung zu tun hatte, müsste mit dem Klassenprinzip vertraut sein. Aber fangen wir trotzdem mal oben an …
Der Kommentarblock
Der Kommentarblock ist relativ wichtig — auch im Aufbau. Hier liest das System die Grundinformationen aus, welche später in der Übersichtsseite der Plugins erscheinen. Also übernehmt diesen Block so und ändert einfach die Informationen.
Die Klasse an sich
… und es beginnt hier mit einer kleinen “Sicherheitseinrichtung”. Die Zeile
if( !class_exists( 'myPlugin' ) ) {
prüft, ob unsere Klasse schon mal existiert. Wobei … eigentlich falsch ausgedrückt. Es wird hier geprüft, ob unsere Klasse noch nicht (man achte auf das !) existiert — in dem Fall wird sie “angelegt”. Es reicht ja, wenn sie einmal existiert und nicht 100.000 Mal. Macht ja keinen Sinn.
Danach kommen die OOP-typischen Methoden und Attribute, Funktionen und Variablen, oder wie auch immer
Wir haben einen Konstruktur in Zeile 14, eine Art zweiten Konstruktur in Zeile 19, mit dem wir unsere Hooks am System anmelden, einen nicht auf den ersten Blick erkennbaren Destruktor in Zeile 24, mit dem man wieder aufräumen sollte (Hooks deaktivieren, Datenbankeinträge entfernen etc.), und in Zeile 29 haben wir endlich die erste eigene Plugin-Funktion, die auch tatsächlich mal etwas “sinnvolles” für uns macht — nämlich eine Ausgabe in der Kategorie-Ansicht im Backend.
Der Konstruktor
Der Konstruktor dürfte auf den ersten Blick etwas seltsam aussehen. Es sind nur zwei Funktionen vorhanden:
register_activation_hook( ... ); register_deactivation_hook( ... );
Die Funktion register_activation_hook()
Diese Funktion dient dazu, dem WordPress System mitzuteilen, welche Methode ausgeführt werden soll, wenn das WordPress Plugin aktiviert wird. Erst danach können die eigentlichen Hooks greifen. In unserem Fall rufen wir activate() auf, um unsere Hooks am System anzumelden.
Die Funktion register_deactivation_hook()
Hier haben wir quasi das Gegenteil der Funktion register_activation_hook(). Wird das WordPress Plugin daktiviert, wird die Funktion aufgerufen, die als Parameter übergeben wurde. In dem Fall ist das deactivate() — unser Pseudo-Destruktor.
So weit so gut. Aber was jetzt?
Jetzt kommt noch ein kleiner, aber sehr entscheidender Teil: wir müssen unseren Konstruktor irgendwie aufrufen. Denn schließlich wollen wir ja unsere tollen Funktionen am System anmelden. Dazu fügen wir am Ende der Datei, direkt hinter der schließenden Klammer der ersten if–Abfrage, folgenden Quelltext ein:
if( class_exists( 'myPlugin' ) ) {
$myPluginObject = new myPlugin();
}
if( isset( $myPluginObject ) ) {
add_action( 'init', array( &$myPluginObject, 'activate' ) );
}
Was passiert hier noch? Eigentlich auch wieder nicht viel Aufregendes: wir instanziieren (super tolles Wort
), erstellen ein neues Objekt aus unserer Klasse. Damit ist ja bekanntlich der implizite Konstruktor-Aufruf verbunden. Somit sind wir am System mit unserem WordPress Plugin registriert.
Mit der nächsten Zeile setzen wir einen Hook auf ‘init’. Dieser Hook greift dann, wenn das WordPress System geladen wird. Tjoa … und dann können wir unser Plugin schön verwenden und erweitern. Das Einzigste was noch zu erledigen ist: die PHP-Datei muss in den Ordner wp-content/plugins
Wer hierzu noch spezielle Fragen hat, kann sich selbstverständlich bei mir melden. In diesem Sinne wünsche ich euch happy coding Doods
Update!
Ein Dank gilt Frank, der mich auf eine Kleinigkeit aufmerksam gemacht hat: oberhalb des Konstruktors war eine protected Variable namens myOptions definiert. Diese hat hier nichts verloren und wurde entfernt
- November 19, 2011Eigenes WordPress Plugin erstellen - objektorientiert mit Klassen(2) Comments
- November 13, 2011Neues WordPress Theme für Guardian Online(2) Comments
- September 13, 2011jQuery ToolTip Plugin mit Fokussteuerung(3) Comments
- July 3, 2011Wordpress Template in Zusammenarbeit mit CreateCom(0) Comments
- June 9, 2011Media Queries - Website für das Handy aufbereiten(1) Comments
- May 27, 2011Schriftgröße mit rem statt em oder px? So geht's...(1) Comments
- April 1, 2011div float bottom - es geht doch!(0) Comments
- March 15, 2011Browserweiche mit PHP (mit Wordpress-Beispiel)(0) Comments
- February 21, 2011IE 6 und doppeltes margin(1) Comments
- January 28, 2011Wordpress 3.1 RC3 released **UPDATE**(0) Comments