問題描述

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