WordPress节日
1月22日,2021年

选择一种语言

This is an archive of the January 2021 event

WordPress太烂了

我们都喜欢WordPress,但如果我们对自己诚实,我们知道它并不完美。我们将探讨WordPress的一些问题,从数据库结构等技术方面,到GPL等项目方面,并学习如何在你的下一个WordPress项目中考虑到WordPress的一些更具挑战性的方面。

演讲者:Cameron JonesCameron Jones

时间:世界协调时凌晨3:00
区域:大洋洲
阶段。全球阶段

WordPress很烂,引起你的注意了吗?不是吗,你可能会觉得这有点挑衅,但尽管我很喜欢WordPress,我相信你也是。但是,尽管我很喜欢WordPress,我相信你也是,但是WordPress有很多东西确实很烂。这不是一些讽刺性的谈话,而是我们真的要摘下我们的玫瑰色眼镜,来看看WordPress的一些糟糕之处。

但首先,我是谁?我有什么权利说WordPress很烂。呃,我叫卡梅隆-琼斯。我是一名来自澳大利亚维多利亚港的WordPress开发者,从2014年开始就一直在搭建WordPress网站。而且我还经营着插件商店mongoose marketplace,呃,在我们开始之前,我想说的是,我可能会涉及一些敏感的话题,所有的观点都是我自己的。

现在让我们潜入。

我们先来看看数据库结构。WordPress刚开发出来的时候,它是一个纯粹的博客平台。而这样的只有帖子,因为它的发展包括了页面和自定义的帖子类型,这些新的内容类型只是帖子的核心延伸,一个页面是一个帖子一个产品是一个帖子一个订单是一个帖子。

而且它们都存储在同一个职位稳定。这有两个主要的问题,第一个问题是,它使多个环境之间的内容合并变得非常困难。对于大多数静态网站来说,这还不算太坏。但对于非常活跃的网站,如电子商务商店和论坛,这可能会成为一个噩梦。

比如在暂存环境下,如果你做了一个新的帖子,就会被赋予一个ID,但在生产环境下,同样ID的帖子,可能是完全不同的东西,比如订单图片,甚至是改版。美味大脑的团队曾试图为此构建一个名为merge bot的解决方案,但他们最终放弃了这个项目。

如果他们不能想办法解决理念冲突的问题,在目前的数据库结构状态下,可能是不可能的。另一个问题是,所有的帖子类型都共享帖子表,没有机会针对每个帖子类型所需的不同数据来定制表格的列。

所以,所有的内容都会以某种方式进入帖子元表。帖子金属的工作方式非常好,因为它很灵活,特别容易存储重复的内容。但是,由于post metal的每一项都会占用表中的一行,所以很快就会变得非常臃肿。这也意味着,你不能在特定的列上设置查询索引,这将使查询速度更快。

综合来看,这意味着WordPress的帖子查询通常会比一个简单的静态网站要慢。这不会很明显,但在规模化的网站上,这可能是相当抑制的。数据库是相当僵化的,因为WordPress的很多工作方式,都依赖于它的设置方式,但你可以做一些事情来帮助缓解这些问题。

如果你能控制好设置的内容类型,让你注册自己的自定义帖子类型,你可以使用pods,自定义内容类型,它为每个内容类型设置自己的表格。但是这对于WooCommerce这种内置了自己的自定义帖子类型的东西是行不通的。

如果你可以控制正在使用的帖子元字段,你可以将它们存储为一个单一的序列化数组,这意味着数据库中的每篇帖子将只存储一行帖子元。不过这样一来,通过特定的元字段来查询帖子就比较困难了。再说一遍,如果你依靠的是有自己自定义帖子类型的插件,在理想的世界里,你对这些插件真的无能为力,注册一个类型会专门为该帖子类型注册一个新表。

你有机会在注册帖子类型时为帖子元数据添加自定义列,但不幸的是,这需要在核心中进行大量的破坏性修改。

我们已经算是介绍了一种自定义类型的内容,比如说产品,其实不应该是一个帖子的扩展。帖子表中的一些列和WP帖子对象中的属性,你可能都不需要,比如评论和回帖的字段。除此之外,很可能还有其他的属性,你希望为你的自定义帖子类型中的每一个帖子存储,你必须将其存储为帖子元数据,这可能是不太理想的。

另外,有些方面帖子具有其他帖子类型不能的功能,比如自定义帖子类型不能有粘帖。可以通过使用Postmate字段并过滤查询,重新创建粘帖功能。但是。而且似乎有一些插件可以解决这个问题。

然而,这只是帖子和自定义帖子类型之间不一致的地方之一,帖子可以将存档作为主页或分配到发布的页面,但自定义帖子类型没有这样的选项。它们只能有一个动态生成的存档,或者根本没有。这意味着,如果没有代码,你不能改变自定义帖子类型存档的永久地址,也不能将其设置为主页。

