Namespace Konflikt in WordPress Plugins

Namespace Konflikt in Wordpress Plugin

Table of content

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.

Related posts

WP Mail ist nicht kaputt - DKIM für wp_mail

WP_Mail ist nicht kaputt

Reading Time: 10:54 min

Warum versuchen dann alle, es zu reparieren? Ich versuche, es zu erklären. WP_Mail() ohne funktionierendem DKIM schlägt fehl – und hier bekommst du die Lösung. Ich zeige dir, wie du…

View post
Offset für Anchor Links in Bricks

Offset für Smooth Scroll in Bricks hinzufügen

Reading Time: 1:22 min

Wie du das Offset für Anchor Links in Bricks anpassen kannst, siehst du hier. Wenn du Anchor Links in Bricks nutzt, dann musst du ggfs. dein Offset anpassen. Was ist…

View post
Mann am Computer - Cyberpanel Block 7080

Cyberpanel webAdmin – Blocke Port 7080

Reading Time: 1:37 min

Wie blockt man den Zugriff auf den Port 7080 in Cyberpanel? Möchtest du den Zugang zu 7080 blockieren und die Firewall-Regeln werden nicht wie erwartet aktualisiert? Wenn du Openlitespeed für…

View post

1 Kommentar

  • Отдых в Твери

    I’m impressed, I must say. Rarely do I encounter a blog that’s equally educative and entertaining, and let me tell you, you have hit the nail on the head. The issue is something which not enough folks are speaking intelligently about. I am very happy that I stumbled across this in my search for something concerning this.

Hinterlasse deinen Kommentar