問題描述

在自定義帖子型別中設定元框時,我已經使用 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'
    );
}

但是我剛剛讀了 this tutorial,它使用 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) 工作,但…

  • 這是首選方法嗎? (即更最佳化?)

  • 只是不同的方式實現相同的結果,或者

  • 一個壞的方式來新增元框? (如果是,為什麼?)

最佳解決方案

看看這個列表:http://codex.wordpress.org/Plugin_API/Action_Reference

  1. 只要不是太早,而不是太晚,你使用哪一個都不重要。最好使用直觀和可預測的掛鉤,所以 add_meta_boxes 是首選。有一天在未來 WordPress 可能會改變一些東西,並透過使用最適當的鉤子,增加你的程式碼將來仍然可以工作的機會。

  2. 有一個例外,我可以想到這一點。有時 (在不太可能發生的情況下),您可能需要呼叫 add_theme_support(),通常用於 after_setup_theme 操作鉤子,僅適用於作為管理員的登入使用者,但此鉤子不允許您訪問此資訊。因此,您可能需要使用 set_current_userinit 動作鉤子 (如果可以做到這一點,則進行一些研究) 。

次佳解決方案

還有幾個鉤子:

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

並立即執行:

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

如果要從實際註冊元框的鉤子/回撥中執行不同的中止檢查,請儘快使用 WP_Screen 物件,因為 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;

等等。結論:如果你想縮小範圍,使用上面所示的鉤子。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。