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