织梦小说模块如何自动更新HTML?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 织梦建站 正文

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

织梦小说模块自动更新html
(图片来源网络,侵删)

“自动更新HTML”的核心思想是:产生(如发布新章节、修改章节内容)时,系统自动触发一个更新流程,重新生成相关的静态HTML文件。

下面我将从原理、实现方法(推荐方案)、代码示例三个方面为你详细拆解。


核心原理

要实现自动更新,首先要理解织梦生成静态页面的核心函数:CreateHtml()

这个函数位于 /include/helpers/extend.helper.php 文件中,是织梦生成所有静态页面的基石,它的基本用法是:

织梦小说模块自动更新html
(图片来源网络,侵删)
CreateHtml($typeid, $page = 1, $totalpage = 1, $position = 0);
  • $typeid: 栏目ID,这是最重要的参数,告诉织梦要生成哪个栏目的HTML。
  • $page: 页码,用于生成列表的分页。
  • $totalpage: 总页数,告诉织梦这个栏目有多少页需要生成。
  • $position: 位置,通常用于首页等特殊页面。

自动更新的关键就在于: 在小说章节被修改或新增的“触发点”上,调用这个函数,并传入正确的参数。


实现方法(推荐方案)

最稳定、最推荐的方法是修改织梦的核心文件,虽然听起来有点“硬核”,但对于小说模块这种高度定制化的需求,这是最直接、最可靠的方式,我们可以通过修改发布章节的文件,在内容保存后立即执行更新。

操作步骤如下:

步骤 1:找到核心文件

织梦后台发布小说章节(文章)时,处理数据的核心文件是: /dede/article_add.php (用于新增章节) /dede/article_edit.php (用于修改章节)

织梦小说模块自动更新html
(图片来源网络,侵删)

我们需要在这两个文件中,找到数据成功保存到数据库之后的位置,插入我们的自动更新代码。

步骤 2:分析 article_add.php 文件

  1. 打开 /dede/article_add.php 文件。

  2. 找到数据保存成功的位置:搜索类似 if($arcID) 的判断,$arcID 是新文章的ID,在这段代码的后面,就是执行成功后的逻辑。

  3. 定位到更新栏目缓存和生成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 文件

  1. 打开 /dede/article_edit.php 文件。
  2. 找到数据更新成功的位置:搜索 if($dsql->ExecuteNoneQuery($upquery))$upquery 是更新文章的SQL语句,在这段 if 语句内部,就是更新成功后的逻辑。
  3. 手动添加自动更新逻辑:修改章节后,我们通常只需要重新生成该章节对应的文章页,以及它所在栏目的列表页和首页(如果该章节是最新章节,可能会影响首页的更新)。

代码示例与详细说明

假设我们希望在每次新增或修改章节后,都自动执行以下操作:

  1. 生成该章节对应的文章详情页。
  2. 生成该章节所在栏目的列表页。
  3. 生成该章节所在栏目的首页(可选,如果首页有调用最新章节)。

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();
}

高级优化与注意事项

  1. 性能考虑:生成HTML是相对耗时的操作,如果一次性生成大量页面(比如一个有几千章的栏目,你修改了第一章),服务器可能会卡顿。

    • 解决方案:可以考虑使用“计划任务”或“队列”机制,先将需要更新的页面ID记录到一张表中,然后通过Linux的Crontab或Windows计划任务,每隔几分钟执行一个PHP脚本,去读取这张表并逐步生成HTML,避免对主流程造成阻塞。
  2. 前台更新:如果你希望用户在前台点击“更新”按钮时也能触发这个逻辑,你需要修改前台的模板文件或自定义PHP文件,并确保调用时有足够的权限,这通常更复杂,不推荐新手尝试。

  3. 文件权限:确保你的网站目录(如 /html/)有写入权限,否则 CreateHtml() 函数会失败。

  4. 备份:在修改核心文件(如 article_add.php)之前,务必备份原文件!以防修改出错导致后台无法使用。

  5. 使用织梦自带的“一键更新”功能:织梦后台有一个“内容更新”功能(/dede/content_list.php),你可以选择一个栏目,然后点击“一键更新栏目”,这会重新生成该栏目下所有文章的HTML,这虽然不是“自动”的,但可以作为手动应急的方案。

实现织梦小说模块的自动更新HTML,最核心的步骤就是:

  1. 理解原理:利用 CreateHtml() 函数。
  2. 找到触发点:修改 article_add.phparticle_edit.php
  3. 编写代码:在触发点调用 CreateHtml()Archives 类的方法来生成所需的页面。
  4. 测试与优化:测试功能,并根据网站规模考虑性能优化。

通过以上方法,你就可以实现一个高效、自动的HTML更新机制,让小说网站的维护变得异常轻松。

-- 展开阅读全文 --
头像
C语言Windows下llseek函数如何使用?
« 上一篇 2025-12-20
织梦Dede模板本地怎么搭建?
下一篇 » 2025-12-20

相关文章

取消
微信二维码
支付宝二维码

目录[+]