核心概念
- 专题: 一个独立的、由多个文章聚合而成的页面,它有自己的模板(
special_arclist.htm)。 - 专题节点: 在专题内部,你可以创建不同的“栏目”或“分类”,这些就是节点,每个节点可以关联不同的文章列表。
- 节点分页: 当一个节点下的文章数量很多,需要分页显示时,就涉及到节点分页的实现,DedeCMS 通过
{dede:arclist}标签的pagesize和listitem属性来控制分页。
推荐方法(使用 GetArcList 标签,更灵活)
这是目前最推荐、最稳定的方法,它不依赖于系统自带的分页标签,而是直接调用底层函数,能更好地获取当前节点的 ID 和分页信息。

步骤 1:修改专题节点列表模板文件
-
找到你的专题模板文件,通常位于
/templets/default/special_arclist.htm,如果你使用了自定义模板,请找到对应的文件。 -
在需要显示文章列表的地方,删除或注释掉默认的
{dede:arclist}标签,它看起来可能像这样:{dede:arclist titlelen='42' row='10'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} -
用下面的代码替换它:
<!-- 专题节点文章列表开始 --> {dede:field name='node' runphp='yes'} // 获取当前节点的ID $nodeid = @me; if(empty($nodeid)) { // 如果没有指定节点ID,则获取专题ID,并作为节点ID使用 $nodeid = $_GET['id']; } // 调用GetArcList函数,参数分别为: channelid, nodeid, row, orderby // channelid 通常为8,代表专题模型,但最好通过配置获取 // row 每页显示条数 // orderby 排序方式 @me = GetArcList(8, $nodeid, 10, 'pubdate'); {/dede:field} <!-- 循环输出文章 --> {dede:arclist row='10' titlelen='42'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} <!-- 分页链接 --> <div class="page"> {dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'} {/dede:pagelist} </div> <!-- 专题节点文章列表结束 -->
代码解释:
-
{dede:field name='node' runphp='yes'}...{/dede:field}:
(图片来源网络,侵删)name='node': 获取当前专题节点的 ID。runphp='yes': 允许在标签内执行 PHP 代码。GetArcList(8, $nodeid, 10, 'pubdate'): 这是核心函数。8: 专题模型的 ID,如果你的专题模型不是 8,请登录后台 -> 核心 -> 频道管理 -> 找到你的专题模型,查看其 ID 并替换。$nodeid: 当前节点的 ID。10: 每页显示 10 篇文章。'pubdate': 按发布时间降序排列,你也可以使用'click'(点击量) 或其他排序字段。
-
{dede:arclist row='10' titlelen='42'}:- 这个标签现在被
GetArcList函数“喂饱”了数据,它会直接输出当前节点、当前页的文章列表。row属性在这里会被GetArcList的参数覆盖,所以可以写也可以不写。
- 这个标签现在被
-
{dede:pagelist ...}:- 这个标签负责生成分页链接,它会自动读取
GetArcList生成的分页信息,并正确显示上一页、下一页、页码等。
- 这个标签负责生成分页链接,它会自动读取
步骤 2:确保专题链接正确
在专题首页或栏目页,访问节点时,URL 必须包含 nodeid 参数。
/special/index.php?id=123&node=456
id=123: 专题 IDnode=456: 节点 ID
如果你的专题链接没有 node 参数,分页将无法工作,因为系统不知道你要对哪个节点进行分页。

