web-dev-qa-db-ja.com

他のフックを呼び出すためにwp init hookを使用しますか?

私はそれが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

}

ありがとう

11
atinder

一般的に:はい、あなた自身のコードを起動するための専用フックを待ちます。 決して 単にオブジェクトインスタンスをグローバル名前空間にスローするだけです。しかしinitはめったに必要ではありません。

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

add_action( 'wp_head', 'first_callback' );

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

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

16
fuxia

これらの理由から、このプラクティスのbigの利点は見当たりません。

登録時にコールバック関数は呼び出されません

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

そうすると、グローバル変数$wp_filterが大きくなり、必要なメモリが増えます。しかし、新しい関数の作成にも同じ問題があると思います。

コードを整理する

one関数にすべてを入れると、テーマ/プラグインのすべてのファイルのすべてのフックを記憶するように強制します。あなたは次のようなことをしません

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

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

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

  • header.phpcontent.phpadmin-menu.phpにコールバック関数のみを配置します
  • そして、すべてのフックを別のファイルの分離された関数に入れます

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

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

これらの理由よりも、個人的なスタイルだと思います:)。 Hybridのようないくつかのフレームワークは、あなたが言ったことを行うと思います。これらのフレームワークを掘り下げるのが難しい場合があります!

3
Anh Tran