orderby 是 DedeCMS 中一个非常重要且常用的参数,它主要用于 对数据库查询结果进行排序,它通常与 row(返回结果数量)、col(列数)等参数一起,在列表标签(如 {dede:arclist}、{dede:channelartlist})和循环标签(如 {dede:loop})中使用。

(图片来源网络,侵删)
orderby 的基本语法
orderby 参数通常放在标签的属性中,格式如下:
{dede:arclist row='10' orderby='排序方式'}
<li>
<a href='[field:arcurl/]'>[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
这里的 orderby='排序方式' 就是核心。排序方式 可以是预定义的关键字,也可以是自定义的 SQL 片段。
常用预定义排序方式
DedeCMS 内置了一些非常方便的排序关键字,你无需编写复杂的 SQL 即可实现常用排序。
| 排序方式 (关键字) | 说明 | 示例 |
|---|---|---|
sort |
默认值,按文章排序值排序(后台“常规选项”中设置的“排序”字段)。 | orderby='sort' |
hot 或 click |
按点击数(浏览量)从高到低排序。 | orderby='hot' |
pubdate |
按发布日期从新到旧排序(降序)。 | orderby='pubdate' |
pubdateasc |
按发布日期从旧到新排序(升序)。 | orderby='pubdateasc' |
id |
按文章 ID 从大到小排序(降序)。 | orderby='id' |
idasc |
按文章 ID 从小到大排序(升序)。 | orderby='idasc' |
lastpost |
按最后评论时间排序。 | orderby='lastpost' |
scores |
按文章得分(如顶踩数)排序。 | orderby='scores' |
rand |
随机排序,每次刷新页面,文章顺序都会打乱。 | orderby='rand' |
示例:获取点击量最高的 5 篇文章
{dede:arclist row='5' orderby='click'}
<a href="[field:arcurl/]">[field:title/]</a> (点击: [field:click/])
{/dede:arclist}
自定义 SQL 排序(高级用法)
当预定义的排序方式无法满足你的需求时(按某个自定义字段排序),你可以使用自定义的 SQL 片段。

(图片来源网络,侵删)
语法: orderby='自定义SQL片段'
注意:
- 你不需要写
ORDER BY关键字,标签会自动加上。 - 直接写排序的字段名或表达式即可。
- 默认是降序(
DESC),如果需要升序(ASC),必须在字段名后加上asc。
示例 1:按自定义字段 price 从高到低排序
假设你给文章添加了一个自定义字段 price(价格),并且字段名为 price。
{dede:arclist row='10' orderby='price'}
<a href="[field:arcurl/]">[field:title/]</a> - 价格: [field:price/]
{/dede:arclist}
这会生成类似 ORDER BY price DESC 的 SQL 语句。

(图片来源网络,侵删)
示例 2:按自定义字段 price 从低到高排序
{dede:arclist row='10' orderby='price asc'}
<a href="[field:arcurl/]">[field:title/]</a> - 价格: [field:price/]
{/dede:arclist}
这会生成类似 ORDER BY price ASC 的 SQL 语句。
示例 3:按多个字段排序(先按 sort,再按 pubdate)
{dede:arclist row='10' orderby='sort,pubdate desc'}
...
{/dede:arclist}
这会生成类似 ORDER BY sort ASC, pubdate DESC 的 SQL 语句,注意多个排序字段之间用英文逗号 隔开。
在 {dede:sql} 标签中使用 orderby
{dede:sql} 标签用于直接执行自定义的 SQL 查询,在这种情况下,orderby 的用法略有不同,因为它需要包含完整的 ORDER BY 子句。
语法: 在 sql 属性中直接编写完整的 ORDER BY 语句。
示例:查询 dede_archives 表中点击量最高的 10 篇文章
{dede:sql sql="SELECT title,click FROM dede_archives ORDER BY click DESC LIMIT 0, 10"}
<li>
<a href="#">[field:title/]</a> (点击: [field:click/])
</li>
{/dede:sql}
注意对比:
- 在
{dede:arclist}中,你只写orderby='click'。 - 在
{dede:sql}中,你必须写完整的sql="... ORDER BY click DESC ..."。
总结与最佳实践
- 优先使用预定义关键字:对于常规需求(如按时间、点击量排序),直接使用
pubdate、click等关键字,简单高效。 - 自定义字段排序:当需要按文章模型中的自定义字段(如价格、销量、作者等)排序时,使用
orderby='字段名'或orderby='字段名 asc'。 - 随机排序:
orderby='rand'适用于实现“随机推荐”等功能,但请注意,在数据量大的表上使用ORDER BY RAND()可能会影响性能。 - 区分标签用法:牢记在
{dede:arclist}等列表标签和{dede:sql}标签中orderby的用法是不同的,后者需要写完整的 SQL 语句。 - 性能考虑:复杂的排序(尤其是多表连接后的排序)可能会对数据库造成较大压力,应尽量避免在数据量巨大的表上进行不必要的复杂排序。
希望这份详细的解释能帮助你完全掌握 DedeCMS 中 orderby 的使用!
