使用 {dede:if} 条件判断标签
这是最通用、最强大的判断方式,可以在 {dede:loop}、{dede:arclist} 等几乎所有循环标签内部使用,也可以在模板的任何独立位置使用。

基本语法
{dede:if condition='这里写你的判断条件'}
<!-- 如果条件为真,则显示这部分内容 -->
<p>条件成立,显示我!</p>
{else}
<!-- 如果条件为假,则显示这部分内容 (else 是可选的) -->
<p>条件不成立,显示我!</p>
{/dede:if}
关键点:
condition属性:里面写的是你的判断表达式,必须用单引号 包裹起来。{dede:if}和{/dede:if}必须成对出现。{else}是可选的,根据需要添加。
常用的判断条件类型
字符串比较 (最常用)
判断一个字段是否等于某个特定的值。
示例:在文章列表中,给置顶的文章加上特殊标记
{dede:arclist titlelen='30' row='10'}
<li>
<!-- 判断 flag 字段中是否包含 'p' (p 代表置顶) -->
{dede:if condition='strpos(@me["flag"], "p") !== false'}
<span style="color:red;">[置顶]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
代码解析:

@me:这是一个非常重要的变量,它代表当前正在循环的这个条目的原始数据(一个数组)。@me["flag"]:就是获取当前文章的flag字段的值。strpos(string, find):PHP 函数,查找find在string中首次出现的位置,如果找到,返回索引(数字),否则返回false。!== false:因为strpos可能返回0(在开头找到),所以用 (严格不等于) 来判断,比 更严谨。
其他字符串比较示例:
<!-- 判断文章栏目ID是否为 1 -->
{dede:if condition="@me['typeid'] == 1"}
<p>这是来自栏目ID为1的文章。</p>
{/dede:if}
<!-- 判断文章作者是否为 'admin' -->
{dede:if condition="@me['writer'] == 'admin'"}
<p>作者:[field:writer/]</p>
{/dede:if}
数字比较
判断字段的数值大小。
示例:只显示点击量大于100的热门文章
{dede:arclist row='10'}
{dede:if condition='@me["click"] > 100'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
(点击: [field:click/])
</li>
{/dede:if}
{/dede:arclist}
逻辑判断 (AND, OR)
组合多个条件。
示例:显示栏目ID为1 并且 是推荐的文章
{dede:arclist row='10'}
{dede:if condition='(@me["typeid"] == 1) && (@me["flag"] == "c")'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>推荐</span>
</li>
{/dede:if}
{/dede:arclist}
&&:代表 " (AND)。- 代表 "或者" (OR)。
判断变量是否存在或为空
使用 isset() 和 empty() 函数。
示例:如果文章摘要为空,则显示文章内容的前100个字符作为摘要
{dede:arclist row='5'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>
{dede:if condition='empty(@me["description"])'}
<!-- 如果摘要为空,则截取内容 -->
[field:autodesc function='cn_substr(@me, 100)'/]...
{else}
<!-- 否则显示摘要 -->
[field:description/]
{/dede:if}
</p>
{/dede:arclist}
empty():检查变量是否为空、0、'false'、'null' 或未定义。isset():检查变量是否已定义并且不为null。
使用 PHP 函数
你可以在 condition 中使用任何有效的 PHP 函数,这让判断功能非常强大。
示例:根据发布时间判断新旧文章,并加上不同样式
{dede:arclist row='10'}
{dede:if condition='date("Y-m-d", @me["pubdate"]) == date("Y-m-d", time())'}
<li style="color:blue; font-weight:bold;">
<a href="[field:arcurl/]">[field:title/]</a>
<span style="color:red;">[</span>
</li>
{else}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:if}
{/dede:arclist}
date()和time()都是 PHP 的时间函数。@me["pubdate"]是文章发布的时间戳。
使用 {dede:arclist} 标签的属性判断
{dede:arclist} 是 DedeCMS 中最核心的列表标签,它自带了一些属性可以直接过滤或标记数据,无需在模板里写 {dede:if},这种方式更简洁,性能也更好。
常用属性
| 属性名 | 说明 | 示例 |
|---|---|---|
flag |
按标志位筛选。'p'置顶, 'c'推荐, 'h'头条, 'a'特荐, 'f'幻灯。 |
flag='p' 只显示置顶文章。 |
typeid |
指定栏目ID。 | typeid='5,6,7' 显示多个栏目下的文章。 |
channelid |
指定频道ID。 | channelid='1' 只显示文章频道。 |
limit |
限制获取记录的数量。 | limit='0,5' 从第0条开始,获取5条。 |
orderby |
排序方式。hot按点击, pubdate按发布日期, sortrank按权重。 |
orderby='hot' 按点击量从高到低排序。 |
noflag |
排除标志位。 | noflag='h' 排除所有头条文章。 |
示例:只显示“推荐”和“头条”的文章
{dede:arclist flag='c,h' titlelen='30' row='10'}
<li>
<!-- 因为flag属性已经筛选了,这里可以直接用 {dede:if} 来判断具体是哪种 -->
{dede:if condition='strpos(@me["flag"], "h") !== false'}
<span>[头条]</span>
{else if condition='strpos(@me["flag"], "c") !== false'}
<span>[推荐]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
在这个例子中,flag='c,h' 先保证了列表里只有推荐或头条文章,然后我们再用 {dede:if} 来给它们加上不同的标记。
总结与最佳实践
-
优先使用标签属性:如果你的判断只是为了筛选数据(比如只看某个栏目、某种状态的文章),优先使用
{dede:arclist}的typeid,flag,orderby等属性,这样代码更简洁,效率更高。 -
使用
{dede:if}进行逻辑展示:如果判断是为了的显示样式(比如给不同类型的文章加不同样式、处理空数据等),{dede:if}是不二之选。 -
@me是核心:在循环标签(arclist,loop,sql等)内部使用{dede:if}时,@me是获取当前条目数据的唯一途径,一定要记住它的用法。 -
善用 PHP 函数:不要局限于简单的 或
>,strpos,date,substr,empty等函数能帮你实现更复杂的逻辑。 -
调试技巧:如果判断不生效,可以尝试在
{dede:if}和{/dede:if}之间直接输出@me或其某个字段,看看数据是否是你期望的。{dede:if condition='@me["flag"] == "p"'} <!-- 尝试输出一下 flag 的值,看看是不是 "p" --> <p>当前 flag 值: [field:flag /]</p> <span>[置顶]</span> {/dede:if}
通过灵活运用这两种方法,你就可以轻松驾驭 DedeCMS 模板的各种复杂判断需求了。
