这是一个非常经典且实用的需求,因为 arclist 标签本身不直接支持自动分页,官方提供的 list 标签(用于列表页)是自带分页功能的,但 arclist 通常用于首页、栏目页等调用少量内容,如果要用它来展示一个需要分页的列表,就需要一些技巧。

核心思路
实现 arclist 分页的核心思路是:
- 手动编写分页SQL:不使用
arclist标签自带的limit属性,而是通过一个独立的自定义SQL查询来获取当前页的数据。 - 手动获取总记录数:再写一个SQL查询(或使用
GetTotalArc()函数)来获取满足条件的文章总数,这是生成分页导航的基础。 - 手动生成分页导航:使用DedeCMS内置的
分页函数(``)来生成上一页、下一页、页码等链接。 - 结合使用:将分页数据列表和分页导航组合在一起,形成一个完整的分页效果。
详细步骤实现
假设我们要在首页调用一个特定的“产品”栏目(ID=3)下的文章,并实现每页5条记录的分页效果。
第1步:准备模板文件
在你的首页模板文件 index.htm 中,找到你想要放置分页列表的位置,我们将使用 {dede:arclist} 的兄弟标签 {dede:sql} 和 {dede:pagelist} 来完成。
第2步:编写获取分页数据的SQL
这部分代码负责查询当前页应该显示的文章内容。

