Namespace Konflikt in WordPress Plugins

Namespace Konflikt in Wordpress Plugin

Übersicht

Es gibt aktuell einen Namespace Konflikt in WordPress Plugins – genauer geht es um Borlabs Cache und Shortpixel Adaptive Images. Über die Verwendung von Borlabs Cache habe ich bereits berichtet, wohingegen Shortpixel Adaptive Images ebenso wie Borlabs Cache zur Verbesserung der Ladegeschwindigkeit beitragen soll (und es übrigens auch tut).

Stell dir vor, du könntest alle Probleme mit Bildern auf deiner Website mit einem einfachen Klick lösen und die Seitengeschwindigkeit und Leistung erhöhen. Genau das soll Shortpixel Adaptive Images lösen.

Allerdings treten Probleme auf, wenn du gleichzeitig Borlabs Cache neben Shortpixel AI aktiviert hast:

Got error 'PHP message: PHP Fatal error:  Cannot declare class MatthiasMullie\\Minify\\Minify, because the name is already in use in...

Ich verwende Borlabs Cache, wie du vielleicht weißt, und ich wollte mit Shortpixel meine Bilder zusätzlich optimieren. Der oben genannte Fehler trifft auf, wenn du das Adaptive Image Plugin gleichzeitig aktivierst.

Das Plugin Image Optimizer hingegen funktioniert hervorragend zusammen mit Borlabs Cache.

“Die Klasse MatthiasMullie kann nicht deklariert werden” ist eine Fehlermeldung, der ich auf den Grund gehen will.

Nach kurzer Prüfung stellt sich heraus, das beide Plugins den selben Namespace verwenden.

namespace MatthiasMullie\Minify;

Letztlich hatte es zur Folge, dass gewisse Inhalte nicht mehr dargestellt wurden, und außerdem die Bildoptimierung nicht funktionierte.

Was also tun, wenn du beide Plugins dennoch nebeneinander nutzen willst?

Kurze Antwort: Vielleicht ist das Umbenennen von Namespaces eine Option – für minify und path-converter, die beide auch in Borlabs Cache verwendet werden.

In PHP ist ein Namespace eine Möglichkeit, zusammengehörige Klassen, Schnittstellen, Funktionen und Konstanten unter einem einzigen Namen zu gruppieren. Namespaces helfen dabei, Namenskonflikte zu vermeiden, wenn zwei oder mehr Klassen denselben Namen haben, indem sie es dir ermöglichen, dieselbe Klasse in verschiedenen Namespaces zu definieren.

Um einen Namespace zu definieren, verwendest du das Schlüsselwort Namespace, gefolgt von dem Namen des Namespaces, etwa so:

namespace MyApp\Models;

class User {
    // class definition
}

Um eine Klasse oder Funktion aus einem Namespace zu verwenden, musst du sie über ihren voll qualifizierten Namen referenzieren. Dieser besteht aus dem Namespace-Namen, gefolgt von dem Klassen- oder Funktionsnamen, getrennt durch einen Backslash (\), etwa so:

$user = new \MyApp\Models\User();

Alternativ kannst du die use-Anweisung verwenden, um einen Namespace in den aktuellen Bereich zu importieren, und dann die Klasse oder Funktion ohne das Namespace-Präfix referenzieren:

use MyApp\Models\User;

$user = new User();

Namensräume können auch verwendet werden, um verwandte Funktionen und Konstanten zu organisieren, genau wie Klassen und Schnittstellen. Es gelten dieselben Regeln: Du kannst sie mit dem Namensraumnamen und dem Backslash (\) als Trennzeichen definieren und darauf zugreifen.

Zusammenfassend lässt sich sagen, dass Namespaces in PHP eine Möglichkeit sind, Code zu organisieren, Namenskonflikte zu vermeiden und deinen Code lesbarer und wartbarer zu machen.

Was also, wenn zwei Plugins denselben Namespace verwenden?

