使用自定义SQL(最推荐)
这是最灵活、最直接的方法,我们通过编写一个SQL查询语句,直接从数据库中获取我们想要的数据。

操作步骤:
-
找到目标栏目的ID: 你需要确定不调用的那个栏目的ID。
- 登录你的DedeCMS后台。
- 进入「栏目管理」。
- 找到那个你想要排除的栏目,鼠标悬停在上面,浏览器左下角会显示链接,
.../catalog_add.php?dopost=edit&channelid=1&cid=5,这里的cid=5就是该栏目的ID,假设我们要排除ID为5的栏目。
-
在模板中添加自定义SQL调用标签: 在你想要显示最新文章的模板文件(通常是
index.htm或其他自定义的.htm文件)中,使用{dede:sql}<h3>全站最新文章(排除“不想要”的栏目)</h3> <ul> {dede:sql sql='SELECT arc.id, arc.title, arc.typeid, arc.pubdate, tp.typename FROM dede_archives arc LEFT JOIN dede_arctype tp ON arc.typeid = tp.id WHERE arc.typeid != 5 AND arc.arcrank >= 0 ORDER BY arc.pubdate DESC LIMIT 10'} <li> <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a> <span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span> </li> {/dede:sql} </ul>
代码详解:
{dede:sql sql='...'}: 这是DedeCMS执行自定义SQL的核心标签。SELECT arc.id, arc.title, ...: 我们选择需要显示的字段,如文章ID、标题、栏目ID、发布时间、栏目名称等。arc.id: 文章ID。arc.title: 文章标题。arc.typeid: 文章所属栏目ID。arc.pubdate: 文章发布时间戳。tp.typename: 栏目名称(通过LEFT JOIN关联dede_arctype表获取)。arc.arcurl: 注意:arcurl字段在archives表里不存在,它是一个动态值,我们不能直接SELECT arc.arcurl,正确的做法是使用{field:arcurl/}标签,它会自动根据你的网站规则生成文章链接。
FROM dede_archives arc: 指定从dede_archives(文章主表) 查询,并给它一个别名arc。LEFT JOIN dede_arctype tp ON arc.typeid = tp.id: 关联dede_arctype(栏目表) 以获取栏目名称。WHERE arc.typeid != 5: 这是关键!typeid != 5的意思是,筛选出栏目ID不等于5的所有文章。请将5替换成你自己的栏目ID。- 如果要排除多个栏目,可以用
AND连接,WHERE arc.typeid NOT IN (5, 8, 10),这会排除ID为5、8、10的三个栏目。
- 如果要排除多个栏目,可以用
AND arc.arcrank >= 0: 这是一个非常重要的条件。arcrank是文章的审核状态,-1表示被审核掉或回收站的文章,>= 0表示只调用正常发布的文章。ORDER BY arc.pubdate DESC: 按照发布时间倒序排列,保证最新的文章排在前面。LIMIT 10: 限制只返回10条记录,你可以根据需要修改这个数字。[field:arcurl/]: 在循环内部,用于生成文章的完整链接。[field:title/]: 显示文章标题。[field:pubdate function='MyDate("Y-m-d", @me)'/]: 对发布时间戳进行处理,格式化为 "年-月-日" 的形式。
使用 arclist 标签 + typeid 参数(备选方案)
如果你的网站结构简单,或者你只想排除顶级栏目,这个方法会更简单。
操作步骤:
-
找到所有你想要调用的栏目的ID: 这个方法不是“排除”,而是“包含”,你需要列出所有需要调用的栏目的ID。
- 进入「栏目管理」。
- 记下所有需要调用文章的栏目的ID,你需要调用栏目ID为
1, 2, 3, 4的文章,而栏目5是不需要的。
-
在模板中使用
arclist: 将这些ID用英文逗号 隔开,赋值给typeid参数。
(图片来源网络,侵删)<h3>全站最新文章(仅包含指定栏目)</h3> <ul> {dede:arclist typeid='1,2,3,4' titlelen='40' orderby='pubdate' orderway='desc' row='10'} <li> <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a> <span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span> </li> {/dede:arclist} </ul>
代码详解:
typeid='1,2,3,4': 这是核心,这里明确指定了只调用这几个ID的栏目下的文章,你需要手动计算并填入所有需要包含的栏目ID。orderby='pubdate' orderway='desc': 按发布时间倒序排列,与SQL方法中的效果一致,len='40'`: 标题长度限制,防止标题过长影响布局。row='10': 调用文章的数量限制。
这种方法的缺点:
- 维护麻烦:如果未来新增了栏目,并且你希望新栏目的文章也显示在这里,你必须手动回来修改这个
typeid值。 - 不适合复杂排除:如果你有几十个栏目,只想排除一两个,列出所有要包含的ID会非常繁琐。
使用 loop 标签(备选方案)
loop 标签的功能与 sql 类似,但语法稍有不同,它更像是在写一段PHP代码。
<h3>全站最新文章(使用loop标签)</h3>
<ul>
{dede:loop table='dede_archives' sort='pubdate' row='10' if='typeid!=5 AND arcrank>=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span>
</li>
{/dede:loop}
</ul>
代码详解:
{dede:loop table='...'}: 指定操作的表名。sort='pubdate': 排序字段,等同于SQL的ORDER BY。row='10': 返回记录数。if='typeid!=5 AND arcrank>=0': 这是核心,这里的if条件相当于SQL的WHERE子句,同样,typeid != 5是排除指定栏目,arcrank >= 0是只调用已审核文章。
loop 标签的灵活性不如 sql 标签,因为它不能方便地进行 JOIN 操作(比如获取栏目名称),所以对于这个需求,sql 标签是更优的选择。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 自定义SQL | 最灵活、性能最好、逻辑清晰(排除法)、可扩展性强(如JOIN获取更多信息) | 需要一点SQL基础,但语法简单 | 强烈推荐,几乎所有需要复杂筛选的场景都适用。 |
arclist |
标签简单,无需写SQL | 维护麻烦(需要手动列出所有包含的ID)、不适合排除少量栏目 | 网站栏目 |

