问题描述
我正在学习如何使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。