Пояснення функції apply_filters та її змінних


16

Я вчусь будувати HTML-форми за допомогою PHP, беручи приклад із плагіна "simplr form registration".

Я переглядаю цей код:

$form .= apply_filters('simplr-reg-instructions', __('Please fill out this form to sign up for this site', 'simplr-reg'));

Чи можете ви пояснити, що тут радує?

Чому цього рядка просто не може бути:

$form .= 'Please fill out this form to sign up for this site' ;

Я прочитав посилання на функцію, але все ще не можу це зрозуміти.

Відповіді:


22

Цей рядок використовує дві різні функції, які потребують двох окремих пояснень.

__ ()

Це функція перекладу. Якщо налаштування виконано правильно, він переведе перший параметр зі списку попередньо перекладених рядків. Якщо інсталяція має файл із зібраним перекладом для використання цієї функції, вона використовуватиме її. Звичайно, плагін повинен упакувати власний переклад, звідси другий параметр. simplr-regповідомляє, __()що переклад рядка 'Please fill out this form to sign up for this site'повинен бути у пов'язаному з файлом перекладу 'simplr-reg'(це робиться раніше у плагіні за допомогою load_plugin_textdomain()функції).

Потім функція повертає переклад. Якщо для повернення немає перекладу (наприклад, поточна мова не має складеного перекладу, рядок не має складеного перекладу для цього пакету тощо), повертається початковий вхід.

Так що для сайту WordPress англійською мовою __( 'This', 'simplr-reg' )функціонально те саме, що 'This'. Щоб дізнатися більше про l10n (Локалізація), прочитайте його в кодексі:

http://codex.wordpress.org/I18n_for_WordPress_Developers

apply_filters ()

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

Для маніпулювання даними, такими як фрагмент коду, про який ви запитували, ви використовуєте функцію add_filter(). Ось основний приклад того, як це працює:

add_filter( 'simplr-reg-instructions', 'wpse16573_my_filter' );

Ви, мабуть, впізнаєте перший аргумент там. Це те саме, що було використано add_filterвище. Це ім'я гачка. Другий аргумент - зворотний виклик фільтра. Це має бути дійсним зворотним дзвоном до функції ( докладніше про зворотні дзвінки читайте тут ). У цьому рядку коду написано "Коли 'simplr-reg-instructions'виконується гачок, запустіть функцію за допомогою наданого мною зворотного дзвінка". apply_filters()виконує гак, знайдений у своєму першому аргументі, по суті означає "виконати всі функції, зареєстровані для цього гака". apply_filtersпотім передає всі інші аргументи (у цьому випадку 'Please fill out this form to sign up for this site') функціям цього фільтра. Отже, зворотний виклик, який я використав вище, повинен виглядати приблизно так:

function wpse16573_my_filter( $text ){
  $text = "<strong>$text</strong>";
  return $text;
}

У WordPress є два види гачків: фільтри (тип, який ми тут використовуємо) та дії. Основна відмінність між ними полягає в тому, що фільтри очікують, що ви щось повернете, а дії не роблять. Отже, для цього фільтра мій приклад вище додає трохи html 'Please fill out this form to sign up for this site'і повертає його.

Детальніше про дії та гачки читайте тут:

http://codex.wordpress.org/Plugin_API


Джон, велике спасибі Чудова відповідь! Але я не можу знайти навіть один рядок "add_filter (" simplr-reg-інструкції ", ..." у файлах плагінів. Як можна запускати application_filter?
Еш,

1
Якщо до гака не додано ніяких фільтрів, він просто повертає початковий ввід праворуч. Фільтр відсутній, щоб плагін не використовувався, він є для вас, щоб ви могли користуватися, якщо вам потрібно / хочете, щоб вам не довелося змінювати сам плагін.
Джон П Блох

+1 Відмінне пояснення - Читає так, як повинні Документи ;-)
Едді Б

+1 Відмінна відповідь, саме те, що я шукав, я вкрай розгубився, але зараз все так зрозуміло;)
doz87

5

У вас є дві різні функції тут apply_filtersі__()

Функція apply_filters - це спосіб WordPress, який дозволяє змінювати / редагувати значення змінних за допомогою власних функцій зворотного виклику та add_filterфункції. він приймає багато аргументів, але важливими є перші два:

$something = apply_filters( $tag, $value, $var ... );

$ tag - це назва гачка фільтра, який використовується, add_filterнаприклад:

add_filter($tag,callback_function);

$ value - це фактичне значення, яке ви зможете змінити або відредагувати.

$ var - це змінні, які може використовувати ваша функція зворотного дзвінка, одна чи кілька.

__() функція використовується для перекладів:

__($message,$text_domain);

$ message - це фактичне повідомлення для перекладу.

$ text_domain - це тег текстового домену, який використовується для завантаження плагіна або перекладу теми load_plugin_textdomain()

що це робить?

Він здійснює пошук в модулі локалізації для перекладу $ повідомлення і передає переклад в оператор повернення PHP. Якщо для $ message не знайдено переклад, він просто повертає $ message.

Тож тепер обидві функції у вашому випадку працюють однаково, application_filters надішле будь-яку функцію зворотного виклику, пов’язану з simplr-reg-instructionsгачком фільтра, переведеним значенням (якщо воно існує) "Будь ласка, заповніть цю форму, щоб зареєструватися на цьому веб-сайті", використовуючи текст- доменsimplr-reg


Bainternet, велике спасибі! Як це так, що я не можу знайти жодних рядків "add_filter (" simplr-reg-інструкції "," рядки у файлах плагінів? "
Ash

Його гачок залишився для розробників, які хочуть розширити або відфільтрувати функціональність плагінів.
Bainternet

Тож add_filter тут не очікується? Я не розумію, чому. Чи не повинен apply_filters запускати всі функції, пов'язані з його гаком, функціями add_filter?
Еш

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