为您的 WordPress 插件创建自定义数据库表


VPS1352主机测评网(www.vps1352.com)
本文链接:https://www.vps1352.com/11165.html
在大多数情况下,插件会修改选项、元数据或利用现有表(最常见的是帖子表)来创建新功能.
自定义帖子类型、自定义分类法、图像处理、画廊、短代码——这些通常都不需要自己的数据库表.
这是因为 WordPress 的数据库模式(数据库的组织方式)非常适合开发.post 表可用于存储对象,而 postmeta 表可用于存储有关这些对象的附加信息.然而,在某些情况下,这会变得很麻烦和/或浪费.
在今天的文章中,我们将看看新数据库表的优缺点,如何确定它们的结构以及如何在 WordPress 中创建它们.
自定义表格的注意事项?
您是否应该为您的插件使用自定义表格归结为两个因素:结构和数据量.我认为,如果您的数据结构与标准帖子模型完全不同并且您有大量数据结构,那么您只需要一个自定义表格.
为了证明我的观点,让我们开始考虑一个插件,它使用 Google 分析来创建和存储由多个数据点组成的每周报告.您可以通过三种方式解决此问题:
自定义表格
我们可以创建一个简单的自定义表格,将每周的分析存储在一行中.数据库中的一行将包含一个标识符、分析日期、阅读的帖子数量、点击的链接、哪个国家/地区的访问者最多等等.
Post 和 Postmeta
我们可以创建一个"分析"自定义帖子类型,并使用它来存储 ID 和分析日期.然后我们可以使用 post meta 来存储各个数据点.
一个简单的数组
我们可以简单地使用选项表中的单个选项,而不是使用帖子或自定义表.这将是一个数组,其成员将是各个周数.
由于我们每周收集数据,这确实不是一个大型数据集.当然,拥有一个完全符合我们需求的表格会很方便,但是既然我们不值得用一个每周只使用一次的表格来污染我们漂亮的 WordPress 数据库吗?我会说不,特别是因为我们的数据非常适合 postmeta 表的键值方法.
在帖子表和简单数组之间进行选择并不是那么简单.如果我们的示例仅存储一年的历史数据,则数组可能是一种完全有效的方法.一开始它将包含 52 个成员,这些成员很容易操作.
如果继续收集数据,我会考虑使用 post 和 postmeta 方法,因为我们不想在第 5 年后加载和操作 260 个成员的数组.
"在现实世界中,线条有时是模糊的,决定走哪条路并不容易."
现在,让我们只更改示例的一个参数,看看是否有任何变化.让我们每分钟而不是每周收集数据.一年有 525,948 分钟,这意味着如果我们使用一个简单的数组,到第一年年底它会膨胀到超过 50 万个成员.这显然不是对我们数据库的有效使用,因为计算任何东西都需要很长时间.
post 和 postmeta 解决方案会遇到同样的问题.虽然 WordPress 已经过优化,但在如此大的数量下,如果您犯了最轻微的优化错误,您的网站可能会陷入停顿,更不用说用户搜索可能会受到您博客上的速度问题的影响(因为帖子和所有分析都将存储在同一张表).请记住,您的 postmeta 表可能包含每个分析的 10 多个数据点,因此您的元表每年将收到 5,259,480 行.
这种情况可能适合使用自定义表格.虽然该表每年也将填充 50 万行,但它与您的其他内容是分开的.由于数据点可以作为列添加(或可以使用专用元表),因此您可以更快地执行操作.
在现实世界中,线条有时会很模糊,要决定走哪条路并不容易.为了帮助您,以下是创建自定义表的一些更简洁的优缺点:
优点
- 您可以根据自己的数据结构设计架构
- 您不必使用两个数据库表来存储数据
- 您可以控制字段类型和限制
- 您的数据与 WordPress 的其他方面完全分离
- 在某些情况下,导出数据可能更容易
- 您的应用程序可能会更好地扩展
- 否则复杂的查询可以变得更简单
- 您的数据可能会更清晰
缺点
- 您可能会弄乱 WordPress 数据库
- 处理表格数据更加困难
- 您需要创建自己的用户界面
- 您可能更容易受到 SQL 错误和攻击
- 您将无法访问 很多 功能
- 您需要维护您的数据库,可能需要维护多个版本
- 您需要在插件激活、停用和卸载方面做更多工作
考虑到这一点,希望您可以决定是否需要自定义表格.如果是,请继续阅读,我将向您展示如何以 WordPress 的方式创建一个.
创建数据库表
应在激活时创建数据库表.这可以使用以下方法通过插件和激活挂钩中的函数来完成:
加载要点 f2cd7abccbf87bdc0dd1b9e823542a02
此功能将在用户激活插件时运行.如果您想了解更多相关信息,请查看我们关于 WordPress 插件激活、停用和卸载挂钩的教程.
我们将使用我们刚刚挂钩的函数来使用 dbDelta()
函数添加我们的数据库表.要使用这个函数,我们需要一个数据库名称(使用 WordPress 表前缀)、数据库排序规则和一个 SQL 查询.以下示例展示了如何创建数据库,灵感来自我们的网站分析插件:
加载要点 cbb85f6083248a874ed8c1c758a2916f
最初,我们从 WordPress 配置文件中的一组中获取我们的排序规则——它存储在 $wpdb
变量中——我们也从那里检索前缀.我们使用前缀来创建最终的数据库名称.使用一些根据某些规则格式化的 SQL,我们创建了一个数据库表.然后我们包含包含 dbDelta()
函数的文件,然后执行它将创建我们的数据库.
格式化我们的 SQL 查询
在格式化 SQL 查询时,我们必须遵循许多规则.以下内容摘自 Codex 文章.
- 您必须在 SQL 语句中将每个字段放在自己的行中.
- PRIMARY KEY 和主键定义之间必须有两个空格.
- 您必须使用关键字 KEY 而不是其同义词 INDEX,并且您必须至少包含一个 KEY.
- 您不得在字段名称周围使用任何撇号或反引号.
- 字段类型必须全部小写.
- SQL 关键字,如 CREATE TABLE 和 UPDATE,必须大写.
这些是由 dbDelta()
函数强加的,当然不是 SQL 本身.此功能需要找出数据库模式之间的差异,以便在需要时高效、安全地更新表.因此,SQL 的格式必须允许函数轻松"消化"它.
更新数据库表
随着时间的推移,您可能需要向插件添加其他功能.我只在上面添加了浏览量和点击量,那么以分钟为单位添加平均页面浏览时间怎么样?这将需要一个新列,而这正是 dbDelta()
派上用场的地方.
在我们做任何事情之前,我们应该确保我们已经将我们的版本号添加到我们的插件中.这将帮助我们确定何时需要更改数据库.
加载要点8bcd636b36128992447bbad1508c4348
假设在整个 1.x 版本中,数据库架构中没有任何变化.在 2.0 版中,我们添加了一个列.以下是它的工作原理:
加载要点 89d021b9bf28a83d3656d9597e7adccb
我添加了一个单独的列,即 blog_id,它可以帮助我们使这个插件适用于多站点安装.如您所见,我检测到当前使用的数据库版本是否低于插件的版本.如果是我们使用相同的格式来简单地添加一列.dbDelta()
函数会为我们处理所有更改,我们只需为其提供正确的数据库模式.
结论
通常不需要创建自己的表.然而,当它是时,dbDelta 函数允许我们创建模块化、灵活且易于维护的表.
如果您发现自己需要表格,则应始终小心使用此方法,因为这是以 WordPress 友好的方式完成自定义表格的唯一方法.
如果您知道添加自己的数据库表的插件,请在下面的评论中告诉我们,也许我们可以检查一下它是否正确!
标签: