元框:“ admin_init”或“ add_meta_boxes”钩子?


9

在自定义帖子类型中设置元框时,我已经使用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' 
    );
}

但是我刚刚阅读了本教程该教程使用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确实有效,但是...

  • 这是首选方法吗?(即更优化?)
  • 只是获得相同结果的一种不同方式,或者
  • 添加元框的一种方法?(如果是这样,为什么?)

4
请查看以下列表:codex.wordpress.org/Plugin_API/Action_Reference-使用哪一个都没有关系,只要它还不太早也不太晚。最好使用直观且可预测的钩子,因此add_meta_boxes是首选。
保罗

@保罗大。您可以将其发布为答案吗(这样我可以相信您)?
卧铺

3
同意,我认为只是本教程的作者并不了解add_meta_boxes。我们甚至"add_meta_boxes_$post_type"有更好的控制。
brasofilo

Answers:


4

看一下此列表:http : //codex.wordpress.org/Plugin_API/Action_Reference

  1. 只要使用的时间不早也不晚就没关系。最好使用直观且可预测的钩子,因此add_meta_boxes是首选。将来的某一天,WordPress可能会有所改变,并且通过使用最合适的钩子,您可以增加代码在将来仍然可以使用的机会。
  2. 我可以想到一个例外。有时(在不太可能发生的情况下),您可能需要例如调用add_theme_support(),该调用通常与after_setup_theme操作挂钩一起使用,仅适用于作为管理员的登录用户,但是此挂钩尚不允许您访问此信息。因此,您可能必须改用set_current_userinit动作钩子(在进行了一些研究后,如果可以安全的话)。

3

还有其他几个挂钩:

do_action( 'add_meta_boxes', $post_type, $post );

然后立即运行:

do_action( "add_meta_boxes_{$post_type}", $post );

如果要在实际注册元框的挂钩/回调中执行不同的中止检查,请使用上述方法之一,因为\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;

等等。结论:如果要缩小范围,请使用上面显示的挂钩。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.