Hooking in to plugins

时间:2010-08-14 作者:Ryan Elkins

我正在开发一个插件,理想情况下,当用户通过一个不同的插件做某事时,它能够做一些事情。

我可以在这些插件中添加自定义挂钩,但很明显,当我想要分发插件时,这不会很好地工作。有没有一个好方法可以从我自己的插件中为其他人的插件添加钩子?唯一真正的解决方案是要求作者包含自定义挂钩,以便其他开发人员可以根据他们的工作进行构建吗?

示例:当有人转发文章时,我想在插件中做一些事情。如果在流行的retweet插件中有一个自定义的钩子,我可以钩住它,然后启动它,那就太好了。没有,所以我可以修改他们的插件以包含它,但这只适用于我的副本,我不想尝试重新分发它。

我们是否只需要努力成为更好的插件开发者,这样我们就能一起玩得很好?

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

@Ryan Elkins:

我想答案取决于如何导入每个用例。在某些情况下,它可能是您需要的快速而肮脏的东西,在其他情况下,它可能是一个更重要的用例。以下是我想到的两件事:

在WordPress Core中寻找其他钩子,如果是快速而脏的东西,有时可以使用Core中的其他下游钩子来修改所需内容,或者通过使用ob_start()/ob_end_clean() (见@Todd Perkins answer 至“Dealing with large HTML output via plugin code“以获取代码示例。)

要追踪钩子,您可以查看Instrument Hooks plugin 我昨天发布了文章,以帮助您找到可能使用的挂钩。

如果您的用例对您或社区更重要,请向插件开发人员提交一个带有所需钩子的补丁,我建议您继续向插件添加所需的钩子。然后对它进行测试,确保它真正符合您的用例,然后您可以向插件开发人员提交补丁,希望他或她能够应用它。通过这种方式,您可以通过向他们提供经过测试的代码来尽可能地简化他们的工作,并且您可以自己完成用例,以确保它是您真正需要的。我无法告诉你,我有多少次认为我需要某个钩子,只是为了在尝试实现一个钩子后发现,我需要一个钩子,但它与我最初设想的不同。

如果您不熟悉创建补丁,这里有一篇关于修补WordPress core的好文章,对于大多数适用于修补插件的补丁,对于不适用的补丁,希望可以很明显地看到该怎么做:

  • How to Patch WordPress

    P、 有一件事我觉得有点令人失望,你的问题是只为最终用户设计的插件的百分比,即没有自己的挂钩。想象一下,如果WordPress的设计与大多数插件一样?这将是一个非常灵活的解决方案。

    如果WordPress能够自动安装其他插件所依赖的插件,情况可能会有所不同?事实上,我通常必须从头开始编写大量所需的功能,因为客户端需要某种方式和可用的插件,而90%的客户端不允许我灵活地更新其余的10%。

    我真的希望WordPress社区的领导者能够找到一种方法,确保插件在遵循最佳实践(例如为其他开发人员添加挂钩)的同时获得奖励,就像在StackExchange网站上奖励好的答案一样。

SO网友:Arlen Beiler

我们是否只需要尝试to 成为更好的插件开发人员,这样我们就能一起玩得更好?

首先,是的。

唯一真正的解决方案是要求作者包含自定义挂钩,以便其他开发人员可以根据他们的工作进行构建吗?

这将是一个很好的解决方案。

您也可以复制其他插件,只需添加任何更改,尽管这会更麻烦。

SO网友:nobody

我想你在问题中回答了你的问题,因此它变得有些修辞。

很明显,你所说的是一个类似于谷歌鼓励Android和Intent系统的系统,即一个应用程序可以发布它能够代表其他应用程序执行的操作,然后这些应用程序可以连接到其他应用程序并来回传递数据。就个人而言,我认为这是我们作为优秀开发人员需要努力的方向——我们使用WordPress是因为它已经非常棒了,在大多数情况下,它足以让我们轻松决定是使用它还是开发类似的内部产品。插件库本身也是一样的,主要是作为最终用户+开发人员-为什么要开发一个非常好的twitter插件呢。

同样的“为什么要开发副本”也是您这里问题的关键所在。Android Intent系统允许应用程序利用已经创建的功能,并在它们之间传递数据,这一点很受欢迎,也经常使用,因为它被大量推送。WordPress中已经实现了一个类似的系统,但除了核心代码中的钩子之外,很少使用,因为核心代码中使用了大量的钩子。

如果定制插件中有更多的钩子,社区将受益匪浅,但正如您所说,在需要钩子的时候/地方添加钩子并不容易。

关于你想连接的Twitter插件,给作者发一封电子邮件,我相信他会很乐意为你添加这些插件。

如果您认为有一个地方是在插件中放置挂钩的好地方,那么就去做,并做好文档记录。如果更多的人开始在插件中加入钩子,或者有一种普遍的趋势,那么这种情况最终会发生。

所以要回答你的最后一个问题:

我们是否只需要努力成为更好的插件开发者,这样我们就能一起玩得很好?


Edit:我已经对实际问题和实现钩子的最佳方式做了更多的思考,你不能添加一个操作,如果你试图运行的插件的特定功能存在,它就会运行吗?

SO网友:bueltge

定义函数:

function my_footer() {
    do_action(\'my_footer\');
}
现在您可以钩住这个钩子:add_action(\'my_footer\', \'example_function\', 1);#更多信息请参见my post.

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?