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