有多少筛选器/操作挂钩是健康的?

时间:2016-08-24 作者:Mayeenul Islam

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

最近,我的插件的一个用户要求更改最后的工具提示文本,在他们的情况下,这并不是那么糟糕的原因。该页面上有6-8个工具提示。我知道我可以为每一个都装上过滤钩。但我应该吗?

放置多个挂钩是否有任何缺点、性能问题?

3 个回复
最合适的回答,由SO网友:Rarst 整理而成

只要钩子没有任何东西被钩住,它们就不是操作,也就是说,几乎什么都不做,对运行时没有显著影响。当事物被钩住并且有很多呼叫时,情况就大不一样了。

既然您谈到了自定义字符串,那么最好的示例是gettext 钩住铁芯。每个本地化的字符串都会通过它。

因此,理论上,这是一个非常灵活的挂钩,可以在几乎任何地方过滤文本<实际上,它可以发射数千次,如果你毫无保留地使用它,它会很快使复杂的站点停止运行。

您没有足够详细地介绍您的用例以推荐具体的实现。通常,您可以选择多种方式来组织:

  • apply_filters( \'prefix_tooltip\', $text ) 基本情况下,过滤器必须找出文本是否完全匹配才能确定上下文,因此很脆弱
  • apply_filters( \'prefix_tooltip\', $text, \'type/location\' ) 附加参数允许您指定工具提示的类型,过滤器可以将其作为目标;因此,即使文本发生变化,类型仍然可以识别它
  • apply_filters( \'prefix_tooltip_\' . $type, $text ) 动态挂钩名称,随变量值变化;对于许多/生成类型的情况,这是非常灵活的,主要问题是动态挂钩更难在代码中发现,而且在自文档方面更差
  • apply_filters( \'prefix_tooltips\', $texts_array ) 用于所用工具提示的完整集的单个过滤器
在6到8个条目的计数中,这两个条目之间的性能差异不会太大。

这里要学习的重要内容是那里的方法是什么,您需要为每种情况仔细选择最合适的方法,以使其对您自己和下游开发人员都有意义和方便。

SO网友:Mark Kaplun

这里有两个问题1。有钩子的影响是什么?和2。你是不是应该把钩子撒得到处都是

影响接近于零。如果操作/筛选上没有挂接任何内容,则调用do_action/apply_filters 将几乎立即返回,因此不会对不使用钩子的人产生任何明显的影响,因此添加钩子在技术上并不坏(如果您给出任何半合理的理由将钩子添加到核心,则很可能是通过核心主题添加)。

但是它作为一种软件开发实践是否明智呢?不。钩子是API,而API意味着您承诺长期维护它们。因此,就像您创建的任何“官方”API一样,您应该考虑从长远来看,它对您的插件是否有意义,而不仅仅是为了让一个插件用户满意。

根据您的描述,如果您认为有需要自定义的文本,也许您应该考虑使用某种设置屏幕。这显然也是某种API,但对最终用户来说更容易访问。

SO网友:Kolya Korobochkin

定制总是一块绊脚石(痛苦的过程)。从一方面来说,我们有来自用户的真实请求(问题),这总是很重要的。另一方面,所有这些额外的选项都会让你可爱的主题、插件或一些抽象产品陷入地狱。那么,作为一名开发人员,我们能做些什么呢?

首先Write extensible code 有机会更改部分代码—可重用代码。类、接口、特性以及将长时间错误的代码拆分为小方法(函数)。一些用户可以轻松地使用它们,而无需对您的产品进行更改。例如,有人可以根据自己的需要创建一个小部件,并使用内部插件功能please_echo_the_plugin_awesome_stuff().

添加new filters and actions is not bad idea. 许多流行的插件,如Jetpack或bbPress,其代码中都有数百个过滤器。有时甚至过度。没有任何处理程序的每个新过滤器(或操作)通常不会产生很大的开销。这是一微秒。

10个^−3秒毫秒ms10^−6秒微秒µs

更重要的是,通过以下方式添加新的处理程序,您正在对此操作执行什么操作add_action()add_filter(). 例如,对数据库服务器的请求(有时是不明显的,例如通过get_option()). 你可以测量它。最简单的示例:

$start = microtime(true);
// Do some stuff here
$end = microtime(true);
echo $start, PHP_EOL, $end, PHP_EOL, $end - $start, PHP_EOL,
这是一种非常简单的技术,有时也是最适合评测代码的技术。顺便说一下,WordPress有内部“秒表”,结账timer_start()timer_stop().

也可以使用XDebug。配置起来可能很复杂。但你可以使用VVV 或任何其他现成服务器。所有这些都已经正确配置了Xdebug,您可以直接使用它-听起来不错,不是吗?。如果使用VVV,只需点击几个命令:

vagrant ssh
xdebung_on
仅此而已!切换到IDE并分析代码。或者使用像WebGrind这样的VVV内部服务。有关此技术的更多信息,请访问Code Debugging Wiki. 应该记住,使用Xdebug会对性能产生影响,但您会发现代码速度慢(瓶颈)。

第三个。最后一件事。WordPress的理念是Decisions, not Options.