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

11

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

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

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

// more like so

}

Спасибо

atinder
источник

Ответы:

16

В общем: да, подождите, пока выделенный хук запустит ваш собственный код. Никогда не бросайте экземпляр объекта в глобальное пространство имен. Но initэто редко необходимо.

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

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

Что касается initкрючка: используйте wp_loadedвместо этого. Это работает после initи после ms_site_check()был назван. Таким образом, вы избегаете запускать ваш плагин на недопустимом под-сайте при установке на несколько сайтов. Все остальное тоже самое.

Фуксия
источник
3
+1 за wp_loadedи MS информация.
Кайзер
большое спасибо за ваш ответ, все еще сомневаюсь, что лучше загружать все другие хуки внутри wp_loaded или загружать их отдельно? Интересно, если я добавлю хуки в wp_loaded, они будут перехвачены раньше, а не перехватываются после admin_init или admin_menu?
atinder
каскадные крючки не проблема?
atinder
Нет, почему так должно быть? Вызывайте второй хук, только если первый был полезен.
fuxia
3

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

Ваши функции обратного вызова не вызываются при регистрации

Функции add_actionи add_filterдобавляют только запись в глобальную переменную, $wp_filterкоторая содержит все фильтры и действия. Смотрите источник . Это не вызывает вашу функцию. Ваш код будет работать только , когда do_actionи apply_filtersназывается (с соответствующим именем крюка), который бывает очень поздно в том месте , где эти крючки должны быть.

Вы можете сказать, что это приведет к увеличению глобальной переменной $wp_filter=> больше памяти. Но я думаю, что создание новой функции имеет ту же проблему.

Организационный код

Объединение всего в одну функцию заставляет вас помнить все хуки в каждом файле вашей темы / плагина. Вы бы не сделали что-то вроде этого:

  • в header.php: добавить хуки и функции обратного вызова для вещей, происходящих в заголовке (например, меню, регистрация скрипта)
  • в content.php: добавить хуки и функции обратного вызова для фильтрации содержимого
  • admin-menu.php: добавить хуки и функции обратного вызова для добавления меню администратора

(предположим, что эти файлы помещены в вашу тему / плагин)

Вместо этого вы должны:

  • ставить только функции обратного вызова в header.php, content.php,admin-menu.php
  • и поместите все хуки в отдельную функцию в другом файле

=> Это затруднит понимание того, что происходит, когда вы смотрите на содержимое header.phpфайла. Вы должны искать, чтобы знать, когда эти обратные вызовы запускаются.

И подумайте о ситуации, когда у вас есть несколько классов в вашей теме / плагине. Вы кладете все крючки всех классов в одном месте? Или у каждого класса есть функция-обертка, которая содержит все хуки? Это слишком избыточно!

Над этими причинами я думаю, что это личный стиль :). Я вижу, что некоторые фреймворки, такие как Hybrid, делают то, что вы сказали. Иногда мне трудно копаться в этих рамках!

Ань Чан
источник