WordPress源码深度解析之:`WordPress`的多站点架构:`wp-blogs`和`wp-sitemeta`表的底层逻辑。

各位技术大拿,晚上好!我是今晚的讲师,很高兴能和大家一起扒一扒WordPress多站点架构的底裤,特别是wp_blogswp_sitemeta这两张表,看看它们到底在玩什么花样。

今天咱们的讲座主题是:WordPress源码深度解析之:WordPress的多站点架构:wp_blogswp_sitemeta表的底层逻辑

咱们要搞清楚,WordPress多站点(Multisite)可不是简单地复制粘贴几个WordPress程序那么简单。它是一个精心设计的架构,允许你在一个WordPress安装下运行多个站点,共享核心代码和插件,但每个站点又有自己的数据库表、主题、上传文件和用户。

wp_blogswp_sitemeta这两张表,就是支撑这个多站点架构的关键骨架。

一、wp_blogs表:多站点的核心目录

首先,咱们来认识一下wp_blogs表。这玩意儿就像一个总目录,记录了所有站点的基本信息。如果没有它,WordPress就不知道该去哪里找各个站点的数据。

咱们先来看看wp_blogs表里都有哪些字段:

字段名 数据类型 描述
blog_id bigint(20) 站点ID,自增主键,每个站点的唯一标识符。
site_id bigint(20) 站点组ID,指向wp_sitemeta表中的site_id。 在单站点模式下,通常是1。 在多站点模式下,允许将站点分组管理。
domain varchar(200) 站点域名。 注意,这里只存储域名,不包含协议(http/https)。
path varchar(100) 站点路径。 例如,如果站点访问地址是example.com/blog1/,那么path就是/blog1/。 根站点的path/
registered datetime 站点注册时间。
last_updated datetime 站点最后更新时间。
public tinyint(2) 站点是否公开。 1表示公开,0表示不公开。
archived tinyint(2) 站点是否已归档。 1表示已归档,0表示未归档。 归档的站点通常会被禁用,但数据仍然保留。
mature tinyint(2) 站点是否包含成人内容。 1表示包含,0表示不包含。
spam tinyint(2) 站点是否被标记为垃圾站点。 1表示是垃圾站点,0表示不是。
deleted tinyint(2) 站点是否被删除。 1表示已删除,0表示未删除。 删除的站点通常会从前台隐藏,但数据仍然保留,可以恢复。
lang_id int(11) 站点语言ID。 和wp_options里的WPLANG相关。

简单来说,wp_blogs表就像一个地址簿,告诉你每个站点住在哪个域名和路径下,以及它们的状态(是否公开、是否归档、是否被删除等等)。

代码示例:获取所有站点的基本信息

如果你想获取所有站点的基本信息,你可以这样写SQL查询:

SELECT blog_id, domain, path, registered, public, archived
FROM wp_blogs;

在WordPress里,你也可以使用get_sites()函数来获取站点信息。这个函数返回一个WP_Site对象数组,包含了wp_blogs表中的数据。

<?php
$sites = get_sites();

foreach ( $sites as $site ) {
    echo 'Site ID: ' . $site->blog_id . '<br>';
    echo 'Domain: ' . $site->domain . '<br>';
    echo 'Path: ' . $site->path . '<br>';
    echo 'Registered: ' . $site->registered . '<br>';
    echo 'Public: ' . $site->public . '<br>';
    echo 'Archived: ' . $site->archived . '<br>';
    echo '<br>';
}
?>

这个代码片段会循环遍历所有的站点,并输出它们的基本信息。

二、wp_sitemeta表:站点的元数据仓库

有了wp_blogs这张总目录,我们知道了每个站点住在哪里。但是,每个站点还有很多其他的配置信息,比如站点名称、站点描述、管理员邮箱等等,这些信息都存在哪里呢? 答案就是wp_sitemeta表。

wp_sitemeta表用来存储站点的元数据(metadata),也就是关于站点的数据。

wp_sitemeta表结构如下:

字段名 数据类型 描述
meta_id bigint(20) 元数据ID,自增主键。
site_id bigint(20) 站点组ID,指向wp_blogs表中的site_id
meta_key varchar(255) 元数据键名。 例如,site_namesite_descriptionadmin_email等等。
meta_value longtext 元数据值。 和meta_key对应。

简单来说,wp_sitemeta表就像一个Key-Value存储,用来存储站点的各种配置信息。

代码示例:获取站点的元数据

假设你想获取站点ID为1的站点的名称和描述,你可以这样写SQL查询:

SELECT meta_key, meta_value
FROM wp_sitemeta
WHERE site_id = 1
AND meta_key IN ('site_name', 'site_description');

在WordPress里,你可以使用get_site_option()函数来获取站点的元数据。

<?php
$site_id = 1;
$site_name = get_site_option( 'site_name', '', $site_id );
$site_description = get_site_option( 'site_description', '', $site_id );

echo 'Site Name: ' . $site_name . '<br>';
echo 'Site Description: ' . $site_description . '<br>';
?>

