Відмінність між гачками фільтра та дії?


51

Нещодавно я дивився на плагін API трохи глибше, і мені було цікаво, які реальні відмінності між діями та гачками фільтру . Вони обидва - це події, які отримують дані як параметр, і вони, здається, обидва можуть робити те саме.

Очевидно, я бачу, що дії викликаються, коли відбуваються дії, і фільтри викликаються при маніпулюванні даними, але це, здається, просто семантична різниця імен.

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

Відповіді:


58

Привіт @Sruly :

Ви в значній мірі відповіли на власне питання, але я трохи детальніше.

Гачки для дії

Гачки дій призначені для використання, коли ядро ​​WordPress або якийсь плагін або тема дає вам можливість вставити свій код у певний момент і виконати одну або декілька з наступних дій:

  1. Використовуйте echoдля введення деякого HTML або іншого вмісту в буфер відповідей,
  2. Змінення глобального стану змінної для однієї або декількох змінних та / або
  3. Змініть параметри, передані вашій функції гака (припустимо, що гак викликався do_action_ref_array()замість того, do_action()що останній не підтримує передавання змінних за посиланням .)

Гачки для фільтру

Гачки фільтра поводяться дуже схоже на Action Hooks, але їх призначенням є отримання значення та потенційне повернення зміненої версії значення. Гак фільтра також може бути використаний так само, як Action Hook, тобто для зміни глобальної змінної або генерування деякого HTML, припускаючи, що це потрібно зробити, коли гачок викликається. Одне, що дуже важливо щодо фільтруючих гаків, про які вам не потрібно хвилюватися, - це те, що особа, яка використовує гачок фільтру, повинна повернути (модифіковану версію) перший параметр, який він передав. Поширена помилка новачка - забути повернути це значення!

Використання додаткових параметрів для надання контексту в гачках фільтрів

Як осторонь, я відчув, що фільтри Гачки були заплетені в попередніх версіях WordPress, оскільки вони отримають лише один параметр; тобто вони отримають значення для зміни, але не мають 2-го чи 3-го параметрів, щоб забезпечити будь-який контекст. Однак останнім часом, і позитивно, здається, що основний колектив WordPress з радістю (для мене) додав додаткові параметри до фільтруючих гаків, щоб ви могли відкрити більше контексту. Хороший приклад - posts_whereгачок; Я вважаю , що кілька версій назад він приймається тільки один параметр є поточним запитом до «де» клас SQL , але тепер він приймає як статтю , де і посилання на поточний екземпляр WP_Queryкласу, що посилається на гачок.

То яка реальна різниця?

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

Давати вказівки та наміри телеграфування

Але це, мабуть, не те, що важливо. Я думаю, що важливо, що розробник, який вирішив використовувати Action Hook vs. Filter Hook, або навпаки, вони телеграфують свої наміри і таким чином дають вказівки темеру або розробнику плагінів, які можуть використовувати гачок. По суті вони говорять або "Я зателефоную вам, зробіть все, що вам потрібно зробити" АБО "Я передам вам це значення для зміни, але будьте впевнені, що ви передасте його назад ".

Тому в кінцевому рахунку я думаю, що вказівки, що надаються при виборі типу гака, є реальною цінністю цього розрізнення . ІМО, все одно.

Сподіваюся, це допомагає!


Мені здається, ви могли просто використовувати фільтри для всього, оскільки повернення змінної в PHP необов’язкове. Хтось знає, чому розробники WordPress обрали два окремі терміни? Це виключно з смислових причин? Технічно я не бачу потреби в цьому ...
TheStoryCoder

2
@TheStoryCoder "Це суто з семантичних причин?" Здається, саме так пояснили мою відповідь п’ять (5) років тому ...?
MikeSchinkel

11

Якщо ви подивитесь на джерело add_action()основної функції, це просто обгортка для add_filter()функції ...

