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

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

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

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

45 голосов | спросил Sruly 29 PM00000040000003131 2010, 16:27:31

3 ответа


52

Привет @Sruly :

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

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

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

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

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

Фильтрующие крючки ведут себя очень похоже на Action Hooks , но их предназначение - получить значение и, возможно, вернуть измененную версию значения. Крючок фильтра также можно использовать так же, как Action Hook, т. Е. Изменять глобальную переменную или генерировать некоторый HTML, предполагая, что это то, что вам нужно делать, когда вызывается hook. Одна вещь, которая очень важна в фильтровальных крючках, о которых вам не нужно беспокоиться с помощью Action Hooks, заключается в том, что человек, использующий фильтр 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 vs. Filter Hook или наоборот, телеграфировал свое намерение и, таким образом, давал указания для пользователя или разработчик плагинов, который может использовать крючок. По сути, они говорят либо «Я позвоню вам, сделаю все, что вам нужно» ИЛИ вы передадите вам это значение для изменения, но убедитесь, что вы передали его обратно . "

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

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

ответил MikeSchinkel 29 PM00000050000001931 2010, 17:57:19
9

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

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

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

ответил trusktr 29 J0000006Europe/Moscow 2013, 22:41:50
3

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

  

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

     

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

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


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

Действие:

Проверьте приведенные ниже простые примеры в своем файле 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. Пример 4: (сторонняя поддержка) Добавьте код ниже в 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 для всех добавленных действий.]

Фильтры

Проверьте приведенные ниже примеры:

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

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

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

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

add_filter ('my_filter_name', function ($ old_data) {
     return array («три», «четыре»);
});

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

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

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


ответил maheshwaghmare 3 FebruaryEurope/MoscowbFri, 03 Feb 2017 18:37:31 +0300000000pmFri, 03 Feb 2017 18:37:31 +030017 2017, 18:37:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132