- 理解织梦DedeCMS网址导航的工作原理
- 创建和调用自定义模型(这是关键)
- 制作全新的前端模板
第一步:理解织梦DedeCMS网址导航的工作原理
默认的织梦网址导航功能比较简单,它依赖于一个核心文件:/plus/digg.php,这个文件会读取系统后台设置的一些导航链接,并套用一个固定的模板文件 plus/digg.htm。

这种方式的缺点很明显:
- 内容管理不灵活:链接只能在后台“基本参数”->“其他选项”里设置,数量有限,无法分类。
- 模板限制:只能修改
plus/digg.htm,无法像调用文章、栏目那样,使用自由定义的模板。
二次开发的核心思路是:抛弃原有的 /plus/digg.php 和 plus/digg.htm,改用织梦最强大的“自定义模型”功能来创建一个真正的“网址导航”系统。 这样我们就可以像管理文章一样管理网址,拥有无限分类、自定义字段和完全自由的模板。
第二步:创建和调用自定义模型(核心步骤)
这是整个二次开发最关键的一步,我们将创建一个新的数据模型,专门用来存放网址信息。
进入后台,创建自定义模型
- 登录织梦DedeCMS后台。
- 在左侧菜单栏找到 【核心】 -> 模型管理】。
- 点击右上角的 【增加一个新模型】。
- 填写模型信息:
- 模型名称:填写
网址导航(或你喜欢的名字)。 - 模型表前缀:系统会自动生成,如
dede_addonnav,无需修改。 - 模型介绍:填写
用于管理各类网址链接,支持分类和自定义字段。 - 是否支持栏目:勾选,这是为了可以给网址分类。
- 是否支持发布:勾选,这样才能在后台添加内容。
- 模型名称:填写
- 点击 【保存】,模型创建成功。
为新模型添加自定义字段
我们需要定义一个网址应该包含哪些信息,点击刚创建的模型名称“网址导航”,进入字段管理。

-
必须添加的字段:
url(链接地址):- 字段名:
url - 字段类型:
单行文本 - 字段说明:
网址链接 - 高级选项 ->
是否为必填项:是
- 字段名:
logo(网站图标):- 字段名:
logo - 字段类型:
媒体图片 - 字段说明:
网站Logo - 高级选项 ->
是否为必填项:否
- 字段名:
description(网站描述):- 字段名:
description - 字段类型:
多行文本(文本域) - 字段说明:
网站简介 - 高级选项 ->
是否为必填项:否
- 字段名:
-
可选添加的字段:
click(点击次数):- 字段名:
click - 字段类型:
数字 - 字段说明:
点击次数 - 高级选项 ->
是否为必填项:否,并设置为默认值0,用于统计点击。
- 字段名:
adddate(添加时间):- 字段名:
adddate - 字段类型:
日期时间 - 字段说明:
收录时间 - 高级选项 ->
是否为必填项:否,系统会自动填充当前时间。
- 字段名:
添加完所有需要的字段后,点击 【保存】。
创建栏目用于分类
- 在后台左侧菜单找到 【核心】 -> 【栏目管理】。
- 点击 【增加一个顶级栏目】。
- 填写栏目信息:
- 栏目名称:
网址导航(作为总栏目)。 - 栏目类型:选择
外部链接或内部栏目(如果希望导航页有自己的独立URL,选内部栏目)。 - 模型:选择我们刚刚创建的
网址导航模型! 这是关键! - 列表模板:稍后我们创建的模板文件名,
nav_list.htm。 - 列表命名规则:可以自定义,如
{typedir}/nav_{page}.html。
- 栏目名称:
- 保存后,你可以在这个“网址导航”栏目下再创建子栏目,常用网站”、“设计资源”、“技术博客”等,实现分类管理。
在后台添加网址数据
你的“网址导航”系统框架已经搭好了。

