問題描述

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