DedeCMS 的网站地图功能主要通过 “频道模型” -> “自定义表单” 来实现,这是一种非常灵活和强大的方式。

下面我将分为两个部分来讲解:
- 通用型网站地图模板:适合大多数网站,包含栏目、文章、单页等链接。
- 提交给搜索引擎的 XML Sitemap 模板:专门用于 Google、百度、Bing 等搜索引擎提交。
第一部分:通用型网站地图模板 (HTML)
这种地图通常是 .html 格式,方便访客浏览,也有利于 SEO。
步骤 1:创建自定义表单
这是最关键的一步,我们需要通过自定义表单来获取全站的链接数据。
- 登录 DedeCMS 后台,点击顶部菜单 “频道模型” -> “自定义表单”。
- 在自定义表单管理页面,点击 “增加一个自定义表单”。
- 填写表单信息:
- 表单名称:填写
网站地图或sitemap,方便识别。 - 数据表:系统会自动生成,如
dede_sgmap,无需修改。 - 列表目录:填写
sitemap,这样生成的文件会存放在/sitemap/目录下。 - 默认排序:填写
id。 - 列表模板:留空,因为我们后面会手动创建模板文件。
- 发布项:先不管,点击“提交”。
- 表单名称:填写
- 提交后,进入这个新创建的“网站地图”自定义表单管理页面。
- 点击 “字段管理” -> “增加字段”,我们需要添加两个字段:
- 字段名称:
mapurl- :
地图链接 - 数据类型:
单行文本 - 其他选项保持默认,点击“保存”。
- :
- 字段名称:
mapname- :
地图名称 - 数据类型:
单行文本 - 其他选项保持默认,点击“保存”。
- :
- 字段名称:
你的自定义表单结构就搭建好了。

