web-dev-qa-db-ja.com

WordPressはどのようにしてプラグインを同時に実行することを確実にし、プラグインの他のプラグインへの依存をどのように解決しますか?

初期化時にplugin_1_actionを起動するプラグインがあるとします。

それでは、そのプラグインを拡張したいので、plugin_1_actionにフックしますが、そのプラグインがそのプラグインの後にインストールされた場合はどうなりますか?そのプラグインが最初に実行されるわけではないので、plugin_1_actionフックをキャッチする機会を失うでしょうか。

たとえ私のプラグインが明らかにそれ以降にインストールされていたとしても、たとえ何に関係なく、WooのアクションやWooが私のものにフックできることに関係なく、私ができるのは私にとって奇妙で魔法です。

ほとんどのプラグインがinitフックで実行されても(したがって、同じスペースで実行されても)、優先順位の設定は異なります。つまり、plugin1のコードがplugin2のコードの前に実行され、plugin2がplugin1へのフックを持っている場合でも、うまくいきませんが、WordPressにはこの問題はありません。

それはどのように機能しますか?

2
coolpasta

プラグインが実際にロードされるとすぐにplugin_1_action を実行する場合 、つまりdo_action()呼び出しはプラグインファイル内にあり、後でフックされる関数内には存在しないことを意味します。あなたのプラグインが後でロードされた場合は、それをフックすることができなくなります。

これはプラグインがどのように動作するのかほとんどありません。ほとんどすべてのプラグインは、ロードされるとすぐに実際にはコードを実行しません。プラグインは通常、すべての機能をフックして、後で発生するようにします。通常は、すべてのプラグインとテーマがロードされた後に実行されるinitフックより前ではありません。

オリジナルのプラグインにこのコードがあるとしましょう。

function og_plugin_initialize() {
    // Does stuff.

    do_action( 'og_plugin_initialized' );
}

このコードはおそらくinitフックで実行するためにフックされるでしょう:

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

そのためog_plugin_initializedフックは、優先度20のinitフックまで実行されません。

あなたがog_plugin_initializedフックにフックしたい関数を持っていたなら、あなたはこのようにあなたのプラグインにそれを追加するでしょう:

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

このようにしておけば、プラグインとプラグインの両方が後で実行するためにそれらの関数をキューに入れたので、プラグインがどの順序でロードするかは関係ありません。そして、これらの関数はすべてすべてのプラグインが読み込まれた後に実行されるので、元のプラグインで定義されている関数を問題なく使用できます。

3
Jacob Peattie

重要: 代わりに行動やフックをイベントとして考える

その精神モデルはあなたにはるかに良く役立つでしょう。

それでは、そのプラグインを拡張したいので、plugin_1_actionにフックしますが、そのプラグインがそのプラグインの後にインストールされた場合はどうなりますか?

プラグインは好きな順番でインストールできます。プラグインはすべて同じ順番で読み込まれます。最初にプラグインCをインストールしても、そのコードが最初に実行されるわけではありません。

プラグインはアルファベット順にロードされるので、AはBの前に来るので、プラグインaはプラグインbの前にロードされます。

そのプラグインが最初に実行されるわけではないので、plugin_1_actionフックをキャッチする機会を失うことになりますか?

そのアクションが一度起動され、そのイベントがすでに発生しているのなら、それは遅すぎます。あなたはまだそれにフックすることができますが、そのイベントはすでに起こっているので、それは決して実行されません。

彼らが以前よりもむしろ店に行った後に誰かに牛乳を買うように言うことに似ています。あなたはそれをすることができます、しかし、彼らが二度目に店を訪問しない限り、それはあなたに牛乳を与えません。

それがまだうまくいくためには、ある種の時間旅行/時間力学を含む必要があるでしょう。 Who博士はそれを実行できるかもしれませんが、元のプラグインを修正するにはリファクタリングが必要になります。

それは私にとって奇妙で魔法のようなものです。たとえ何に関係なく、たとえばWooのアクションに、そしてWooは私のものにフックできるのです。

行動は単なる行動であり、誰にも属しません。コードのサンドボックス化はなく、一度ロードされるとロードされます。プラグインコードはWP Coreや他のプラグインとすべて同じスペースを共有します。

明らかに私のプラグインがそれ以降にインストールされていたとしても。

インストールの順番は関係ありません。先に学んだように、実行順序は重要です。いったんイベント/アクション/フックが起動されても、それにフックすることはできますが、あなたの関数は再び起動されるまで実行されません。 WPフックはタイムトラベルしません。

ほとんどのプラグインがinitフックで実行されても(つまり同じスペースで実行されても)、優先順位の設定は異なります。

実際、イベントがまだ発生していない場合は、関数が呼び出される順序に影響を与える優先順位を指定できます。

つまり、plugin1のコードがplugin2のコードの前に実行され、plugin2がplugin1へのフックを持っている場合でも、うまくいきませんが、WordPressにはこの問題はありません。

ああ、でもそうです!前述したように、すでに起動しているフックに関数を追加することができます。つまり、フックが起動した前回の時刻に遡って適用されるわけではありません。前述したように、それにはタイムトラベル技術が必要です。

ここでの根本的な問題は、プラグインがinitまたはadmin_initフックが発生する前に動作していることです。プラグインがロードされたら、オブジェクトを設定したり、フックを追加したりする必要がありますが、機能しません。それがinitなどのライフサイクルイベントの目的です。

2
Tom J Nowell