методы do_action и hook

Я пытаюсь понять, как работают методы hook в WordPress. Я понимаю, что когда do_action называется WP ищет всех зарегистрированных слушателей и вызывает их в соответствии с установленным приоритетом.

Как ядро ​​WordPress собирает все зарегистрированные методы hook в разных файлах? Например, я объявил add_action для wp_head в нижнем колонтитуле. Будет ли это выполнено? Похоже, что WordPress должен собирать все данные, итерации по всем файлам?

Пожалуйста, объясните это.

Ваша аналогия здесь частично правильная, но неполная:

Я понимаю, что когда do_action называется wp, он ищет всех зарегистрированных слушателей и вызывает их в соответствии с установленным приоритетом.

Вам нужно подумать о том, что происходит, когда вы вызываете add_action . WordPress никогда не ищет инструкции add_action , у него есть те, что указаны в списке. Когда вы вызываете add_action , он обновляет список обратных вызовов для вызова, когда это действие происходит.

Имея это в виду, более полезно использовать аналогию с событиями.

  • do_action( 'init' ) действие init
  • add_action('init', 'myfunction' ) Когда происходит событие init , вызовите myfunction
  • function myfunction() {} А произошло событие init

Аналогия событий очень помогает при понимании того, как работают действия и фильтры, потому что существует целый класс проблем, которые возникают, когда вы не понимаете связанные с временем.

Давайте рассмотрим ваш пример вызова add_action в нижнем колонтитуле для действия wp_head . wp_head запускается при wp_head() , который должен произойти в заголовке между тегами <header> . Если мы попытаемся добавить действие в нижний колонтитул, то оно будет добавлено, и в следующий раз, wp_head() будет вызван wp_head() он будет wp_head() . Но wp_head уже вызван, уже слишком поздно. Это как просить ребенка «не забудьте упаковать сумку перед вечеринкой» сразу после окончания вечеринки.

Имея это в виду, у меня есть некоторые общие правила и рекомендации, которые будут действовать как эвристика для более удобного кода:

  • Поместите весь код внутри функций, которые запускают события. init , after_theme_setup , wp_head и admin_init должны покрывать большую часть
  • Единственный код за пределами крючка или фильтра. Были бы файлы шаблонов и начальные вызовы add_action
  • Не добавляйте фильтры и крючки внутри шаблонов, делайте их в functions.php или плагине, или если эти файлы используют инструкции include или require для папки с включенными

Есть некоторые ситуации, которые вы захотите нарушить эти правила, как правило, чтобы предотвратить рекурсию при сохранении вещей и т. Д., Но это должны быть редкие исключения. Поэкспериментируйте и посмотрите, что работает, и посмотрите на этот пост, который показывает, какие действия срабатывают, когда и что безопасно использовать в те времена

Конечная нота, действия и фильтры – одно и то же. Внутри они обрабатываются одинаково, но есть некоторые важные различия, если вы хотите, чтобы все хорошо работало:

  • Действия делают что-то
  • Фильтры модифицируют вещи
  • Действия не должны возвращать ничего
  • Фильтры передаются тем, что «фильтруется» как первый аргумент, и всегда возвращают его или модифицированную версию
  • Фильтры называются много, поэтому никогда не делайте тяжелую работу в фильтрах, они будут замедлять работу в массовом порядке, изменять только, делать работу – это действия для
  • Будьте осторожны с подключением к трансляционным и экранирующим фильтрам, это может быть опасно и имеет большое влияние на производительность, поскольку это наиболее часто называемые фильтры
  • Существует особо опасное действие / фильтр, называемый all , что будет срабатывать для каждого фильтра и крюка. Полезно иногда для отладки, но я бы рекомендовал вместо этого использовать плагин, такой как монитор запросов.

Все ваши действия принадлежат вашим functions.php , предполагая, что вы создаете тему. Именно здесь вы добавляете действия к определенным событиям в ваших шаблонах.

Теперь, после того, как он прочитал functions.php WP имеет список действий, которые он должен предпринять в определенных точках ваших шаблонов тем. Существует несколько предопределенных крючков действия, таких как wp_head() и wp_footer() , которые являются сокращенными для do_action('wp_head') и do_action('wp_footer') . Они определены, поэтому плагины имеют стандартные места, где они могут добавлять свои действия. Вы также можете определить свои собственные крючки действий с do_action .

Например, если вы хотите добавить одно и то же изображение в конце каждого сообщения, вы должны определить в своих functions.php следующее действие:

 add_action ('my_post_image', 'generate_my_post_image'); function generate_my_post_image () { echo '<img src="path_to_my_image">'; } 

Затем в вашем index.php вас будет:

 while (have_posts()) { ... generate your post ... do_action ('my_post_image'); }