这是一个非常常见的需求,尤其是在企业建站、多品牌展示或者个人开发者想用一套代码快速搭建多个风格不同的网站时。

dedecms 多模板共用数据库
(图片来源网络,侵删)

核心思路是:通过数据表前缀来区分不同站点的数据,同时利用 DedeCMS 的模板机制和配置文件,让每个站点指向不同的模板目录和数据表。

下面我将分步详细讲解整个实现过程,包括准备工作、配置步骤、以及一些注意事项。


核心原理

  1. 独立的数据表:DedeCMS 的数据表默认都有前缀,如 dede_archives (文章表), dede_arctype (栏目表),我们可以利用这个特性,为每个子站点创建一套带有不同前缀的数据表。

    • 站点A: dede_archives, dede_arctype, ...
    • 站点B: mydb_archives, mydb_arctype, ...
    • 站点C: site2_archives, site2_arctype, ... 所有这些表都存放在同一个数据库中。
  2. 独立的模板目录:在 DedeCMS 的 /templets/ 目录下,为每个站点创建一个独立的文件夹,siteA/, siteB/, siteC/,每个文件夹内都有一套完整的模板文件。

    dedecms 多模板共用数据库
    (图片来源网络,侵删)
  3. 动态配置:通过修改 DedeCMS 的核心配置文件 include/common.inc.php,在程序运行时动态设置当前站点所使用的数据表前缀和模板目录。


详细实施步骤

假设我们要在一个 DedeCMS 系统中创建两个子站点:

  • 主站:www.main.com (使用默认配置)
  • 子站:www.sub.com (使用新的数据表前缀 subdb_ 和新模板 subsite)

第一步:准备工作

  1. 安装基础 DedeCMS:在你的服务器上安装好一个标准的 DedeCMS 系统,并确保主站 www.main.com 可以正常运行。
  2. 规划数据表前缀:为子站 www.sub.com 规划一个数据表前缀,subdb_
  3. 规划模板目录:为子站规划一个模板目录,/templets/subsite

第二步:创建子站独立的数据表

这是最关键的一步,你需要将主站的数据表结构复制一份,并重命名为带有新前缀的表。

  1. 导出主站表结构

    dedecms 多模板共用数据库
    (图片来源网络,侵删)
    • 登录你的数据库管理工具(如 phpMyAdmin)。
    • 选择 DedeCMS 的数据库。
    • 选择主站使用的所有数据表(dede_archives, dede_arctype, dede_addonarticle, dede_channeltype 等,注意:只需要表结构,不需要数据)。
    • 点击“导出”,选择“自定义”,在“格式”中选择“SQL”,然后点击“执行”,这时会下载一个包含所有 CREATE TABLE 语句的 .sql 文件。
  2. 修改并导入新表结构

    • 用文本编辑器打开刚刚下载的 .sql 文件。
    • 使用“查找替换”功能,将所有的 dede_ 替换为你的子站前缀 subdb_
    • 保存修改后的 .sql 文件。
    • 回到 phpMyAdmin,选择同一个数据库,点击“导入”,选择你刚刚修改并保存的 .sql 文件,执行导入。
    • 你的数据库里就多了一套名为 subdb_* 的空表。
  3. (可选)初始化子站数据

    • 如果你希望子站一开始就有一些内容(比如栏目、文章),你可以从主站导出数据,然后同样用“查找替换”将 dede_ 替换为 subdb_,再导入到新表中。注意:ID 字段可能会冲突,需要小心处理。

第三步:创建子站独立的模板目录

  1. 在 DedeCMS 的安装目录下,找到 /templets/ 文件夹。
  2. /templets/ 内部创建一个新的文件夹,命名为 subsite(或你之前规划好的名字)。
  3. /templets/default/ 目录下的所有文件和文件夹完整复制/templets/subsite/ 中。
  4. 你可以根据子站的设计需求,自由修改 /templets/subsite/ 里的模板文件,而不会影响到主站的 /templets/default/

第四步:配置 include/common.inc.php 文件

这是实现动态切换的核心,我们需要在程序入口处根据不同的域名来加载不同的配置。

  1. 打开文件:用代码编辑器打开 /include/common.inc.php 文件。

  2. 查找配置代码:在文件中找到类似下面这几行代码(版本不同可能略有差异):

    //数据库连接信息
    $cfg_dbhost = 'localhost';
    $cfg_dbname = 'your_database_name';
    $cfg_dbuser = 'your_username';
    $cfg_dbpwd = 'your_password';
    $cfg_dbprefix = 'dede_'; // 这就是数据表前缀
    $cfg_db_language = 'gbk';
  3. 添加动态判断逻辑:在 $cfg_dbprefix = 'dede_'; 这一行之前,插入下面的 PHP 代码,这段代码会检查当前访问的域名,并据此设置不同的数据表前缀和模板目录。

    // =====================================================
    // 多站点共用数据库配置开始
    // 根据域名动态设置数据表前缀和模板目录
    // =====================================================
    if ($_SERVER['HTTP_HOST'] == 'www.sub.com') // 这里替换为你的子站域名
    {
        // 子站配置
        $cfg_dbprefix = 'subdb_';       // 子站的数据表前缀
        $cfg_templets_dir = '/templets/subsite'; // 子站的模板目录
    }
    else
    {
        // 默认配置 (主站)
        $cfg_dbprefix = 'dede_';       // 主站的数据表前缀
        $cfg_templets_dir = '/templets/default'; // 主站的模板目录
    }
    // =====================================================
    // 多站点共用数据库配置结束
    // =====================================================

    代码解释

    • $_SERVER['HTTP_HOST'] 获取当前访问的域名。
    • 我们通过 if 判断,如果域名是 www.sub.com,就 $cfg_dbprefix 设置为 subdb_$cfg_templets_dir 设置为 /templets/subsite
    • 否则,就使用默认的 dede_ 前缀和 /templets/default 模板。
    • 你可以根据需要添加更多的 else if 来支持第三个、第四个站点。

第五步:访问测试

所有配置都已完成,你可以通过浏览器访问:

  1. 主站http://www.main.com,应该会正常显示主站的内容和模板。
  2. 子站http://www.sub.com,应该会显示你为它准备的独立模板,并且数据是从 subdb_* 表中读取的。

重要注意事项和高级技巧

后台登录问题

  • 共用后台:默认情况下,两个站点会共用同一个 /dedede/ 后台,登录后台后,你发布文章、添加栏目等操作,需要非常小心,因为你操作的是哪个站点的数据表前缀是由 common.inc.php 决定的,这很容易造成数据混乱。
  • 推荐方案:独立后台(推荐) 为了管理方便,最好为每个子站也创建一个独立的后台。
    1. 复制 /dedede/ 文件夹,重命名为 /dedede_sub/
    2. 修改 /dedede_sub/config.php 文件,将其中的数据库连接信息指向同一个数据库,但数据表前缀要修改为子站的前缀$cfg_dbprefix = 'subdb_';
    3. 修改 /dedede_sub/index.php 文件的最顶部,加入和 common.inc.php 中一样的域名判断逻辑,以确保后台程序也加载正确的配置。
    4. 你可以通过 www.sub.com/dedede_sub/ 来登录子站的专属后台,这样就不会和主站的管理数据混淆了。

全局变量和配置

  • 网站信息:站点名称、网站版权、公司信息等,存储在 dede_sysconfig 表中,如果你想让每个站点有不同的信息,你需要为每个站点的前缀都创建一条记录(subdb_sysconfig)。
  • 频道模型:如果你自定义了频道模型,这些模型定义存储在 dede_channeltype 表中,同样,你需要为每个站点的前缀都复制一份模型定义。

URL 静态化

  • DedeCMS 的 URL 静态化规则是基于栏目 ID 和文章 ID 的,由于不同站点的栏目和文章 ID 是完全独立的(因为存在不同的数据表),URL 静态化功能可以正常工作,不会互相冲突。

插件和扩展

  • 使用第三方插件时,要特别注意插件是否也依赖特定的数据表,如果插件有自己的数据表,你需要像处理 DedeCMS 核心表一样,为每个站点创建一套带不同前缀的插件数据表。

更新和维护

  • DedeCMS 程序升级:当 DedeCMS 发布新版本时,你需要对所有站点的程序文件都进行升级,这可能会比较繁琐,因为每个站点可能使用了不同的模板。
  • 数据备份:由于所有数据都在一个库里,备份会变得很简单,但在恢复时,需要确保恢复的 SQL 文件中包含了所有前缀的表。

通过“数据表前缀分离 + 模板目录分离 + common.inc.php 动态配置”的方式,可以高效、低成本地实现 DedeCMS 多站点共用数据库的需求,这种方法充分利用了 DedeCMS 本身的设计,灵活性很高。

虽然操作上比完全独立的站点要复杂一些,特别是在后台管理和数据维护上需要更加细心,但对于需要快速部署多个风格统一但内容独立的网站来说,这是一个非常实用的方案。