Использование wp init хука для вызова других хуков?

9 окт. 2012 г., 17:32:35
Просмотры: 24.9K
Голосов: 13

Я хочу узнать, является ли это хорошей практикой при разработке тем или плагинов WordPress.

add_action('init','all_my_hooks');

function all_my_hooks(){

// здесь некоторая инициализация, а затем

add_action('admin_init',-----);
add_action('admin_menu',----);

// и так далее

}

спасибо

0
Все ответы на вопрос 2
4
17

В общем: Да, дождитесь специального хука, чтобы запустить свой код. Никогда не размещайте экземпляр объекта в глобальном пространстве имен. Но хук 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(). Таким образом вы избежите выполнения вашего плагина на недействительном подсайте в мультисайтовой установке. Во всем остальном разницы нет.

9 окт. 2012 г. 17:47:59
Комментарии

+1 за wp_loaded и информацию о мультисайтовости.

kaiser kaiser
9 окт. 2012 г. 17:51:32

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

atinder atinder
9 окт. 2012 г. 21:35:35

каскадирование хуков не проблема?

atinder atinder
9 окт. 2012 г. 22:50:19

Нет, зачем? Вызывайте второй хук только если первый был полезен.

fuxia fuxia
9 окт. 2012 г. 22:56:57
0

Я не вижу больших преимуществ этой практики по следующим причинам:

Ваши 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, делают так, как вы сказали. Иногда это затрудняет изучение этих фреймворков!

10 окт. 2012 г. 05:01:07