织梦loop标签使用教程
loop
SQL
高级查询
loop标签是什么
织梦 {dede:loop} 是一个底层 SQL 循环标签,可以查询任意数据表并循环输出。相比 {dede:arclist} 只能查文档表,loop 更灵活,能调用栏目、用户、自定义表,适合做高级功能。
基本语法
{dede:loop table='数据表' sort='排序字段' row='行数' if='条件'}
[field:字段名/]
{/dede:loop}
参数详解
table:要查询的表名,多表用逗号分隔,必填。sort:排序字段,默认 id。row:返回条数,默认 10。if:查询条件,对应 SQL 的 WHERE 子句。orderway:排序方向,desc或asc,默认 desc。typeid:限定栏目 ID。
实例一:调用最新10篇文章
{dede:loop table='dede_archives' sort='pubdate' row='10' if='arcrank>-1'}
<li>
<a href="/view.php?aid=[field:id/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:loop}
- 织梦loop标签使用教程 2026-07-29
- 织梦arclist如何过滤重复文章 2026-07-28
- 织梦模板缓存如何关闭 2026-07-27
实例二:调用指定栏目下的子栏目
{dede:loop table='dede_arctype' sort='sortrank' row='20' if="reid='1'"}
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">
[field:typename/]
</a>
{/dede:loop}
实例三:调用热门文章(按点击量)
{dede:loop table='dede_archives' sort='click' row='8' if='arcrank>-1 AND typeid=5'}
<li>
<a href="/view.php?aid=[field:id/]">[field:title/]</a>
阅读:[field:click/]
</li>
{/dede:loop}
实例四:调用自定义表数据
假设你建了一个留言表 dede_guestbook:
{dede:loop table='dede_guestbook' sort='dtime' row='5' if='ischeck=1'}
<div class="msg">
<strong>[field:uname/]:</strong>
[field:msg function="cn_substr(@me,80)"/]
<time>[field:dtime function="GetDateMk(@me)"/]</time>
</div>
{/dede:loop}
实例五:多表联合查询
调用文章标题 + 栏目名,需 JOIN:
{dede:loop table='dede_archives arc,dede_arctype t'
sort='arc.pubdate' row='10'
if='arc.typeid=t.id AND arc.arcrank>-1'}
<li>
<a href="/view.php?aid=[field:arc.id/]">[field:arc.title/]</a>
- [field:t.typename/]
</li>
{/dede:loop}
注意:多表 JOIN 时,
table 用逗号分隔并加表别名,if 中写连接条件。字段引用要带表别名前缀,如 [field:arc.title/]。
loop 与 sql 标签的区别
织梦还有个 {dede:sql} 标签,写法更接近原生 SQL:
{dede:sql sql="SELECT * FROM dede_archives WHERE arcrank>-1 LIMIT 10"}
[field:title/]
{/dede:sql}
对比:
loop:参数化,写法简单但灵活度低。sql:原生 SQL,灵活但易出错。- 两者性能接近,复杂查询推荐
sql。
分页支持
loop 本身不分页,需要分页可改用 {dede:listsql} 标签或在 loop 外层手动拼接分页参数。
性能优化建议
- 查询条件字段务必建索引,特别是
typeid、pubdate、click。 row控制在合理范围(≤50),避免一次查太多。- 复杂 JOIN 查询启用 SQL 缓存。
- 避免在首页使用大表全表扫描。
- 开启
$cfg_dsql_cache缓存查询结果。
常见问题
loop 不输出任何内容
1) 表名写错(前缀可能不是 dede_,而是 dede_);2) if 条件写错;3) 字段名拼写错误。
SQL 注入风险
不要把用户输入直接拼到 if 中,用 if='typeid='.intval($tid) 强制转整数。
行动建议
用 loop 之前先想清楚能否用 arclist、channel 等专用标签实现,专用标签性能和安全性都更好。loop 是「最后一招」,用于专用标签覆盖不到的场景。建议把常用的 loop 查询封装成自定义标签或函数,避免模板里满屏 SQL,提升可维护性。把数据库表结构和索引情况整理成文档,写 loop 时心里有数,查询效率才有保障。