addfilter 的主要作用是 为列表或内容页添加额外的查询条件(即 WHERE 子句),从而实现更灵活的数据筛选,它通常与 arclist、list、sql 等具有列表查询功能的标签配合使用。

(图片来源网络,侵删)
基本语法
{addfilter field='字段名' value='值' relation='关系' condition='条件'}
这个标签本身不会输出任何内容,它更像一个“指令”,告诉后续的列表标签如何修改其 SQL 查询语句。
参数详解
addfilter 有四个核心参数,理解它们是关键:
field (必须)
- 作用: 指定你要筛选的 数据表字段名。
- 类型: 字符串
- 示例:
field='typeid': 筛选栏目ID。field='flag': 筛选文章属性(如 'h' 推荐, 'c' 特荐等)。field='arcrank': 筛选审核状态(如 '-1' 待审核, '0' 已审核)。field='click': 筛选点击量。field='pubdate': 筛选发布日期。field='mid': 筛选作者/会员ID。
value (必须)
- 作用: 指定字段要匹配的 值。
- 类型: 字符串或数字
- 示例:
value='10': 匹配值为 10 的记录。value='h': 匹配属性为 'h' (推荐) 的记录。value='2025-01-01': 匹配日期为 '2025-01-01' 的记录。
relation (可选)
- 作用: 指定当前
addfilter条件与 其他条件(或默认条件)之间的逻辑关系,这是实现复杂筛选的关键。 - 类型: 字符串
- 常用值:
AND(默认): 并且,表示必须同时满足当前条件和其他所有条件。OR: 或者,表示满足当前条件 或者 满足其他条件即可。AND NOT: 并且不,表示必须满足其他条件,但 不能 满足当前条件。OR NOT: 或者不,表示不满足当前条件 或者 满足其他条件即可。(较少用)
condition (可选)
- 作用: 指定字段与值之间的 比较运算符,比简单的 更加灵活。
- 类型: 字符串
- 常用值:
- (默认): 等于。
- 不等于。
>: 大于。>=: 大于等于。<: 小于。<=: 小于等于。LIKE: 模糊匹配。value='%关键词%'可以查找标题或内容中包含“关键词”的文章。IN: 在...之中。value='1,2,3'可以查找ID为1、2或3的文章。NOT IN: 不在...之中。
使用场景与示例
场景1:筛选特定属性的文章(最常用)
需求: 在首页或栏目页,只显示带有 "推荐" 标志的文章。
代码:

(图片来源网络,侵删)
{addfilter field='flag' value='h' relation='AND'}
{dede:arclist titlelen='30' row='10'}
<li><a href='[field:arcurl/]'>[field:title/]</a></li>
{/dede:arclist}
解析:
field='flag': 我们要筛选dede_archives表中的flag字段。value='h':h是 DedeCMS 中“推荐”的标志。relation='AND': (可省略,因为是默认值) 确保这个条件与arclist标签自带的typeid(栏目ID)等条件是“关系。- 最终生成的 SQL WHERE 子句类似:
... WHERE typeid='栏目ID' AND flag='h'
场景2:组合筛选(AND 关系)
需求: 在某个栏目下,显示“推荐” 并且 审核状态为“已发布”的文章。
代码:
{addfilter field='flag' value='h' relation='AND'}
{addfilter field='arcrank' value='0' relation='AND'}
{dede:arclist titlelen='30' row='10'}
<li><a href='[field:arcurl/]'>[field:title/]</a></li>
{/dede:arclist}
解析:

(图片来源网络,侵删)
- 第一个
addfilter添加了flag='h'的条件。 - 第二个
addfilter添加了arcrank='0'的条件,并明确指定relation='AND'。 - 最终生成的 SQL WHERE 子句类似:
... WHERE typeid='栏目ID' AND flag='h' AND arcrank='0'
场景3:使用 OR 关系实现“或”逻辑
需求: 显示栏目ID为 1 的文章 或者 是“推荐”的文章(无论在哪个栏目)。
代码:
{addfilter field='flag' value='h' relation='OR'}
{dede:arclist typeid='1' titlelen='30' row='10'}
<li><a href='[field:arcurl/]'>[field:title/]</a></li>
{/dede:arclist}
解析:
typeid='1'是arclist标签自带的条件,表示只查找栏目1。addfilter的relation='OR'改变了逻辑,表示查找 (栏目ID=1) 或者 (flag='h') 的文章。- 最终生成的 SQL WHERE 子句类似:
... WHERE typeid='1' OR flag='h'
场景4:使用 condition 参数进行复杂筛选
需求: 显示点击量 大于 100 的文章。
代码:
{addfilter field='click' value='100' condition='>'}
{dede:arclist titlelen='30' row='10'}
<li><a href='[field:arcurl/]'>[field:title/]</a> ([field:click/])</li>
{/dede:arclist}
解析:
field='click': 筛选点击量字段。value='100': 基准值是100。condition='>': 比较运算符是“大于”。- 最终生成的 SQL WHERE 子句类似:
... WHERE typeid='栏目ID' AND click > 100
场景5:使用 NOT 排除特定内容
需求: 在首页显示所有文章,但 不显示 标题包含“广告”字样的文章。
代码:
{addfilter field='title' value='%广告%' condition='LIKE' relation='AND NOT'}
{dede:arclist titlelen='30' row='10'}
<li><a href='[field:arcurl/]'>[field:title/]</a></li>
{/dede:arclist}
解析:
field='title': 在标题字段中筛选。value='%广告%': 使用LIKE和 实现模糊匹配,查找包含“广告”的标题。condition='LIKE': 指定使用模糊匹配。relation='AND NOT': 这是一个强大的组合,表示“并且不包含...”,它确保文章必须属于当前栏目 (typeid),但同时标题不能包含“广告”。- 最终生成的 SQL WHERE 子句类似:
... WHERE typeid='栏目ID' AND NOT title LIKE '%广告%'
注意事项
- 标签顺序:
addfilter标签必须放在它要影响的列表标签(如arclist,list)之前。 - 字段存在:
field参数指定的字段必须是目标数据表(通常是dede_archives)中真实存在的字段,否则可能会导致查询错误。 - 值类型:
value的值类型要和字段类型匹配。click是数字,value直接写数字即可;title是字符串,value最好用单引号或双引号括起来。 - 调试: 如果筛选结果不符合预期,最好的方法是查看页面最终生成的 SQL 语句,你可以在
include/dedetag.class.php中找到相关代码进行输出调试,或者使用浏览器开发者工具的网络面板分析请求。
| 参数 | 作用 | 可选值 | 示例 |
|---|---|---|---|
field |
指定筛选字段 | 数据表字段名 | field='typeid' |
value |
指定筛选值 | 任意字符串或数字 | value='10' |
relation |
指定逻辑关系 | AND, OR, AND NOT, OR NOT |
relation='OR' |
condition |
指定比较运算符 | , , >, <, LIKE, IN 等 |
condition='>' |
addfilter 是 DedeCMS 模板开发中实现动态数据筛选的利器,熟练掌握它能让你制作出功能更加强大和个性化的网站。
