Konflikt

Aus WordWiki.de
Wechseln zu: Navigation, Suche

Ein Konflikt ist im Bezug zu WordPress eine Situation, bei der sich zwei Plugins oder ein Theme und ein Plugin in die Quere kommen, und so eine Fehldarstellung oder Fehlfunktion erzeugen. Durch Konflikte verursachte Fehlfunktion können sich vom Fehlverhalten einzelner Details bis hin zur totalen Nutzlosigkeit einer bestimmten Funktionalität äußern. Wenn ein Konflikt einen internen PHP-Fehler hervorruft (z.B. durch eine doppelte Klassen-Definition, oder ein anderes vom Plugin unerwartetes Verhalten), kann sogar die komplette Website unaufrufbar werden. In einigen wenigen Fällen ist auch eine Beeinträchtigung der Sicherheit möglich.

Technischer Hintergrund

Konflikte können unter WordPress verschiedene Ursachen haben. Auf die häufigsten und typischsten Fälle wird hier für Entwickler genauer eingegangen, und erklärt, wie sie sich beheben bzw. vermeiden lassen.

API-Hooks

Mit Plugins erweiterbare Content-Management-Systeme wie WordPress verwenden sogenannte API-Hooks, an welche Plugins (und auch Themes) Funktionen binden können. Eine API-Hook wird bei einer bestimmten Aktivität im WordPress-System ausgeführt, z.B. wenn gerade der Inhalt eines Beitrags für einen Besucher gerendert wird, oder wenn ein neuer Beitrag veröffentlicht wird. Bein anbinden an eine API-Hook kann dem WordPress-System eine Prioritätsnummer mitgeteilt werden. Anhand dieser wird die Reihenfolge festgelegt, falls mehrere Funktionen an die gleiche Hook gebunden sind. Es wird von der niedrigsten bis zur höchsten Nummer verfahren, sodass die höchste Priorität als letztes ausgeführt. API-Hooks teilen entweder nur Informationen an die gebundene Funktion mit (sogenannte Actions), oder können von dieser sogar Änderungen vornehmen lassen (sogenannte Filters). Genau letzter Fall kann zu Problemen führen, wenn zwei Plugins auf die selbe API-Hook zugreifen, und die Priorität zueinander nicht in der richtigen Reihenfolge gesetzt ist.

Theoretisches Beispiel

Angenommen man hat ein Plugin A, dass einem Bild nach dem Hochladen in WordPress automatisch ein Wasserzeichen hinzufügt. Und man hat ein weiteres Plugin B, welches bestimmte weitere Bildgrößen beim Hochladen eines Bildes anfertigt. Beide Plugins haben die gleiche Priorität, und funktionieren jeweils einzeln aktiviert perfekt.

Wenn die Hooks dieser beiden Plugins jedoch nun in der eben genannten Reihenfolge ausgeführt werden, kommt es letztendlich dazu, dass zwar das originale Bild sowie die von WordPress selbst definierten Bildgrößen ein Wasserzeichen von Plugin A haben, nicht jedoch jene Bildgrößen, welche von Plugin B angefertigt wurden. Schließlich wurde Plugin B ja nach Plugin a ausgeführt. Die Lösung dieses wohlgemerkt relativ kleinen Konfliktes bestände darin, dass die Priorität von Plugin B höher gesetzt werden müsste, als die von Plugin A.

Gleiche Funktions- und Klassennamen

Ebenso fehleranfällig, aber sehr viel einfacher vermeidbar, ist das Vorkommen von gleichen bzw. doppelten Funktions- oder Klassennamen. Wenn die zwei Plugins aus eben genannten Beispiel beide z.B. den Funktionsnamen new_upload auf globaler Ebene verwenden, um diesen an die API-Hook zu binden, so wird dies in Kombination miteinander ebenfalls zu einem Fehlverhalten führen. Es wird lediglich die zuletzt gebundene Funktion aufgerufen, da diese die vorhergehende überschrieben hat. Bei Klassennamen sieht das ganze noch tragischer aus. Da PHP das Überschreiben einer Klasse nicht erlaubt, wird beim Versuch des doppelten Definierens ein PHP-Fehler ausgeworfen, und das Skriptablauf abgebrochen. Die Website samt dem Admin-Panel ist nicht mehr aufrufbar. Das eines der am Konflikt beteiligten Plugins muss über FTP manuell entfernt, oder der Ordner umbenannt werden, damit WordPress wieder richtig laufen kann. Die Lösung für doppelte Funktions- und Klassennamen besteht ganz einfach darin, jeder in der Hauptebene des Skriptes liegenden Funktion und Klasse ein einmaliges Präfix zu geben, was nicht von einem anderen Plugin verwendet wird. Falls das entsprechende Plugin beispielsweise “Email on new posts” heißt, könnte das Präfix eonp_ lauten. Da dies bei vielen Funktionen sehr umständlich werden kann, sollten umfangreiche Plugins grundsätzlich eine übergeordnete Klasse verwenden, in der alle weiteren Funktionen definiert sind. So muss lediglich der Klasse das einmalige Präfix gegeben werden, die Funktionen innerhalb der Klasse können jedoch bedenkenlos ohne Präfix definiert und verwendet werden, da diese sich nun nicht mehr auf globaler Ebene befinden.