指的是,当一篇长文章被分成多个页面时,除了第一页有主标题外,从第二页开始,每个分页页面都有一个独立的、自定义的副标题,这对于SEO优化和提升用户体验非常有帮助。

(图片来源网络,侵删)
下面我将提供三种实现方法,从最简单、最推荐的方法到最灵活、最复杂的方法,并附上详细步骤。
核心思路
无论哪种方法,核心思路都是一致的:
- 修改文章编辑器:在文章内容编辑区增加一个“副标题”输入框。
- 修改数据表:在
dede_archives(文章主表) 或新建一个附加表,增加一个字段来存储副标题。 - 修改PHP处理逻辑:在文章保存时,将副标题字段的数据也保存到数据库中。
- 修改模板文件:在文章内容页模板中,通过PHP判断,如果当前不是第一页,则显示副标题。
推荐方案(修改附加表,最稳定)
这是最规范、最安全的方法,不会影响主表结构,适合对系统稳定性要求高的网站。
第1步:创建附加表并添加字段
- 登录你的网站数据库管理工具(如phpMyAdmin)。
- 找到你的DedeCMS数据库,进入
dede_addonarticle表(这是“普通文章”模型的附加表)。 - 为该表添加一个新的字段,用于存储副标题,执行以下SQL语句:
ALTER TABLE `dede_addonarticle` ADD `pagesubtitle` VARCHAR(255) NOT NULL DEFAULT '';
pagesubtitle是字段名,你可以自定义。VARCHAR(255)是数据类型和长度,255个字符通常足够。NOT NULL DEFAULT ''表示该字段不能为空,默认值为空字符串。
第2步:修改文章发布后台
- 打开文件:
/dede/templets/article_add.htm(新增文章) 和/dede/templets/article_edit.htm(编辑文章),编辑器<textarea>标签附近,找到合适的位置(比如在“文章内容”下方),添加以下HTML代码:<div style="margin:10px 0;"> <label>分页副标题:</label> <input type="text" name="pagesubtitle" id="pagesubtitle" style="width:400px;" class="alltxt" /> <span class="gray">(此副标题将在文章分页的第2页及之后显示)</span> </div>这会在后台文章编辑页面增加一个输入框。
(图片来源网络,侵删)
第3步:修改PHP处理文件以保存数据
- 打开文件:
/dede/article_add.php(新增文章处理) 和/dede/article_edit.php(编辑文章处理)。 - 在这两个文件中,找到处理附加表数据的SQL插入或更新语句,将
pagesubtitle字段加入其中。
在 article_add.php 中查找类似代码:
// 在 $inquery = $dsql->ExecuteNoneQuery($query); 之前,找到构建 $addquery 的部分
$addquery = " ";
if(empty($typeid2)) $typeid2 = 0;
if(empty($typeid3)) $typeid3 = 0;
$addquery = " (typeid, typeid2, typeid3, body, litpic, userip) VALUES ('$typeid', '$typeid2', '$typeid3', '$body', '$litpic','$userip') ";
修改为:
// 在 $inquery = $dsql->ExecuteNoneQuery($query); 之前,找到构建 $addquery 的部分
$addquery = " ";
if(empty($typeid2)) $typeid2 = 0;
if(empty($typeid3)) $typeid3 = 0;
// 注意:这里需要把POST过来的pagesubtitle进行安全处理,比如使用 dede_htmlspecialchars
$pagesubtitle = $dsql->GetInnerText($pagesubtitle);
$addquery = " (typeid, typeid2, typeid3, body, litpic, userip, pagesubtitle) VALUES ('$typeid', '$typeid2', '$typeid3', '$body', '$litpic','$userip', '$pagesubtitle') ";
在 article_edit.php 中查找类似代码:
// 在 $upquery = $dsql->ExecuteNoneQuery($upquery); 之前 $upquery = " SET typeid='$typeid',typeid2='$typeid2',typeid3='$typeid3',body='$body',litpic='$litpic',userip='$userip' ";
修改为:

