我刚开始编写wordpress插件,但是我已经涉足了深层次的工作,我想确保在即将到来的大型项目中做得对。

我'我将把wordpress大量扩展到一个相当大的Web应用程序中,并希望保持我的数据结构尽可能本机,以依靠wordpress框架,但是我不知道创建自己的自定义数据库表还是尝试使用它更好可以使用自定义帖子类型。

我还不知道我的所有数据,但是会有许多表(或cpt)关联在一起。我从研究中得到“共鸣”,应该避免使用自定义数据库表,但是我不确定如何确定最佳解决方案。

我特别关注三个方面:


如果我走那条路线,每个cpt所需的额外元字段数,并且如果这样会使事情变得“棘手”
我如何使用半复杂的关系过滤器来获取报表的查询效果如何
如何最好地管理关系,尤其是当我有很多对很多关系时

有“正确”的方法吗?感谢您的输入。

#1 楼

您应该对任何说有单一“正确”方式的人都持怀疑态度。正确的方法取决于情况。使用CPT基础结构有许多显着的好处:


您免费获得了Dashboard UI
您会自动利用WP的缓存,包括安装时安装的所有持久性缓存插件可能正在使用
,您会自动获得诸如修订本之类的好东西
,您可以访问WP_Query类,这意味着从理论上讲,您不必编写任何(或至少不多)的代码-容易出错且效率低下的SQL
如果您打算分发插件或将其打开以进行开源开发,则可能会发现开发人员更愿意使用自定义帖子类型和关联的API函数要比您自己的自定义东西

CPT API的问题主要源于以下事实:它与“帖子”的隐喻高度相关,并且该数据类型的所有方面伴随着隐喻。在MySQL命令行中,运行DESCRIBE wp_posts。 WP假定您的内容具有标题,并且具有(单个)作者,您只需要跟踪创建日期和上次编辑日期,就需要空间来放置未索引的post_content等。适用于某些内容,但不一定适用于其他内容。您已经指出了一些潜在问题的方向:


如果我走那条路线,我将需要为每个cpt分配额外字段的发布元字段数使事情变得“棘手”


有两种通过CPT API扩展wp_posts模式的方法:后元和分类法。 Postmeta是未索引的键/值对,非常适合存储大量其他数据,但根本没有针对复杂的查找进行优化。在这方面,分类法更为灵活,但是如果您的查询非常复杂,您仍将面临许多潜在的昂贵子查询。 (不过meta_querytax_query参数及其查询构造函数类非常好用。)

如果,如您所建议的那样,您只需要在代码中执行这些“半复杂关系过滤器”如果偶尔有报告,那么此体系结构可能适合您。当您开始向用户展示过滤器时,您必须始终运行许多复杂的JOIN和子查询,这些事情很快就会失控。


如何最好地管理关系,尤其是当我有很多关系时。


多对多关系是WP开发社区中长期存在的问题(请参阅https://core.trac.wordpress。 org / ticket / 14513)。您可以通过将分类项目映射到post_ids上来伪造它,而无需使用自定义表(例如,可以说P3具有标签“ Y-P3”,从而说出“ P3与Y到P5的关系为Y”),但这会造成混淆(效率低下)非常快。您还可以考虑创建将CPT链接在一起的自己的关系表-您仍将获得CPT的好处,并且仅创建一个数据库表即可。有关此方法的良好执行版本,请参见Posts 2 Posts插件:https://wordpress.org/extend/plugins/posts-to-posts/

因此,最后,您应该基于以下内容决定:


您将存储的数据类型-它们如何“发布”
所需的查询类型-它们将变得多么复杂
规模-所需的架构有多复杂,将拥有多少个对象以及预期有多少用户

如果答案是:非常贴切,不太复杂并且不必扩展超大尺寸,请使用CPT。否则请考虑自己的表。

评论


优秀的总结。

– JCL1178
2012年4月4日,下午3:22

加倍。很好回答+1

– kaiser
2012年4月4日下午14:13

哇,好极了布恩,谢谢!知识渊博,解释清楚,摘要清单非常实用。我认为这给了我所需的方向。也许我可以使我的一些对象cpts和其他自定义。我也在考虑帖子2帖子样式关系表,以获取两全其美的感觉。而且您对meta_query arg的提示也很棒!

–杰夫
2012年4月4日在16:58

如果您正在考虑定制表,那么Pippin Williamson的本系列绝对值得一读:pippinsplugins.com/series/building-a-database-abstraction-layer

–特拉维斯·诺斯库特(Travis Northcutt)
2015年10月16日16:23