通过修改列表页模板文件,增加带有不同排序参数的链接,然后修改或调用相应的列表标签,使其能识别并响应这些参数。

下面我将分两种最常见的情况来讲解,并提供详细的代码和步骤。
文章列表页(最常见)
假设我们要在文章列表页(如 list_article.htm旁边增加一个“点击量”排序的链接。
第 1 步:修改列表页模板文件
打开你的文章列表模板文件,通常位于 /templets/你的默认模板目录/list_article.htm。
找到你想要添加排序链接的位置,比如文章标题的 <h3> 标签旁边,加入以下代码:

<h3>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<!-- 在这里添加排序链接 -->
<span style="margin-left: 15px; font-size: 12px; color: #666;">
排序:
<a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=click">点击量</a>
</span>
</h3>
代码解释:
{dede:global.cfg_cmspath/}:这是 DedeCMS 的全局变量,代表你的网站根目录,确保链接正确。special_sort.php:这是一个关键文件,DedeCMS 自带的一个专门用于处理排序功能的动态页面,我们不直接修改list.php,而是通过它来调用,更规范。tid={dede:field.id/}:传递当前栏目的 ID,确保排序的是当前栏目下的内容。orderby=click:这是我们自己定义的排序参数。click代表按点击量排序,你也可以换成pubdate(发布时间)、hot(人气/点击量) 等。
为了让用户体验更好,我们还可以增加一个“升序/降序”切换和“默认排序”的链接。
<span style="margin-left: 15px; font-size: 12px; color: #666;">
排序:
<a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=click">点击量</a> |
<a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}&orderby=pubdate">发布时间</a> |
<a href="{dede:global.cfg_cmspath/}/special_sort.php?tid={dede:field.id/}">默认排序</a>
</span>
第 2 步:创建或修改 special_sort.php 文件
如果你的网站根目录下没有 special_sort.php 文件,你需要手动创建一个,如果已有,则修改它。
创建文件:
在网站根目录()下新建一个文件,命名为 special_sort.php。

