- 列表页调用栏目文章,但不包含当前栏目本身。 这是最常见的需求,比如在首页或某个大栏目下,调用其子栏目的文章,但不想显示当前这个大栏目自己的文章。
- 页调用相关文章,但排除当前文章。 在文章页底部,我们通常想显示“相关文章”,这个“相关”肯定不应该包含文章自己。
下面我将针对这两种最常见的场景,提供详细的解决方案和代码示例。

列表页调用子栏目文章,但不调用当前栏目自身
假设你的栏目结构是这样的:
- 首页
- 新闻中心 (ID=1)
- 国内新闻 (ID=2)
- 国际新闻 (ID=3)
- 科技新闻 (ID=4)
你希望在“新闻中心”这个列表页,只显示其子栏目(国内、国际、科技)的文章,而不显示“新闻中心”栏目本身发布过的文章。
DedeCMS 的 arclist 标签本身没有直接的“排除自身栏目”参数,但我们可以通过一个巧妙的间接方法来实现:不指定 typeid,而是用 topid 来获取顶级栏目ID,然后在子查询中排除这个顶级ID。
方法:使用 topid 和 NOT IN 查询
-
获取当前顶级栏目ID 在模板中,我们可以通过
{dede:field.typeid/}获取当前栏目的ID,然后通过GetTopid()函数来获取其顶级栏目ID,在“新闻中心”页面,GetTopid()的结果就是1。
(图片来源网络,侵删) -
编写
arclist 我们使用typeid来指定要调用的栏目,用topid来获取顶级ID,然后用notypeid来排除这个顶级ID。
代码示例:
{dede:arclist
typeid='top'
topid='GetTopid()'
notypeid='GetTopid()' len='30'
row='10'
}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
代码解释:
typeid='top': 这个参数非常重要,它表示调用顶级栏目(即topid指定的栏目)下的所有子栏目。topid='GetTopid()': 获取当前页面的顶级栏目ID,在“新闻中心”页面,它会返回1。notypeid='GetTopid()': 这是实现“不调用自身”的关键,它告诉arclist标签,在调用子栏目时,要排除掉topid所指定的那个顶级栏目(ID=1的“新闻中心”)。
这样,arclist 就只会调用 topid(ID=1)的子栏目(ID=2,3,4)的文章,而不会调用 ID=1 的文章,完美实现了需求。

页调用相关文章,但不调用当前文章
这个需求非常普遍,在文章页,我们使用 likearticle 标签来调用相关文章,但它默认可能包含当前文章,我们需要排除它。
方法:使用 idlist 参数排除当前文章ID
likearticle 标签有一个 idlist 参数,可以指定一个文章ID列表,这些ID的文章不会被调用,我们可以利用这一点,将当前文章的ID放入 idlist 中。
代码示例:
<div class="related-article">
<h3>相关文章</h3>
<ul>
{dede:likearticle
row='6'
titlelen='30'
idlist=''}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
</div>
代码解释:
idlist='': 这里我们把idlist参数留空,看起来好像没什么用,但实际上,likearticle在生成SQL查询时,idlist为空,它不会添加AND aid NOT IN (...)这个条件。- 如何真正排除? 这需要修改
likearticle标签的底层PHP文件,但有一个更简单、更推荐的“曲线救国”方法。
推荐方法:利用 arcid 参数(更简单)
likearticle 标签有一个 arcid 参数,用于指定当前文章的ID,当指定了 arcid 后,DedeCMS 的底层逻辑会自动排除这个ID的文章。
修改后的代码示例(推荐):
<div class="related-article">
<h3>相关文章</h3>
<ul>
{dede:likearticle
row='6'
titlelen='30'
arcid=''}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
</div>
代码解释:
arcid='': 同样,我们把它留空,在模板解析时,DedeCMS 会自动将当前文章的ID ({dede:field.id/}) 赋值给arcid这个变量。- 底层PHP代码
/include/taglib/likearticle.lib.php中,会检查arcid是否有值,如果有,它就会在最终的SQL查询中加上AND arc.aid <> '$arcid'条句,从而确保当前文章不会被调用出来。
这是最标准、最简洁的实现方式。
总结与补充
| 需求场景 | 推荐标签 | 关键参数 | 实现原理 |
|---|---|---|---|
| 列表页不调用当前栏目自身 | arclist |
typeid='top' topid='GetTopid()' notypeid='GetTopid()' |
调用顶级栏目下的子栏目,并排除顶级栏目本身。 |
| 文章页不调用当前文章 | likearticle |
arcid='' (留空,系统自动填充) |
底层逻辑自动排除 arcid 所指定的文章ID。 |
重要提示:
- 修改文件风险:上述方法均不涉及修改DedeCMS核心文件,是安全且推荐的做法,如果你在网上找到需要修改
likearticle.lib.php文件的方案,请务必谨慎,因为这可能会导致升级时被覆盖或引入新的问题。 - 标签文档:遇到问题时,最好的参考资料是DedeCMS自带的标签文档,你可以在后台找到“模板” -> “标签调用”,里面有详细的参数说明。
希望这些详细的解释和示例能帮助你完美解决“不调用自身”的问题!
