it-swarm.com.de

Wie stellt WordPress sicher, dass Plugins gleichzeitig ausgeführt werden und wie löst es die Abhängigkeit eines Plugins von einem anderen?

Angenommen, ich habe ein Plugin, das den plugin_1_action bei der Initialisierung auslöst.

Nun, da ich dieses Plugin erweitern möchte, werde ich mich in plugin_1_action einhängen, aber was ist, wenn mein Plugin nach diesem Plugin installiert wurde? Wird das Plugin nicht zuerst ausgeführt und ich verliere die Chance, den plugin_1_action-Hook zu fangen?

Es ist einfach seltsam und magisch für mich, dass ich mich, egal was passiert, in Woos Aktionen einklinken kann und Woo sich in meine einklinken kann, auch wenn mein Plugin eindeutig später installiert wurde.

Selbst wenn die meisten Plugins auf dem Hook init ausgeführt werden (damit sie auf demselben Space ausgeführt werden), haben sie unterschiedliche Prioritäten. Das bedeutet, dass der Code von plugin1 vor dem Code von plugin2 ausgeführt wird und wenn plugin2 einen Haken in plugin1 hat, nun, Pech ... oder nicht, anscheinend hat WordPress dieses Problem nicht.

Wie funktioniert es?

2
coolpasta

Wenn das Plugin tatsächlich plugin_1_actionsobald es geladen ist ausführt, was bedeutet, dass der Aufruf von do_action() nur in der Plugin-Datei und nicht in einer später verknüpften Funktion enthalten ist, dann sind Sie richtig: Sie haben gewonnen. ' Sie können sich nicht einhängen, wenn Ihr Plugin später geladen wird.

So funktionieren Plugins jedoch so gut wie nie. So gut wie alle Plugins führen keinen Code aus, sobald sie geladen sind. Plugins binden normalerweise alle ihre Funktionen ein, um später aufzutreten, normalerweise nicht früher als der Hook init, der ausgeführt wird, nachdem alle Plugins und Designs geladen wurden.

Nehmen wir also an, das Original-Plugin hat diesen Code:

function og_plugin_initialize() {
    // Does stuff.

    do_action( 'og_plugin_initialized' );
}

Dieser Code wird wahrscheinlich eingehakt, um mit dem Hook init ausgeführt zu werden:

add_action( 'init', 'og_plugin_initialize', 20 );

Daher wird der Hook og_plugin_initialized erst mit dem Hook init mit Priorität 20 ausgeführt.

Wenn Sie eine Funktion hatten, die Sie in den og_plugin_initialized-Hook einbinden wollten, würden Sie sie folgendermaßen in Ihr Plugin einfügen:

function my_plugin_init() {
    // Do stuff.
}
add_action( 'og_plugin_initialized', 'my_plugin_init' );

Wenn es so gemacht wird, spielt es keine Rolle, in welcher Reihenfolge die Plugins geladen werden, da beide Plugins und ihre Funktionen in die Warteschlange gestellt wurden, um später ausgeführt zu werden. Und da beide Funktionen ausgeführt werden, nachdem alle Plugins geladen wurden, können Sie die im Original-Plugin definierten Funktionen ohne Probleme verwenden.

3
Jacob Peattie

Wichtig: Stellen Sie sich Aktionen und Hooks stattdessen als Ereignisse vor

Dieses mentale Modell wird Ihnen weitaus besser dienen.

Nun, da ich dieses Plugin erweitern möchte, werde ich mich in plugin_1_action einklinken, aber was ist, wenn mein Plugin nach diesem Plugin installiert wurde?

Sie können Ihre Plugins in beliebiger Reihenfolge installieren. Sie werden unabhängig davon in derselben Reihenfolge geladen. Das Installieren von Plugin C bedeutet nicht, dass der Code zuerst ausgeführt wird.

Plugins werden alphabetisch geladen, daher wird Plugin a vor Plugin b geladen, da A vor B steht, usw

Wird das Plugin nicht zuerst ausgeführt und ich verliere die Chance, den Haken für plugin_1_action zu fangen?

Richtig, wenn die Aktion einmal ausgelöst wurde und dieses Ereignis bereits stattgefunden hat, ist es zu spät. Sie können sich weiterhin daran beteiligen, aber dieses Ereignis ist bereits aufgetreten, sodass es niemals ausgeführt wird.

Ähnlich wie jemandem gesagt wird, er solle Milch kaufen, nachdem er im Laden war, anstatt zuvor. Sie können es tun, aber es bringt Ihnen keine Milch, wenn sie den Laden nicht ein zweites Mal besuchen.

Damit es immer noch funktioniert, müsste es sich um eine Art Zeitreise/Zeitmechanik handeln. Dr. Who ist möglicherweise in der Lage, dies zu tun, es ist jedoch ein Refactoring erforderlich, um das ursprüngliche Plugin zu reparieren.

Es ist einfach seltsam und magisch für mich, dass ich mich, egal was passiert, an Woos Handlungen anhaken kann und Woo sich an meine anhaken kann,

Aktionen sind nur Aktionen, sie gehören niemandem. Es gibt kein Sandboxing von Code und sobald er geladen ist, ist er geladen. Ein Plugin-Code teilt sich den gesamten Speicherplatz mit WP Core und anderen Plugins.

auch wenn mein plugin eindeutig später installiert wurde.

Installationsreihenfolge ist irrelevant. Wie wir bereits zuvor erfahren haben, ist die Ausführungsreihenfolge von Bedeutung, sobald das Ereignis/die Aktion/der Hook ausgelöst wurde, können Sie sich weiterhin daran beteiligen, aber Ihre Funktionen werden erst ausgeführt, wenn sie erneut ausgelöst werden, was möglicherweise nie der Fall ist. WP Hooks machen keine Zeitreise.

Selbst wenn die meisten Plugins auf dem Init-Hook ausgeführt werden (damit sie auf demselben Space ausgeführt werden), haben sie unterschiedliche Prioritäten.

Falls das Ereignis noch nicht eingetreten ist, können Sie eine Priorität angeben, um die Reihenfolge der Funktionsaufrufe zu beeinflussen.

Das bedeutet, dass der Code von plugin1 vor dem Code von plugin2 ausgeführt wird und wenn plugin2 einen Haken in plugin1 hat, nun, Pech ... oder nicht, anscheinend hat WordPress dieses Problem nicht.

Oh doch! Wie bereits erwähnt, können Sie einem Hook Funktionen hinzufügen, die bereits ausgelöst wurden. Dies bedeutet jedoch nicht, dass er rückwirkend auf frühere Zeitpunkte angewendet wird, zu denen der Hook ausgelöst wurde. Wie ich bereits erwähnte, würde dies Zeitreisetechnologie erfordern.

Das Grundproblem hierbei ist, dass das Plugin arbeitet, bevor die Hooks init oder admin_init auftreten. Wenn Plugins geladen werden, sollten sie ihre Objekte einrichten, ihre Hooks usw. hinzufügen, aber sie sollten nicht funktionieren. Dafür gibt es die Lebenszyklusereignisse von init etc

2
Tom J Nowell