Я немного углубился в API плагинов, и мне стало интересно, какие реальные различия существуют между хуками действий и фильтров. Оба они являются событиями, которые получают данные в качестве параметра, и, похоже, они оба могут делать одно и то же.
Очевидно, что действия вызываются, когда происходят действия, и фильтры вызываются, когда данными манипулируют, но, похоже, это просто семантическая разница в именах.
Помимо семантики, для чего они используются, какие реальные различия между ними?
Вы в значительной степени ответили на свой вопрос, но я немного уточню.
Действия
Они предназначены для использования, когда ядро WordPress или какой-либо плагин или тема дают вам возможность вставить свой код в определенный момент и выполнить одно или несколько из следующих действий:
echo
, чтобы вставить какой-либо HTML или другой контент в буфер ответов,do_action_ref_array()
вместоdo_action()
, так как последний не поддерживает передачу переменных по ссылке.)Фильтры
Фильтр-хуки ведут себя очень похоже, но их предполагаемое использование состоит в том, чтобы получать значение и потенциально возвращать измененную версию значения. Хук фильтра также может быть использован точно так же, как хук действий, то есть для изменения глобальной переменной или генерации некоторого HTML, при условии, что это то, что вам нужно сделать, когда вызывается хук. Одна вещь, которая очень важна в фильтрах, — не забыть вернуть это значение!
Использование дополнительных параметров для предоставления контекста в хуках фильтров
Так в чем же реальная разница?
На самом деле фильтр-хуки — это в значительной степени надстройка действий-хуков. Первый может делать все, что может делать второй, и немного больше, хотя разработчик не несет ответственности за возвращение значения с помощью хуков-действий
Если вы посмотрите на источник для основной функции
add_action()
, то это просто оболочка для функцииadd_filter()
…И если вы посмотрите на базовую функцию
do_action()
, она будет очень похожа на базовую функциюapply_filters()
, с одним очень существенным отличием: она не возвращает значение.Так что это значит? действия похожи на фильтры, за исключением того, что действие не возвращает значение, поэтому вы не можете изменять данные. Это показывает, что легко создать механизм действия WordPress, просто скопировав механизм фильтра, а не возвращая значение. По сути, все, что вы можете сделать с действием, — это просто выполнить функцию без изменения какого-либо значения.
Простыми словами.
Мы можем расширить любой плагин, который использует действия и фильтры, не изменяя там код. Добавляя фильтры и действия в нашей собственной теме или плагине.
Как использовать?
Действия:
Ниже приведены простые примеры в файле вашей темы
functions.php
.В итоге:
Здесь test() просто вызывает функцию…
В итоге:
Тут
do_action('test')
работает как вызывающая функция. И нужно выполнить функцию обратного вызова ‘test1’.В итоге:
Здесь
do_action('test')
работает как вызывающая функция.Функция обратного вызова ‘test1’ имеет приоритет 2, а ‘test2’ имеет приоритет 1.
Если приоритеты изменяются, например, «test1» с приоритетом 1 и «test2» с приоритетом 2, вывод будет следующим:
В итоге:
Теперь создайте пример плагина, чтобы проверить, как он работает для стороннего разработчика.
/wp-content/plugins/
.Теперь активируйте свой Simple plugin em> из панели администратора WordPress.
После активации на экране появится:
Если мы добавим приоритет для нашего действия плагина от 1 до 9, тогда он напечатает вывод как:
Потому что WordPress учитывает приоритет
10 по умолчанию code> для всех добавленных действий.
Фильтры
Проверьте приведенные ниже примеры:
Простой пример:
В итоге:
В итоге:
Здесь мы добавили фильтр
my_filter_name
и изменили существующий выходной массив('one', 'two')
с массивом('three', 'four')
без изменения файлов тем/плагинов.