栏目排序概述
织梦CMS的栏目排序功能允许管理员自定义栏目在导航、列表和模板中的显示顺序。通过设置 sortrank 字段的值(数字越小越靠前),可以灵活控制各级别栏目的显示顺序。较早版本的织梦CMS不原生支持拖拽排序,需要通过插件或手动方式实现。
一、后台手动设置排序
在栏目管理中调整排序值:
- 进入
核心 > 栏目管理 - 每个栏目显示有"排序"字段(sortrank值)
- 点击栏目右侧的"更改"
- 在栏目属性中修改"排列顺序"或"sortrank"值
- 数字越小越靠前显示(例如:1排第一,10排第十)
排序技巧:建议使用间隔数值(如10、20、30...),方便以后在中间插入新栏目而无需调整所有栏目的排序值。
二、通过 SQL 批量调整排序
-- 将所有顶级栏目按ID重新排序 SET @rownum=0; UPDATE dede_arctype SET sortrank=(@rownum :=@rownum + 1) * 10 WHERE reid=0 ORDER BY id ASC; -- 将指定栏目移到最前面 UPDATE dede_arctype SET sortrank=0 WHERE id=目标栏目ID; -- 将某个子栏目的排序与父栏目对齐 UPDATE dede_arctype SET sortrank=(SELECT sortrank FROM dede_arctype AS p WHERE p.id=dede_arctype.reid) + 10 WHERE reid > 0;
三、添加拖拽排序插件
如果后台不支持拖拽排序,可以通过安装插件或修改后台文件来实现。以下是通过修改 dede/catalog_main.php 添加拖拽功能的思路:
<!-- 引入jQuery UI Sortable插件 -->
<script src="jquery.min.js"></script>
<script src="jquery-ui.min.js"></script>
<script>
$(function(){
// 使栏目列表支持拖拽排序
$("#catalog-list tbody").sortable({
handle: ".drag-handle",
update: function(event, ui){
var order=$(this).sortable("toArray");
// 通过AJAX将新顺序发送到服务器
$.post("catalog_sort.php", {order: order}, function(res){
if(res.success) alert("排序已保存");
}, "json");
}
});
});
</script>
处理排序请求的PHP文件(catalog_sort.php):
<?php
require_once(dirname(__FILE__)."/config.php");
$order=$_POST['order']; // 栏目ID数组,按新顺序排列
foreach($order as $index=> $typeid){
$rank=($index + 1) * 10; // 新的排序值
$dsql->ExecuteNoneQuery(
"UPDATE dede_arctype SET sortrank={$rank} WHERE id=" . intval($typeid)
);
}
echo json_encode(['success'=> true]);
?>
四、模板中按 sortrank 排序显示
确保模板标签使用 sortrank 排序:
<!-- arclist 按sortrank排序 -->
{dede:arclist typeid='3' row='10' orderby='sortrank'}
<!-- channel 标签默认按sortrank排序,也可显式指定 -->
{dede:channel type='top' row='10' orderby='sortrank'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
<!-- SQL标签明确按sortrank排序 -->
{dede:sql sql="SELECT * FROM dede_arctype
WHERE reid=0 AND ishidden=0
ORDER BY sortrank ASC, id ASC"}
<a href="[field:typedir/]">[field:typename/]</a>
{/dede:sql}
五、栏目排序的注意事项
- 排序值冲突:多个栏目sortrank值相同时,按ID升序排列
- 子栏目排序:子栏目的排序在父栏目范围内独立计算,不会和同级其他父栏目的子栏目混淆
- 缓存影响:修改排序后需要更新系统缓存,静态页面需要重新生成
- 导航排序:导航菜单的栏目顺序完全由sortrank值决定,与栏目创建时间无关
六、排序示例
假设有以下栏目需要按指定顺序排列:
排序前(默认按创建顺序): 经典文学 (sortrank=50) 现代小说 (sortrank=10) 诗歌散文 (sortrank=30) 排序后(手动调整): 现代小说 (sortrank=10) 诗歌散文 (sortrank=30) 经典文学 (sortrank=50) <!-- SQL实现一键重排序 --> UPDATE dede_arctype SET sortrank=10 WHERE typename='现代小说'; UPDATE dede_arctype SET sortrank=30 WHERE typename='诗歌散文'; UPDATE dede_arctype SET sortrank=50 WHERE typename='经典文学';
实用建议:建议在网站规划阶段就确定栏目的排序方案,并为每个栏目预留sortrank数值间隔(建议10-20的间隔)。这样后续添加新栏目时,只需调整少量栏目的排序值即可。