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

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

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

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

Привет @Sruly :

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

Крючки для действий

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

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

Фильтрующие крючки

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

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

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

Итак, какова реальная разница?

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

Предоставление руководства и телеграфного намерения

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

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

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

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

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

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

В простых словах.

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

Фильтры: Являются ли эти функции PHP, которые возвращают результат.

[Примечание. Используя этот удивительный API, мы обеспечим контроль над нашей темой или плагином для сторонних разработчиков.

Таким образом, они будут настраивать нашу функциональность из собственной темы или плагина без изменения наших файлов.]


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

Действие:

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

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

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

Выше программы распечатать вывод:

 Вывод

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


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

 do_action ('test');

Выше программы распечатать вывод:

 Вывод

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


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

 function test1 () {
      echo «Тест 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');
      echo «Тест 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.

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

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

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

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

 Из модуля pluginTest 1

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

фильтры

(СКОРО)