Вопрос

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

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

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

Это было полезно?

Решение

Привет @Sruly:

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

Действие Крюки

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

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

Фильтруя крючки

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

Действия это те функции 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.

Если приоритеты изменяются как «test1» с приоритетом 1 и «test2» с приоритетом 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 Admin Dashboard.

Goto Menu Plugin и активируйте его.

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

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' ) Без изменения файлов темы/плагинов.


Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top