下面我将从原因分析、解决方案和预防措施三个方面,为你详细拆解和解决这个问题。

问题原因分析
DedeCMS 的 {dede:channel} 标签在默认情况下,有以下几个核心逻辑,这些逻辑可能导致外链不显示或显示不正确:
-
优先级问题:内链优先
- DedeCMS 的设计初衷是管理站内内容,当
{dede:channel}标签解析时,它会优先判断该栏目是否存在对应的内部栏目(即数据表dede_arctype中有记录)。 - 如果系统发现
topid或reid指向的栏目在数据库中存在,它就会自动生成指向该内部栏目的链接(如a href="/plus/list.php?tid=XX")。 - 只有当内部栏目不存在时,它才会去读取你手动填写的“外部链接”字段(
dede_arctype表中的content字段)并生成外链。
- DedeCMS 的设计初衷是管理站内内容,当
-
缓存问题
DedeCMS 有非常强大的缓存机制,当你修改了栏目信息(比如从内链改为外链)后,如果后台的“更新系统缓存”没有执行,前台页面显示的可能还是旧的缓存数据,导致修改不生效。
(图片来源网络,侵删) -
模板标签使用不当
- 有时我们使用的标签可能不完整,或者使用了错误的属性来调用外链,默认的
{dede:channel}标签并不直接输出外链 URL。
- 有时我们使用的标签可能不完整,或者使用了错误的属性来调用外链,默认的
解决方案
根据以上原因,我们可以按照以下步骤来排查和解决。
检查并确保外部链接字段正确(治本方法)
这是最根本的解决方法,你需要确保栏目的“外部链接”字段被正确填写和调用。
第一步:后台确认外部链接已填写

- 登录 DedeCMS 后台。
- 进入「核心」 -> 「栏目管理」。
- 找到那个不显示外链的栏目,点击 “[常规属性]” 或直接点击栏目名称进行编辑。
- 在栏目编辑页面,找到 “选择外部链接” 这一项(通常在页面的中下部)。
- 在输入框中完整地填写你的外部链接,
https://www.example.com。 - 务必保存。
第二步:使用正确的模板标签调用
默认的 {dede:channel} 标签主要用于生成内链,要正确显示外链,你需要使用它的特定属性。
错误用法(可能导致问题):
{dede:channel type='top' row='8'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
[field:typelink/] 在栏目是内链时指向内部地址,是外链时虽然能获取到外链地址,但有时会被其他逻辑干扰。
推荐用法(明确指定):
使用 type='son' 或 type='self' 配合 reid='父栏目ID' 来限制只显示子栏目,并使用 [field:typedir/] 或 [field:typelink/] 来获取链接,但最稳妥的方式是使用 function 或 innertext 来处理。
方法A:使用 innertext 属性(推荐)
这是最灵活、最推荐的方法,你可以自定义链接的 HTML 结构。
{dede:channel type='top' row='8'}
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 或者更明确地判断 -->
<a href="[field:typedir/]" target="_blank">[field:typename/]</a>
{/dede:channel}
注意: [field:typedir/] 和 [field:typelink/] 在处理外链时,[field:typedir/] 会直接输出你在后台填写的外部链接地址,而 [field:typelink/] 也会输出,通常两者效果一致。
方法B:使用 function 属性进行二次开发
innertext 仍然无法满足复杂需求,可以使用 function 调用一个自定义函数。
-
在
/include/extend.func.php文件中添加一个自定义函数:// 获取栏目链接,如果是外链则返回外链地址 function GetChannelLink($typeid) { global $dsql; $query = "SELECT ispart, content FROM `#@__arctype` WHERE id = '$typeid'"; $row = $dsql->GetOne($query); // 如果是外部链接 (ispart=1 通常表示外部链接,但具体看你的系统设置) // 或者直接判断 content 字段是否包含 'http' if (!empty($row['content']) && strpos($row['content'], 'http') === 0) { return $row['content']; } else { // 否则返回内部栏目链接 return GetOneTypeUrlA($typeid); } } -
在模板中调用:
{dede:channel type='top' row='8'} <a href="{dede:field name='typeid' function="GetChannelLink(@me)"/}" target="_blank">[field:typename/]</a> {/dede:channel}这种方法非常强大,但需要一定的 PHP 基础。
清理和更新缓存
无论你修改了什么,这一步都至关重要。
- 登录 DedeCMS 后台。
- 顶部菜单栏找到「系统」 -> 「一键更新网站」。
- 在打开的页面中,勾选 “更新系统缓存” 和 “更新栏目缓存”。
- 点击“开始更新”。
- 更新完成后,刷新你的前台页面,查看外链是否正常显示。
检查数据库记录(终极排查)
如果以上方法都无效,可能是数据库数据有问题。
- 登录你的网站数据库管理工具(如 phpMyAdmin)。
- 找到 DedeCMS 的数据表,通常名为
dede_arctype(你的表前缀可能不是dede_)。 - 找到对应栏目的那条记录。
- 检查两个字段:
content: 这个字段应该存储了你填写的完整外部链接,如https://www.example.com,确保它不为空且格式正确。ispart: 这个字段通常为0表示内部栏目,为1表示外部链接,请确认它是否被正确设置为1。
预防措施
为了避免未来再次遇到这个问题,建议养成良好的操作习惯:
- 先建栏目,再填内容:尽量先在后台创建好所有栏目(包括外链栏目),再进行内容的发布和模板的制作。
- 使用缓存:理解并善用 DedeCMS 的缓存机制,栏目、文章等内容修改后,及时更新缓存,这能显著提升网站速度。
- 规范命名:为内部栏目和外部链接栏目使用不同的命名规范,例如内部栏目使用“公司新闻”、“产品中心”,外部链接使用“友情链接-百度”、“合作伙伴-阿里”等,便于区分。
- 模板分离:如果导航栏中外链和内链混用,可以考虑在模板中使用
{dede:channel}和{dede:flink}(友情链接标签)相结合的方式,让它们各司其职。
| 问题现象 | 最可能的原因 | 推荐解决方案 |
|---|---|---|
| 栏目显示为内部链接,而非设置的外部链接 | 系统优先调用内链,即使你填了外链。 | 方案一:在后台确认外链已填写,并使用 [field:typedir/] 或 [field:typelink/] 在模板中调用。 |
| 修改了外链设置,但前台页面无变化 | 缓存未更新。 | 方案二:进入“一键更新网站”,更新“系统缓存”和“栏目缓存”。 |
| 所有外链都无法显示,或者显示逻辑混乱 | 数据库记录错误或标签使用不当。 | 方案三:检查数据库 dede_arctype 表中对应栏目的 content 和 ispart 字段,或尝试使用 function 自定义函数。 |
按照这个流程,99% 的 DedeCMS 栏目外链不显示问题都可以得到解决,希望对你有帮助!
