使用 arcid 参数 (最推荐)
这是最直接、最简洁、效率最高的方法。arcid 参数用于指定一个或多个文章 ID 的列表,系统在调用时会排除这些 ID。

语法:
arcid='这里填要排除的文章ID'
示例:
假设当前文章的 ID 是 15,你想要调用除了这篇文章之外的其他文章。
{dede:arclist row='10' titlelen='30' arcid='15'}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
如何动态获取当前文章 ID?
在实际使用中,你不可能手动去填写 ID,你需要动态获取当前页面的文章 ID,可以通过 DedeCMS 的全局变量 $arcid 来实现。
{dede:arclist row='10' titlelen='30' arcid=''}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
<script type="text/javascript">
// 使用 JavaScript 获取当前文章 ID 并赋值给 arcid 参数
document.addEventListener('DOMContentLoaded', function() {
// DedeCMS 在文章详情页会定义全局变量 arcid
if(typeof(arcid) != 'undefined') {
// 找到 arclist 标签,并为其添加 arcid 属性
var arclistTags = document.getElementsByTagName('dede:arclist');
for(var i=0; i<arclistTags.length; i++) {
// 注意:直接修改标签属性在JS中可能无效,这里推荐使用JS动态生成或使用后端PHP处理
// 更好的方式是在模板里直接使用PHP变量
}
}
});
</script>
更简单、更推荐的动态写法 (PHP 模板语法):
在模板文件中,你可以直接使用 PHP 代码来动态生成 arcid 的值,这是最稳妥的方法。

{dede:arclist row='10' titlelen='30' arcid=''}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
<script type="text/javascript">
// 将当前文章ID通过JS变量传递给模板
document.addEventListener('DOMContentLoaded', function() {
var currentArcid = '{dede:field.id/}';
// 找到arclist标签的容器(给它一个id)
var arclistContainer = document.getElementById('related-articles');
if(arclistContainer) {
// 这里需要配合JS模板引擎或者重新请求API来实现,比较复杂。
// 最简单的方法还是直接在模板里写PHP。
}
});
</script>
最佳实践 (直接在模板中使用PHP):
如果你的模板支持直接写 PHP 代码(通常是 .htm 文件,但 DedeCMS 会解析其中的 PHP),这是最完美的方案。
{dede:arclist row='10' titlelen='30' arcid=''}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
<!-- 更优雅的写法,直接在标签内使用PHP变量 -->
{dede:arclist row='10' titlelen='30' arcid=''}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
注意:直接在模板中写 <?php ?> 在某些 DedeCMS 版本或配置下可能被禁用,如果上面的代码不生效,请尝试下面的方法。
使用 idlist 参数的反向逻辑
idlist 参数用于指定一个只包含的文章 ID 列表,它的逻辑和 arcid 相反,我们可以利用这个特性。
思路:

- 先获取当前栏目的所有文章 ID 列表。
- 从这个列表中移除当前文章的 ID。
- 将处理后的 ID 列表传给
idlist参数。
示例:
{dede:arclist
row='10' len='30'
idlist=''
}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
说明:
这种方法同样需要动态生成 ID 列表,实现起来比 arcid 更复杂,因为你需要先获取一个列表再进行过滤。不推荐作为首选方案,除非你有特殊需求。
使用 notin 条件 (SQL 排除)
notin 是 arclist 标签的一个底层查询条件,它允许你直接在 SQL 查询的 WHERE 子句中添加 NOT IN 条件,这种方法非常灵活,但需要你了解一点 SQL 语法。
语法:
notin="字段名, '要排除的ID1,要排除的ID2, ...'"
示例:
排除当前 ID 为 15 的文章。
{dede:arclist row='10' titlelen='30' notin='id, 15'}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
动态实现: 同样,为了动态获取 ID,你需要结合 PHP。
{dede:arclist row='10' titlelen='30' notin='id, '}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
</li>
{/dede:arclist}
注意:notin 参数虽然强大,但在某些 DedeCMS 版本中,如果参数处理不当,可能会存在安全隐患(SQL注入),确保传入的 ID 是数字类型至关重要。arcid 参数在底层已经被 DedeCMS 做了安全处理,所以更安全。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
arcid 参数 |
语法最简单,最直观,性能最好,官方推荐 | 需要动态获取 ID | ★★★★★ |
notin 条件 |
灵活,可用于排除其他字段 | 语法稍复杂,有潜在安全风险,非官方首选 | ★★★☆☆ |
idlist 参数 |
逻辑清晰(白名单) | 实现复杂,需要先获取列表再过滤 | ★★☆☆☆ |
最终结论:
请优先使用 arcid 参数。
对于动态排除当前文章,最可靠的实现方式是在模板文件中直接使用 PHP 代码来设置 arcid 的值。
<!-- 假设这是在文章详情页 article.htm -->
{dede:arclist
row='10' len='30'
typeid='当前栏目ID'
channelid='-1'
flag='c'
arcid=''
}
<li>
<a href="[field:arcurl/]">[field:title function='cn_substr(@me,30)'/]</a>
</li>
{/dede:arclist}
如何让上面的代码生效?
- 打开你的文章详情页模板文件(通常是
/templets/default/article_article.htm)。 - 找到你想放置“相关文章”的位置。
- 将上面的代码粘贴进去。
- DedeCMS 在解析这个模板时,
{dede:field.id/}会被替换成当前文章的实际 ID,从而arcid就被动态设置为当前文章 ID,实现了排除自身的功能。
如果直接写 PHP 不生效怎么办?
如果你的服务器禁用了模板中的 PHP 执行,你需要修改 DedeCMS 的核心文件 /include/taglib/arclist.lib.php,找到生成 SQL 查询的地方,在 $addsql 条件中增加对 arcid 的处理,但这属于二次开发,有一定风险,不推荐普通用户尝试。
首先尝试使用 arcid='' 这种写法,它通常在 DedeCMS 的默认环境下是有效的。