А якщо поглянути на do_action()основну функцію, вона дуже схожа на apply_filters()основну функцію, з однією дуже ключовою різницею: вона не повертає значення.

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


5

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

Дії - це ті функції PHP, які виконують вихід.

Фільтри - це ті функції PHP, які повертають вихід.

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


Як користуватись?

Дія:

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

  1. Приклад перший: (простий приклад PHP)
тест функції () {
     ехо "Вихід";
}

тест ();

Над програмою надрукуйте вихід:

Вихід

[ПРИМІТКА: Тут тест () просто викликає функцію. І виконати функцію "тест" зворотного дзвінка.]


  1. Приклад другий: (Просте використання дії)
функція test1 () {
     ехо "Вихід";
}
addgery ('тест', 'test1');

dogery ('тест');

Над програмою надрукуйте вихід:

Вихід

[ПРИМІТКА: Тут do_action('test')працює як функція виклику. І виконати функцію зворотного виклику 'test1'.]


  1. Приклад третій: (Інше використання дій)
функція test2 () {
     ехо "Тест 2";
}
добавлення ('тест', 'test2', 1);

функція test1 () {
     ехо "Тест 1";
}
addgery ('тест', 'test1', 2);

dogery ('тест');

Над програмою надрукуйте вихід:

Тест 2Тест 1

[ПРИМІТКА: Тут do_action('test')працює як функція виклику. І виконувати функції зворотного виклику за своїми пріоритетами.

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

Якщо пріоритети змінюються на зразок "test1" з пріоритетом 1 та "test2" з пріоритетом 2, то вихід буде таким:

Тест 1Тест 2

  1. Приклад четвертий: (Підтримка третьої сторони) Додайте код нижче вfunctions.php
функція test1 () {
     dogery ('test_before');
     ехо "Тест 1";
     dogery ('test_after');
}
addgery ('тест', 'test1');

dogery ('тест');

Над програмою надрукуйте вихід:

Тест 1

Тепер створіть зразок плагіна, щоб перевірити, як він працює для сторонніх розробників.

  1. Створити папку «простий» в /wp-content/plugins/каталозі.
  2. Створіть файл з назвою 'simple.php' та додайте нижче код.
/ *
* Назва плагіна: простий плагін
* /
функція test_callback_function () {
     ехо "З плагіна";
}
addgery ('тест', 'test_callback_function');

Тепер активуйте наш простий плагін з інформаційної панелі адміністратора WordPress.

Відкрийте плагін меню та активуйте його.

Після активації плагіна над програмою надрукуйте вихід:

Перевірте плагін 1

[ПРИМІТКА. Якщо ми додамо пріоритет для нашої плагінової дії від 1 до 9, то він надрукує вихід таким чином:

З плагінаTest 1

Тому що WordPress враховує 10 priority by defaultвсі додані дії.]

Фільтри

Перевірте наведені нижче приклади:

Простий приклад PHP:

$ data = масив ('один', 'два');
print_r ($ дані);

Над програмою надрукуйте вихід:

Масив ([0] => один [1] => два)
  1. Приклад перший: (Просте використання фільтра)
$ data = apply_filters ('my_filter_name', масив ('один', 'два'));
print_r ($ дані);

add_filter ("ім'я мого_фільтра", функція ($ old_data) {
     повернути масив ('три', 'чотири');
});

Над програмою надрукуйте вихід:

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

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



Дякую @maheshwaghmare за такий простий трюк. будь ласка, напишіть про "Фільтри" теж
Аді,

Що саме ви маєте на увазі під «скоро»?
Рапті

@Rapti Вибачте за затримку. Сьогодні ввечері я додам відповідь, що стосується фільтрів. Надалі я створять описову статтю щодо Гачків (Дії та Фільтри).
maheshwaghmare

@maheshwaghmare сильно зволікає? : P

Добре пояснення, я зараз краще розумію
budiantoip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.