问题描述

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