建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

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

GG网络技术分享 2025-03-18 16:05 0


在大多数情况下,插件会修改选项、元数据或利用现有表(最常见的是帖子表)来创建新功能。

自定义帖子类型、自定义分类法、图像处理、画廊、短代码——这些通常都不需要自己的数据库表。

这是因为 WordPress 的数据库模式(数据库的组织方式)非常适合开发。 post 表可用于存储对象,而 postmeta 表可用于存储有关这些对象的附加信息。 然而,在某些情况下,这会变得麻烦和/或浪费。

在今天的文章中,我们将看看新数据库表的优缺点,如何确定它们的结构以及如何在 WordPress 中创建它们。

自定义表格的注意事项?

您是否应该为您的插件使用自定义表格归结为两个因素:结构和数据量。 我会争辩说,如果您的数据结构与标准帖子模型完全不同,您只需要一个自定义表 你有大量的。

为了证明我的观点,让我们开始考虑一个插件,它使用谷歌分析来创建和存储由许多数据点组成的每周报告。 您可以通过三种方式解决此问题:

自定义表格

我们可以创建一个简单的自定义表格,将每周的分析存储在一行中。 数据库中的一行将包含一个标识符、分析日期、阅读的帖子数量、点击的链接、哪个国家贡献了最多的访问者等等。

Post 和 Postmeta

我们可以创建一个“分析”自定义帖子类型,并使用它来存储分析的 ID 和日期。 然后我们可以使用 post meta 来存储各个数据点。

一个简单的数组

我们可以简单地使用选项表中的单个选项,而不是使用帖子或自定义表。 这将是一个数组,其中的成员将是各个周数。

由于我们每周收集数据,这确实不是一个大型数据集。 当然,拥有一个完全符合我们需求的表会很方便,但是既然我们不值得用一个每周只使用一次的表来污染我们漂亮的 WordPress 数据库吗? 我会说不,特别是因为我们的数据非常适合 postmeta 表的键值方法。

在帖子表和简单数组之间进行选择并不是那么简单。 如果我们的示例仅存储一年的历史数据,则数组可能是一种完全有效的方法。 一开始它将包含 52 个成员,这些成员很容易操作。

如果继续收集数据,我会考虑使用 post 和 postmeta 方法,因为我们不想在第五年后加载和操作 260 个成员的数组。

“在现实世界中,界限有时会很模糊,决定走哪条路并不容易。”

现在,让我们只更改示例的一个参数,看看是否有任何变化。 让我们每分钟而不是每周收集数据。 一年有 525,948 分钟,这意味着如果我们使用一个简单的数组,到第一年年底它会膨胀到超过 50 万个成员。 这显然不是对我们数据库的有效使用,因为计算任何东西都需要很长时间。

post 和 postmeta 解决方案会遇到同样的问题。 虽然 WordPress 已经过优化,但在如此大的数量下,如果您犯了最轻微的优化错误,您的网站可能会停止运行,更不用说用户搜索可能会因您博客上的速度问题而受到影响(因为帖子和所有分析都将存储在同一张表)。 请记住,您的 postmeta 表可能包含每个分析的 10 多个数据点,因此您的元表每年将收到 5,259,480 行。

在这种情况下,自定义表格可能是合适的。 虽然该表每年也将填充 50 万行,但它与您的其他内容是分开的。 由于数据点可以作为列添加(或可以使用专用元表),您可以更快地执行操作。

在现实世界中,界限有时是模糊的,决定走哪条路并不容易。 为了帮助您,以下是创建自定义表的一些更简洁的优缺点:

优点

  • 您可以使用模式来完全适合您的数据结构
  • 您不必使用两个数据库表来存储数据
  • 您可以控制字段类型和限制
  • 您的数据与 WordPress 的其他方面完全分离
  • 在某些情况下,导出数据可能更容易
  • 您的应用程序可能会更好地扩展
  • 否则复杂的查询可以变得更简单
  • 您的数据可能更清晰

缺点

  • 您可能会弄乱 WordPress 数据库
  • 操作表数据比较困难
  • 您将需要创建自己的 UI
  • 您可能更容易出现 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 友好的方式完成自定义表格的唯一方法。

如果您知道添加自己的数据库表的插件,请在下面的评论中告诉我们,也许我们可以检查一下它是否正确!

标签:

标签: WordPress 教程

提交需求或反馈

Demand feedback