Использование wp init хука для вызова других хуков?
Я хочу узнать, является ли это хорошей практикой при разработке тем или плагинов WordPress.
add_action('init','all_my_hooks');
function all_my_hooks(){
// здесь некоторая инициализация, а затем
add_action('admin_init',-----);
add_action('admin_menu',----);
// и так далее
}
спасибо

В общем: Да, дождитесь специального хука, чтобы запустить свой код. Никогда не размещайте экземпляр объекта в глобальном пространстве имен. Но хук init
редко бывает необходимым.
Подключайтесь на как можно более позднем этапе. Если ваш код должен выполняться на хуке wp_head
, не используйте более ранние хуки. Вы даже можете каскадировать хуки:
add_action( 'wp_head', 'first_callback' );
function first_callback()
{
// делаем что-то
// затем
add_action( 'wp_footer', 'second_callback' );
}
Что касается хука init
: используйте вместо него wp_loaded
. Этот хук срабатывает после init
и после вызова ms_site_check()
. Таким образом вы избежите выполнения вашего плагина на недействительном подсайте в мультисайтовой установке. Во всем остальном разницы нет.

большое спасибо за ответ, но остался вопрос: что лучше - загружать все остальные хуки внутри wp_loaded или подключать их отдельно? интересно, если я добавлю хуки в wp_loaded, они будут подключены раньше, а не после admin_init или admin_menu?

Я не вижу больших преимуществ этой практики по следующим причинам:
Ваши callback-функции не вызываются при регистрации
Функции add_action
и add_filter
только добавляют запись в глобальную переменную $wp_filter
, которая содержит все фильтры и действия. Смотрите исходный код. Они не вызывают вашу функцию. Ваш код выполнится только при вызове do_action
и apply_filters
(с соответствующим именем хука), что происходит очень поздно в том месте, где эти хуки должны быть.
Можно сказать, что это приведёт к увеличению глобальной переменной $wp_filter
=> требуется больше памяти. Но я думаю, что создание новой функции имеет ту же проблему.
Организация кода
Размещение всего в одной функции заставляет вас помнить все хуки в каждом файле вашей темы/плагина. Вы не стали бы делать так:
- в
header.php
: добавлять хуки и callback-функции для событий в шапке (например, меню, регистрация скриптов) - в
content.php
: добавлять хуки и callback-функции для фильтрации контента - в
admin-menu.php
: добавлять хуки и callback-функции для добавления меню в админке
(предположим, что эти файлы находятся в вашей теме/плагине)
Вместо этого вам придётся:
- размещать только callback-функции в
header.php
,content.php
,admin-menu.php
- а все хуки помещать в отдельную функцию в другом файле
=> Это затруднит понимание происходящего при просмотре содержимого файла header.php
. Вам придётся искать, чтобы узнать, когда вызываются эти callback-функции.
И подумайте о ситуации, когда у вас есть несколько классов в вашей теме/плагине. Вы размещаете все хуки всех классов в одном месте? Или каждый класс имеет обёрточную функцию, содержащую все хуки? Это слишком избыточно!
Учитывая вышеперечисленные причины, я думаю, что это вопрос личного стиля :). Я видел, что некоторые фреймворки, например Hybrid, делают так, как вы сказали. Иногда это затрудняет изучение этих фреймворков!
