探讨 WordPress 自动保存与修订版本系统的数据库存储结构

好的,现在开始我们的 WordPress 自动保存与修订版本系统数据库存储结构讲座。

今天我们将深入探讨 WordPress 的自动保存与修订版本系统,并详细分析其在数据库中的存储结构。理解这些机制对于优化数据库性能、开发自定义插件以及深入理解 WordPress 的底层运作至关重要。

一、自动保存与修订版本的概念

  • 自动保存 (Autosave): WordPress 会定期自动保存用户正在编辑的文章或页面,以防止数据丢失,例如浏览器崩溃或网络中断。自动保存不会创建新的修订版本,它只是覆盖现有的自动保存版本。

  • 修订版本 (Revisions): WordPress 会在用户每次手动保存文章或页面时创建一个新的修订版本。修订版本允许用户回溯到文章或页面的先前状态,从而恢复或比较不同的版本。

二、数据库表结构

WordPress 主要使用 wp_postswp_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 元数据的值

五、自动保存的存储方式

  1. post_type 字段: 自动保存的 post_type 字段设置为 'auto-draft'

  2. post_status 字段: 自动保存的 post_status 字段设置为 'auto-draft'

  3. post_parent 字段: 自动保存的 post_parent 字段设置为父文章/页面的 ID。这建立了自动保存与原始文章/页面之间的关联。

  4. 自动保存覆盖: 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() 函数检索给定文章/页面的自动保存版本。

六、修订版本的存储方式

  1. post_type 字段: 修订版本的 post_type 字段设置为 'revision'

  2. post_status 字段: 修订版本的 post_status 字段设置为 'inherit'

  3. post_parent 字段: 修订版本的 post_parent 字段设置为父文章/页面的 ID。这建立了修订版本与原始文章/页面之间的关联。

  4. 每个保存创建一个修订版本: 每次手动保存文章/页面时,WordPress 都会创建一个新的修订版本,并在数据库中创建一个新的 wp_posts 记录。

  5. 元数据: 有关修订版本的附加信息(例如创建修订版本的用户)存储在 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_relationshipswp_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_postswp_postmeta 如何存储文章、页面、自动保存和修订版本的相关信息,学习了如何查询和清理它们,以及相关的核心函数。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注