Im Falle eines Namespace Konflikt in WordPress Plugins kannst du entweder den Namespace eines der beiden Plugins umbenennen oder du kannst einen Alias verwenden, um auf einen der beiden Namespaces zu verweisen.

Beispiel:

use Blog\Plugins\MyPlugin als MyPluginA;
use Blog\Plugins\MyPlugin as MyPluginB;

Borlabs hat die Klasse in eine Vendor-Bibliothek aufgenommen, während Shortpixel sie in einer include/libs Bibliothek verwendet hat.

Wir können darüber nachdenken, die Namespaces umzubenennen, wenn es keinen Konflikt gibt, oder einen Alias dafür verwenden.

Ich könnte die Alias-Einstellung in die Datei functions.php meines Themes aufnehmen, da die Datei functions.php ein üblicher Ort ist, um benutzerdefinierten Code in ein WordPress-Theme aufzunehmen. Ich würde jedoch an dieser Stelle bedenken, dass die Datei functions.php bei jedem Laden der Seite mitgeladen wird, daher ist es wichtig, die Auswirkungen auf die Leistung zu berücksichtigen, wenn du Code in diese Datei einfügst.

Namespace Konflikt in WordPress Plugins via functions.php lösen

Hier ist ein Beispiel dafür, wie du die Alias-Einstellung in der Datei functions.php deines Themes hinzufügen kannst:

use Blog\Plugins\MyPlugin als MyPluginA;
use Blog\Plugins\MyPlugin as MyPluginB;

$my_plugin_a = new MyPluginA\ClassA();
$my_plugin_b = new MyPluginB\ClassB();

Aber wie gesagt, meiner Meinung nach könnte man das besser mit einem Plugin machen.

Wenn ein Plugin die Verwendung eines NameSpace-Alias erfordert, ist es am besten, den Alias in der Hauptdatei deines Plugins zu deklarieren. So wird sichergestellt, dass der Alias im gesamten Plugin verwendet werden kann.

In diesem Beispiel wird die use-Anweisung verwendet, um zwei Aliase für denselben Namespace zu deklarieren, so dass du beide Plugins ohne einen Konflikt verwenden kannst. Die beiden Instanzen der Klasse aus den konfliktbehafteten Plugins können dann unter Verwendung der aliierten Namensraumnamen instanziiert werden.

Übrigens: ich habe mit dem Entwickler von Shortpixel Adaptive Images kommuniziert – die Antwort kam super schnell! Sie sind auf jeden Fall bemüht, sich der Sache umgehend anzunehmen und eine Lösung bereit zu stellen. Borlabs ist ebenfalls angeschrieben, schauen wir mal, was passiert.

Außerdem sind alle drei hier genannten Plugins tolle Werkzeuge, mit denen du die Nutzung deiner Seite angenehmer und schneller machen kannst.

Weitere Beiträge

Fehler in der php.ini

Php übernimmt Einstellungen nicht?

Reading Time: 1:37 min

Hast du deine Einstellungen in der php.ini geändert, aber diese wollen partout nicht übernommen werden? Eventuell hast du einen Fehler in der php.ini WordPress benötigt höhere Upload Limits In der…

Zum Beitrag
Shared Hosting vs. Dedicated Server

Hosting: Shared vs eigener Server

Reading Time: 16:17 min

Shared Hosting und eigene Server unterscheiden sich in vielen Aspekten grundlegend voneinander. Beim Shared Hosting teilen sich mehrere Websites die Ressourcen eines Servers, was zu niedrigeren Kosten führt, aber auch…

Zum Beitrag
Designer vs Developer - wo sind die Unterschiede

Web Designer vs. Web Developer: Die Unterschiede verstehen

Reading Time: 9:11 min

Webdesigner/innen und Webentwickler/innen spielen bei der Erstellung von Websites unterschiedliche, aber sich ergänzende Rollen. Webdesigner/innen konzentrieren sich auf die visuellen Aspekte, einschließlich Layout, Farbgestaltung und Typografie.

Zum Beitrag

Hinterlasse einen Kommentar