初期化時にplugin_1_action
を起動するプラグインがあるとします。
それでは、そのプラグインを拡張したいので、plugin_1_action
にフックしますが、そのプラグインがそのプラグインの後にインストールされた場合はどうなりますか?そのプラグインが最初に実行されるわけではないので、plugin_1_action
フックをキャッチする機会を失うでしょうか。
たとえ私のプラグインが明らかにそれ以降にインストールされていたとしても、たとえ何に関係なく、WooのアクションやWooが私のものにフックできることに関係なく、私ができるのは私にとって奇妙で魔法です。
ほとんどのプラグインがinit
フックで実行されても(したがって、同じスペースで実行されても)、優先順位の設定は異なります。つまり、plugin1のコードがplugin2のコードの前に実行され、plugin2がplugin1へのフックを持っている場合でも、うまくいきませんが、WordPressにはこの問題はありません。
それはどのように機能しますか?
プラグインが実際にロードされるとすぐに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' );
このようにしておけば、プラグインとプラグインの両方が後で実行するためにそれらの関数をキューに入れたので、プラグインがどの順序でロードするかは関係ありません。そして、これらの関数はすべてすべてのプラグインが読み込まれた後に実行されるので、元のプラグインで定義されている関数を問題なく使用できます。
重要: 代わりに行動やフックをイベントとして考える
その精神モデルはあなたにはるかに良く役立つでしょう。
それでは、そのプラグインを拡張したいので、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
などのライフサイクルイベントの目的です。