兼容旧版/简化方法(直接使用 arclist)
如果你的系统比较简单,或者不想修改 PHP 代码,可以尝试这个方法,它依赖于 {dede:arclist} 标签自身的分页能力。
步骤 1:修改专题节点列表模板
同样,找到并编辑 special_arclist.htm 文件,使用以下代码:
<!-- 专题节点文章列表开始 -->
{dede:arclist nodeid='[field:nodeid/]' row='10' titlelen='42' pagesize='10' orderby='pubdate'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 分页链接 -->
<div class="page">
{dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'}
{/dede:pagelist}
</div>
<!-- 专题节点文章列表结束 -->
代码解释:
-
{dede:arclist ...}:nodeid='[field:nodeid/]': 关键! 这个属性告诉arclist标签只获取当前节点的文章。[field:nodeid/]会自动解析为当前节点的 ID。row='10': 每页显示 10 条记录。pagesize='10': 关键! 设置分页每页的大小,这个参数和row配合使用,确保分页逻辑正确。orderby='pubdate': 排序方式。
-
{dede:pagelist ...}:与方法一中的用法相同,用于生成分页导航。
注意事项:
- 此方法在某些 DedeCMS 版本中可能存在兼容性问题,特别是当专题结构比较复杂时。
- 确保
nodeid参数在 URL 中存在(?node=xxx)。
手动实现分页(终极方案,100%可控)
如果以上方法都无效,或者你需要完全自定义分页的样式和逻辑,可以手动实现。
步骤 1:修改专题节点列表模板
<!-- 专题节点文章列表开始 -->
{dede:sql sql="SELECT arc.id, arc.title, arc.pubdate FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = ~id~ AND sa.nodeid = ~nodeid~ ORDER BY arc.pubdate DESC LIMIT ~start~, ~pagesize~"}
<li><a href="[field:arcurl function='MakeArcUrl(@me)'/]">[field:title/]</a></li>
{/dede:sql}
<!-- 手动生成分页链接 -->
<div class="page">
<!-- 上一页 -->
<a href='special.php?id=[field:id/]&node=[field:nodeid/]&page=[field:prepage/]'>上一页</a>
<!-- 页码循环 -->
{dede:pagelist listsize='5' listitem='pageno'}
{/dede:pagelist}
<!-- 下一页 -->
<a href='special.php?id=[field:id/]&node=[field:nodeid/]&page=[field:nextpage/]'>下一页</a>
</div>
<!-- 专题节点文章列表结束 -->
步骤 2:在 special_arclist.php 中处理分页逻辑
这个方法最复杂,需要修改 PHP 文件。
-
打开
/special/special_arclist.php文件。 -
找到处理列表数据的部分,通常是一个
while循环。 -
在循环之前,添加分页参数的计算逻辑:
// ... 在 special_arclist.php 中 ... // 获取当前页码 $page = isset($_GET['page']) && is_numeric($_GET['page']) ? intval($_GET['page']) : 1; // 每页显示条数 $pagesize = 10; // 计算总记录数 $count_query = "SELECT COUNT(*) as c FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = $id AND sa.nodeid = $nodeid"; $count_arr = $dsql->GetOne($count_query); $totalcount = $count_arr['c']; // 计算总页数 $totalpage = ceil($totalcount / $pagesize); // 计算偏移量 $start = ($page - 1) * $pagesize; // 修改原来的 SQL 查询,添加 LIMIT 子句 // 假设原来的查询是 $query $query = "SELECT arc.id, arc.title, arc.pubdate FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = $id AND sa.nodeid = $nodeid ORDER BY arc.pubdate DESC LIMIT $start, $pagesize"; // ... 然后执行这个查询并循环输出 ...
-
将计算出的
$page,$pagesize,$totalpage,$start等变量传递给模板。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 方法一 (GetArcList) | 最规范、最稳定,官方推荐方式,代码清晰,不易出错。 | 需要少量 PHP 代码。 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 方法二 (arclist) | 简单,纯模板实现,无需 PHP 代码。 | 可能在某些版本有兼容性问题,依赖性强。 | ⭐⭐⭐ |
| 方法三 (手动分页) | 100% 自定义,分页逻辑和样式完全可控。 | 最复杂,需要修改 PHP 文件,容易出错。 | ⭐⭐ (仅当有特殊需求时使用) |
对于绝大多数用户,我强烈建议你使用方法一,它解决了 DedeCMS 专题分页的核心问题,并且是社区公认的、最可靠的解决方案。
如果你在使用方法一时遇到问题,请检查:
- 你的专题模型 ID 是否正确。
- 你的专题链接是否包含了
node参数。 - 你的模板文件路径是否正确。
