Мета-боксы: ловушка '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

Ответы:

4

Посмотрите на этот список: http://codex.wordpress.org/Plugin_API/Action_Reference

  1. Неважно, какой вы используете, пока это не слишком рано и не слишком поздно. Лучше использовать интуитивные и предсказуемые хуки, поэтому add_meta_boxesпредпочтительнее. Когда-нибудь в будущем WordPress может что-то изменить, и, используя наиболее подходящие хуки, вы увеличите свои шансы на то, что ваш код все еще будет работать в будущем.
  2. Есть одно исключение, о котором я могу подумать. Иногда (в случаях, которые очень маловероятны) вам может понадобиться, например, вызов, add_theme_support()который обычно используется с after_setup_themeловушкой действий только для зарегистрированных пользователей, которые являются администраторами, но эта ловушка не позволяет вам получить доступ к этой информации. Поэтому вам, вероятно, придется вместо этого использовать хуки set_current_userили initдействия (после некоторого исследования, если это безопасно).
Павел
источник
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;

и так далее. Вывод: если вы хотите сузить круг, используйте крючки, показанные выше.

кайзер
источник