問題描述
我正在學習如何使用 PHP 構建 HTML 表單,以 「簡單的表單註冊」 插件為例。
我在看這個代碼:
$form .= apply_filters('simplr-reg-instructions', __('Please fill out this form to sign up for this site', 'simplr-reg'));
你能解釋一下這裏發生了什麼 – 功能是什麼,為什麼需要’simplr-reg-instructions’ 和’simplr-reg’?
為什麼這條線不能簡單:
$form .= 'Please fill out this form to sign up for this site' ;
我已經閲讀了功能參考,但仍然無法弄清楚。
最佳解決方案
該行使用兩個不同的功能,需要兩個單獨的説明。
__()
這是翻譯功能。如果設置正確,它將從 pre-translated 字符串列表中轉換第一個參數。如果一個安裝有一個文件與一個編譯的這個函數使用的翻譯,它將使用它。當然,插件必須打包自己的翻譯,因此是第二個參數。 simplr-reg 告訴__(),字符串'Please fill out this form to sign up for this site'的翻譯應該在與'simplr-reg'相關聯的翻譯文件中 (這通過 load_plugin_textdomain()功能在插件前面完成) 。
該函數然後返回翻譯。如果沒有要返回的翻譯 (例如當前語言沒有編譯的翻譯,該字符串沒有該包的編譯翻譯等),則返回原始輸入。
所以對於英文的 WordPress 網站,__( 'This', 'simplr-reg' )在功能上與'This'相同。要了解更多關於 l10n(本地化) 的信息,請閲讀 Codex:
http://codex.wordpress.org/I18n_for_WordPress_Developers
apply_filters()
此功能允許您根據需要過濾插件使用的值。這是作為插件開發人員掌握的主要概念之一。通過鈎子擴展 WordPress,這些鈎子基本上是訪問點,允許您執行插件的操作和/或操作 WordPress 使用的信息/數據等。
要操縱數據,例如您詢問的代碼片段,您可以使用函數 add_filter()。這是一個如何工作的基本示例:
add_filter( 'simplr-reg-instructions', 'wpse16573_my_filter' );
你可能會認出那裏的第一個參數。它與上述 add_filter 中使用的相同。這是掛鈎名稱。第二個參數是過濾器回調。它必須是對函數 (read more about callbacks here) 的有效回調。該行代碼説 「當執行'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 中有兩種鈎子:過濾器 (我們在這裏使用的類型) 和操作。兩者之間的主要區別在於過濾器期望您返回某些東西,而不採取行動。所以,對於這個過濾器,我上面的示例在'Please fill out this form to sign up for this site'周圍添加了一些 html 並返回它。
在這裏閲讀更多關於操作和鈎子的信息:
http://codex.wordpress.org/Plugin_API
次佳解決方案
您有兩種不同的功能 apply_filters 和__()
apply_filters 功能是使用您自己的回調函數和 add_filter 函數來更改/編輯變量值的 WordPress 方式。它接受許多論據,但重要的是前兩個:
$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 過濾器相關聯的任何回調函數,使用 text-domain 將 「請填寫此表單註冊該站點」 的翻譯值 (如果存在) 的 simplr-reg
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。