当不同的内容类型可以有如此不同的实现方式时,即使它们是如此的相似,试图将一个网站整合起来也是相当令人沮丧的。

长期以来,WordPress在保持向后兼容性方面一直保持着高标准。不仅是WordPress,自己的架构,还有PHP版本。直到最近,WordPress才正式放弃对PHP 5.4的支持,而一方面。这对于向后兼容来说是很好的。另一方面,这意味着主机商已经没有什么动力去保持服务器的更新了。

最近一段时间,WordPress推出了插件要求最低WordPress版本和最低PHP版本的方式,因为插件提高了安装的最低要求。一些廉价的主机已经被抛弃了。活,网站的卡在插件上,无法更新,如果这些插件在那些早期版本中存在bug或漏洞,可能会让网站崩溃或容易受到黑客的攻击。

WordPress对向后兼容性的承诺导致了一些主机商的自满。不幸的是,现在和以往一样,投资于高质量的主机是很重要的。

停止。我们将采取在代码基础上看。WrodPress是老成立于2003年。因此,这是近18年。随着时代的变迁和编码标准的提高,它已经在这一点上。所以WordPress的很多代码库也有了很大的变化,很多功能都被废弃了,换成了更好的功能。但由于他们对向后兼容的承诺,大多数,甚至所有这些被废弃的功能仍然只是被废弃的,它们仍然被放在代码库中,以防一些很老的网站仍然在使用它们。

我不会说WordPress是臃肿的,但里面有很多代码可能应该被删除。这是ClassicPress作为WordPress 4.9的硬分叉之一,他们已经删除了许多过时的功能和不再需要的旧代码。

然而,并不是所有的东西都有改进,WordPress严重依赖全局变量,这就污染了全局命名空间。所以你可能需要小心你对变量的称呼,特别是在使用钩子的函数中。最好的检查方法是使用WordPress PHP编码标准,它将突出显示你正在使用的变量,这些变量可能会导致与一些核心全局变量的冲突。

你可能已经看过那个模板层次图了。这是一个奇妙的乱七八糟的意大利面条。其实这很有意义。一旦你建了几个网站。问题是,它并没有真正反映出大多数网站在不同页面上的模板化应该如何工作。它们几乎总是会是一组全局元素,会出现在每个页面上。

是的,WordPress有获取模板部分等功能。WordPress有get模板部分等功能。但你最终还是会在众多不同的模板文件中重复很多,让事情变得非常困难。如果你需要对整个模板进行重大的改变,最好的方法就是尝试建立一个模板包装器功能,来应对这种低效的模板层次结构。

有几个主题,比如根已经想好了如何做到这一点,非常好。实际上,几年前我做过一次演讲,演示了如何做到这一点。如果你想更深入地了解一下,屏幕上会有一个链接。

WordPress自然与wordpress.org有着非常紧密的联系,但在某些方面却走得太远。WordPress认为网站上的每一个插件都是从wordpress.org安装的。这意味着,如果你打算开发一个自定义的插件或主题,你需要注意文件夹的名称,否则WordPress可能会试图用同名的插件或主题来覆盖它。

那是托管在wordpress.org上的。如果你想让你的自定义插件或主题托管在其他地方,不管出于什么原因,比如在GitHub上,你需要使用过滤器来改变WordPress寻找插件的托管位置。有一些方法可以让这很容易,比如 edd 许可类,如果你正在分发你的插件或主题与简易数字下载。

我相信Fremius也有类似的东西。然后还有一些GitHub更新的类也有。然而,这并不是万无一失的,因为它需要插件或主题是活动的,过滤器才能运行。例如,而不是一些更合理的东西,比如文件头中的一个选项。这就需要我们去了解为什么像EDD或Fremius这样的东西是必要的。

而这是因为你不能在WordPress.org上有付费插件或主题,它们都是免费下载的。这很好。如果你只是把一个插件或主题作为爱好,但如果你的插件发展起来,要维护这个插件,要迎合WordPress核心的变化,要处理支持查询,尤其是,所以如果你的插件没有得到任何经济回报,但又期望继续努力,很多插件都选择了免费增值的路线,在wordpress.org上有一个免费的插件,然后卖一个功能更多的高级版本,根本不需要WordPress。

我想毋庸置疑,WordPress.org上没有付费的插件和主题,让人们更难通过构建WordPress产品谋生,也降低了WordPress.org上的插件和主题的质量。

WordPress使用SVN对核心以及主题和插件进行版本控制。SVN是一个集中式的版本控制系统,这意味着它实际上只在一个地方。我希望WordPress能够使用Git,他们确实使用GitHub来做更现代的项目,比如Gutenberg,但WordPress其实比Git存在的时间更长。

