フックメソッドがWordPressでどのように機能するかを理解しようとしています。私は、do_action
がWPと呼ばれると、登録されたすべてのリスナーを探し、設定された優先順位に従ってそれらを呼び出すことを理解しています。
WordPressコアはどのようにして登録されたすべてのフックメソッドを異なるファイルに集めますか?たとえば、フッターでadd_action
をwp_head
に宣言しました。実行されますか?それで、WordPressはすべてのファイルにわたって反復するすべてのデータを集めるべきですか?
これを説明してください。
ここでのあなたのアナロジーは部分的には正しいが不完全である:
Do_actionが呼び出されると、wpは登録されているすべてのリスナーを探し、設定されている優先順位に従ってそれらを呼び出します。
add_action
を呼び出したときに何が起こるかを考慮する必要があります。 WordPressはadd_action
ステートメントを検索しません。それらはリストにあります。 add_action
を呼び出すと、そのアクションが発生したときに呼び出すコールバックのリストが更新されます。
これを念頭に置いて、イベントのアナロジーを使用するほうが便利です。
do_action( 'init' )
'init'アクションを起動するadd_action('init', 'myfunction' )
init
イベントが発生したら、myfunction
を呼び出してください。function myfunction() {}
ああinit
イベントが起こりましたイベントに似ていることは、アクションやフィルタがどのように機能するのかを理解するときに非常に役立ちます。タイミングに関して理解していないときに発生する問題のクラス全体があるからです。
add_action
アクションのフッターでwp_head
を呼び出す例を見てみましょう。 wp_head()
が呼び出されるとwp_head
が起動します。これは<header>
タグの間のヘッダーで発生します。フッターにアクションを追加しようとすると、それが追加され、次回wp_head()
が呼び出されたときに起動されます。しかしwp_head
はすでに呼ばれています、遅すぎます。パーティーが終わった直後に、子供に「パーティーの前に鞄を詰めるのを忘れないで」と頼むようなものです。
これを念頭に置いて、私はもっと保守しやすいコードのための発見的方法として働く一般的な規則と勧告をいくつか持っています。
init
、after_theme_setup
、wp_head
、およびadmin_init
はそのほとんどをカバーするはずですadd_action
呼び出しはfunctions.php
やプラグインの中、あるいはそれらのファイルがincludesフォルダのためにinclude
やrequire
ステートメントを使う場合通常は物事を保存するときの再帰を防ぐなどのために、これらの規則を破る必要がある状況がいくつかありますが、それらはまれな例外です。実験して何がうまくいくのかを確認し、そして どのアクションがいつ起動されるのか、そしてそのときに何が安全であるのかを示すこの記事を見てください
最後の注意、アクションとフィルタは同じものです。内部的には同じように扱われますが、うまく動作させるためにはいくつか重要な違いがあります。
all
と呼ばれる特に危険なアクション/フィルタがあり、それはすべてのフィルタとフックに対して起動します。デバッグに便利なこともありますが、代わりにクエリモニタなどのプラグインを使用することをお勧めします。テーマを作成していると仮定すると、すべてのアクションはあなたのfunctions.php
に属します。ここで、テンプレート内の特定のイベントにアクションを追加します。
functions.php
WPには、テーマテンプレートの特定の時点で実行されることになっているアクションのリストがあります。 wp_head()
とwp_footer()
のように、do_action('wp_head')
とdo_action('wp_footer')
の省略形で定義済みのアクションフックがいくつかあります。これらは定義されているので、プラグインにはアクションを追加できる標準的な場所があります。 do_action
を使って独自のアクションフックを定義することもできます。
たとえば、すべての投稿の最後に同じ画像を追加する場合は、functions.php
に次のアクションを定義します。
add_action ('my_post_image', 'generate_my_post_image');
function generate_my_post_image () {
echo '<img src="path_to_my_image">';
}
それであなたのindex.php
にあなたがいるでしょう:
while (have_posts()) {
... generate your post ...
do_action ('my_post_image');
}