使用 {dede:arclist} 标签(最常用、最灵活)
{dede:arclist} 是DedeCMS最核心、最强大的列表标签,几乎可以用来调用任何内容,在网站地图中使用它,可以完全控制文章的显示顺序、数量和格式。

(图片来源网络,侵删)
基础用法
这是最简单的调用,会按发布时间倒序输出所有文章的标题和链接。
{dede:arclist orderby='pubdate' titlelen='50'}
<a href="[field:arcurl/]">[field:title/]</a>
<br>
{/dede:arclist}
标签解析:
{dede:arclist ...}: 调用文章列表的开始标签。orderby='pubdate': 按发布时间排序,对于网站地图,这通常是最佳选择,因为最新的文章应该排在前面,你也可以使用id(按文章ID)、click(按点击量)等,len='50'`: 标题长度,截取50个字符,防止标题过长影响排版。[field:arcurl/]: 文章的完整链接地址。[field:title/]: 文章的标题。<br>: 换行标签,用于让每个链接显示在一行。
完整的网站地图示例
一个标准的网站地图通常会按栏目分类显示,我们可以通过嵌套 {dede:channel} 和 {dede:arclist} 来实现。
步骤:

(图片来源网络,侵删)
- 在DedeCMS后台,创建一个新页面,例如命名为
sitemap.html。 - 中,填入以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">网站地图 - {dede:global.cfg_webname/}</title>
</head>
<body>
<h1>网站地图 - {dede:global.cfg_webname/}</h1>
<p>欢迎来到本站网站地图,您可以通过以下链接快速找到您感兴趣的内容。</p>
<!-- {dede:channel} 用于获取所有顶级栏目 -->
{dede:channel type='top' row='100'}
<h2><a href="[field:typelink/]">[field:typename/]</a></h2>
<ul>
<!-- {dede:arclist} 用于调用当前栏目下的文章 -->
{dede:arclist typeid='[field:id]' row='100' orderby='pubdate' titlelen='50'}
<li><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
{/dede:channel}
<hr>
<p>本站最后更新时间:{dede:tagname runphp='yes'}@me = date('Y-m-d H:i:s');{/dede:tagname}</p>
</body>
</html>
代码解析:
{dede:channel type='top' row='100'}:type='top': 只调用顶级栏目,如果你的网站有二级栏目,并且希望在一级栏目下显示其所有子栏目的文章,可以去掉这个属性或改为type='son'。row='100': 调用100个栏目,基本足够。
[field:typelink/]和[field:typename/]: 分别是栏目的链接和名称。typeid='[field:id]': 这是 关键!它告诉{dede:arclist}只调用当前{dede:channel}循环到的这个栏目([field:id])下的文章,从而实现了栏目和文章的分类对应。row='100': 每个栏目下调用100篇文章,可以根据需要修改。<ul>和<li>: 使用无序列表让文章链接更整洁。- 最后的更新时间:使用了一个简单的PHP标签来动态显示当前时间。
使用 {dede:list} 标签(适用于单栏目)
如果你的网站地图页面只显示 某一个特定栏目 下的文章("新闻中心"),那么使用 {dede:list} 会更简单。
{dede:list} 通常用于列表页,它会自动获取当前栏目ID下的文章。
基础用法
假设你的 "新闻中心" 栏目ID是 1。

(图片来源网络,侵删)
{dede:list pagesize='100' orderby='pubdate'}
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span class="arctime">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
<br>
{/dede:list}
标签解析:
{dede:list ...}: 调用当前栏目下的文章列表。pagesize='100': 每页显示100条文章,因为sitemap不需要分页,所以设置一个足够大的数字。orderby='pubdate': 同样,按发布时间排序。[field:pubdate function="MyDate('Y-m-d', @me)"/]: 调用发布时间,并使用function将其格式化为 "年-月-日"。
在模板中的应用
- 创建一个页面,
news_sitemap.html。 - 在后台新建一个栏目,比如叫 "新闻地图",设置其内容模板为
news_sitemap.html。 - 将这个栏目移动到你希望展示的栏目(如"新闻中心")下,成为其子栏目。
- 访问这个 "新闻地图" 栏目的页面,它就会自动显示其父栏目(或同级栏目,取决于设置)下的文章列表。
使用SQL直接查询(高级用法,性能最优)
如果你的网站文章数量非常庞大(几十万甚至上百万),使用 {dede:arclist} 可能会因为解析标签和查询次数过多而导致页面生成缓慢,这时,直接使用SQL查询并输出是最高效的方式。
注意: 此方法需要对PHP和SQL有一定了解,并且修改模板文件。
示例代码
<?php
$dsql = new DedeSql(false);
// 设置你想要查询的栏目ID,多个ID用逗号隔开,如 "1,2,3",如果想查询所有栏目,可以去掉这个条件或设置为 ''。
$typeid = "1";
// 构建SQL查询语句
$sql = "SELECT id, title, arcurl, pubdate FROM `dede_archives` WHERE arctypeid IN ($typeid) AND ismake = 1 ORDER BY pubdate DESC LIMIT 0, 500";
$dsql->SetQuery($sql);
$dsql->Execute('list');
echo "<ul>";
while($row = $dsql->GetArray('list'))
{
// 格式化日期
$pubdate = date('Y-m-d', $row['pubdate']);
// 输出链接
echo "<li><a href='{$row['arcurl']}' title='{$row['title']}'>{$row['title']}</a> ({$pubdate})</li>";
}
echo "</ul>";
$dsql->Close();
?>
代码解析:
new DedeSql(false): 初始化一个数据库连接对象。SELECT id, title, arcurl, pubdate FROM dede_archives: 从文章数据表dede_archives中查询我们需要的字段。WHERE arctypeid IN ($typeid): 限定只查询指定栏目ID下的文章。AND ismake = 1: 只查询已生成静态页面的文章。ORDER BY pubdate DESC LIMIT 0, 500: 按发布时间倒序,并只取最新的500条。while($row = $dsql->GetArray('list')): 循环输出查询结果。echo "...": 直接使用PHP的echo输出HTML结构。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:arclist} |
灵活、强大、官方推荐、易于理解和维护 | 在文章量极大时,生成速度可能稍慢 | 绝大多数网站地图需求,特别是需要按多栏目分类展示时。 |
{dede:list} |
简单、直接,无需指定typeid | 只能用于单一栏目或固定栏目 | 网站结构简单,只需要展示某一个特定栏目下的文章列表。 |
| SQL查询 | 性能最高,不受标签解析影响 | 需要PHP/SQL知识,代码不够“模板化”,不易维护 | 超大型网站(文章量10万+),对页面生成速度有极致要求。 |
给你的建议:
对于99%的DedeCMS网站,直接使用 {dede:arclist} 的完整示例 就完全足够了,它既实现了按栏目分类的清晰结构,又保持了代码的可读性和可维护性,是最佳实践。
