避免插件名称与WP更新程序冲突

时间:2014-11-13 作者:jalefkowit

我有一个客户端,它有一个WordPress站点,使用另一个开发人员为其编写的自定义插件。最近,他们运行了WordPress更新程序,其中一个更新删除了该自定义插件,并将其替换为插件库中碰巧具有相同名称的插件。

我正试图弄清楚到底需要改变什么,以避免这种情况在未来再次发生。所讨论的插件在目录/主文件名中没有任何特定的唯一标识符;想象一下是这样的:

foo/foo.php
因此,如果存储库中已经有一个“Foo”插件,那么可以理解为什么WP会混淆两者。

我过去的理解是,避免这种情况的方法是在这些名称中添加唯一标识符,例如:

client-foo/client-foo.php
我认为,添加“client”位是通过使插件特定于运行它的一个WordPress站点来降低冲突几率的方法。

然而,即使在重命名文件之后,我发现更新程序仍然将插件与存储库中的“foo”插件混淆。

接下来,我尝试更改插件元数据标题中的“Name”字段,从

Plugin Name: Foo

Plugin Name: Foo (Client)
以及this 似乎消除了碰撞;更新程序不再将其标记为与公共插件匹配。

所以现在我很困惑。更新程序为避免冲突而检查的唯一内容是插件名称元数据字段,这真的是这样吗?至少对我来说,与我之前认为的方式(比较文件名)相比,这似乎真的很脆弱。

无论如何,我无法找到更新程序用于进行此检查的确切信息,虽然我确实找到了this previously asked question 答案线程从来没有出来说“这就是它的工作原理”所以我想我应该问问。

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

WordPress在存储库中查找插件的方式不是公共的AFAIK。

根据Otto的回答,您链接了插件url标题和插件名称。

顺便说一句,从要更新的插件列表中删除插件是确保此问题不会再次发生的最佳方法:一旦匹配方法不是公共的,您就无法知道它将来是否会更改。

SO网友:Rarst

由于用于从官方存储库进行更新的逻辑既模糊又精确,细节都是保密的,因此仅仅通过操纵细节是不可能可靠地避开它的。

目前唯一可靠的做法是从发送进行更新检查的集合中筛选出数据。即使这样也非常不方便,需要在HTTP API请求级别上执行。一个相关的挑战是,如果插件排除了自身,那么当插件处于非活动状态时,它就无法做到这一点,并且在这种情况下仍然有被更新破坏的风险。

我个人写了一个小Update Blocker 此的帮助程序。在更严重的站点中,我建议完全停止更新,并使用Composer管理站点。

虽然WP project普遍认为这是一个现在的问题(实际上花了几年时间),但票证提议标题选择退出标志已经暂停了一段时间,需要在WordPress org网站上更新。看见ticket #32101 in core trac.

结束