dede如何随机调用栏目?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 DEDE建站 正文

使用 GetTopids 函数(推荐,最灵活)

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

dede 随机调用栏目
(图片来源网络,侵删)

核心代码

{dede:channelArtlist typeid='0' orderby='rand'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channelArtlist}

代码详解

  1. {dede:channelArtlist ...}: 这是一个专门用于调用栏目标签的循环标签。
  2. typeid='0':
    • typeid 用于指定要调用的栏目ID。
    • typeid='0' 时,表示调用所有顶级栏目。
    • 如果你想在某个特定栏目下调用其子栏目,就填写这个栏目的ID,typeid='5'
  3. orderby='rand':
    • 这是实现随机的关键!它告诉DedeCMS按照随机顺序来获取栏目。
    • 除了 rand,你还可以使用 id (按ID排序)、sortrank (按后台排序权重) 等。

如何限制调用数量?

默认情况下,这个标签会调用所有符合条件的栏目,如果你只想随机调用 N个 栏目,你需要配合一个自定义函数来实现。

步骤:

  1. 打开你的 /include/common.func.php 文件(在文件末尾 ?> 之前)。

  2. 添加以下自定义函数:

    dede 随机调用栏目
    (图片来源网络,侵删)
    // 随机获取指定数量的栏目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;
    }
  3. 在你的模板文件(如 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}

代码详解

  1. {dede:arclist ...}: 文章列表标签。
  2. typeid='0': 指定栏目ID,0表示所有栏目。
  3. channelid='-1':
    • 这是实现调用栏目的关键!channelid 指定要获取内容的模型ID。
    • channelid='-1' 时,表示不按模型限制,而是获取所有栏目本身的信息。
  4. orderby='rand': 同样,用于随机排序。
  5. 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}

代码详解

  1. {dede:sql ...}: DedeCMS的万能SQL查询标签。
  2. sql='...': 在这里直接写入你的SQL查询语句。
    • SELECT id,typename,typedir FROM dede_arctype: 从栏目表中选择需要的字段。
    • WHERE reid=0: 只查询顶级栏目(reid=0表示顶级),如果你想查询所有栏目,可以去掉这个条件。
    • ORDER BY rand(): 随机排序。
    • LIMIT 5: 限制结果为5条。
  3. [field:typedir/][field:typename/]: 直接使用SQL查询结果中的字段。

优点: 性能最好,完全自定义查询逻辑。 缺点: 需要一定的SQL知识,且不同网站表前缀(如dede_)可能不同,需要根据实际情况修改。


总结与选择建议

方法 核心标签/代码 优点 缺点 适用场景
方法一 {dede:channelArtlist}
+ 自定义函数
最灵活,功能强大,可扩展性好 需要修改PHP文件,稍显复杂 强烈推荐,大多数情况下的首选,特别是需要复杂逻辑时。
方法二 {dede:arclist} 代码简洁,无需修改文件 功能受限,不如channelArtlist灵活 快速实现,对功能要求不高的简单场景。
方法三 {dede:sql} 性能最高,控制力最强 需要SQL知识,可读性稍差 对性能有极致要求,或需要执行复杂查询的高级用户。

对于绝大多数用户来说,方法一 是最佳选择,因为它在灵活性和易用性之间取得了最好的平衡,如果你只是想快速搞定,方法二 也是一个不错的选择。

-- 展开阅读全文 --
头像
dede 首页调用正文
« 上一篇 03-23
dede文章如何自动生成tag?
下一篇 » 03-23
取消
微信二维码
支付宝二维码

目录[+]