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

<p>недавно я немного углубился в api плагинов, и мне было интересно<strong> каковы реальные различия между действием и перехватчиками фильтров </strong>. оба они являются событиями, которые получают данные в качестве параметра, и, похоже, они оба могут делать одно и то же.</p><p>очевидно, что я вижу, что действия вызываются, когда действия имеют место, и фильтры вызываются, когда данными манипулируют, но, похоже, это просто семантическая разница в именах.</p><p>помимо семантики и для чего они используются, какие реальные различия между ними?</p>

<p>привет <strong>@sruly</strong>:</p><p>вы в значительной степени ответили на свой вопрос, но я немного уточню.</p><h2>action hooks</h2><p><em> хуки действий </em>предназначены для использования, когда ядро wordpress или какой-либо плагин или тема дают вам возможность вставить свой код в определенный момент и выполнить одно или несколько из следующих действий:</p><ol> <li>используйте <code>echo</code> для <strong>вставки некоторого html</strong> или другого содержимого в буфер ответов,</li> <li><strong>изменить состояние глобальной переменной</strong> для одной или нескольких переменных и/или</li> <li><strong>измените параметры</strong>, передаваемые вашей функции ловушки (при условии, что ловушка была вызвана <code>do\_action\_ref\_array()</code> вместо <code>do\_action()</code>, поскольку последняя не поддерживает передачу переменных<em> по ссылке </em>.)</li> </ol><h2>крючки фильтра</h2><p><em> хуки-фильтры </em>ведут себя очень похоже на<em> хуки-действия </em>, но они предназначены для получения значения и потенциально могут вернуть измененную версию значения. хук фильтра также может быть использован точно так же, как хук действий, то есть для изменения глобальной переменной или генерации некоторого html, при условии, что это то, что вам нужно сделать, когда вызывается хук. одна вещь, которая очень важна в filter hooks, о которой вам не нужно беспокоиться с action hooks, это то, что человек, использующий filter hook \_ <strong><em> must </em></strong>, возвращает (измененную версию) первого параметра это было пройдено. распространенная ошибка новичка - забыть вернуть это значение!</p><h3>использование дополнительных параметров для обеспечения контекста в хуках фильтров</h3><p><em> в качестве отступления </em>я чувствовал, что в предыдущих версиях wordpress блокировка фильтра была затруднена, поскольку они получали только один параметр; то есть они получат значение, которое нужно изменить, но не будут иметь 2-го или 3-го параметра, чтобы обеспечить какой-либо контекст. однако в последнее время и, что положительно, кажется, что основная команда wordpress с радостью (для меня) добавила дополнительные параметры в фильтр-хуки, чтобы вы могли узнать больше контекста. хорошим примером является хук <code>posts\_where</code>; я полагаю, что в нескольких версиях назад он принимал только один параметр, являющийся текущим запросом<em> "где" </em>класс sql, но теперь он принимает и предложение where<em> и </em>ссылку на текущий экземпляр класса <code>wp\_query</code> это вызывает крюк.</p><h2>так в чем же реальная разница?</h2><p>на самом деле filter hooks - это в значительной степени расширенный набор action hooks. первый может делать все, что может делать второй, и, более того, разработчик не обязан возвращать значение с помощью action hook, что он или она делает с filter hook.</p><h3>давать руководство и телеграфный замысел</h3><p>но это, вероятно, не то, что важно. я думаю, что важно то, что разработчик, решивший использовать action hook вместо filter hook или наоборот, он <strong>телеграфирует свое намерение</strong> и, следовательно, <strong>дает руководство</strong> разработчику или плагину, который может быть используя крючок. по сути, они говорят либо<em> "я собираюсь позвонить вам, делайте все, что вам нужно сделать" </em><strong><em>или</em></strong><em> "я собираюсь передать вам это значение для изменения, но убедитесь, что вы передаете его обратно </em>. "</p><p>итак, в конечном итоге <strong>я думаю, что руководство, обеспечиваемое выбором типа крючка, является реальной ценностью различия</strong>. имо, во всяком случае.</p><p>надеюсь это поможет!</p>

<p>если вы посмотрите на источник основной функции <code>add\_action()</code>, то это просто оболочка для функции <code>add\_filter()</code> ...</p><p>и если вы посмотрите на базовую функцию <code>do\_action()</code>, она очень похожа на базовую функцию <code>apply\_filters()</code>, но с одним существенным отличием: она не возвращает значение.</p><p>так что это значит? действия подобны фильтрам, за исключением того, что действие не возвращает значение, поэтому вы не можете изменять данные. это показывает, что было легко создать механизм действия wordpress, просто скопировав механизм фильтра, а не возвращая значение. по сути, все, что вы можете сделать с действием, - это просто выполнить функцию без изменения какого-либо значения.</p>

