- 后台管理排序:指在后台栏目列表中,手动拖动或设置一个数字来调整栏目的显示顺序,这个顺序主要用于后台管理,不会直接影响前台网站栏目的显示顺序。
- 前台显示排序:指在前台网站(如导航栏、侧边栏)中,栏目按照指定的规则(如后台排序、文章数量、发布时间等)进行排列,这才是我们通常所说的“生成排序栏目”。
下面我将分别对这两种情况进行详细说明。

(图片来源网络,侵删)
后台管理排序(不影响前台)
这是最基础、最简单的排序方式,用于管理员在后台更好地组织栏目。
操作步骤:
- 登录后台:使用管理员账号登录您的 DedeCMS 后台。
- 进入栏目管理:在左侧菜单中,找到
栏目->栏目管理。 - 进行排序:
- 方法A(推荐):直接拖动,在栏目列表页面,将鼠标悬停在您想移动的栏目行上,会出现一个“四向箭头”图标,按住鼠标左键,上下拖动到您想要的位置,松开即可。
- 方法B:使用排序数字,在栏目列表的“排序”一列,每个栏目都有一个数字,直接修改这个数字,然后点击底部的“保存排序”按钮,DedeCMS 会按照数字从小到大的顺序排列栏目(数字越小,排序越靠前)。
重要提示:这个排序仅用于后台列表的显示顺序,默认情况下,不会改变前台网站栏目(如导航栏)的显示顺序,前台栏目的顺序通常由栏目的“类型”和“上级栏目”决定。
前台显示排序(影响网站用户看到的顺序)
这才是我们通常需要的功能,即让网站上的栏目(如主导航、文章列表等)按照我们设定的规则来排序,实现这个功能的关键在于 SQL 查询。

(图片来源网络,侵删)
我们将通过修改模板文件,使用自定义的 SQL 语句来获取排序后的栏目列表。
场景1:按照后台“排序”数字进行排序
这是最常见的需求,让前台栏目也遵循后台的“排序”值。
操作步骤:
-
后台设置排序:首先按照“方法一”的步骤,在后台将您想要的栏目顺序设置好。
(图片来源网络,侵删) -
找到前台模板文件:
- 主导航栏:通常位于
/templets/default/目录下,文件名为head.htm。 - 侧边栏栏目列表:这取决于您的具体页面和调用方式,可能需要根据您的网站结构来查找,在文章列表页
list_article.htm或首页index.htm中查找调用栏目的代码。
- 主导航栏:通常位于
-
修改模板文件:
- 用文本编辑器(如 Notepad++、VS Code)打开您需要修改的模板文件。
- 找到调用顶级栏目的代码,它通常是这样的:
{dede:channel type='top' row='8'} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} - 关键修改:我们需要为这个标签添加一个
sql属性,并编写自定义的 SQL 查询,DedeCMS 的标签支持在sql属性中直接执行 SQL。
修改后的代码如下:
{dede:sql sql='SELECT id,typename,typedir,isdefault,defaultname,issystem,ishome,channeltype,corank,description,keywords,seotitle,moresite,siteurl,sitepath FROM dede_arctype WHERE reid = 0 ORDER BY sortrank ASC'} <li><a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a></li> {/dede:sql}代码解释:
dede:sql:自定义 SQL 查询标签。sql='...':SQL 语句。SELECT id,typename,typedir...:从dede_arctype表中(这是 DedeCMS 存储栏目的表)我们需要的字段。WHERE reid = 0:reid是上级栏目的 ID。reid = 0表示只查询顶级栏目。ORDER BY sortrank ASC:这是核心! 它指定查询结果按照sortrank字段(即后台的“排序”字段)进行升序排列(ASC是从小到大,DESC是从大到小)。[field:typedir function='str_replace("{cmspath}", "", "@me")'/]:由于typedir字段中包含了{cmspath}这样的变量,我们需要用function进行处理,替换掉它,得到正确的栏目链接地址。
-
保存并更新:保存修改后的模板文件,然后到后台“生成” -> “更新主页”或“更新HTML”,让修改生效。
场景2:按照文章数量进行排序
有时候我们希望栏目按照其包含的文章数量来排序,热门栏目排在前面。
操作步骤:
-
找到模板文件:同上,找到需要修改的模板文件。
-
修改模板文件:使用 SQL 联表查询,结合
dede_arctype和dede_archives(文章表)。修改后的代码如下:
{dede:sql sql='SELECT a.id, a.typename, a.typedir, count(b.id) as article_count FROM dede_arctype as a LEFT JOIN dede_archives as b ON a.id = b.typeid WHERE a.reid = 0 GROUP BY a.id ORDER BY article_count DESC'} <li><a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/] ([field:article_count/])</a></li> {/dede:sql}代码解释:
FROM dede_arctype as a LEFT JOIN dede_archives as b ON a.id = b.typeid:将栏目表(a)和文章表(b)通过typeid字段关联起来。count(b.id) as article_count:统计每个栏目下文章的数量,并命名为article_count。GROUP BY a.id:按栏目 ID 分组,这样才能正确统计每个栏目的文章数。ORDER BY article_count DESC:按照我们刚刚统计出的article_count进行降序排列,这样文章数量多的栏目就会排在前面。[field:article_count/]:在模板中调用文章数量。
总结与建议
| 排序方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 后台拖动/排序 | 仅需在后台整理栏目,不改变前台显示。 | 简单直观,无需修改代码。 | 不影响前台用户体验。 |
前台按 sortrank 排序 |
希望前台栏目(如导航)和后台顺序一致。 | 实现简单,符合常规管理习惯。 | 需要修改模板文件。 |
| 前台按文章数排序 | 制作热门栏目推荐、按热度排序的导航。 | 动态展示,内容更吸引人。 | SQL 查询稍复杂,对数据库性能有轻微影响。 |
最佳实践建议:
- 导航栏:通常建议使用后台排序(
sortrank)来控制,这样网站结构清晰,管理员也容易维护。 - 侧边栏推荐:可以在侧边栏使用按文章数排序的 SQL,展示热门栏目,增加用户互动。
重要提醒:在修改模板文件和编写 SQL 时,请务必:
- 备份原文件:修改前务必备份原始模板文件,以防出错。
- 检查表前缀:如果你的
dede_arctype表前缀不是dede_(例如修改过),请将 SQL 中的表名相应修改。 - 谨慎操作:错误的 SQL 可能导致网站无法正常显示,如果不确定,可以先在本地测试环境进行操作。
