好的,现在开始我们的 WordPress 自动保存与修订版本系统数据库存储结构讲座。
今天我们将深入探讨 WordPress 的自动保存与修订版本系统,并详细分析其在数据库中的存储结构。理解这些机制对于优化数据库性能、开发自定义插件以及深入理解 WordPress 的底层运作至关重要。
一、自动保存与修订版本的概念
-
自动保存 (Autosave): WordPress 会定期自动保存用户正在编辑的文章或页面,以防止数据丢失,例如浏览器崩溃或网络中断。自动保存不会创建新的修订版本,它只是覆盖现有的自动保存版本。
-
修订版本 (Revisions): WordPress 会在用户每次手动保存文章或页面时创建一个新的修订版本。修订版本允许用户回溯到文章或页面的先前状态,从而恢复或比较不同的版本。
二、数据库表结构
WordPress 主要使用 wp_posts
和 wp_postmeta
这两个表来存储文章、页面、自动保存和修订版本的数据。
-
wp_posts
表: 这是核心表,存储了所有文章、页面、自动保存和修订版本的通用信息。 -
wp_postmeta
表: 用于存储与文章、页面、自动保存和修订版本相关的元数据。
三、wp_posts
表的关键字段
字段名 | 数据类型 | 描述 |
---|---|---|
ID |
BIGINT(20) UNSIGNED | 文章、页面、自动保存或修订版本的唯一标识符 (primary key, auto_increment) |
post_author |
BIGINT(20) UNSIGNED | 作者 ID (关联 wp_users 表的 ID 字段) |
post_date |
DATETIME | 文章、页面、自动保存或修订版本的创建日期和时间 (UTC) |
post_date_gmt |
DATETIME | 文章、页面、自动保存或修订版本的创建日期和时间 (GMT) |
post_content |
LONGTEXT | 文章、页面、自动保存或修订版本的内容 |
post_title |
TEXT | 文章、页面、自动保存或修订版本的标题 |
post_excerpt |
TEXT | 文章、页面、自动保存或修订版本的摘要 |
post_status |
VARCHAR(20) | 文章、页面、自动保存或修订版本的状态 (例如:publish, draft, auto-draft, inherit, revision) |
comment_status |
VARCHAR(20) | 评论状态 (例如:open, closed) |
ping_status |
VARCHAR(20) | PING状态 (例如:open, closed) |
post_password |
VARCHAR(255) | 文章、页面、自动保存或修订版本的密码 (如果已设置) |
post_name |
VARCHAR(200) | 文章、页面、自动保存或修订版本的别名 (slug) |
to_ping |
TEXT | 需要PING的URL |
pinged |
TEXT | 已经PING过的URL |
post_modified |
DATETIME | 文章、页面、自动保存或修订版本的最后修改日期和时间 (UTC) |
post_modified_gmt |
DATETIME | 文章、页面、自动保存或修订版本的最后修改日期和时间 (GMT) |
post_content_filtered |
LONGTEXT | 过滤后的文章、页面、自动保存或修订版本的内容 |
post_parent |
BIGINT(20) UNSIGNED | 父文章/页面的 ID (用于分层结构) 对于修订版本,此字段存储父文章/页面的 ID。 |
guid |
VARCHAR(255) | 文章、页面、自动保存或修订版本的唯一标识符 (URL) |
menu_order |
INT(11) | 菜单顺序 |
post_type |
VARCHAR(20) | 文章、页面、自动保存或修订版本的类型 (例如:post, page, attachment, revision, auto-draft) |
post_mime_type |
VARCHAR(100) | MIME类型 |
comment_count |
BIGINT(20) | 评论数量 |
四、wp_postmeta
表的关键字段
字段名 | 数据类型 | 描述 |
---|---|---|
meta_id |
BIGINT(20) UNSIGNED | 元数据的唯一标识符 (primary key, auto_increment) |
post_id |
BIGINT(20) UNSIGNED | 文章、页面、自动保存或修订版本的 ID (关联 wp_posts 表的 ID 字段) |
meta_key |
VARCHAR(255) | 元数据的键名 |
meta_value |
LONGTEXT | 元数据的值 |
五、自动保存的存储方式
-
post_type
字段: 自动保存的post_type
字段设置为'auto-draft'
。 -
post_status
字段: 自动保存的post_status
字段设置为'auto-draft'
。 -
post_parent
字段: 自动保存的post_parent
字段设置为父文章/页面的 ID。这建立了自动保存与原始文章/页面之间的关联。 -
自动保存覆盖: WordPress 不会为每次自动保存创建新的数据库记录。相反,它会更新现有的自动保存记录,以反映最新的自动保存内容。
示例 SQL 查询:
SELECT *
FROM wp_posts
WHERE post_type = 'auto-draft'
AND post_parent = [父文章/页面 ID];
此查询将检索特定文章/页面的所有自动保存版本。但是,通常只会有一个。如果用户在编辑过程中没有刷新,则只有一个。
代码示例 (PHP):
<?php
global $post; // 获取当前文章/页面对象
if ( $post ) {
$parent_id = $post->ID;
$autosave = wp_get_post_autosave( $parent_id );
if ( $autosave ) {
echo "自动保存 ID: " . $autosave->ID . "<br>";
echo "自动保存内容: " . $autosave->post_content . "<br>";
} else {
echo "没有找到自动保存的版本。";
}
}
?>
此代码段演示了如何使用 wp_get_post_autosave()
函数检索给定文章/页面的自动保存版本。
六、修订版本的存储方式
-
post_type
字段: 修订版本的post_type
字段设置为'revision'
。 -
post_status
字段: 修订版本的post_status
字段设置为'inherit'
。 -
post_parent
字段: 修订版本的post_parent
字段设置为父文章/页面的 ID。这建立了修订版本与原始文章/页面之间的关联。 -
每个保存创建一个修订版本: 每次手动保存文章/页面时,WordPress 都会创建一个新的修订版本,并在数据库中创建一个新的
wp_posts
记录。 -
元数据: 有关修订版本的附加信息(例如创建修订版本的用户)存储在
wp_postmeta
表中。
示例 SQL 查询:
SELECT *
FROM wp_posts
WHERE post_type = 'revision'
AND post_parent = [父文章/页面 ID]
ORDER BY post_date DESC;
此查询将检索特定文章/页面的所有修订版本,并按日期降序排列。
代码示例 (PHP):
<?php
global $post; // 获取当前文章/页面对象
if ( $post ) {
$revisions = wp_get_post_revisions( $post->ID );
if ( $revisions ) {
echo "修订版本列表:<br>";
foreach ( $revisions as $revision ) {
echo "修订版本 ID: " . $revision->ID . ", 创建日期: " . $revision->post_date . "<br>";
}
} else {
echo "没有找到修订版本。";
}
}
?>
此代码段演示了如何使用 wp_get_post_revisions()
函数检索给定文章/页面的所有修订版本。
七、wp_postmeta
表中与修订版本相关的元数据
以下是一些常见的与修订版本相关的元数据存储在 wp_postmeta
表中:
_edit_lock
: 存储锁定文章/页面的用户信息。_edit_last
: 存储最后编辑文章/页面的用户 ID。_revision_log
: 有关修订版本的日志信息(例如创建修订版本的原因)。 通常是空值,除非插件或自定义代码添加了相关信息。
示例 SQL 查询:
SELECT *
FROM wp_postmeta
WHERE post_id = [修订版本 ID];
此查询将检索特定修订版本的所有元数据。
八、禁用自动保存和修订版本
虽然自动保存和修订版本对于数据安全和版本控制很有用,但它们也会增加数据库的大小,并可能影响性能。 因此,在某些情况下,可能需要禁用或限制它们。
禁用自动保存 (通过 wp-config.php
):
define( 'AUTOSAVE_INTERVAL', false ); // 禁用自动保存
限制修订版本数量 (通过 wp-config.php
):
define( 'WP_POST_REVISIONS', 3 ); // 限制为 3 个修订版本
完全禁用修订版本 (通过 wp-config.php
):
define( 'WP_POST_REVISIONS', false ); // 完全禁用修订版本
代码示例 (PHP) – 删除所有修订版本:
警告:此操作不可逆,请谨慎使用!备份数据库后再执行!
<?php
global $wpdb;
$sql = "DELETE FROM wp_posts WHERE post_type = 'revision'";
$wpdb->query( $sql );
echo "所有修订版本已删除。";
?>
此代码段将从 wp_posts
表中删除所有修订版本。 请务必在执行此操作之前备份数据库!
九、清理修订版本和自动保存
即使禁用了修订版本,现有的修订版本仍然会保留在数据库中。定期清理这些数据可以帮助提高数据库性能。
使用 WP-CLI 清理修订版本:
wp post delete $(wp post list --post_type='revision' --format=ids) --force
使用 SQL 查询清理修订版本 (更彻底,也更危险,谨慎使用):
警告:此操作不可逆,请谨慎使用!备份数据库后再执行!
DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision';
此查询将从 wp_posts
, wp_term_relationships
和 wp_postmeta
表中删除所有修订版本及其相关数据。 请务必在执行此操作之前备份数据库!
十、自动保存机制的源码分析
自动保存的核心逻辑位于 wp-includes/js/tinymce/plugins/autosave/plugin.js
(前端) 和 wp-admin/includes/post.php
(后端)。
前端 JavaScript 代码负责定期将文章内容发送到服务器。后端 PHP 代码接收这些数据并将其保存为自动保存版本。
关键函数:
wp_autosave()
: 处理自动保存请求,并在数据库中创建或更新自动保存版本。wp_get_post_autosave()
: 检索给定文章/页面的自动保存版本。
十一、修订版本机制的源码分析
修订版本的核心逻辑位于 wp-includes/post.php
。
关键函数:
wp_create_post_revision()
: 创建新的修订版本。wp_get_post_revisions()
: 检索给定文章/页面的所有修订版本。wp_restore_post_revision()
: 恢复到特定的修订版本。
十二、总结
WordPress 的自动保存和修订版本系统是一个复杂但强大的机制,用于保护用户数据和提供版本控制功能。理解其数据库存储结构对于优化数据库性能、开发自定义插件以及深入理解 WordPress 的底层运作至关重要。 我们学习了 wp_posts
和 wp_postmeta
如何存储文章、页面、自动保存和修订版本的相关信息,学习了如何查询和清理它们,以及相关的核心函数。