WordPress 中的自定义数据库表:第一部分
已发表: 2022-06-27在本系列文章中,我们将了解如何在 WordPress 中使用或不使用插件创建自定义数据库表。
何时以及为什么应该使用自定义数据库表?
在大多数情况下,您只需要安装 WordPress 时创建的默认 WordPress 数据库表即可。 这些表包含各种信息,例如帖子类型及其相关元数据。 那么,为什么需要自定义数据库表呢?
当您处理不属于 WordPress 中使用的正常信息的数据时,这些就会发挥作用。 因此,当您构建需要将信息存储在数据库中的插件时,您可能希望将数据放在自定义表中。 这就是为什么你会看到像 WooCommerce 这样的插件有自己的自定义表格的原因。
除了作为一种更简洁的信息存储方式之外,使用单独的表还可以帮助提高性能,因为使用的任何查询都不必搜索行和行不必要的数据。 相反,他们可以被引导到“正确的”表格,在那里他们可以更快、更有效地找到所需的信息。 当数据库表开始增长时,这变得非常重要。
创建 WordPress 自定义数据库表
假设我们想构建一个简单的插件来帮助我们组织学生列表。 实际上,像这样的简单任务意味着我们根本不需要使用自定义表。 自定义帖子类型可以完美地完成这项工作。
然而,为了这个例子,这种数据非常适合展示自定义表背后的理论,所以我们将使用它来运行。 注意:我们假设您具备一些基本的 PHP 和 mySQL 知识。
入门
首先,我们将创建一个“学生”数据库表,其中包含姓名、年龄、电子邮件和唯一 ID 列。 我们将通过创建一个自定义插件来完成这项工作。
注意:如果您还不熟悉如何创建自定义插件,请在继续本教程之前查看我们关于构建您自己的自定义 WordPress 插件的指南!
创建插件文件
我们将在 plugins 文件夹中创建一个名为“my-custom-db-tables”的文件夹,并在其中创建一个名为“my-custom-db-tables.php”的文件,其中包含以下代码:
<?php /* Plugin Name: My Custom DB Tables Description: A plugin for registering my students Author: Tassos Antoniou */ function create_the_custom_table() { // THE CODE } register_activation_hook(__FILE__, 'create_the_custom_table');
我们所做的是引入插件信息,以便 WordPress 能够识别插件。 显然,您还需要一个将表模式添加到数据库的函数,该函数将是create_the_custom_table()
函数。
在大多数情况下,您只需要运行一次此功能,最好在插件激活时运行。 因此,我们使用了 WordPress 提供的 register_activation_hook() 来确保该函数在插件激活时运行。
定义表的结构
当然,如果我们激活插件,什么都不会发生,因为该功能仍然是空的。 所以让我们用这段代码填充它,以便实际创建表:
<?php /* Plugin Name: My Custom DB Tables Description: A plugin for registering my students Author: Tassos Antoniou */ function create_the_custom_table() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $table_name = $wpdb->prefix . 'students'; $sql = "CREATE TABLE " . $table_name . " ( id int(11) NOT NULL AUTO_INCREMENT, name tinytext NOT NULL, email VARCHAR(100) NOT NULL, age int(11) NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } register_activation_hook(__FILE__, 'create_the_custom_table');
现在让我们暂停一下,看看我们用这段代码做了什么。
首先,我们使用与数据库通信的全局$wpdb
WordPress 类来获取表前缀。 它与wp-config.php
文件中定义的前缀相同,并且在您的自定义表中使用它也是一个好习惯。 我们还将通过将当前排序规则保存在$charset_collate
变量中来继承当前排序规则,以便稍后在查询中设置它。
我们的下一步是在 sql 查询中定义表的结构,以正确获取所需的模式。 正如我们所说,一个 id、email、name 和 age 列,每个列都有正确的数据类型。
$sql = "CREATE TABLE " . $table_name . " ( id int(11) NOT NULL AUTO_INCREMENT, name tinytext NOT NULL, email VARCHAR(100) NOT NULL, age int(11) NULL, PRIMARY KEY (id) ) $charset_collate;";
接下来,我们require_once
的upgrade.php
文件。 为了使用紧随其后的dbDelta
函数,这是强制性的。 在 WordPress 上,为了创建数据库表(或将现有表更新为新结构),我们需要使用 dbDelta 函数。
注意:此函数不是直接执行 SQL 查询,而是用于根据指定的 SQL 语句通过创建或更新表来修改数据库。 使用它的$queries
参数,我们可以传递自定义表的方案。
现在,如果您激活插件并检查您的数据库,您应该会看到该表已创建。
现在,如果您阅读wp-admin/includes/upgrade.php
文件,您会注意到dbDelta()
使用preg_match()
函数从 SQL 语句中检索信息。 因此,您在编辑时需要小心。 官方文档提供了更多信息,但我们强调了以下要点:
- 您必须在 SQL 语句中将每个字段放在自己的行中。
- PRIMARY KEY 和主键定义之间必须有两个空格。
- 您必须使用关键字KEY而不是其同义词 INDEX,并且您必须至少包含一个KEY。
- KEY 后面必须跟一个空格,然后是键名,然后是一个空格,然后是带有字段名称的左括号,然后是右括号。
- 除主键之外的其他 KEY 应指定名称。 例如:
... PRIMARY KEY (id), KEY age (age) ...
- 不得在字段名称周围使用任何撇号或反引号。
- 字段类型必须全部小写。
- SQL 关键字,如 CREATE TABLE 和 UPDATE,必须是大写的。
- 您必须指定接受长度参数的所有字段的长度,例如 id 列的 int(11)。
您可能还注意到,我们没有检查该表是否已存在于数据库中。 那是因为dbDelta
为我们做了这件事。 无需担心更新查询。 它不仅会创建表,还会检查同名表是否已经存在,如果存在,则不会创建表。 如果需要,它只会更新现有的表结构。
我们将在本系列的后续文章中对此进行更多介绍。
功能性和可扩展性
那么,当插件被停用或卸载时会发生什么? 理想情况下,当插件被停用或删除时,应该有一个管理员选项来选择是否从数据库中删除此表。
此外,您几乎可以肯定迟早会发现您需要更改您的插件(以改进它或消除错误)。 也许您想改变它存储数据的方式,向表中添加列,或者改变它的设计。 这意味着您应该以确保它尽可能可扩展并且可以适应所做的任何更改的方式构建插件。
在本系列的下一篇文章中,我们将深入探讨这些主题并向您展示如何实现这一目标。 稍后检查!