問題描述
在自定義帖子類型中設置元框時,我已經使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。