web-dev-qa-db-ja.com

do_actionメソッドとhookメソッド

フックメソッドがWordPressでどのように機能するかを理解しようとしています。私は、do_actionがWPと呼ばれると、登録されたすべてのリスナーを探し、設定された優先順位に従ってそれらを呼び出すことを理解しています。

WordPressコアはどのようにして登録されたすべてのフックメソッドを異なるファイルに集めますか?たとえば、フッターでadd_actionwp_headに宣言しました。実行されますか?それで、WordPressはすべてのファイルにわたって反復するすべてのデータを集めるべきですか?

これを説明してください。

2
Ptzhub

ここでのあなたのアナロジーは部分的には正しいが不完全である:

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はすでに呼ばれています、遅すぎます。パーティーが終わった直後に、子供に「パーティーの前に鞄を詰めるのを忘れないで」と頼むようなものです。

これを念頭に置いて、私はもっと保守しやすいコードのための発見的方法として働く一般的な規則と勧告をいくつか持っています。

  • イベントを発生させる関数内にすべてのコードを配置します。 initafter_theme_setupwp_head、およびadmin_initはそのほとんどをカバーするはずです
  • フックまたはフィルタの外側の唯一のコードはテンプレートファイルであり、最初のadd_action呼び出しは
  • テンプレートの中にフィルタやフックを追加しない、functions.phpやプラグインの中、あるいはそれらのファイルがincludesフォルダのためにincluderequireステートメントを使う場合

通常は物事を保存するときの再帰を防ぐなどのために、これらの規則を破る必要がある状況がいくつかありますが、それらはまれな例外です。実験して何がうまくいくのかを確認し、そして どのアクションがいつ起動されるのか、そしてそのときに何が安全であるのかを示すこの記事を見てください

最後の注意、アクションとフィルタは同じものです。内部的には同じように扱われますが、うまく動作させるためにはいくつか重要な違いがあります。

  • 行動は物事をする
  • フィルタは物事を修正する
  • アクションは何も返す必要はありません
  • フィルタは、最初の引数として「フィルタ処理されている」ものを渡され、常にそれを変更したもの、または修正版を返します。
  • フィルタはたくさん呼ばれているので、フィルタの中で重い作業をしないでください。
  • 翻訳フィルタに引っ掛かってフィルタをエスケープすることには用心してください、それは危険になる可能性があり、それらは最も一般的にフィルタと呼ばれるのでパフォーマンスに大きな影響を与えます
  • allと呼ばれる特に危険なアクション/フィルタがあり、それはすべてのフィルタとフックに対して起動します。デバッグに便利なこともありますが、代わりにクエリモニタなどのプラグインを使用することをお勧めします。
5
Tom J Nowell

テーマを作成していると仮定すると、すべてのアクションはあなたの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');
    }
0
cjbj