使用DedeCMS内置的“相关专题”功能(最简单)
这是DedeCMS系统自带的功能,适用于“这篇文章属于某个专题”的场景,它需要在后台添加文章时,手动选择或创建专题。

(图片来源网络,侵删)
操作步骤:
-
添加文章时勾选专题
- 登录DedeCMS后台,进入“[核心] -> [内容发布管理] -> [添加文档]”。
- 在文章编辑页面,向下滚动,找到“专题属性”部分。
- 点击“选择专题”,在弹出的窗口中,您可以选择已有的专题,或者点击“新建专题”来创建一个新专题并关联到当前文章。
- 填写完文章内容后,点击“保存”或“发布”。
-
在文章页模板中调用
- 进入“[模板] -> [默认模板管理]”,找到您当前使用的文章页模板文件,通常是
article_article.htm。 - 在您希望显示专题列表的位置,插入以下DedeCMS标签代码:
{dede:field name='typeid' runphp='yes'} // 如果typeid不为空,则查询专题 if(@me != ''){ @me = "<div class='related-specials'><h3>相关专题</h3>"; @me .= "<ul>"; @me .= "<li><a href='/special/index.php'>查看所有专题</a></li>"; @me .= "</ul></div>"; }else{ @me = ""; } {/dede:field} {dede:field name='body'/}注意: 上面的代码只是一个框架,它并不能直接调用出专题,DedeCMS原生标签中,并没有一个像
{dede:arclist}那样可以直接调用文章关联专题的标签,更通用的方法是使用 方法二。
(图片来源网络,侵删) - 进入“[模板] -> [默认模板管理]”,找到您当前使用的文章页模板文件,通常是
使用自定义SQL查询(最常用、最灵活)
这种方法的核心思想是:通过文章的ID,去 dede_archives 表中找到其专题ID(存储在 typeid 字段,如果专题文章的话),或者去 dede_specialtopic 表中查找关联,但更常见的是,我们通过专题的关联文章ID来反向查找。
这里我们采用一个更普适的思路:查找所有包含了当前文章的专题。
操作步骤:
-
修改文章页模板
- 同样地,打开您的文章页模板
article_article.htm。 - 在需要显示专题的位置,放入以下代码块:
<!-- 调用包含当前文章的专题 --> {dede:sql sql="SELECT st.*, stb.body FROM `dede_specialtopic` st LEFT JOIN `dede_specialtopic_data` stb ON st.id = stb.tid WHERE FIND_IN_SET('~aid~', st.aid) ORDER BY st.id DESC"} <div class="article-special"> <h3>本文所属专题:<a href='[field:phpurl/]/special/index.php?id=[field:id/]'>[field:title/]</a></h3> [field:body/] </div> {/dede:sql} - 同样地,打开您的文章页模板
-
代码解释与重要修正
- 上面的SQL代码有一个关键问题:
st.aid字段通常存储的是专题的封面文章ID,而不是包含的所有文章ID,包含所有文章ID的字段是dede_specialtopic_data表里的aid字段。 - 正确的查询应该是:从
dede_specialtopic_data表中查找aid字段里包含当前文章ID的记录,然后通过tid关联到dede_specialtopic表。 - 修正后的代码如下:
<!-- 调用包含当前文章的专题 (推荐方法) --> {dede:sql sql=" SELECT s.id, s.title, s.typename, s.description, s.litpic, s.pubdate FROM `dede_specialtopic` s INNER JOIN `dede_specialtopic_data` d ON s.id = d.tid WHERE d.aid = '~aid~' LIMIT 1 "} <div class="article-special"> <h3>本文所属专题:</h3> <div class="special-box"> <a href='[field:phpurl/]/special/index.php?id=[field:id/]'> <img src='[field:litpic/]' alt='[field:title/]' /> </a> <div class="special-info"> <h4><a href='[field:phpurl/]/special/index.php?id=[field:id/]'>[field:title/]</a></h4> <p>[field:description function='cn_substr(@me, 100)'/]...</p> </div> </div> </div> {/dede:sql}- 代码详解:
~aid~:这是DedeCMS模板引擎的一个特殊占位符,它会自动被当前页面的文章ID所替换。dede_specialtopic:专题主表,存储专题的基本信息(标题、描述、图片等)。dede_specialtopic_data:专题数据表,存储专题和文章的关联关系(tid是专题ID,aid是文章ID)。INNER JOIN ... ON s.id = d.tid:将专题表和关联表通过ID连接起来。WHERE d.aid = '~aid~':筛选出关联了当前文章的专题。LIMIT 1:一篇文章通常只属于一个专题,加上这个可以限制只显示一个,提高效率,如果一篇文章可以属于多个专题,请去掉此句。[field:phpurl/]:调用网站后台设置的“程序路径”,通常是 。[field:litpic/]:调用专题封面图。[field:title/]:调用专题标题。[field:description/]:调用专题描述,并用cn_substr函数截取前100个字符。
- 上面的SQL代码有一个关键问题:
调用网站所有专题(不区分文章)
如果您想在文章页展示整个网站的所有专题列表,而不是与当前文章相关的专题,那就非常简单了。
操作步骤:
-
在文章页模板中插入代码
- 打开
article_article.htm。 - 放入以下代码:
<!-- 调用网站所有专题 --> {dede:sql sql="SELECT id, title, litpic FROM `dede_specialtopic` WHERE ismake=1 ORDER BY id DESC LIMIT 0, 10"} <a href='[field:phpurl/]/special/index.php?id=[field:id/]'> <img src='[field:litpic/]' alt='[field:title/]' /> <span>[field:title/]</span> </a> {/dede:sql} - 打开
-
代码解释
ismake=1:这个条件很重要,它只调用后台已经“生成”的专题,草稿状态的专题(ismake=0)不会被显示。ORDER BY id DESC:按专题ID降序排列,即最新的专题排在前面。LIMIT 0, 10:从第0条开始,共显示10条专题,您可以根据需要修改这个数字。
总结与建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 方法一 | 文章在发布时被明确指定到某个专题 | 系统自带,无需额外代码 | 功能较弱,调用方式不直观,灵活性差 |
| 方法二 | 最推荐,需要动态显示与当前文章内容相关的专题 | 非常灵活,能精确找到包含当前文章的专题,逻辑清晰 | 需要写SQL语句,对表结构有一定了解 |
| 方法三 | 在文章页展示全站的专题列表,作为网站导航 | 简单快捷,代码量少 | 与当前文章内容无关,属于通用模块 |
对于绝大多数需求,方法二 是最佳选择,它实现了“智能关联”,用户体验更好,如果您只是想在侧边栏加一个“专题入口”,那么方法三就足够了。
最后的小提示:在修改模板文件前,请务必备份原文件,以防修改出错导致网站前台显示异常,修改后,请到后台“[生成] -> [更新HTML]”中更新相关页面,才能看到效果。