步骤 2:创建数据录入模板
这个模板用于手动或通过程序将链接数据添加到我们刚创建的自定义表单中。
- 在你的网站模板目录(通常是
/templets/default/)下新建一个文件,命名为sitemap_add.htm。 - 将以下代码复制到
sitemap_add.htm文件中:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">网站地图数据录入</title>
</head>
<body>
<h2>网站地图数据录入</h2>
<form action="/plus/diy.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="action" value="post" />
<input type="hidden" name="diyid" value="{dede:global.diyid/}" />
<input type="hidden" name="do" value="2" />
<p>地图名称:<input type="text" name="mapname" id="mapname" class="intxt" style="width:250px" /></p>
<p>地图链接:<input type="text" name="mapurl" id="mapurl" class="intxt" style="width:400px" /></p>
{dede:php}
// 此处添加验证码,防止恶意提交
if($cfg_mb_enews == 'Y')
{
{
/dede:php}
<p><input type="submit" name="submit" value="提交" class="coolbg" /></p>
{dede:php}
}
/dede:php}
</form>
</body>
</html>
- 访问这个模板页面:
你的域名/sitemap_add.htm,你就可以通过这个页面手动添加网站的链接和名称了,但手动添加效率太低,所以我们需要一个自动化的方法。
步骤 3:自动化生成数据(推荐)
手动添加不现实,我们可以写一个简单的 PHP 脚本来批量获取数据并提交到自定义表单中。
- 在网站根目录创建一个新文件,
make_sitemap.php。 - 将以下代码复制进去,并根据你的网站情况进行修改:
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
// 获取所有顶级栏目
$sql = "SELECT * FROM `#@__arctype` WHERE reid=0 AND ishidden<>1 ORDER BY sortrank";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row = $dsql->GetArray())
{
// 提交栏目链接
PostData($row['typename'], $row['typedir']);
}
// 获取所有文章
$sql = "SELECT * FROM `#@__archives` a LEFT JOIN `#@__arctype` t ON a.typeid=t.id WHERE t.ishidden<>1 ORDER BY a.id DESC";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row = $dsql->GetArray())
{
$arcUrl = GetOneArchive($row['id']);
// 提交文章链接
PostData($row['title'], $arcUrl['arcurl']);
}
// 获取所有单页
$sql = "SELECT * FROM `#@__arctype` WHERE ishidden<>1 AND ispart<>1 AND reid>0 ORDER BY sortrank";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row = $dsql->GetArray())
{
$arcUrl = GetOneArchive($row['id']);
// 提交单页链接
PostData($row['typename'], $arcUrl['arcurl']);
}
// 提交数据的函数
function PostData($name, $url)
{
$dsql = new DedeSql(false);
$sql = "INSERT INTO `#@_sgmap` (`mapname`, `mapurl`) VALUES ('$name', '$url');";
$dsql->ExecuteNoneQuery($sql);
echo "已添加: $name - $url <br>";
}
echo "网站地图数据生成完成!";
?>
- 重要提示:在运行此脚本前,请务必备份你的数据库!
- 通过浏览器访问
你的域名/make_sitemap.php,脚本会自动执行,并将所有栏目、文章和单页的链接存入数据库。
步骤 4:创建网站地图列表模板
这个模板决定了最终生成的 HTML 网站地图页面是什么样子。
- 在
/templets/default/目录下新建一个文件,命名为sitemap_list.htm。 - 将以下代码复制进去,你可以根据自己的网站风格进行美化:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global.cfg_webname/} - 网站地图</title>
<meta name="description" content="{dede:global.cfg_description/}" />
<meta name="keywords" content="{dede:global.cfg_keywords/}" />
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; background-color: #f4f4f4; }
.container { max-width: 800px; margin: 0 auto; background: #fff; padding: 20px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
h1 { text-align: center; color: #333; }
.map-section { margin-bottom: 20px; }
.map-section h2 { border-bottom: 1px solid #eee; padding-bottom: 10px; color: #555; }
.map-section ul { list-style-type: none; padding-left: 20px; }
.map-section li { margin-bottom: 8px; }
.map-section a { color: #0066cc; text-decoration: none; }
.map-section a:hover { text-decoration: underline; }
</style>
</head>
<body>
<div class="container">
<h1>{dede:global.cfg_webname/} - 网站地图</h1>
{dede:php}
$this->dsql->SetQuery("SELECT * FROM `#@__sgmap` ORDER BY id ASC");
$this->dsql->Execute();
$current_letter = '';
while($row = $this->dsql->GetArray())
{
// 按首字母分组
$first_letter = mb_substr($row['mapname'], 0, 1, 'utf-8');
if ($first_letter != $current_letter) {
$current_letter = $first_letter;
echo '<div class="map-section"><h2>' . $current_letter . '</h2><ul>';
}
echo '<li><a href="' . $row['mapurl'] . '" target="_blank">' . $row['mapname'] . '</a></li>';
// 检查下一条记录的首字母是否不同,如果是则关闭ul
$next_row = $this->dsql->GetArray();
if ($next_row && mb_substr($next_row['mapname'], 0, 1, 'utf-8') != $current_letter) {
echo '</ul></div>';
}
// 如果是最后一条,关闭ul
if (!$next_row) {
echo '</ul></div>';
}
$this->dsql->MovePrev(); // 回退,因为GetArray已经移动了指针
}
/dede:php}
</div>
</body>
</html>
步骤 5:生成网站地图页面
- 回到 DedeCMS 后台,点击 “频道模型” -> “自定义表单”,找到你创建的“网站地图”。
- 点击 “生成HTML”。
- 在弹出的页面中,选择你刚刚创建的模板
sitemap_list.htm。 - 点击“生成”,系统就会在
/sitemap/目录下生成一个sitemap_index.html(或类似名称)的文件。 - 访问
你的域名/sitemap/sitemap_index.html,你就能看到完整的网站地图了。
第二部分:提交给搜索引擎的 XML Sitemap
XML Sitemap 是一种机器可读的格式,专门为搜索引擎设计。
步骤 1:创建 XML 模板
- 在
/templets/default/目录下新建一个文件,命名为sitemap.xml。 - 将以下代码复制进去:
{dede:global name='cfg_phpurl'/}/sitemap.php
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<!-- 网站首页 -->
<url>
<loc>http://你的域名/</loc>
<lastmod>{dede:func str_replace('-','',@me)}{dede:field name='pubdate' function='strftime("%Y%m%d",@me)'/}{/dede:func}</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<!-- 栏目页 -->
{dede:channel type='top' row='100'}
<url>
<loc>[field:typelink/]</loc>
<lastmod>{dede:func str_replace('-','',@me)}{dede:field name='senddate' function='strftime("%Y%m%d",@me)'/}{/dede:func}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
{/dede:channel}
<!-- 文章页 -->
{dede:arclist row='5000' orderby='pubdate'}
<url>
<loc>[field:arcurl/]</loc>
<lastmod>{dede:func str_replace('-','',@me)}{dede:field name='pubdate' function='strftime("%Y%m%d",@me)'/}{/dede:func}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
{/dede:arclist}
<!-- 单页 -->
{dede:sql sql="Select * from `#@__arctype` where ispart<>1 and reid>0"}
<url>
<loc>[field:typedir function='str_replace("{cmspath}","",@me)'/]</loc>
<lastmod>{dede:func str_replace('-','',@me)}{dede:field name='senddate' function='strftime("%Y%m%d",@me)'/}{/dede:func}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
{/dede:sql}
</urlset>
注意:将 http://你的域名/ 替换成你自己的网站域名。
步骤 2:创建生成脚本
为了方便更新,我们创建一个 PHP 脚本来生成这个 XML 文件。
- 在网站根目录创建一个文件,命名为
sitemap.php。 - 将以下代码复制进去:
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 设置 header 为 XML 格式
header("Content-type: text/xml");
// 调用并输出 XML 模板
$p = new PartView();
$p->SetTemplet($cfg_basedir . $cfg_templets_dir . "/default/sitemap.xml");
$p->Display();
?>
步骤 3:生成和访问
- 每次网站有更新后,访问
你的域名/sitemap.php。 - 浏览器会直接下载或显示一个 XML 文件,这就是你的 XML Sitemap。
- 将这个文件的地址(
http://你的域名/sitemap.php)提交到 Google Search Console、百度搜索资源平台等搜索引擎的站长工具中。
- HTML 网站地图:通过 自定义表单 实现,灵活性高,适合访客浏览。
- XML 网站地图:通过 模板+脚本 实现,结构简单,专为搜索引擎设计。
对于大多数网站,建议同时制作这两种地图,HTML 地图放在网站底部供用户使用,XML 地图提交给搜索引擎以提升收录效率,你可以将 sitemap.php 的更新设置为每天通过计划任务自动执行,保持地图的最新状态。
