使用 GetTopids 函数(推荐,最灵活)
这是最常用且最灵活的方法,因为它可以让你自由地控制调用的数量、排序方式以及排除某些特定栏目。

(图片来源网络,侵删)
核心代码
{dede:channelArtlist typeid='0' orderby='rand'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channelArtlist}
代码详解
{dede:channelArtlist ...}: 这是一个专门用于调用栏目标签的循环标签。typeid='0':typeid用于指定要调用的栏目ID。- 当
typeid='0'时,表示调用所有顶级栏目。 - 如果你想在某个特定栏目下调用其子栏目,就填写这个栏目的ID,
typeid='5'。
orderby='rand':- 这是实现随机的关键!它告诉DedeCMS按照随机顺序来获取栏目。
- 除了
rand,你还可以使用id(按ID排序)、sortrank(按后台排序权重) 等。
如何限制调用数量?
默认情况下,这个标签会调用所有符合条件的栏目,如果你只想随机调用 N个 栏目,你需要配合一个自定义函数来实现。
步骤:
-
打开你的
/include/common.func.php文件(在文件末尾?>之前)。 -
添加以下自定义函数:
(图片来源网络,侵删)// 随机获取指定数量的栏目ID function getRandChannels($num) { $dsql = new DedeSql(false); $sql = "SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=0 ORDER BY rand() LIMIT 0, $num"; // 如果你需要调用所有顶级栏目,包括外部链接,可以这样写: // $sql = "SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=0 AND ispart<>2 ORDER BY rand() LIMIT 0, $num"; $dsql->SetQuery($sql); $dsql->Execute(); $channels = array(); while($row = $dsql->GetArray()) { $channels[] = $row; } return $channels; } -
在你的模板文件(如
index.htm)中,使用这个函数:{dede:getRandChannels num='5' function='getRandChannels(@me)'/} {loop $fields $channel} <a href="{$channel['typedir']}">{$channel['typename']}</a> {/loop}num='5': 定义你想随机获取的栏目数量,这里是5个。function='getRandChannels(@me)': 调用我们刚刚在common.func.php中定义的函数。{loop $fields $channel}: 循环输出函数返回的结果数组。
使用 arclist 标签(巧妙的用法)
arclist 主要是用来调用文章列表的,但它有一个隐藏功能,可以用来随机调用栏目。
核心代码
{dede:arclist typeid='0' channelid='-1' orderby='rand' row='5'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:arclist}
代码详解
{dede:arclist ...}: 文章列表标签。typeid='0': 指定栏目ID,0表示所有栏目。channelid='-1':- 这是实现调用栏目的关键!
channelid指定要获取内容的模型ID。 - 当
channelid='-1'时,表示不按模型限制,而是获取所有栏目本身的信息。
- 这是实现调用栏目的关键!
orderby='rand': 同样,用于随机排序。row='5': 限制输出数量,这里是5个。
优点: 代码简洁,不需要修改PHP文件。
缺点: 功能相对 channelArtlist 来说较少,不如第一种方法灵活。
使用SQL直接查询(最高效,适合开发者)
如果你对SQL语句比较熟悉,这是最直接最高效的方法。
核心代码
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=0 ORDER BY rand() LIMIT 5'}
<a href="[field:typedir/]">[field:typename/]</a>
{/dede:sql}
代码详解
{dede:sql ...}: DedeCMS的万能SQL查询标签。sql='...': 在这里直接写入你的SQL查询语句。SELECT id,typename,typedir FROM dede_arctype: 从栏目表中选择需要的字段。WHERE reid=0: 只查询顶级栏目(reid=0表示顶级),如果你想查询所有栏目,可以去掉这个条件。ORDER BY rand(): 随机排序。LIMIT 5: 限制结果为5条。
[field:typedir/]和[field:typename/]: 直接使用SQL查询结果中的字段。
优点: 性能最好,完全自定义查询逻辑。
缺点: 需要一定的SQL知识,且不同网站表前缀(如dede_)可能不同,需要根据实际情况修改。
总结与选择建议
| 方法 | 核心标签/代码 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 方法一 | {dede:channelArtlist}+ 自定义函数 |
最灵活,功能强大,可扩展性好 | 需要修改PHP文件,稍显复杂 | 强烈推荐,大多数情况下的首选,特别是需要复杂逻辑时。 |
| 方法二 | {dede:arclist} |
代码简洁,无需修改文件 | 功能受限,不如channelArtlist灵活 |
快速实现,对功能要求不高的简单场景。 |
| 方法三 | {dede:sql} |
性能最高,控制力最强 | 需要SQL知识,可读性稍差 | 对性能有极致要求,或需要执行复杂查询的高级用户。 |
对于绝大多数用户来说,方法一 是最佳选择,因为它在灵活性和易用性之间取得了最好的平衡,如果你只是想快速搞定,方法二 也是一个不错的选择。