所以当时根本没有选择,不像它,你可以在本地提交,然后用SVN把你的提交推送到服务器上,一个提交就是直接提交到服务器上。使用起来会相当痛苦。特别是当你习惯于和Git打交道的时候,如果你有一个插件托管在wordpress.org上,而你又不想和SVN打交道,你可以用类似Absera这样的东西来帮你处理SVN方面的问题,而自己只和Git打交道。

WordPress是在GPL下授权的,这是一个有效的版权许可。这意味着任何人都可以使用WordPress。然而,他们喜欢。这很酷,但这也意味着任何衍生作品都会继承该许可证,这意味着主题和插件。从某种程度上来说,这是件好事,因为这让我们可以轻松地使用插件,并让它们变得更好,就像我们的商务是Gigoshop的一个分叉。

但它也意味着。人们更欢迎把你的,你的作品作为自己的作品进行再分配,包括付费作品。这就出现了很多GPL俱乐部,以很便宜的价格转卖高级插件。严格来说,主要是只有PHP代码继承了GPL,图片、字体等不继承。

同样,它们也可以被您的插件或主题使用。它们不以任何方式依赖于WordPress。所以,在一个分离的许可证下授权你的工作是完全合法的,其中代码是GPL,而其他资源是不合法的,这导致的是社区中一些热心的把关。例如,如果你想在wordpress.org上发布你的插件或者在WordCamp上演讲,所有的东西都必须是GPL。

例如,Envato已经允许作者在分割许可下出售他们的插件或主题。因此,所有Envato员工在仍受雇于WordCamps和WordPress见面会期间,都被禁止在WordCamps和WordPress见面会上发言,说实话,这让人很失望。值得庆幸的是,这不是WordPress的官方活动。

否则,我可能连12秒后的演讲都不允许参考这个。

新的区块编辑器也不是没有问题。区块编辑器是使用React构建的,React是一个JavaScript框架,它与PHP甚至jQuery有很大的不同,在这之前,React几乎是WordPress所有部分的基础,学习曲线陡峭。而开发一个区块虽然不需要对React有广泛的了解。

这确实大大提升了入门门槛,因为开发者甚至需要了解JSX和Webpack等编译器才能入门。而且这也无济于事。文档有时会有些欠缺。值得庆幸的是,对于传统的开发者来说,有一些选择,高级自定义字段和Genesis自定义块。

只是其中的一些,呃,允许你使用PHP和UI的组合来创建自定义块。块编辑器还有很多其他的问题,比如无障碍性差,但我想我们可能会暂时把它留在那里。

最后我想说一些意见,不是针对WordPress这个软件,而是它的生态系统,尤其是最近,WordPress的生态系统似乎出现了垄断的情况。这在资本主义市场中是可以预期的,但这也是一种耻辱,生态系统越来越不多样化,越来越被几个大玩家控制。

最近的一些收购包括Yoast刚刚收购,Duplicate Post。自动收购Prosperous,WP引擎收购Genesis和Flywell Awesome Motive收购all in one SEO,Liquid Web,收购The Events Calendar。而I Themes收购Restrict Content Pro显然没有办法确定,但我认为可以肯定的是,这其中有一些是因为wordpress.org不托管付费产品而发生的。

还有一个问题就是Automattic和WordPress商标的问题,因为Matt Mullenweg同时经营着Automattic和WordPress基金会。Automattic已经获得了使用WordPress商标的独家权利,有效地将自己定位为WordPress的官方权威,而最近Automattic进入定制网站开发领域却未必如此。

而这导致了很多人的反感,因为他们能够定位自己的方式。我觉得可以说Automattics使用WordPress商标伤害了WordPress社区。当初向我推荐WordPress的时候,我就被它伤害了,当我搜索WordPress的时候,搜索结果中第一个出现的就是wordpress.com。

而当我很快发现你连写一些自定义CSS都要付费时,我就把WordPress写成了Wix这样的垃圾建站软件。而在我了解到它所建立的开源软件之前,差不多要一年的时间。在对WordPress核心软件的贡献方面,Automattic也有点垄断。

而这也让一些人认为Automattic有效地控制了WordPress这个软件的发展方向。也许是,也许不是,但他们肯定比任何人都更有发言权。我说这些话并不是要抨击Automattic或Matt,但不用说,这里存在着巨大的利益冲突,我们都应该意识到。

非常感谢您的坚持。希望现在您对WordPress的工作方式和它的一些限制有了更好的了解,也知道如何适应这些限制。当然,这还不是一个详尽的列表,只是WordPress很烂。当然不是。如果是这样,我们就不会在这里了。我的名字是Camerson Jones,你可以在网上找到我,大多数地方都是Cameron Jones web。

分享本届会议

分享到Facebook
在微博上分享
在linkedin上分享
分享到pinterest
分享到电子邮件