<p>в простых словах.</p><blockquote> <p><strong> действия </strong><em>это те функции php, которые выполняют вывод.</em></p> <p><strong> фильтры </strong><em>это те функции php, которые возвращают вывод.</em></p> </blockquote><p><strong> обновлено: </strong>мы можем расширить любой плагин, который использует действия и фильтры без изменения там кода. добавляя фильтры и действия в нашей собственной теме или плагине.</p><hr><h1>как пользоваться?</h1><h2>действие:</h2><p>ниже приведены простые примеры в вашем файле <code>functions.php</code> темы.</p><ol> <li>пример первый: <em>(простой php пример)</em></li> </ol><pre> function test () { echo "output"; } test (); </pre><p>над программой выведите вывод:</p><pre> выход </pre><p>[примечание: здесь test () просто вызывает функцию. и выполните функцию обратного вызова 'test'.]</p><hr><ol start="2"> <li>пример второй: <em>(простое использование action)</em></li> </ol><pre> function test1 () { echo "output"; } add\_action ('test', 'test1'); do\_action ('test'); </pre><p>над программой выведите вывод:</p><pre> выход </pre><p>[примечание: здесь <code>do\_action('test')</code> работает как вызывающая функция. и выполните функцию обратного вызова 'test1'.]</p><hr><ol start="3"> <li>пример третий: <em>(другое использование actions)</em></li> </ol><pre> function test2 () { echo "test 2"; } add\_action ('test', 'test2', 1); function test1 () { echo "test 1"; } add\_action ('test', 'test1', 2); do\_action ('test'); </pre><p>над программой выведите вывод:</p><pre> тест 2test 1 </pre><p>[примечание: здесь <code>do\_action('test')</code> работает как вызывающая функция. и выполнять функции обратного вызова по своим приоритетам.</p><p>функция обратного вызова "test1" имеет приоритет 2, а "test2" имеет приоритет 1.]</p><p>если приоритеты изменяются как "test1" с приоритетом 1 и "test2" с приоритетом 2, то результат будет:</p><pre> тест 1, тест 2 </pre><hr><ol start="4"> <li>пример четвертый: <em>(поддержка сторонних производителей)</em> добавить приведенный ниже код в <code>functions.php</code></li> </ol><pre> function test1 () { do\_action ('test\_before'); echo "test 1"; do\_action ('test\_after'); } add\_action ('test', 'test1'); do\_action ('test'); </pre><p>над программой выведите вывод:</p><pre> тест 1 </pre><p>теперь создайте пример плагина, чтобы проверить, как он работает для стороннего разработчика.</p><ol> <li>создайте папку 'simple' в каталоге <code>/wp-content/plugins/</code>.</li> <li>создайте файл с именем 'simple.php' и добавьте приведенный ниже код.</li> </ol><pre> /* * имя плагина: простой плагин */ function test\_callback\_function () { echo "from plugin"; } add\_action ('test', 'test\_callback\_function'); </pre><p>теперь активируйте наш <em>простой плагин</em> с панели администратора wordpress.</p><p>перейти в плагин меню и активировать его.</p><p>после активации плагина над программой распечатайте вывод:</p><pre> тест 1 из плагина </pre><p>[примечание: если мы добавим приоритет для нашего действия плагина от 1 до 9, тогда он напечатает вывод как:</p><pre> из плагинатест 1 </pre><p>потому что wordpress учитывает <code>10 priority by default</code> для всех добавленных действий.]</p><h2>фильтры</h2><p>проверьте следующие примеры:</p><p>простой php пример:</p><pre> $ data = array ('one', 'two'); print_r ($ data); </pre><p>над программой выведите вывод:</p><pre> массив ([0] => один [1] => два) </pre><ol> <li>пример первый: <em>(простое использование фильтра)</em></li> </ol><pre> $ data = apply_filters ('my_filter_name', массив ('one', 'two')); print_r ($ data); add\_filter (' my\_filter\_name ', function ($ old\_data) { возвращаемый массив (' three ',' four '); }); </pre><p>над программой выведите вывод:</p><pre> массив ([0] => три [1] => четыре) </pre><p>здесь мы добавили фильтр <code>my\_filter\_name</code> и изменили существующий вывод <code>array( 'one', 'two' )</code> на <code>array( 'three', 'four' )</code> без изменения файлов тем/плагинов.</p><hr>