loop。loop函数可以直接在模板文件(.htm)中执行SQL查询,并将结果循环输出。

(图片来源网络,侵删)
下面我将详细介绍loop函数的用法,并提供几种最常见的文章调用场景示例。
核心函数:loop
loop函数是DedeCMS为了在模板中直接执行SQL查询而设计的,它的基本语法如下:
{dede:loop table='表名' sort='排序字段' row='记录条数' if='条件语句'}
// 循环体内的内容,即每条记录的显示格式
{/dede:loop}
参数详解:
table(必需): 指定要查询的数据库表名,对于文章调用,通常是dede_archives(文章主表)或dede_arctype(栏目表)。sort(可选): 指定排序方式。id: 按文章ID排序pubdate: 按发布时间排序click: 按点击量排序rand(): 随机排序hot: 按热度排序(需要额外配置)
row(可选): 指定获取的记录条数。row='10'表示获取10条记录。if(可选): 指定查询条件,这是实现“相关文章”等复杂功能的关键。if="typeid='2' AND arcrank > -1"。
循环体内可用字段:
在 {dede:loop} 和 {/dede:loop} 之间,你可以使用当前记录的字段,对于文章调用,最常用的字段来自 dede_archives 表,包括:
id: 文章IDtypeid: 栏目ID: 文章标题shorttitle: 文章短标题pubdate: 发布时间(时间戳)click: 点击量arcrank: 文章状态(-1为待审核,0为正常)ismake: 是否生成静态页channel: 所属模型ID
常见文章调用场景示例
假设我们要在文章详情页(article_article.htm)或列表页(list_*.htm)中调用相关文章。

(图片来源网络,侵删)
最新文章
调用全站最新的10篇文章。
<h3>最新文章</h3>
<ul>
{dede:loop table='dede_archives' sort='pubdate' row='10' if='arcrank=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span>([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
</li>
{/dede:loop}
</ul>
说明:
sort='pubdate': 按发布时间降序排列(最新的在前)。if='arcrank=0': 只调用状态为“正常”的文章,过滤掉待审核的。[field:arcurl/]: 这是DedeCMS的默认标签,用于获取文章的链接。注意:loop标签默认不支持arcurl,需要DedeCMS V5.7及以上版本或开启相关功能,如果无效,可以手动拼接链接:/plus/view.php?aid=[field:id/]。[field:pubdate function="MyDate('Y-m-d',@me)"/]: 对时间戳进行格式化,显示为年-月-日。
热门文章
调用全站点击量最高的10篇文章。
<h3>热门文章</h3>
<ul>
{dede:loop table='dede_archives' sort='click' row='10' if='arcrank=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span>(点击:[field:click/])</span>
</li>
{dede:loop}
</ul>
说明:

(图片来源网络,侵删)
sort='click': 按点击量降序排列。
随机文章
随机调用10篇文章,每次刷新页面都会变化。
<h3>随机推荐</h3>
<ul>
{dede:loop table='dede_archives' sort='rand()' row='10' if='arcrank=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:loop}
</ul>
说明:
sort='rand()': 使用rand()函数进行随机排序。
相关文章(最常用)
这是loop功能最强大的地方,实现相关文章通常有两种思路:
同栏目文章
调用与当前文章同一栏目的其他文章(不包括自己)。
<h3>相关文章</h3>
<ul>
{dede:loop table='dede_archives' sort='pubdate' row='8' if='typeid=[field:typeid/] AND id != [field:id/] AND arcrank=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:loop}
</ul>
说明:
typeid=[field:typeid/]: 这是关键![field:typeid/]会获取到当前文章所在的栏目ID,注意,这个标签只能在文章内容页模板中使用。id != [field:id/]: 排除当前文章本身,避免显示重复。
关键词相关(更智能)
调用包含当前文章关键词的其他文章,这需要先获取当前文章的关键词,然后进行模糊查询。
<h3>关键词相关</h3>
<ul>
{dede:loop table='dede_archives' sort='pubdate' row='8' if='keywords LIKE "%[field:keywords/]%" AND id != [field:id/] AND arcrank=0'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:loop}
</ul>
说明:
keywords LIKE "%[field:keywords/]%": 使用LIKE进行模糊匹配,是通配符,表示任意字符。- 注意:这种方法的缺点是,如果当前文章的关键词是“网站建设”,那么标题为“我的网站建设日记”和“网站建设的重要性”都会被匹配到,但标题为“网站优化”的则不会,效果取决于关键词的设置。
进阶技巧与注意事项
-
arcurl标签问题:- 在较新版本的DedeCMS中,
{dede:loop}内的[field:arcurl/]默认是可用的。 - 如果在你的版本中无效,最可靠的方法是手动拼接链接:
/plus/view.php?aid=[field:id/]。
- 在较新版本的DedeCMS中,
-
使用SQLJOIN查询: 如果你想同时获取文章标题和栏目名称,而
dede_archives表中没有栏目名称,你需要进行JOIN查询,连接dede_archives和dede_arctype表。<h3>带栏目名的文章列表</h3> <ul> {dede:loop table='dede_archives a LEFT JOIN dede_arctype t ON a.typeid=t.id' sort='a.pubdate' row='5' if='a.arcrank=0'} <li> <span>[field:typename/]</span> - <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a> </li> {/dede:loop} </ul>table='dede_archives a LEFT JOIN dede_arctype t ON a.typeid=t.id': 这里给表起了别名a和t,并在typeid字段上连接。[field:typename/]: 现在就可以获取到栏目名称了。
-
性能考虑:
loop功能非常强大,但因为它直接在模板中执行SQL,如果使用不当(例如复杂的JOIN、大量的数据),可能会对网站性能产生一定影响。- 对于热门文章、最新文章等调用频率高的模块,建议数据量不要设置得过大(
row值不宜过高)。 - 尽量使用简单的
if条件。
-
标签与
loop的选择:- 对于调用当前栏目、指定栏目下的文章,使用DedeCMS内置的标签(如
{dede:arclist})通常更简单、高效,且支持更多参数。 - 当你需要进行跨表查询、复杂条件筛选(如相关文章)时,
{dede:loop}是最佳选择。
- 对于调用当前栏目、指定栏目下的文章,使用DedeCMS内置的标签(如
| 调用类型 | loop 代码片段 |
适用场景 |
|---|---|---|
| 最新文章 | {dede:loop table='dede_archives' sort='pubdate' row='10' if='arcrank=0'}...{/dede:loop} |
全站或指定区域展示最新内容。 |
| 热门文章 | {dede:loop table='dede_archives' sort='click' row='10' if='arcrank=0'}...{/dede:loop} |
展示点击量高的文章,吸引用户。 |
| 随机文章 | {dede:loop table='dede_archives' sort='rand()' row='10' if='arcrank=0'}...{/dede:loop} |
增加页面新鲜感,展示用户可能忽略的内容。 |
| 同栏相关 | {dede:loop ... if='typeid=[field:typeid/] AND id != [field:id/]'}...{/dede:loop} |
文章详情页,提供高度相关的阅读内容。 |
| 关键词相关 | {dede:loop ... if='keywords LIKE "%[field:keywords/]%" AND id != [field:id/]'}...{/dede:loop} |
文章详情页,基于内容主题推荐。 |
掌握{dede:loop}函数,你就能在织梦模板中实现绝大多数复杂的数据调用需求,让你的网站内容更加丰富和互联。