编写代码:
将以下代码完整复制到 special_sort.php 文件中:
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
$tid = isset($tid) && is_numeric($tid) ? $tid : 0;
$orderby = isset($orderby) ? trim($orderby) : '';
$keyword = isset($keyword) ? trim($keyword) : '';
if($tid == 0) {
ShowMsg('栏目ID不能为空!', '-1');
exit();
}
// 获取栏目信息
$channelType = GetChannelType($tid);
$channelType = $channelType == '-1' ? 'article' : $channelType;
// 构建查询条件
$addsql = '';
if (!empty($keyword)) {
$addsql = " AND arc.title LIKE '%$keyword%'";
}
// 根据 orderby 参数构建排序 SQL
if (!empty($orderby)) {
switch ($orderby) {
case 'click':
$ordersql = " ORDER BY arc.click DESC";
break;
case 'pubdate':
$ordersql = " ORDER BY arc.pubdate DESC";
break;
case 'hot':
$ordersql = " ORDER BY arc.hot DESC";
break;
case 'scores':
$ordersql = " ORDER BY arc.scores DESC";
break;
case 'rand':
$ordersql = " ORDER BY rand()";
break;
default:
$ordersql = " ORDER BY arc.sortrank DESC"; // 默认按权重排序
}
} else {
$ordersql = " ORDER BY arc.sortrank DESC"; // 默认排序
}
// 设置分页参数
$PageSize = 20; // 每页显示多少条
$GetNums = " $addsql $ordersql ";
$ctag = new PartView();
$ctag->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $cfg_df_style . "/list_article.htm");
$ctag->Display();
?>
代码解释:
require_once "include/common.inc.php";:加载 DedeCMS 的核心文件。$tid = isset($tid) ...:获取并验证栏目 ID。$orderby = isset($orderby) ...:获取我们通过链接传递过来的orderby参数。switch ($orderby):这是核心逻辑,它会判断$orderby的值,然后构建对应的 SQL 排序语句,如ORDER BY arc.click DESC(按点击量降序)。$ctag = new PartView();:创建一个列表视图对象。$ctag->SetTemplet(...):指定要使用的列表模板文件,这里我们直接使用了默认的list_article.htm,你也可以指定其他模板。$ctag->Display();:执行并显示列表内容。
第 3 步:更新栏目并测试
- 登录 DedeCMS 后台。
- 进入“[核心] -> [批量更新栏目HTML]”。
- 找到你刚才修改了模板的栏目,点击“开始更新”。
- 更新完成后,访问你的文章列表页,点击你添加的“点击量”排序链接,应该就能看到文章按照点击量重新排序了。
自定义列表标签(更灵活)
我们可能不想使用 special_sort.php,或者想在更复杂的地方使用排序功能,这时,可以直接在模板中使用 dede:list 标签,并通过 PHP 代码动态修改其 sql 属性。
注意: 这种方法通常需要开启模板的 PHP 支持,或者在 DedeCMS 5.7 版本中,dede:list 标签本身支持部分动态逻辑。
第 1 步:修改模板文件
同样,打开你的列表模板文件(如 list_article.htm)。
在 {dede:list} 标签之前,加入一段 PHP 代码来获取排序参数,并动态构建 SQL 语句。
{dede:php}
// 获取排序参数
$orderby = isset($orderby) ? trim($orderby) : 'sortrank';
$ordersql = '';
// 根据参数设置排序
if ($orderby == 'click') {
$ordersql = " ORDER BY arc.click DESC";
} elseif ($orderby == 'pubdate') {
$ordersql = " ORDER BY arc.pubdate DESC";
} else {
$ordersql = " ORDER BY arc.sortrank DESC";
}
// 将排序 SQL 注入到 list 标签中
// 注意:这需要你的 list 标签有 sql 属性,或者通过其他方式实现
// 在 DedeCMS 5.7 中,可以直接在 list 标签里写,但更推荐使用下面的方法
{/dede:php}
<!-- 使用 arclist 标签,它更灵活 -->
{dede:arclist titlelen='50' row='10' orderby='sortrank'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>点击:[field:click/]</span>
</li>
{/dede:arclist}
更推荐的 arclist 方法:
{dede:arclist} 标签本身支持 orderby 属性,我们可以通过 PHP 动态设置它的值。
{dede:php}
// 获取排序参数
$globalOrderBy = isset($orderby) ? trim($orderby) : 'sortrank';
{/dede:php}
{dede:arclist titlelen='50' row='10' orderby='$globalOrderBy'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>点击:[field:click/]</span>
</li>
{/dede:arclist}
然后在你的排序链接中,直接传递 orderby 参数即可:
<a href="{dede:field name='phpurl'/}/list.php?tid={dede:field.id/}&orderby=click">按点击量排序</a>
<a href="{dede:field name='phpurl'/}/list.php?tid={dede:field.id/}&orderby=pubdate">按时间排序</a>
这里的 {dede:field name='phpurl'/} 会自动输出你的 php 目录路径,比硬编码 special_sort.php 或 list.php 更好。
总结与注意事项
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
special_sort.php |
官方推荐,规范稳定,不依赖模板PHP支持,逻辑清晰。 | 需要额外创建一个文件。 | 绝大多数情况,特别是对新手来说最稳妥的方法。 |
arclist + PHP |
非常灵活,可以直接在模板内控制,无需新文件。 | 需要模板支持PHP执行,对有一定基础的开发者更友好。 | 需要在模板内进行复杂逻辑判断,或不想创建新文件时。 |
重要提示:
- 文件路径:确保
special_sort.php或list.php的路径正确。 - 栏目缓存:修改栏目后,一定要去后台“批量更新栏目HTML”,否则可能看不到效果。
- 模板缓存:如果排序不生效,可以尝试清空一下 DedeCMS 的模板缓存。
- SQL 安全:
special_sort.php方法中的switch语句已经做了很好的过滤,但如果使用其他方法拼接 SQL,务必注意防止 SQL 注入。
希望这个详细的教程能帮助你成功实现 DedeCMS 的点击排序功能!