- 进入 【核心】 -> 发布管理】 -> 】。
- 在右上角的“选择栏目”下拉框中,选择你刚刚创建的“网址导航”或其下的子栏目。
- 你会看到我们自定义的字段:标题、网址链接、Logo、网站描述等。
- 填写信息并上传Logo,然后发布。
重复此步骤,添加你所有的网址链接。
第三步:制作全新的前端模板
我们来制作两个模板文件:一个用于列表页(显示所有网址或某一分类下的网址),一个用于内容页(点击某个网址后跳转的页面)。
创建列表页模板 (nav_list.htm)
这个文件放在你网站的 /templets/default/ 目录下(如果你使用了其他模板,则放在对应的模板目录)。
代码示例 (nav_list.htm):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{dede:field.title/} - {dede:global.cfg_webname/}</title>
<meta name="description" content="{dede:field.description function='html2text(@me)'/}" />
<link rel="stylesheet" href="/templets/default/css/style.css"> <!-- 假设你有一个公共样式文件 -->
<style>
/* 一些简单的导航站样式 */
.nav-container { max-width: 1200px; margin: 20px auto; padding: 0 20px; }
.nav-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; }
.nav-item { border: 1px solid #eee; padding: 15px; text-align: center; border-radius: 8px; transition: all 0.3s; }
.nav-item:hover { box-shadow: 0 4px 8px rgba(0,0,0,0.1); transform: translateY(-2px); }
.nav-item img { max-width: 80px; max-height: 80px; margin-bottom: 10px; }
.nav-item h3 { font-size: 16px; margin: 10px 0; }
.nav-item p { font-size: 12px; color: #666; margin-bottom: 10px; }
.nav-item a { display: inline-block; background: #007bff; color: #fff; padding: 5px 15px; border-radius: 4px; text-decoration: none; }
.nav-item a:hover { background: #0056b3; }
</style>
</head>
<body>
<div class="nav-container">
<h1>{dede:field.title/}</h1>
<p>{dede:field.description/}</p>
<div class="nav-grid">
{dede:arclist row='20' titlelen='30' orderby='pubdate' idlist=''}
<!--
这里我们使用arclist标签来调用网址数据。
因为我们的模型是自定义的,arclist默认不识别。
需要修改 /include/taglib/arclist.lib.php 文件,在大概第380行左右的
$typeidQuery = " arc.typeid IN($typeid) AND ";
下面添加一行:
$addSql = " AND arc.arctypeid IN($typeid) ";
这样才能正确调用。
一个更简单的方法是直接用SQL查询,但arclist是标准做法。
-->
<div class="nav-item">
<a href="[field:url/]" target="_blank">
<img src="[field:logo/]" alt="[field:title/]" onerror="this.src='/templets/default/images/default-logo.png';">
</a>
<h3><a href="[field:url/]" target="_blank">[field:title/]</a></h3>
<p>[field:description/]</p>
</div>
{/dede:arclist}
</div>
</div>
</body>
</html>
注意: 上述 arclist 调用可能需要根据你的织梦版本和修改进行微调。arclist 调用自定义模型数据有问题,可以使用 {dede:sql} 标签直接查询,更灵活但性能稍差。
使用 sql 标签的替代方案:
{dede:sql sql="SELECT * FROM `dede_addonnav` ORDER BY id DESC"}
<div class="nav-item">
<a href="[field:url/]" target="_blank">
<img src="[field:logo/]" alt="[field:title/]" onerror="this.src='/templets/default/images/default-logo.png';">
</a>
<h3><a href="[field:url/]" target="_blank">[field:title/]</a></h3>
<p>[field:description/]</p>
</div>
{/dede:sql}
dede_addonnav 是你在第一步创建模型时系统自动生成的表名,请务必确认你的表名。
页模板 (可选)
如果你的网址导航也需要一个“详情页”(虽然大部分情况下是直接跳转),可以创建 nav_article.htm。
但通常,我们只需要在列表页点击就直接跳转到 url 字段指定的地址,列表页模板已经足够。
模板标签说明
{dede:field.title/}: 调用栏目标题。{dede:field.description/}: 调用栏目描述。[field:url/]: 调用自定义字段url的值。[field:logo/]: 调用自定义字段logo的值。[field:title/]: 调用文章(在这里是网址)的标题。[field:description/]: 调用自定义字段description的值。
总结与注意事项
- 核心思想:二次开发织梦网址导航,最佳实践是放弃原生功能,使用自定义模型,这赋予了系统最大的灵活性和扩展性。
- 文件位置:所有模板文件(
.htm)都必须放在/templets/你的模板名称/目录下。 - URL伪静态:为了更好的SEO,建议为栏目设置伪静态规则,在后台“系统”->“核心设置”中开启伪静态,并根据你的服务器环境(Apache或Nginx)配置相应的规则文件(
.htaccess或nginx.conf)。 - 点击统计:如果你添加了
click字段,可以在网址的<a>标签中加入onclick="window.open(this.href); document.getElementById('click_<?php echo $aid;?>').click(); return false;",并配合一个隐藏的<a>标签来织梦的点击统计功能。 - 缓存问题:修改模板或发布新内容后,如果前台不显示,请去后台“系统”->“性能选项”里清空一下所有缓存。
通过以上步骤,你就成功地为织梦DedeCMS开发了一个功能强大、模板自由的网址导航系统,你可以随心所欲地设计它的外观和布局,并且内容管理也变得非常简单直观。
