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

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

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

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

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 3
  1. MikeSchinkel

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

    Действия

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

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

    Фильтры

    Фильтр-хуки ведут себя очень похоже, но их предполагаемое использование состоит в том, чтобы получать значение и потенциально возвращать измененную версию значения. Хук фильтра также может быть использован точно так же, как хук действий, то есть для изменения глобальной переменной или генерации некоторого HTML, при условии, что это то, что вам нужно сделать, когда вызывается хук. Одна вещь, которая очень важна в фильтрах, — не забыть вернуть это значение!

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

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

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

  2. trusktr

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

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

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

  3. maheshwaghmare

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

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

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

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


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

    Действия:

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

    1. Пример №1
    function test() {
         echo "Output";
    }
    
    test();
    

    В итоге:

    Output
    

    Здесь test() просто вызывает функцию…


    1. Пример №2: (Действие)
    function test1() {
         echo "Output";
    }
    add_action( 'test', 'test1' );
    
    do_action( 'test' );
    

    В итоге:

    Output
    

    Тут do_action('test') работает как вызывающая функция. И нужно выполнить функцию обратного вызова ‘test1’.


    1. Пример №3: (Действие)
    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. Пример №4:
    function test1() {
         do_action( 'test_before' );
         echo "Test 1";
         do_action( 'test_after' );
    }
    add_action( 'test', 'test1' );
    
    do_action( 'test' );
    

    В итоге:

    Test 1
    

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

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

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

    После активации на экране появится:

    Test 1From plugin
    

    Если мы добавим приоритет для нашего действия плагина от 1 до 9, тогда он напечатает вывод как:

    From pluginTest 1
    

    Потому что WordPress учитывает приоритет 10 по умолчанию для всех добавленных действий.

    Фильтры

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

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

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

    В итоге:

    Array ( [0] => one [1] => two )
    
    1. Пример №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 и изменили существующий выходной массив ('one', 'two') с массивом ('three', 'four') без изменения файлов тем/плагинов.

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: