这是一个非常经典的需求,因为织梦的默认机制是“动态内容,静态发布”,即内容存储在数据库中,但前台页面是生成好的静态HTML文件,对于小说这种章节多、更新频繁的站点,手动去更新每个章节的HTML是不现实的。

“自动更新HTML”的核心思想是:产生(如发布新章节、修改章节内容)时,系统自动触发一个更新流程,重新生成相关的静态HTML文件。
下面我将从原理、实现方法(推荐方案)、代码示例三个方面为你详细拆解。
核心原理
要实现自动更新,首先要理解织梦生成静态页面的核心函数:CreateHtml()。
这个函数位于 /include/helpers/extend.helper.php 文件中,是织梦生成所有静态页面的基石,它的基本用法是:

CreateHtml($typeid, $page = 1, $totalpage = 1, $position = 0);
$typeid: 栏目ID,这是最重要的参数,告诉织梦要生成哪个栏目的HTML。$page: 页码,用于生成列表的分页。$totalpage: 总页数,告诉织梦这个栏目有多少页需要生成。$position: 位置,通常用于首页等特殊页面。
自动更新的关键就在于: 在小说章节被修改或新增的“触发点”上,调用这个函数,并传入正确的参数。
实现方法(推荐方案)
最稳定、最推荐的方法是修改织梦的核心文件,虽然听起来有点“硬核”,但对于小说模块这种高度定制化的需求,这是最直接、最可靠的方式,我们可以通过修改发布章节的文件,在内容保存后立即执行更新。
操作步骤如下:
步骤 1:找到核心文件
织梦后台发布小说章节(文章)时,处理数据的核心文件是:
/dede/article_add.php (用于新增章节)
/dede/article_edit.php (用于修改章节)

我们需要在这两个文件中,找到数据成功保存到数据库之后的位置,插入我们的自动更新代码。
步骤 2:分析 article_add.php 文件
-
打开
/dede/article_add.php文件。 -
找到数据保存成功的位置:搜索类似
if($arcID)的判断,$arcID是新文章的ID,在这段代码的后面,就是执行成功后的逻辑。 -
定位到更新栏目缓存和生成HTML的代码:你会看到类似下面的代码:
// ... 前面的代码是接收表单数据、验证等 // 保存文章到数据库 if($arcID) { // ... 更新其他相关表,如arctiny, taglist等 // 更新栏目缓存 $dsql->ExecuteNoneQuery("UPDATE `#@_arctype` SET `isdefault`= -1 WHERE id='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `#@_arctype` SET `isdefault`= 0 WHERE id='$typeid' AND isdefault<>-1"); // 调用系统接口处理 if($cfg_remote_site=='Y') { // ... 远程站点同步逻辑 } // 关键点:生成HTML // 这里通常会调用一个函数来生成栏目首页、列表页和文章页 // 我们要找到这个调用,或者自己在这里添加 }
在 article_add.php 中,织梦本身已经集成了生成相关页面的逻辑,我们可能只需要确保它被正确执行,或者根据我们的需求进行微调。
步骤 3:分析 article_edit.php 文件
- 打开
/dede/article_edit.php文件。 - 找到数据更新成功的位置:搜索
if($dsql->ExecuteNoneQuery($upquery)),$upquery是更新文章的SQL语句,在这段if语句内部,就是更新成功后的逻辑。 - 手动添加自动更新逻辑:修改章节后,我们通常只需要重新生成该章节对应的文章页,以及它所在栏目的列表页和首页(如果该章节是最新章节,可能会影响首页的更新)。
代码示例与详细说明
假设我们希望在每次新增或修改章节后,都自动执行以下操作:
- 生成该章节对应的文章详情页。
- 生成该章节所在栏目的列表页。
- 生成该章节所在栏目的首页(可选,如果首页有调用最新章节)。
在 article_add.php 中添加代码
在 if($arcID) 代码块内,找到合适的位置(比如在所有数据库操作都完成后),添加以下代码:
// ... article_add.php 原有代码 ...
if($arcID)
{
// ... 织梦原有的保存和更新逻辑 ...
// ====== 开始:我们的自动更新逻辑 ======
// 1. 引入织梦的核心函数库
// require_once(dirname(__FILE__)."/../include/common.inc.php"); // 通常这个文件已经被包含了
// 2. 获取新文章的栏目ID
$typeid = $typeid; // $typeid 在此文件中已经存在,是表单提交的栏目ID
// 3. 生成该文章的详情页
// GetMakeHtml($typeid, $arcID, $typeid); // 这是一个封装好的函数,可以直接用
// 或者直接调用底层的 CreateHtml
$arc = GetOneArchive($arcID);
if(is_array($arc))
{
// 生成文章页
require_once(DEDEINC."/arc.archives.class.php");
$arc = new Archives($arcID);
$arc->MakeHtml();
}
// 4. 生成该栏目的列表页和首页
// 这里我们调用一个自定义的函数来批量更新,避免重复代码
// 注意:织梦自带的函数调用可能会比较复杂,我们简化处理
// 更新栏目列表页
// $dlist = new DedeList($typeid);
// $dlist->MakeHtmlList();
// 更简单粗暴但有效的方法是,调用系统的刷新栏目接口
// 这个接口会重新生成栏目首页和列表页
$cInfos = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE id='$typeid'");
$maxpage = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@_archives` WHERE typeid='$typeid'");
$maxpage = ceil($maxpage['dd'] / $cInfos['listpagesize']);
// 生成栏目首页 (index.html)
CreateHtml($typeid, 1, 1, 0);
// 生成栏目列表页 (list_1.html, list_2.html ...)
for($i=1; $i<=$maxpage; $i++)
{
CreateHtml($typeid, $i, $maxpage, 0);
}
// ====== 结束:我们的自动更新逻辑 ======
// ... 织梦原有的跳转逻辑 ...
ShowMsg("成功发布新章节!",'javascript:;',0,2000);
exit();
}
在 article_edit.php 中添加代码
在 if($dsql->ExecuteNoneQuery($upquery)) 代码块内,添加与 article_add.php 类似的逻辑。
// ... article_edit.php 原有代码 ...
if($dsql->ExecuteNoneQuery($upquery))
{
// ... 织梦原有的更新逻辑 ...
// ====== 开始:我们的自动更新逻辑 ======
// 1. 获取文章ID和栏目ID
// $id 和 $typeid 在此文件中已经存在
// 2. 生成该文章的详情页
$arc = GetOneArchive($id);
if(is_array($arc))
{
require_once(DEDEINC."/arc.archives.class.php");
$arc = new Archives($id);
$arc->MakeHtml(); // 这会重新生成该文章的HTML
}
// 3. 生成该栏目的列表页和首页 (逻辑同上)
$cInfos = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE id='$typeid'");
$maxpage = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@_archives` WHERE typeid='$typeid'");
$maxpage = ceil($maxpage['dd'] / $cInfos['listpagesize']);
CreateHtml($typeid, 1, 1, 0); // 栏目首页
for($i=1; $i<=$maxpage; $i++)
{
CreateHtml($typeid, $i, $maxpage, 0); // 栏目列表页
}
// ====== 结束:我们的自动更新逻辑 ======
// ... 织梦原有的跳转逻辑 ...
ShowMsg("成功修改章节内容!",'javascript:;',0,2000);
exit();
}
高级优化与注意事项
-
性能考虑:生成HTML是相对耗时的操作,如果一次性生成大量页面(比如一个有几千章的栏目,你修改了第一章),服务器可能会卡顿。
- 解决方案:可以考虑使用“计划任务”或“队列”机制,先将需要更新的页面ID记录到一张表中,然后通过Linux的Crontab或Windows计划任务,每隔几分钟执行一个PHP脚本,去读取这张表并逐步生成HTML,避免对主流程造成阻塞。
-
前台更新:如果你希望用户在前台点击“更新”按钮时也能触发这个逻辑,你需要修改前台的模板文件或自定义PHP文件,并确保调用时有足够的权限,这通常更复杂,不推荐新手尝试。
-
文件权限:确保你的网站目录(如
/html/)有写入权限,否则CreateHtml()函数会失败。 -
备份:在修改核心文件(如
article_add.php)之前,务必备份原文件!以防修改出错导致后台无法使用。 -
使用织梦自带的“一键更新”功能:织梦后台有一个“内容更新”功能(
/dede/content_list.php),你可以选择一个栏目,然后点击“一键更新栏目”,这会重新生成该栏目下所有文章的HTML,这虽然不是“自动”的,但可以作为手动应急的方案。
实现织梦小说模块的自动更新HTML,最核心的步骤就是:
- 理解原理:利用
CreateHtml()函数。 - 找到触发点:修改
article_add.php和article_edit.php。 - 编写代码:在触发点调用
CreateHtml()或Archives类的方法来生成所需的页面。 - 测试与优化:测试功能,并根据网站规模考虑性能优化。
通过以上方法,你就可以实现一个高效、自动的HTML更新机制,让小说网站的维护变得异常轻松。
