问题描述

使我的插件可扩展是解决大多数人的问题的下一个方法。而且我知道我可以在这里和那里放置大量的过滤器和动作钩,使事情更加动态。但对我来说,这太乱了

最近我的插件的用户要求更改工具提示文本,在他们的情况下,这不是很糟糕的原因。该页面上有 6-8 个工具提示。我知道我可以为每个 「em」 放置过滤钩。但我应该吗

有没有任何缺点,关于放置许多钩子的性能问题?

最佳解决办法

只要钩子没有挂钩的东西就是 no-ops,这几乎没有任何东西,对运行时没有什么影响。当事情挂钩,有很多电话时,它会有很大的不同。

由于您谈到自定义字符串,好的例子是 gettext 挂钩核心。本地化的每个字符串通过它。

所以在理论上这是一个非常灵活的钩子,允许在几乎任何地方过滤文本。在实践中,它可以发射数千次,如果你毫无保留地钩住它,它会快速减慢复杂的网站停止。

您没有充分详细介绍您的用例以推荐具体实现。一般来说,您有多种选择可以组织起来:

  • apply_filters( 'prefix_tooltip', $text )是基本的情况,过滤器必须弄清楚文本是否正确匹配以确定上下文,从而变得脆弱。

  • apply_filters( 'prefix_tooltip', $text, 'type/location' )附加参数允许您指定工具提示的类型,哪个过滤器可以定位; 所以即使文字发生变化,该类型仍然标识它。

  • apply_filters( 'prefix_tooltip_' . $type, $text )动态挂钩名称,其变化为变量值; 这对于许多/生成的类型的情况非常灵活,主要的问题是动态钩子在代码中难以发现,在 self-documenting 中更糟糕;

  • apply_filters( 'prefix_tooltips', $texts_array )单个过滤器,用于完整的工具提示。

在 6-8 个条目的计数中,这些之间的性能差异将不会很明显。

您在这里学习的重要内容是什么方法,您需要仔细挑选最适合每一种情况,为自己和下游开发人员提供有意义和便利的信息。

次佳解决办法

这里真的有两个问题 1. 有钩的影响是什么?你应该在任何地方传播钩子

  1. 影响接近零。如果在动作/过滤器上没有任何东西挂钩,对 do_action/apply_filters 的调用将几乎以 imidiatly 返回,所以对不使用挂钩的人不会有任何明显的影响,因此添加它们在技术上是不好的 (如果你给任何半合理的理由添加钩子到核心,它很有可能被核心主题添加) 。

  2. 但它是否作为软件开发实践的智慧?不,Hooks 是 API 和 API,意味着您的长期承诺,以维护它们。因此,您创建的任何”official” API,您应该认为这是长期的插件有用的东西,而不是仅仅让一个插件用户开心。

从您的描述,如果您认为有需要定制的文本,也许您应该考虑使用某种设置屏幕。这显然也是某种 API,但最终用户更易于访问。

第三种解决办法

定制化总是绊脚石 (痛苦的过程) 。从一方面,我们有一个真正的请求 (问题) 从用户总是重要的。另一方面,所有这些附加选项可以将您可爱的主题,插件或一些抽象的产品转移到地狱。那么我们可以做什么作为开发人员?

首先。使用机会编写可扩展代码来更改代码的一些代码 – 可重用代码。类,接口,特征,并将 long-wrong 代码分解成小的方法 (函数) 。部分用户可以轻松使用它们,而不会改变您的产品。例如,有人可以根据自己的需要创建一个小工具,并使用内部插件函数 please_echo_the_plugin_awesome_stuff()

添加新的过滤器和操作是不错的主意。许多流行的插件,如 Jetpack 或 bbPress 在其代码中有数百个过滤器。有时甚至过分。没有任何处理程序的每个新的过滤器 (或动作) 通常不会做很大的开销。这是一个微秒

10^-3 秒毫秒 ms 10^-6 s 微秒μs

通过 add_action()add_filter()添加新的处理程序,更重要的是您正在做的这个操作。例如,向数据库服务器的请求 (有时候是 non-obvious,就像通过 get_option()获取非自动加载选项) 。你可以测量它。最简单的例子:

$start = microtime(true);
// Do some stuff here
$end = microtime(true);
echo $start, PHP_EOL, $end, PHP_EOL, $end - $start, PHP_EOL,

配置您的代码非常简单,有时是最合适的技术。 WordPress 拥有内部”stopwatch”,检出 timer_start()timer_stop()

或者你可以使用 XDebug 。配置似乎非常复杂。但您可以使用 VVV 或任何其他 ready-to-go 服务器。所有这些都已经正确配置了 Xdebug,你可以使用它 – 听起来不错,不是吗?如果你使用 VVV 只需点击几个命令:

vagrant ssh
xdebung_on

就这样!切换到您的 IDE 并配置您的代码。或使用 VVV 内部服务,如 WebGrind 。更多关于这种技术,你可以在 Code Debugging Wiki 找到。应该记住,使用 Xdebug 会对性能产生影响,但可以找到缓慢的代码 (瓶颈) 。

和第三。最后一件事。 WordPress 哲学是决策,而不是选项。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。