web-dev-qa-db-ja.com

メタボックス: 'admin_init'または 'add_meta_boxes'フック

カスタム投稿タイプでメタボックスを設定するとき、私はadd_meta_boxesフックを使ってそうしました、例えば。

add_action('add_meta_boxes', 'meta_box_setup');
function meta_box_setup()
{
    add_meta_box( 
        'mb_movie_review', 
        'Movie Review Details', 
        'display_movie_review_mb', 
        'movie-reviews', 
        'side', 
        'high' 
    );
}

しかし、私は このチュートリアル を読んだばかりです。これはadmin_initフックを使って次のようにします。

add_action('admin_init', 'meta_box_setup');
function meta_box_setup()
{
    add_meta_box( 
        'mb_movie_review', 
        'Movie Review Details', 
        'display_movie_review_mb', 
        'movie-reviews', 
        'side', 
        'high' 
    );
}

admin_initフックを使ってやったのは初めてです。

質問

後者のメソッド(admin_initを使う)は動作しますが...

  • これは優先メソッドですか? (より最適化された?)
  • 同じ結果を得るには、異なるの方法だけを使用する
  • a bad way to add meta boxes? (if so, why?)
8
sleeper

このリストを見てください: http://codex.wordpress.org/Plugin_API/Action_Reference

  1. 早すぎず遅すぎない限り、どちらを使用してもかまいません。直感的で予測可能なフックを使用するのが最善なので、add_meta_boxesが優先されます。将来的にはWordPressが何かを変更する可能性があり、最も適切なフックを使用することで、コードが将来も機能する可能性を高めることができます。
  2. 私が考えることができる例外が1つあります。時には(ほとんど起こりそうもないケースでは)、管理者であるログインユーザのためだけにafter_setup_themeアクションフックで一般的に使用されているadd_theme_support()を呼び出す必要があるかもしれませんが、このフックはまだこの情報にアクセスできません。したがって、おそらく代わりにset_current_userまたはinitアクションフックを使用する必要があります(それが安全な場合は何らかの調査を行った後)。
4
Paul

他にもいくつかのフックがあります。

do_action( 'add_meta_boxes', $post_type, $post );

そして直後に実行します。

do_action( "add_meta_boxes_{$post_type}", $post );

実際にメタボックスを登録するフック/コールバック内から異なる中止チェックを実行したい場合は、\WP_Screenオブジェクトがadmin_initが実行されると早く充填されないので上記のいずれかを使用してください。

より一般的なadd_meta_boxesフックを使用した場合は、その最初の引数に対して確認できます。

function register( $post_type, $post )
{
    if ( get_current_screen()->post_type !== $post_type )
        return;

    add_meta_box( /* etc. */ );
}

投稿が少なくとも一度も保存されていない限りメタボックスを追加したくない場合は、次のチェックボックスをオンにします。

if ( 'add' !== get_current_screen()->action )
    return;

等々。結論:あなたが物事を絞り込みたいのなら、上に示したフックを使ってください。

2
kaiser