问题描述

在自定义帖子类型中设置元框时,我已经使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。