問題描述
在自定義帖子型別中設定元框時,我已經使用 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
-
只要不是太早,而不是太晚,你使用哪一個都不重要。最好使用直觀和可預測的掛鉤,所以
add_meta_boxes是首選。有一天在未來 WordPress 可能會改變一些東西,並透過使用最適當的鉤子,增加你的程式碼將來仍然可以工作的機會。 -
有一個例外,我可以想到這一點。有時 (在不太可能發生的情況下),您可能需要呼叫
add_theme_support(),通常用於after_setup_theme操作鉤子,僅適用於作為管理員的登入使用者,但此鉤子不允許您訪問此資訊。因此,您可能需要使用set_current_user或init動作鉤子 (如果可以做到這一點,則進行一些研究) 。
次佳解決方案
還有幾個鉤子:
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。