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


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

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

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

Author: Krzysiek Dróżdż, 2010-08-29

4 answers

Привет @Sruly:

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

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

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

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

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

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

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

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

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

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

Давать указания и передавать намерения

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

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

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

 62
Author: MikeSchinkel, 2010-08-29 22:29:09

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

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

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

 12
Author: trusktr, 2013-06-29 19:06:53

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

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

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

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


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

Действие:

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

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

test();

Приведенная выше программа выведет вывод:

Output

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


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

do_action( 'test' );

Приведенная выше программа выведет вывод:

Output

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


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

function test1() {
     echo "Test 1";
}
add_action( 'test', 'test1', 2 );

do_action( 'test' );

Приведенная выше программа выведет вывод:

Test 2Test 1

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

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

Если приоритеты меняются, как "тест1" с приоритетом 1 и "тест2" с приоритетом 2, то вывод будет быть:

Test 1Test 2

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

do_action( 'test' );

Приведенная выше программа выведет вывод:

Test 1

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

  1. Создайте папку "простая" в каталоге /wp-content/plugins/.
  2. Создать файл с именем'simple.php 'и добавьте ниже код.
/*
* Plugin Name: Simple Plugin
*/
function test_callback_function() {
     echo "From plugin";
}
add_action( 'test', 'test_callback_function' );

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

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

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

Test 1From plugin

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

From pluginTest 1

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

Фильтры

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

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

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

Приведенная выше программа выведет вывод:

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

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'three', 'four' );
});

Приведенная выше программа выведет вывод:

Array ( [0] => three [1] => four )

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


 6
Author: maheshwaghmare, 2018-03-18 15:02:07

Основное различие между действием и фильтром можно суммировать следующим образом:

  • действие берет полученную информацию, что-то делает с ней и ничего не возвращает. Другими словами: он действует на что-то, а затем завершает работу, ничего не возвращая вызывающему крючку.
  • фильтр принимает полученную информацию, каким-то образом изменяет ее и возвращает . Другими словами: он фильтрует что-то и передает это обратно на крючок для дальнейшего использовать.

Сказал по-другому:

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

То, на что ссылается , - это список параметров, отправленный через определение крючка.

Из официальной документации WP

 1
Author: Jonathan Rhein, 2020-11-17 07:19:20