Разница между фильтрами и хуками действий?


51

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

Очевидно, что я вижу, что действия вызываются, когда действия имеют место, и фильтры вызываются, когда данными манипулируют, но, похоже, это просто семантическая разница в именах.

Помимо семантики и для чего они используются, какие реальные различия между ними?

Ответы:


58

Привет @Sruly :

Вы в значительной степени ответили на свой вопрос, но я немного уточню.

Action Hooks

Хуки действий предназначены для использования, когда ядро ​​WordPress или какой-либо плагин или тема дают вам возможность вставить свой код в определенный момент и выполнить одно или несколько из следующих действий:

  1. Используйте echoдля вставки некоторого HTML или другого содержимого в буфер ответов,
  2. Изменить состояние глобальной переменной для одной или нескольких переменных и / или
  3. Измените параметры, передаваемые в вашу функцию ловушки (при условии, что ловушка была вызвана do_action_ref_array()вместо, do_action()так как последняя не поддерживает передачу переменных по ссылке .)

Крючки фильтра

Фильтры-зацепки ведут себя очень похоже на Action-зацепки, но они предназначены для получения значения и, возможно, для возврата измененной версии значения. Хук фильтра также можно использовать точно так же, как хук действий, т. Е. Для изменения глобальной переменной или генерации некоторого HTML, предполагая, что это то, что вам нужно сделать, когда вызывается хук. Одна вещь, которая очень важна в Filter Hooks, о которой вам не нужно беспокоиться с Action Hooks, это то, что человек, использующий Filter Hooks, должен вернуть (измененную версию) первый параметр, который был передан. Распространенная ошибка новичка - забыть вернуть это значение!

Использование дополнительных параметров для обеспечения контекста в хуках фильтров

Кроме того, я чувствовал, что фильтр-хуки блокировались в более ранних версиях WordPress, потому что они получали только один параметр; то есть они получат значение, которое нужно изменить, но не будут иметь 2-го или 3-го параметра, чтобы обеспечить какой-либо контекст. Однако в последнее время и, что положительно, кажется, что основная команда WordPress с радостью (для меня) добавила дополнительные параметры в фильтр-хуки, чтобы вы могли узнать больше контекста. Хороший пример - posts_whereкрючок; Я полагаю, что в нескольких версиях назад он принимал только один параметр, являющийся классом SQL текущего запроса «где», но теперь он принимает и предложение where, и ссылку на текущий экземпляр WP_Queryкласса, который вызывает ловушку.

Так в чем же реальная разница?

На самом деле Filter Hooks - это в значительной степени расширенный набор Action Hooks. Первый может делать все, что может делать второй, и, более того, разработчик не обязан возвращать значение с помощью Action Hook, что он или она делает с Filter Hook.

Давать руководство и телеграфный замысел

Но это, вероятно, не то, что важно. Я думаю, что важно то, что разработчик, решивший использовать Action Hook вместо Filter Hook или наоборот, телеграфирует свои намерения и тем самым дает рекомендации разработчикам или разработчикам плагинов, которые могут использовать ловушку. По сути, они говорят: «Я позвоню вам, сделайте все, что вам нужно» ИЛИ «Я передам вам это значение для изменения, но будьте уверены, что вы передадите его обратно ».

В конечном счете, я думаю, что руководство, обеспечиваемое выбором типа крючка, является реальной ценностью, стоящей за этим различием . ИМО, во всяком случае.

Надеюсь это поможет!


Мне кажется, что вы могли бы просто использовать фильтры для всего, так как возвращение переменной необязательно в PHP. Кто-нибудь знает, почему разработчики WordPress решили использовать два отдельных термина? Это чисто по смысловым причинам? Технически я не вижу необходимости в этом ...
TheStoryCoder

2
@TheStoryCoder "Это чисто по семантическим причинам?" Кажется, именно это и объяснил мой ответ пять (5) лет назад ...?
MikeSchinkel

11

Если вы посмотрите на источник для add_action()основной функции, это просто оболочка для add_filter()функции ...

И если вы посмотрите на do_action()базовую функцию, она очень похожа на apply_filters()базовую функцию, но с одним ключевым отличием: она не возвращает значение.

