Gibt es irgendwo eine Dokumentation, die den Lebenszyklus der Plugins erklärt?
Ich starte ein neues Plugin mit OOP-Stil und habe gerade herausgefunden, dass meine Hauptklasse viel instanziiert wird (dank Xdebug und Netbeans).
Ich frage mich, warum, und es ärgert mich, weil ich ein Dropbox-API-Objekt instanziiere, und ich hätte wirklich nicht gedacht, dass WordPress nur meine Hauptklasse so instanziieren würde.
Ich habe weder im Codex noch bei Google etwas im Zusammenhang mit dem Lebenszyklus der Plugins gefunden.
plugin-development
codex
RitonLaJoie
quelle
quelle
Antworten:
Was bedeutet "OOP-Stil" für Sie? Alle Ihre Funktionen mit einer Klassenanweisung abschließen? Dann machst du es falsch. Sie missbrauchen die Klasse als Namespace.
Huh?
Probieren Sie es aus und zählen Sie die Anzahl der erstellten Dateien. Wenn ich es ausprobiere, wird für jede Seitenanforderung eine Datei erstellt. Dies bedeutet, dass für jede Seitenanforderung nur eine Instanz der Foo-Klasse vorhanden ist.
Versuchen wir es mit einem Aktionsaufruf
Wenn ich in mein wp-Inhaltsverzeichnis schaue, habe ich zwei Dateien gefunden. Nicht mehr. Eine Datei wird erstellt, wenn die Klasseninstanz erstellt wird. Und eine wird erstellt, wenn der Aktionsaufruf abgeschlossen ist.
OK, lass uns ein paar dumme Sachen mit unserer Instanz machen. Entfernen Sie das
add_action( 'plugins_loaded', .. )
und fügen Sie stattdessen diesen Code hinzu:Wie viele Dateien erwarten Sie? Ich erwarte zwei. Eine vom Konstruktor, eine von der Methode.
Eine neue Instanz wird nur erstellt, wenn der
new
Operator verwendet wird.Jetzt zähle ich vier Dateien. Zwei vom Konstruktor und zwei von der Methode. Dies liegt daran, dass WordPress zuerst das Plugin einbindet und dann den Aktions-Hook ausführt
plugins_loaded
.Es wird empfohlen, den Aktions-Hook zu verwenden,
plugins_loaded
anstatt eine Instanz aus einer Funktion zu erstellen. Wenn die Plug-in-Datei an einer beliebigen Stelle enthalten ist (z. B. in einer anderen Datei Ihres Plug-ins), wird jedes Mal, wenn die Datei enthalten ist, eine neue Instanz der Klasse erstellt. Der Aktions-Hookplugins_loaded
wird für jede Seitenanforderung nur einmal ausgeführt.quelle
Möglicherweise übergeben Sie eine Kopie Ihrer Klasse an einen Filter oder eine Aktion. Wenn Sie beispielsweise Klassenvariablen in einem Hook oder Filter direkt ändern möchten, sollten Sie den Hook auch als Referenz übergeben
Anstatt von
Wie von bainternet erwähnt, können Sie auch ein Singleton-Muster verwenden, um sicherzustellen, dass ein bestimmtes Objekt nur einmal instanziiert wird (weitere Aufrufe geben den Verweis auf dieses Objekt zurück).
Sie können auch in Betracht ziehen, einige Funktionen statisch zu machen (indem Sie ihnen das Schlüsselwort static geben. Dies wird normalerweise für 'helfer'-ähnliche Funktionen durchgeführt, die nicht mit dem Rest der Klasse interagieren. Statische Methoden können aufgerufen werden, ohne eine Klasse zu instanziieren.
Sie können auch statische Funktionen an eine Aktion / einen Filter übergeben:
Ich habe auch http://codex.wordpress.org/Plugin_API/Action_Reference überprüft und festgestellt, dass Plugins nur in zwei Phasen der Anforderung geladen werden können (muplugins_loaded und plugins_loaded).
quelle