(图片来源网络,侵删)
// 在 $upquery = $dsql->ExecuteNoneQuery($upquery); 之前 $pagesubtitle = $dsql->GetInnerText($pagesubtitle); $upquery = " SET typeid='$typeid',typeid2='$typeid2',typeid3='$typeid3',body='$body',litpic='$litpic',userip='$userip', pagesubtitle='$pagesubtitle' ";
第4步:修改文章内容页模板
- 打开你的文章内容页模板文件,通常位于
/templets/default/article_article.htm。 - 在
{dede:field.body/}标签内部,找到分页代码(通常由{dede:pagebreak/}生成)的前后,添加以下PHP和HTML代码:
{dede:field.body/}
<!-- 以下是分页副标题的显示逻辑 -->
<?php
// 获取当前页码,从URL中获取,默认为1
$page = isset($_GET['pageno']) ? intval($_GET['pageno']) : 1;
// 如果当前页码大于1,则显示副标题
if ($page > 1) {
// 从附加表中获取副标题
// 注意:这里需要根据你的实际字段名和表结构调整
$row = $dsql->GetOne("SELECT pagesubtitle FROM `#@__addonarticle` WHERE aid = '{$aid}'");
if (is_array($row) && !empty($row['pagesubtitle'])) {
echo '<h2 class="page-subtitle">' . htmlspecialchars($row['pagesubtitle']) . '</h2>';
}
}
?>
<!-- 分页代码 -->
<div class="page">
{dede:pagebreak/}
</div>
代码解释:
$page = isset($_GET['pageno']) ? intval($_GET['pageno']) : 1;:获取当前页码。if ($page > 1):判断如果不是第一页。$dsql->GetOne(...):查询当前文章($aid是文章ID)在附加表中的副标题。echo '<h2>...</h2>':如果副标题存在,则用<h2>标签(或其他你喜欢的标签)显示出来。
- 在你的CSS文件中,可以添加样式来美化副标题:
.page-subtitle { font-size: 24px; color: #333; font-weight: normal; text-align: center; margin: 30px 0; border-bottom: 1px solid #eee; padding-bottom: 10px; }
利用“字段(最简单,但不推荐)
如果你的需求不复杂,且“字段足够用,这是一个“零修改”的快速方案。
- 后台操作:在发布文章时,直接在“字段输入你想要作为分页副标题的内容。
- 模板修改:修改
article_article.htm模板,将第4步中的代码替换为:<?php $page = isset($_GET['pageno']) ? intval($_GET['pageno']) : 1; if ($page > 1) { // 直接使用 {dede:field.description/} 标签的值 // 需要先获取它,因为模板引擎在PHP执行后才解析 $description = trim(@me); if (!empty($description)) { echo '<h2 class="page-subtitle">' . htmlspecialchars($description) . '</h2>'; } } ?>- 缺点:这会占用“字段,摘要和副标题的用途混在一起,不够清晰,如果摘要为空,副标题也无法显示。
直接修改文章内容(最灵活,但破坏性最强)
这种方法不修改数据库,而是通过特殊的HTML标签来标记副标题。
-
后台操作:在编辑文章内容时,在需要作为副标题的段落前后,加上自定义的HTML标签,
这是第一页的内容... <div class="my-page-subtitle">这是第二页的副标题</div> 这是第二页的正文内容... <div class="my-page-subtitle">这是第三页的副标题</div> 这是第三页的正文内容...
-
模板修改:修改
article_article.htm模板,在{dede:field.body/}标签内增加PHP代码来处理这些标签:{dede:field.body/} <?php // 使用正则表达式查找并替换自定义的副标题标签 $body = @me; $pattern = '/<div\s+class="my-page-subtitle">(.*?)<\/div>/is'; $replacement = '<h2 class="page-subtitle">$1</h2>'; // 注意:这个替换会在整个文章内容里生效,可能会影响布局 // 更精确的做法是结合分页逻辑,这里仅为示例 echo preg_replace($pattern, $replacement, $body); ?>- 缺点:直接修改文章内容,对内容格式有侵入性,如果用户在后台切换编辑器,这些标签可能会被过滤掉,逻辑也相对复杂,需要精确匹配分页位置。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 方法一(修改附加表) | 结构清晰、稳定安全、符合规范、SEO友好 | 需要修改数据库和多个文件,步骤稍多 | ★★★★★ (最推荐) |
| 方法二(利用摘要) | 简单快捷,无需修改任何文件 | 功能混杂,用途不清晰,不够灵活 | ★★☆☆☆ (应急用) |
| 方法三(修改内容) | 非常灵活,无需改库 | 结构,对编辑器不友好,维护困难 | ★☆☆☆☆ (不推荐) |
对于绝大多数用户,强烈推荐使用方法一,虽然前期需要多花一些时间进行设置,但一旦完成,系统将非常稳定,且功能完全独立,不会对现有功能造成任何影响。
在操作前,请务必备份你的网站文件和数据库,以防万一。
