Пояснение к функции apply_filters и ее переменным


16

Я учусь создавать HTML-формы с использованием PHP на примере плагина "упрощенная регистрация форм".

Я смотрю на этот код:

$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 ('simpr-reg-инструкции', ..." в файлах плагинов. Как может работать apply_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()

что оно делает?

Он ищет в модуле локализации перевод $ message и передает перевод в оператор возврата PHP. Если перевод для $ message не найден, он просто возвращает $ message.

Таким образом, теперь две функции в вашем случае работают одинаково, apply_filters отправит любой функции обратного вызова, связанной с simplr-reg-instructionsперехватом фильтра, переведенное значение (если существует) «Пожалуйста, заполните эту форму, чтобы зарегистрироваться на этом сайте», используя текст областьsimplr-reg


Bainternet, спасибо большое! Как получается, что я не могу найти какие-либо строки "add_filter ('simpr-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.