这个代码片段会获取站点ID为1的站点的名称和描述,并输出它们。

你也可以使用 update_site_option() 函数来更新站点元数据。

<?php
$site_id = 1;
$new_site_name = 'My Awesome Site';
update_site_option( $site_id, 'site_name', $new_site_name );

echo 'Site Name updated to: ' . $new_site_name;
?>

三、wp_blogswp_sitemeta的联动:多站点的魔力

wp_blogswp_sitemeta这两张表不是孤立存在的,它们之间通过site_id字段关联起来,共同支撑着WordPress的多站点架构。

wp_blogs表存储了站点的基本信息,wp_sitemeta表存储了站点的元数据。 当WordPress需要获取某个站点的配置信息时,它会先从wp_blogs表找到该站点的信息,然后根据site_idwp_sitemeta表获取该站点的元数据。

这种设计的好处是:

  • 结构清晰: 站点基本信息和元数据分离存储,结构清晰,易于维护。
  • 灵活扩展: 可以方便地为站点添加新的元数据,而无需修改wp_blogs表的结构。
  • 高效查询: 可以根据site_id快速地获取站点的元数据。

四、多站点架构下的数据库表结构

在多站点架构下,除了wp_blogswp_sitemeta这两张表之外,还有一些其他的表也会受到影响。

一般来说,每个站点都有自己的一套数据库表,这些表的表名都以wp_{blog_id}_开头,其中{blog_id}是站点的ID。 例如,站点ID为2的站点的文章表就是wp_2_posts,用户表就是wp_2_users

但是,有些表是所有站点共享的,比如wp_userswp_usermeta。 也就是说,所有站点的用户都存储在同一张表中。

下面是一个表格,展示了多站点架构下的数据库表结构:

表名 说明
wp_blogs 存储所有站点的基本信息。
wp_sitemeta 存储所有站点的元数据。
wp_users 存储所有站点的用户。
wp_usermeta 存储所有用户的元数据。
wp_{blog_id}_posts 存储站点ID为{blog_id}的站点的文章。
wp_{blog_id}_comments 存储站点ID为{blog_id}的站点的评论。
wp_{blog_id}_options 存储站点ID为{blog_id}的站点的选项。 这个表非常重要,存储了站点的各种配置信息,比如站点标题、站点描述、主题等等。 每个站点都有自己的wp_options表,这意味着每个站点都可以有自己的主题和插件配置。
wp_{blog_id}_terms 存储站点ID为{blog_id}的站点的分类和标签。
wp_{blog_id}_term_taxonomy 存储站点ID为{blog_id}的站点的分类和标签的层级关系。
wp_{blog_id}_term_relationships 存储站点ID为{blog_id}的文章和分类/标签的关联关系。
wp_{blog_id}_postmeta 存储站点ID为{blog_id}的站点的文章的元数据。
其他站点相关的表。

五、wp_options的特殊性:站点配置的中心

在多站点架构下,wp_options表扮演着非常重要的角色。 每个站点都有自己的wp_options表,这意味着每个站点都可以有自己的主题和插件配置。

wp_options表存储了站点的各种配置信息,比如站点标题、站点描述、主题、插件等等。

WordPress使用get_option()函数来获取站点的选项,使用update_option()函数来更新站点的选项。

需要注意的是,get_option()update_option()函数只能访问当前站点的wp_options表。 如果你想访问其他站点的wp_options表,你需要使用switch_to_blog()函数来切换到该站点,然后再使用get_option()update_option()函数。

代码示例:切换站点并获取选项

<?php
$site_id = 2; // 切换到站点ID为2的站点

switch_to_blog( $site_id );

$site_title = get_option( 'blogname' ); // 获取站点标题

echo 'Site Title: ' . $site_title . '<br>';

restore_current_blog(); // 恢复到当前站点
?>

这个代码片段会切换到站点ID为2的站点,然后获取该站点的标题,并输出它。 最后,它会恢复到当前站点。

六、 多站点架构的优势和劣势

了解了wp_blogswp_sitemeta表的底层逻辑,以及多站点架构下的数据库表结构,我们再来总结一下多站点架构的优势和劣势:

优势:

  • 易于管理: 可以在一个WordPress安装下管理多个站点,方便统一管理和维护。
  • 节省资源: 可以共享核心代码和插件,节省服务器资源。
  • 代码复用: 可以方便地在多个站点之间共享代码和功能。

劣势:

  • 复杂性: 多站点架构比单站点架构更复杂,需要更高的技术水平。
  • 安全性: 如果一个站点被攻击,可能会影响到其他站点。
  • 性能: 在某些情况下,多站点架构可能会影响性能。

七、 总结

今天咱们深入研究了WordPress多站点架构的核心组件——wp_blogswp_sitemeta表。 我们了解了它们各自的结构和功能,以及它们是如何协同工作来支撑多站点架构的。

希望今天的讲座能帮助大家更好地理解WordPress的多站点架构,并在实际项目中更好地应用它。

如果大家还有什么问题,欢迎随时提问! 谢谢大家!

发表回复

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