使用 GetTopInfos 函数 + 自定义PHP代码(最推荐)
这是最灵活、最强大的方法,可以完全控制输出的HTML结构,并且性能很好,它通过PHP代码在模板中直接生成随机栏目列表。

(图片来源网络,侵删)
适用场景:首页、自定义页面模板等需要高度定制化输出样式的场景。
实现步骤:
-
打开模板文件:用编辑器打开你需要添加随机栏目的模板文件,
index.htm(首页模板)。 -
添加PHP代码:在模板中需要显示随机栏目的位置,插入以下PHP代码。
(图片来源网络,侵删){dede:php} // 1. 调用顶级栏目 // $topInfos 是一个包含所有顶级栏目的数组 $topInfos = GetTopInfos(); // 2. 打乱数组顺序,实现随机效果 shuffle($topInfos); // 3. 设置要显示的栏目数量 $displayCount = 6; // 只显示6个随机栏目 // 4. 循环输出 for ($i = 0; $i < $displayCount && $i < count($topInfos); $i++) { $topid = $topInfos[$i]['id']; $typename = $topInfos[$i]['typename']; $typedir = $topInfos[$i]['typedir']; // 拼接链接 $url = !empty($topInfos[$i]['siteurl']) ? $topInfos[$i]['siteurl'] : $typedir; // 输出HTML,你可以自定义这里的样式 echo "<li><a href='{$url}' title='{$typename}'>{$typename}</a></li>"; } {/dede:php}
代码详解:
{dede:php}...{/dede:php}:这是DedeCMS的PHP执行标签,允许在模板中直接写PHP代码。GetTopInfos():这是DedeCMS的一个核心函数,用于获取所有顶级栏目的信息,并返回一个包含详细信息的数组。shuffle($topInfos):PHP内置函数,用于将数组中的元素顺序随机打乱。$displayCount = 6;:你可以修改这个数字来控制显示多少个随机栏目。for (...):一个循环,用来遍历打乱后的数组,并输出指定数量的栏目。$topInfos[$i]['id'],$topInfos[$i]['typename'],$topInfos[$i]['typedir']:分别获取栏目的ID、名称和目录。$url = ...:判断栏目是否设置了外部链接 (siteurl),如果有则使用外部链接,否则使用内部栏目路径。echo "<li>...</li>":这里是你自定义的HTML输出,你可以根据网站CSS结构修改成<div>、<a>等任何你需要的标签。
使用 channel 标签 + orderby='rand'(最简单)
如果你的需求只是简单地随机显示栏目,并且对HTML结构要求不高,可以直接使用DedeCMS的 channel 标签,并指定排序方式为随机。
适用场景:快速实现,对样式要求不高的地方。
实现步骤:

(图片来源网络,侵删)
-
打开模板文件:同样,打开你的模板文件。
-
添加
channel:<ul> {dede:channel type='top' row='6' orderby='rand'} <li><a href='[field:typelink/]'>[field:typename/]</a></li> {/dede:channel} </ul>
标签属性说明:
type='top':表示只调用顶级栏目,如果你想调用所有栏目(包括子栏目),可以去掉这个属性或设置为son。row='6':表示要调用的栏目数量。orderby='rand':这是实现随机的关键,它告诉DedeCMS按随机顺序获取栏目。[field:typelink/]:单栏目链接的底层字段。[field:typename/]:单栏目名称的底层字段。
使用SQL标签 {dede:sql}(最灵活,适合复杂筛选)
如果你的随机需求更复杂,随机显示顶级栏目中,栏目内容数大于10的栏目”,那么使用 channel 标签就不够用了,这时,{dede:sql} 标签是你的最佳选择。
适用场景:需要结合数据库表进行复杂条件筛选的随机调用。
实现步骤:
-
分析数据库:我们需要从
dede_arctype(栏目表) 中获取数据。 -
编写SQL语句并添加到模板:
{dede:sql sql='SELECT id, typename, typedir FROM `dede_arctype` WHERE reid = 0 ORDER BY rand() LIMIT 0,6'} <li><a href='[field:typedir function='str_replace("{cmspath}", "", "@me")'/]/' title='[field:typename/]'>[field:typename/]</a></li> {/dede:sql}
SQL语句详解:
SELECT id, typename, typedir FROM dede_arctype:选择需要的字段。WHERE reid = 0:reid是父栏目的ID,reid=0表示只查询顶级栏目,如果你想查询所有栏目,去掉此条件。ORDER BY rand():按随机顺序排序。LIMIT 0,6:从第0条记录开始,获取6条记录,这就是限制数量的方法。
底层字段处理:
[field:typedir/]返回的可能是{cmspath}/a/b这样的路径,我们需要去掉开头的{cmspath},所以使用了function='str_replace("{cmspath}", "", "@me")'来处理。[field:typename/]:栏目名称,直接使用即可。
总结与对比
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
GetTopInfos + PHP |
灵活性最高,可完全控制HTML和逻辑,性能好。 | 需要写一点PHP代码,对新手略有门槛。 | ⭐⭐⭐⭐⭐ |
channel |
最简单,代码量少,标签化使用方便。 | 灵活性较低,样式和功能受限于标签本身。 | ⭐⭐⭐⭐ |
sql |
功能最强大,可以实现任何复杂的筛选条件。 | 需要懂SQL语句,直接操作数据库有一定风险。 | ⭐⭐⭐⭐ |
最终建议:
- 对于绝大多数用户,方法一 是最佳选择,它在灵活性和易用性之间取得了最好的平衡。
- 如果你只是想快速实现一个简单的随机列表,方法二 足够用了。
- 如果你是一个有经验的开发者,需要非常复杂的业务逻辑,方法三 将给你最大的自由度。
希望这些方法能帮助你完美实现DedeCMS的随机栏目调用!
