плагинов — методы do_action и ловушки
Ваша аналогия здесь частично верна, но неполна:
Я так понимаю, что при вызове 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()
, что должно происходить в заголовке между тегами
. Если мы попытаемся добавить действие в нижний колонтитул, то оно будет добавлено, и при следующем вызове wp_head()
оно сработает. Но wp_head
уже вызывали, уже поздно. Это все равно, что попросить ребенка «не забыть собрать сумку перед вечеринкой» сразу после окончания вечеринки.
Имея это в виду, у меня есть несколько общих правил и рекомендаций, которые могут служить эвристикой для более удобного в сопровождении кода:
- Поместите весь код в функции, которые срабатывают при возникновении событий.
init
,after_theme_setup
,wp_head
иadmin_init
должны покрывать большую часть - Единственным кодом вне хука или фильтра Будут файлы шаблонов, и начальный
add_action
вызывает - Не добавляйте фильтры и хуки внутрь шаблонов, делайте это в
functions.
или плагин, или если эти файлы используютinclude
илитребуют операторов
для папки include
В некоторых ситуациях вы захотите нарушить эти правила, обычно для предотвращения рекурсии при сохранении и т. д., но это должны быть редкие исключения. Поэкспериментируйте и посмотрите, что работает, и посмотрите этот пост, в котором показано, какие действия когда срабатывают и какие в это время безопасно использовать
И последнее замечание: действия и фильтры — это одно и то же. Внутренне они обрабатываются одинаково, но есть некоторые важные различия, если вы хотите, чтобы все работало хорошо:
- Действия делают вещи
- Фильтры изменяют вещи
- Действия не должны ничего возвращать
- Фильтрам передается то, что «фильтруется», в качестве первого аргумента, и они всегда возвращают его или модифицированную версию
- Фильтров называют много, поэтому никогда не выполняйте тяжелую работу в фильтрах, это сильно замедлит работу, только модифицируйте, выполнение работы — вот что такое действия для
- Будьте осторожны, подключаясь к фильтрам преобразования и экранирования, это может быть опасно и сильно влияет на производительность, так как эти фильтры чаще всего называются фильтрами
- Существует особенно опасное действие/фильтр под названием
all
Основы хуков действий в WordPress
Каждый раз, когда вы начинаете углубляться в более сложное программирование — будь то WordPress или любой другой фреймворк, библиотека, фонд или язык программирования — бывают времена, когда новые концепции часто могут быть более сложными понять, чем другие.
Как правило, я обнаруживал, что это так, когда человек изучил основы, скажем, объектно-ориентированного программирования, но не знаком с нюансами определенных вещей, таких как шаблоны проектирования.
Показательный пример: я писал о шаблоне проектирования, управляемом событиями (или публикация-подписка или Pub/Sub, как некоторые любят его называть) в других постах.
Да, у каждого есть отличия, но общая идея такова, что что-то 9Происходит 0023, и возникает событие, и все, кто прослушивает это событие или подписался на это событие, ответит.
Photo by Claus Grünstäudl on Unsplash
Это основной шаблон, используемый WordPress, который позволяет нам буквально подключаться к определенным точкам выполнения. Обычно мы можем представить их как хуки действий в WordPress.
В любом случае, приложение предоставляет нам определенные точки для добавления собственных функций. Как только эта функциональность будет зарегистрирована, WordPress покинет свою кодовую базу, так сказать, прыгнет в нашу, а затем вернется обратно к нашей.
Это достаточно легко понять, но что, если вы хотите открыть области своего кода , которые позволят другим подключиться к вашему коду?
Хуки действий в WordPress
Прежде чем рассматривать, как WordPress реализует эти шаблоны, важно понять основы этого шаблона. Хотя это ни в коем случае не исчерпывающее, оно призвано помочь дать базовое понимание шаблона, чтобы можно было читать и писать код, ориентированный на WordPress.
Ну и что — это , хороший способ думать о шаблоне Pub/Sub? Википедия определяет это как:
В архитектуре программного обеспечения публикация-подписка — это шаблон обмена сообщениями, при котором отправители сообщений, называемые издателями, не программируют сообщения для отправки напрямую конкретным получателям, называемым подписчиками, а вместо этого классифицируют опубликованные сообщения. в классы, не зная, какие подписчики, если таковые имеются, могут быть. Точно так же подписчики проявляют интерес к одному или нескольким классам и получают только те сообщения, которые представляют интерес, не зная, какие издатели, если таковые имеются, существуют.
Понимание паттерна
Поначалу это может показаться сложным. Я не знаю, но давайте разберем это:
- Существует сервис, в нашем случае это WordPress, который отвечает за публикацию сообщений на , кто бы ни подписался на (он не обязательно знает, кто слушает).
- Когда подписчик слушает, он будет предпринимать действия всякий раз, когда он слышит это действие.
- После завершения выполнения кода подписчика программа вернется к исходной точке выполнения (куда издатель отправил сообщение).
В этом есть нюансы, такие как асинхронная функциональность и тому подобное, но это более продвинуто, чем я хотел бы рассказать в этом конкретном посте. В конце концов, цель этого — заложить основу для понимания и реализации функциональности.
Асинхронная функциональность может попасть в потоки или Ajax через эти важные темы, это не тот пост.
Как это выглядит в WordPress?
Возможно, самый простой способ описать этот конкретный шаблон в WordPress — использовать вызовы функций:
- сделать_действие
- add_action
Иногда номенклатура может сбивать с толку, но проще говоря, do_action публикует и событие и add_action подписывает на событие. Или, возможно, лучше представить это так: :
do_action указывает WordPress выполнять любые добавленные действия.
Иногда полезно запомнить простые фразы, как все работает. Я не знаю, является ли приведенная выше фраза самой запоминающейся или запоминающейся, но это что-то , верно?
Кроме того, обратите внимание, что do_action и add_action являются базовыми для WordPress и также доступны для нашей разработки.
Для do_action :
Эта функция вызывает все функции, прикрепленные к хуку действия
$tag
. Можно создать новые хуки действий, просто вызвав эту функцию, указав имя нового хука с помощьюПараметр $tag
.
Или еще проще:
Выполнение функций, привязанных к определенному хуку действия.
Когда речь идет о хуках, это могут быть либо хуки, определенные WordPress
Аналогично add_action :
Действия — это хуки, которые ядро WordPress запускает в определенные моменты во время выполнения или при возникновении определенных событий. Плагины могут указать, что одна или несколько функций PHP выполняются в этих точках, используя API действий.
И, аналогично, проще говоря:
Привязывает функцию к определенному действию.
Установка этого значения на практике немного отличается, потому что обычно мы используем add_action для добавления собственного кода в WordPress.
Практический пример
Например, возможно, вы написали что-то вроде этого:
Посмотрите код на Gist.
В этом случае где-то в кодовой базе WordPress есть do_action вызывает хук wp_insert_post_data , и он принимает функцию и передает ей хотя бы один параметр.
Добавление собственных хуков
Но что, если вы хотите дать другим разработчикам возможность подключиться к вашему плагину или теме? В этом случае вам следует позаботиться об использовании do_action, а страница, ссылка на которую приведена ранее в этом документе, содержит все необходимое для ее настройки.
На самом деле, на мой взгляд, это намного проще, чем работать с add_action , потому что add_action обеспечивает не только подключение к существующему издателю, но и добавление собственной пользовательской логики.