wp initフックを使用して他のフックを呼び出しますか?


11

WordPressのテーマやプラグインの開発に応じて良い方法かどうか知りたい。

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

add_action('admin_init',-----);
add_action('admin_menu',----);

// more like so

}

ありがとう

回答:


16

一般的に:はい、専用フックが独自のコードを開始するのを待ちます。オブジェクトインスタンスをグローバルネームスペースにスローしないでください。しかしinit、めったに必要ではありません。

あなたはできるだけ遅くフックインします。最初のコードが実行される場合wp_headは、以前のフックを使用しないでください。フックをカスケードすることもできます:

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

initフックについて:wp_loaded代わりに使用してください。それは呼び出されたinitms_site_check()に実行されます。このようにして、マルチサイトインストールの無効なサブサイトでプラグインを実行することを避けます。他はすべて同じです。


3
+1 wp_loadedとMS情報。
カイザー2012年

あなたの応答にたくさん感謝しますが、それでも疑問です、wp_loaded内の他のすべてのフックをロードするか、別々にロードする方が良いですか?wp_loadedにフックを追加するかどうか、それらはadmin_initまたはadmin_menuの後にフックされるのではなく、より早くフックされるのでしょうか?
12

フックのカスケードは問題ではありませんか?
2012年

いいえ、なぜそうなのですか?最初のフックが役に立った場合にのみ、2番目のフックを呼び出します。
fuxia

3

次の理由により、この方法の大きな利点はわかりません。

登録時にコールバック関数が呼び出されない

add_actionそしてadd_filter機能だけグローバル変数にエントリを追加し$wp_filter、すべてのフィルタとアクションを保持しています。ソースを参照してください。関数を呼び出すことはありません。コードは、およびが(適切なフック名で)呼び出されたときにのみ実行されます。これは、これらのフックがある場所で非常に遅く発生します。do_actionapply_filters

そうすることで、グローバル変数$wp_filterが大きくなる=>より多くのメモリが必要になると言うかもしれません。しかし、新しい関数を作成することにも同じ問題があると思います。

コードの整理

すべてを1つの関数に入れると、テーマ/プラグインのすべてのファイルのすべてのフックを思い出さなければなりません。あなたこのようなことをしないでしょ

  • in header.php:ヘッダーで発生したこと(メニュー、スクリプトの登録など)にフックとコールバック関数を追加する
  • in content.php:コンテンツをフィルタリングするためのフックとコールバック関数を追加します
  • admin-menu.php:管理メニューを追加するためのフックとコールバック関数を追加します

(これらのファイルがテーマ/プラグインに配置されていると仮定します)

その代わりに、次のことを行う必要があります。

  • にのみ、コールバック関数を入れheader.phpcontent.phpadmin-menu.php
  • すべてのフックを別のファイルの別の関数に入れます

=>これは、header.phpファイルの内容を見るときに何が起こるかを知るのを難しくします。これらのコールバックがいつ起動されるかを知るために検索する必要があります。

テーマ/プラグインに複数のクラスがある場合の状況について考えてください。すべてのクラスのすべてのフックを1か所に配置しますか?または、各クラスにすべてのフックを保持するラッパー関数がありますか?冗長すぎる!

これらの理由の上で、それは個人的なスタイルだと思います:)。ハイブリッドのようないくつかのフレームワークがあなたが言ったことをしているのを見ます。時々それはそれらのフレームワークを掘り下げるのを難しくします!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.