Объяснение функции apply_filters и её переменных
Я изучаю, как создавать HTML-формы с помощью PHP, рассматривая пример из плагина "simplr form registration".
Я смотрю на этот код:
$form .= apply_filters('simplr-reg-instructions', __('Please fill out this form to sign up for this site', 'simplr-reg'));
Позвольте объяснить, что здесь происходит:
1. `apply_filters()` - это функция WordPress, которая позволяет другим плагинам или темам модифицировать значение перед его использованием. Это часть системы хуков WordPress.
2. 'simplr-reg-instructions' - это уникальный идентификатор фильтра. Другие плагины могут использовать этот идентификатор для "перехвата" и изменения текста.
3. `__()` - это функция интернационализации, которая делает текст доступным для перевода. 'simplr-reg' - это текстовый домен, используемый для группировки строк перевода.
Почему нельзя просто написать:
$form .= 'Please fill out this form to sign up for this site' ;
Такой подход имеет два существенных недостатка:
1. Текст будет "жёстко закодирован" и не сможет быть переведён на другие языки
2. Другие разработчики не смогут модифицировать этот текст через систему фильтров WordPress
Использование `apply_filters` делает код более гибким и расширяемым, что является одним из основных принципов разработки в WordPress.

Эта строка использует две разные функции, которые требуют отдельных объяснений.
__()
Это функция перевода. При правильных настройках она переведет первый параметр из списка предварительно переведенных строк. Если в установке есть файл с компилированным переводом для использования этой функцией, она его использует. Конечно, плагин должен поставлять собственный перевод, отсюда и второй параметр. 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
выше. Это имя хука. Второй аргумент — это callback-функция фильтра. Она должна быть валидным callback'ом (подробнее о callback'ах здесь). Эта строка кода означает: "Когда выполняется хук 'simplr-reg-instructions'
, запусти функцию с предоставленным callback'ом". apply_filters()
выполняет хук, указанный в первом аргументе, по сути означая "выполни все функции, зарегистрированные для этого хука". Затем apply_filters
передает все остальные аргументы (в данном случае 'Please fill out this form to sign up for this site'
) в функции этого фильтра. Таким образом, callback, который я использовал выше, должен выглядеть так:
function wpse16573_my_filter( $text ){
$text = "<strong>$text</strong>";
return $text;
}
В WordPress есть два типа хуков: фильтры (такие, как здесь) и действия. Основное различие между ними в том, что от фильтров ожидается возвращение значения, а от действий — нет. В этом примере фильтр добавляет HTML-теги вокруг строки 'Please fill out this form to sign up for this site'
и возвращает её.
Подробнее о действиях и хуках:

Джон, большое спасибо. Отличный ответ! Но я не могу найти ни одной строки "add_filter( 'simplr-reg-instructions',..." в файлах плагина. Как тогда может выполняться apply_filter?

Если к хуку не добавлено фильтров, он просто возвращает исходные данные обратно. Этот фильтр существует не для использования самим плагином, а для вас, если вам это понадобится/захочется, чтобы вы могли обойтись без изменений самого плагина.

+1 Отличное объяснение - читается как официальная документация ;-)

Здесь у вас две разные функции: apply_filters
и __()
.
Функция apply_filters
— это способ WordPress, позволяющий изменять/редактировать значения переменных с помощью ваших собственных callback-функций и функции add_filter
. Она принимает множество аргументов, но важны первые два:
$something = apply_filters( $tag, $value, $var ... );
$tag
— это название фильтра (hook), которое используется в add_filter
, например:
add_filter($tag, callback_function);
$value
— это фактическое значение, которое вы сможете изменить или отредактировать.
$var
— это переменные (одна или несколько), которые может использовать ваша callback-функция.
Функция __()
используется для переводов:
__($message, $text_domain);
$message
— это сообщение, которое нужно перевести.
$text_domain
— это текстовый домен, используемый для загрузки перевода плагина или темы с помощью load_plugin_textdomain()
.
Как это работает?
Она ищет в модуле локализации перевод для $message
и передает его в оператор возврата PHP. Если перевод для $message
не найден, функция просто возвращает $message
.
Таким образом, в вашем случае обе функции работают схожим образом: apply_filters
отправит любой callback-функции, связанной с фильтром simplr-reg-instructions
, переведенное значение (если оно существует) для строки 'Please fill out this form to sign up for this site', используя текстовый домен simplr-reg
.

Bainternet, большое спасибо! Почему я не могу найти ни одной строки "add_filter( 'simplr-reg-instructions', " в файлах плагина?

Это хук, оставленный для разработчиков, которые хотят расширить или фильтровать функциональность плагина.

Значит add_filter здесь не ожидается? Я не понимаю почему. Разве apply_filters не должен запускать все функции, связанные с его хуком через add_filter?
