准备工作:确保文章有来源
请确保你的文章模型中已经有了“来源”这个字段,在 DedeCMS 后台,这通常对应的是 source 字段。

(图片来源网络,侵删)
- 检查字段是否存在:登录后台,进入“核心” -> “内容模型管理” -> 选择你的文章模型(如“文章模型”) -> “字段管理”,查看是否存在
source字段。 - 发布文章时填写来源:在发布文章时,记得在“文章来源”或相应位置填写来源信息,CSDN”、“知乎”、“官方博客”等,这个字段需要被正确填写,才能被调用出来。
使用自定义SQL查询(推荐,更灵活)
这种方法的核心是使用 dede:sql 标签,直接执行你想要的 SQL 语句,它的优点是完全自定义,可以配合其他字段进行复杂的查询。
基本语法
{dede:sql sql='你的SQL语句'}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:sql}
示例1:调用来源为“CSDN”的所有文章
假设你想调用所有来源为“CSDN”的文章,并且按发布时间倒序排列。
<h3>来自 CSDN 的相关文章</h3>
<ul>
{dede:sql sql="SELECT * FROM `dede_archives` WHERE source = 'CSDN' ORDER BY pubdate DESC"}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
<span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
</li>
{dede:sql}
</ul>
代码解析:
sql="SELECT * FROM ...":这是标准的 SQL 查询语句。dede_archives:DedeCMS 存储文章基本信息的核心表。WHERE source = 'CSDN':这是筛选条件,表示只查找source字段值为 'CSDN' 的记录。注意:字符串值需要用单引号括起来。ORDER BY pubdate DESC:按发布时间(pubdate字段)降序排列,确保最新的文章显示在最前面。[field:arcurl/]:调用文章的链接。[field:title/]:调用文章的标题。[field:pubdate .../]:调用文章的发布时间,并使用function进行格式化,使其更易读。
示例2:调用当前文章来源的其他文章(非常实用)
这个场景很常见:在文章详情页,显示与本文来源相同的其他文章。

(图片来源网络,侵删)
<h3>更多来自 [field:source/] 的文章</h3>
<ul>
{dede:sql sql="SELECT * FROM `dede_archives` WHERE source = '[field:source/]' AND id <> [field:id] ORDER BY pubdate DESC LIMIT 10"}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{dede:sql}
</ul>
代码解析:
source = '[field:source/]':这里使用了 DedeCMS 的变量替换,[field:source/]会被当前文章的来源值所替代,如果当前文章来源是“知乎”,SQL 就变成了WHERE source = '知乎'。AND id <> [field:id]:这个条件非常重要,它排除了当前文章本身,避免显示重复。LIMIT 10:限制只调用 10 条记录,防止内容过多。
使用 arclist 标签配合子查询
arclist 是 DedeCMS 最常用的列表标签,虽然它本身不直接支持按 source 字段筛选,但我们可以通过它的 typeid 或 channelid 属性配合自定义SQL来实现,或者更巧妙地使用 subday 等属性,但对于按来源筛选,直接使用 dede:sql 更清晰。
如果你非常想用 arclist,可以这样实现(原理是通过一个子查询来获取指定来源的文章ID):
<h3>来自 CSDN 的相关文章</h3>
<ul>
{dede:arclist typeid='0' channelid='1' titlelen='40' row='10'}
{dede:sql sql='SELECT id FROM dede_archives WHERE source = "CSDN" AND id IN ([field:id/])'}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:sql}
{/dede:arclist}
</ul>
注意: 这种方法比较绕,且 arclist 的 idlist 属性通常不支持动态值,所以这种方法在灵活性上不如第一种。强烈推荐优先使用方法一 (dede:sql)。

(图片来源网络,侵删)
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
dede:sql |
灵活、强大、直接,可编写任意复杂SQL,性能较好。 | 需要用户具备基本的SQL知识。 | 所有需要自定义查询的场景,特别是调用来源、自定义字段等。 |
arclist + SQL |
可以利用 arclist 的其他样式功能。 |
代码复杂,可读性差,灵活性低,不推荐。 | 极少数需要与 arclist 特定样式结合的复杂需求。 |
最终推荐:
直接使用 方法一 (dede:sql),它是解决这类问题的最标准、最高效的方式。
特别提醒:
- 在模板中编写SQL时,请确保你的表名(如
dede_archives)和字段名(如source,pubdate,id)与你的数据库结构一致,通常默认安装下,这些名称是固定的。 - 如果你的文章来源可能包含单引号(如
O'Reilly),需要进行转义处理,否则SQL会出错,但在大多数情况下,来源是普通文本,无需担心。