<!-- 获取分页数据列表 -->
{dede:sql sql="
SELECT
id,
typeid,
arcrank,
click,
title,
litpic,
pubdate,
description
FROM `dede_archives`
WHERE
typeid IN (3)
AND arcrank = 0
ORDER BY
id DESC
LIMIT [page], 5
"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:sql}
代码解释:
SELECT ... FROM dede_archives:指定查询的字段和主表。dede_archives是DedeCMS存储文章基本信息的表。WHERE typeid IN (3) AND arcrank = 0:这是你的查询条件。typeid IN (3):只调用栏目ID为3的文章,如果你要调用多个栏目,可以写成typeid IN (3, 4, 5)。arcrank = 0:只显示已审核通过的文章,可以去掉这个条件以包含所有状态的文章。
ORDER BY id DESC:按文章ID降序排列,即最新的在最前面。LIMIT [page], 5:这是分页的关键。5是每页显示的条数。[page]是一个占位符,它本身没有值,我们需要在PHP代码中计算出当前页的起始位置,然后替换掉这个[page]。
第3步:获取总记录数并生成分页导航
这部分代码负责计算总页数,并生成页码链接。
<!-- 获取总记录数 -->
{dede:sql sql="SELECT COUNT(*) AS `total` FROM `dede_archives` WHERE typeid IN (3) AND arcrank = 0"}
{dede:getvar name='total' /}
{/dede:sql}
<!-- 生成分页导航 -->
<div class="dede_pages">
<ul>
{dede:pagelist listsize="4" listitem="info,index,end,pre,next,pageno"}
<li><a href='{dede:field name='phpurl'/}/plus/list.php?tid=[field:tid/]' class='thisclass'>[field:page/]</a></li>
{/dede:pagelist}
</ul>
</div>
代码解释:
- 第一个
{dede:sql}:COUNT(*)用于计算满足条件的总记录数,我们将结果通过{dede:getvar}标签存入一个名为total的变量中。 - 第二个
{dede:pagelist}:这是DedeCMS的分页标签,但它需要一个totalresult参数(总记录数)和listsize等参数才能工作。问题在于,{dede:pagelist}无法直接获取到上面total变量的值。
我们需要一个更灵活的方法,通常是结合PHP代码来实现。

推荐方案:结合PHP代码实现(最稳定)
这是最常用且最可靠的方法,它将上述步骤整合到一个PHP代码块中,解决了变量传递的问题。
在你的模板文件中,使用 代码解释: 对于绝大多数开发者来说,使用 {dede:php}
<!-- 使用PHP代码实现arclist分页 -->
{dede:php}
// 1. 定义变量
$typeid = 3; // 要调用的栏目ID
$pagesize = 5; // 每页显示条数
// 2. 获取当前页码
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? intval($_GET['page']) : 1;
$start = ($page - 1) * $pagesize;
// 3. 获取总记录数
$count_query = "SELECT COUNT(*) AS total FROM `dede_archives` WHERE typeid = $typeid AND arcrank = 0";
$row = $dsql->GetOne($count_query);
$totalcount = $row['total'];
// 4. 获取分页数据
$sql = "SELECT id, typeid, arcrank, click, title, litpic, pubdate, description
FROM `dede_archives`
WHERE typeid = $typeid AND arcrank = 0
ORDER BY id DESC
LIMIT $start, $pagesize";
$dlist = new DedeTagParse();
$dlist->SetNameSpace('field', '[', ']');
$dlist->LoadSource($sql);
if(is_array($dlist->CTags)){
foreach($dlist->CTags as $k=>$ctag){
$ids[] = $ctag->Get('id');
}
}
// 5. 使用arcID列表获取完整文章信息(包含标题、URL等)
$arcids = join(',', $ids);
$innertext = "
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
<span>[field:pubdate function=\"MyDate('Y-m-d',@mydate)\"]</span>
</li>
";
$artlist = '';
if($arcids != ''){
$artlist = GetImgs($arcids, $innertext, 0, 0);
}
// 6. 输出文章列表
echo $artlist;
// 7. 生成分页导航
$totalpage = ceil($totalcount / $pagesize);
// 分页导航样式
$page_list = '';
// 上一页
if($page > 1){
$page_list .= "<a href='?page=".($page-1)."'>上一页</a> ";
}
// 页码
for($i=1; $i<=$totalpage; $i++){
if($i == $page){
$page_list .= "<span class='this'>".$i."</span> ";
} else {
$page_list .= "<a href='?page=".$i."'>".$i."</a> ";
}
}
// 下一页
if($page < $totalpage){
$page_list .= "<a href='?page=".($page+1)."'>下一页</a> ";
}
// 输出分页
echo "<div class='dede_pages'>".$page_list."</div>";
{/dede:php}
page 参数,如果不存在则默认为第1页。$dsql 对象直接查询数据库,得到总数 $totalcount。$start 和 $pagesize 查询当前页的数据ID列表。GetImgs 函数(或更通用的 GetArcList)可以根据ID列表,获取包含完整字段(如 arcurl, title 等)的文章列表。$innertext 定义了每条记录的HTML模板。注意事项
?page=1 这种简单的格式,如果你的网站有伪静态规则,需要修改链接格式以匹配规则,<a href='/products/index_[field:page/].html'>。{dede:php}:此标签在DedeCMS中默认是关闭的,因为它存在一定的安全风险,你需要确保你的网站环境安全,或者联系管理员开启它,开启方法通常在后台的“系统” -> “系统基本参数” -> “核心设置”中找到“启用PHP代码”选项并设置为“是”。GetImgs 函数:这个函数主要用于获取文章中的图片,但它也可以用来根据ID列表获取文章,如果你发现 GetImgs 不满足需求(比如它获取的字段不全),可以改用 GetArcList 函数,或者直接在PHP中循环处理ID列表,为每个ID再次查询数据库获取完整信息。
方法
优点
缺点
适用场景
纯模板SQL
模板与逻辑分离,相对干净。
无法获取总数,无法生成分页导航,需要配合PHP。
简单列表,不需要分页时。
推荐PHP方法
功能完整、灵活、可控性强,是解决此问题的标准方案。
需要开启
{dede:php},代码稍复杂,对PHP有一定要求。绝大多数需要
arclist 分页的场景。{dede:php} 标签结合自定义SQL和分页逻辑是最佳实践,它虽然比直接使用 {dede:list} 复杂一些,但完美地解决了 arclist 无法分页的痛点。