Так что это значит? действия подобны фильтрам, за исключением того, что действие не возвращает значение, поэтому вы не можете изменять данные. Это показывает, что было легко создать механизм действия WordPress, просто скопировав механизм фильтра, а не возвращая значение. По сути, все, что вы можете сделать с действием, - это просто выполнить функцию без изменения какого-либо значения.


5

Простыми словами.

Действия - это те функции PHP, которые выполняют вывод.

Фильтры - это те функции PHP, которые возвращают вывод.

Обновлено: мы можем расширить любой плагин, который использует действия и фильтры без изменения там кода. Добавляя фильтры и действия в нашей собственной теме или плагине.


Как пользоваться?

Действие:

Ниже приведены простые примеры в вашем functions.phpфайле темы .

  1. Пример первый: (Простой пример PHP)
function test () {
     эхо "Вывод";
}

контрольная работа();

Над программой выведите вывод:

Выход

[ПРИМЕЧАНИЕ: здесь test () просто вызывает функцию. И выполните функцию обратного вызова 'test'.]


  1. Пример второй: (простое использование Action)
function test1 () {
     эхо "Вывод";
}
add_action ('test', 'test1');

do_action ('test');

Над программой выведите вывод:

Выход

[ПРИМЕЧАНИЕ: здесь do_action('test')работает как вызов функции. И выполните функцию обратного вызова 'test1'.]


  1. Пример третий: (Другое использование действий)
function test2 () {
     эхо "Тест 2";
}
add_action ('test', 'test2', 1);

function test1 () {
     эхо "Тест 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Над программой выведите вывод:

Тест 2Тест 1

[ПРИМЕЧАНИЕ: здесь do_action('test')работает как вызов функции. И выполнять функции обратного вызова по своим приоритетам.

Функция обратного вызова «test1» имеет приоритет 2, а «test2» имеет приоритет 1.]

Если приоритеты изменяются как «test1» с приоритетом 1 и «test2» с приоритетом 2, то результат будет:

Тест 1Тест 2

  1. Пример четвертый: (сторонняя поддержка) Добавьте ниже код вfunctions.php
function test1 () {
     do_action ('test_before');
     эхо "Тест 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Над программой выведите вывод:

Тест 1

Теперь создайте пример плагина, чтобы проверить, как он работает для стороннего разработчика.

  1. Создать папку «просто» в /wp-content/plugins/каталоге.
  2. Создайте файл с именем 'simple.php' и добавьте приведенный ниже код.
/ *
* Имя плагина: Простой плагин
* /
function test_callback_function () {
     эхо "Из плагина";
}
add_action ('test', 'test_callback_function');

Теперь активируйте наш простой плагин из панели администратора WordPress.

Перейти в плагин меню и активировать его.

После активации плагина над программой распечатайте вывод:

Тест 1 из плагина

[ПРИМЕЧАНИЕ: если мы добавим приоритет для нашего действия плагина от 1 до 9, тогда он напечатает вывод как:

Из плагинаТест 1

Потому что WordPress учитывает 10 priority by defaultвсе добавленные действия.]

фильтры

Проверьте следующие примеры:

Простой пример PHP:

$ data = array ('one', 'two');
print_r ($ data);

Над программой выведите вывод:

Массив ([0] => один [1] => два)
  1. Пример первый: (простое использование фильтра)
$ data = apply_filters ('my_filter_name', array ('one', 'two'));
print_r ($ data);

add_filter ('my_filter_name', function ($ old_data) {
     возвращаемый массив («три», «четыре»);
});

Над программой выведите вывод:

Массив ([0] => три [1] => четыре)

Здесь мы добавили фильтр my_filter_nameи изменить существующий выход array( 'one', 'two' )с array( 'three', 'four' )без изменения темы / плагина файлов.



Спасибо @maheshwaghmare за такой простой трюк. пожалуйста, напишите о «Фильтры» тоже
Ади

Что именно вы подразумеваете под "скоро"?
Рапти

@Rapti Извините за задержку. Сегодня вечером я добавлю ответ, связанный с фильтрами. В будущем я создам описательную статью о хуках (действиях и фильтрах).
maheshwaghmare

@maheshwaghmare откладывать много? : P

Хорошее объяснение, у меня теперь лучшее понимание
budiantoip
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.