dede如何调用当前栏目的一个子栏目?

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

核心思路

无论使用哪种方法,核心思路都是:

dede 调用当前栏目的一个子栏目
(图片来源网络,侵删)
  1. 获取当前栏目的ID:这是所有操作的基础,DedeCMS 有一个全局变量 {dede:field.id/} 可以直接获取。
  2. 根据当前栏目ID查询其子栏目:使用 DedeCMS 的标签(如 channelarclist)或PHP代码,通过 topidreid 参数来筛选出属于当前栏目的子栏目。
  3. 显示子栏目信息:循环输出子栏目的名称、链接、封面图、简介等信息。

使用 {dede:channel} 标签(最常用)

这是最标准、最推荐的方法,专门用于调用栏目列表。

代码示例

{dede:channel type='son' typeid='{dede:field.id/}'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

代码详解

  • {dede:channel ...}:这是 DedeCMS 调用栏目的核心标签。
  • type='son'关键参数,表示调用“子栏目”,如果不写这个参数,默认会调用顶级栏目。
  • typeid='{dede:field.id/}'关键参数,指定要查询哪个栏目的子栏目。{dede:field.id/} 是一个变量,它会自动获取当前页面的栏目ID,如果当前栏目ID是 5,那么这个标签实际就变成了 typeid='5'
  • [field:typelink/]:子栏目的链接地址。
  • [field:typename/]:子栏目的名称。

完整示例(带样式和循环)

假设我们想在当前栏目页的侧边栏显示一个子栏目列表,并给每个子栏目加上 li

<div class="sub-category">
    <h3>子栏目列表</h3>
    <ul>
        {dede:channel type='son' typeid='{dede:field.id/}'}
        <li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
        {/dede:channel}
    </ul>
</div>

使用 {dede:arclist} 标签(灵活,可调用栏目文章)

arclist 标签主要用于调用文章列表,但它也可以用来调用栏目信息,并且非常灵活,可以调用子栏目下的文章。

代码示例(调用子栏目列表本身)

{dede:arclist typeid='{dede:field.id/}' channelid='1' row='10'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:arclist}

代码详解

  • typeid='{dede:field.id/}':指定要查询的父栏目ID(即当前栏目ID)。
  • channelid='1'关键参数,指定要调用的模型ID。1 代表“栏目目录”模型,如果你想调用某个特定栏目模型(如“产品”模型)的子栏目,就需要填写对应的模型ID。
  • row='10':表示最多显示10个子栏目。

代码示例(调用子栏目下的文章)

这是 arclist 标签更强大的地方,可以一次性列出所有子栏目及其最新文章。

{dede:arclist typeid='{dede:field.id/}' row='8' titlelen='30'}
    <li>
        <span class="title">[field:title/]</span>
        <span class="cat"><a href="[field:typelink/]">[field:typename/]</a></span>
    </li>
{/dede:arclist}
  • 这个例子中,[field:title/] 调用的是子栏目下文章的标题,[field:typelink/][field:typename/] 调用的是该文章所属的子栏目的链接和名称。

使用PHP代码(最灵活,适合复杂逻辑)

如果你的需求比较复杂,比如需要判断子栏目是否存在,或者需要调用额外的自定义字段,使用PHP代码会更方便。

dede 调用当前栏目的一个子栏目
(图片来源网络,侵删)

代码示例

<?php
    // 获取当前栏目的ID
    $typeid = $GLOBALS['typeid'];
    // 调用DedeCMS的函数获取子栏目
    // GetSonIds函数可以获取指定ID下的所有子栏目ID(包括孙栏目),这里我们只取一级
    // 使用channelartlist标签配合SQL查询可以更精确地获取一级子栏目
    $dsql = new DedeSql(false);
    $sql = "SELECT id,typename,typedir FROM `dede_arctype` WHERE reid='$typeid' AND ishidden<>1 ORDER BY sortrank ASC";
    $dsql->SetQuery($sql);
    $dsql->Execute();
    if($dsql->GetTotalRow() > 0){
        echo "<ul class='sub-category-list'>";
        while($row = $dsql->GetArray()){
            $typelink = GetOneTypeUrlA($row);
            echo "<li><a href='".$typelink['typeurl']."'>".$row['typename']."</a></li>";
        }
        echo "</ul>";
    }else{
        echo "<p>该栏目暂无子栏目。</p>";
    }
    $dsql->Close();
?>

代码详解

  1. $typeid = $GLOBALS['typeid'];:获取当前栏目的ID,与方法一中的 {dede:field.id/} 效果相同。
  2. new DedeSql(false);:创建一个数据库操作对象。
  3. $sql = "SELECT ...";:编写SQL查询语句。
    • dede_arctype:DedeCMS中存储栏目的数据表(表名可能前缀不同,如#@_arctype)。
    • reid='$typeid'关键条件reid 字段存储的是栏目的“父栏目ID”,这里用它来筛选出当前栏目ID下的所有子栏目。
    • ishidden<>1:排除被隐藏的栏目。
    • ORDER BY sortrank ASC:按后台设置的排序进行升序排列。
  4. while($row = $dsql->GetArray()){...}:循环查询结果。
  5. GetOneTypeUrlA($row);:这是一个DedeCMS内置函数,用于根据栏目信息数组生成完整的栏目链接地址。
  6. if($dsql->GetTotalRow() > 0){...}:判断是否有子栏目,如果没有则显示提示信息。

总结与推荐

方法 优点 缺点 适用场景
{dede:channel} 最标准、最简单、代码可读性强、效率高。 功能相对单一,主要用于调用栏目本身。 绝大多数情况下的首选,特别是只需要显示子栏目名称和链接时。
{dede:arclist} 非常灵活,不仅可以调用栏目,还能调用子栏目下的内容。 参数相对复杂,需要了解 channelid 等参数。 需要在列表页同时显示子栏目及其最新文章等混合内容时。
PHP代码 功能最强大,可以实现任何复杂的逻辑判断和数据处理。 需要一定的PHP和SQL基础,代码量稍多。 需要调用自定义字段、进行复杂判断(如判断子栏目是否存在后再显示)等高级需求。

对于99%的需求,直接使用 方法一 ({dede:channel}) 就完全足够了,也是官方推荐的最佳实践。

dede 调用当前栏目的一个子栏目
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede手机版二级域名图片为何不显示?
« 上一篇 2025-12-13
dede模板样式调用不出的原因是什么?
下一篇 » 2025-12-13

相关文章

取消
微信二维码
支付宝二维码