問題描述
我正在學習如何使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。