dede如何调用子栏目名称?

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

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

这是最标准、最灵活的方法,不仅可以调用子栏目名称,还可以调用链接、ID等其他信息。

dede调用子栏目名称
(图片来源网络,侵删)

调用指定父栏目下的所有直接子栏目

假设你的父栏目ID是 5,你想要在ID为5的栏目页里,调用它的所有直接子栏目。

代码示例:

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

代码详解:

  • {dede:channel}:这是调用栏目的核心标签。
  • type='son':这是关键参数,表示调用“子栏目”,它只会调用当前栏目(或指定栏目)的下一级直接子栏目,不会调用孙栏目。
  • typeid='5':指定要查询的父栏目ID,如果你把这个标签直接放在一个栏目模板(article_*.htm)里,并且省略 typeid 属性typeid 会自动默认为当前栏目的ID,这就是为什么在栏目页调用自己的子栏目时,通常可以省略 typeid
  • [field:typelink/]:子栏目的链接地址。
  • [field:typename/]:子栏目的名称。

完整示例(在父栏目列表页中使用):

dede调用子栏目名称
(图片来源网络,侵删)

假设父栏目是“产品分类”(ID=5),其下有“手机”、“电脑”、“平板”三个子栏目。

<h2>产品分类</h2>
<ul>
    {dede:channel type='son' typeid='5'}
    <li>
        <a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a>
    </li>
    {/dede:channel}
</ul>

最终生成的HTML效果:

<h2>产品分类</h2>
<ul>
    <li><a href="/plus/list.php?tid=6" title="手机">手机</a></li>
    <li><a href="/plus/list.php?tid=7" title="电脑">电脑</a></li>
    <li><a href="/plus/list.php?tid=8" title="平板">平板</a></li>
</ul>

调用所有下级栏目(包括孙栏目)

如果你需要调用一个父栏目下的所有层级的子栏目(不仅包括直接子栏目,还包括孙栏目、曾孙栏目等),可以使用 type='self' 配合 reid 属性。

代码示例:

dede调用子栏目名称
(图片来源网络,侵删)

假设父栏目ID是 5

{dede:channel type='self' reid='5'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

代码详解:

  • type='self':表示调用“自身以及所有下级栏目”。
  • reid='5':指定顶级父栏目的ID。type='self' 必须与 reid 配合使用,才能实现调用所有下级栏目的目的。

使用 {dede:global} 标签(在顶级栏目页调用)

这个方法比较特殊,只在一种情况下适用:当你的栏目是顶级栏目,并且你希望调用它的一级子栏目时

代码示例:

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

代码详解:

  • typeid='':将 typeid 设为空字符串,在顶级栏目模板中,{dede:channel} 会自动识别当前顶级栏目的ID,并调用它的子栏目。
  • 注意:此方法不适用于二级或更深层级的栏目页,在二级栏目页,typeid 为空时会调用当前栏目的子栏目(即三级栏目),而不是上级的子栏目。方法一(指定typeid)是更通用、更推荐的做法

使用SQL直接查询(最灵活,适合复杂逻辑)

{dede:channel} 标签无法满足你的复杂需求时(需要根据特定条件筛选子栏目),你可以使用 dede:sql 标签直接执行SQL查询。

代码示例:

同样,调用父栏目ID为 5 的所有直接子栏目。

{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid = 5 ORDER BY id'}
    <a href="[field:typedir function='MakeDir(@me)'/]">[field:typename/]</a>
{/dede:sql}

代码详解:

  • dede:sql:执行自定义SQL语句的标签。
  • sql='...':里面的SQL语句。
    • dede_arctype:DedeCMS中存储栏目的表名(如果你的表前缀不是 dede_,请修改)。
    • WHERE reid = 5reid 字段存储的是栏目的“父栏目ID”,这句就是筛选出父ID为5的栏目。
    • ORDER BY id:按栏目ID排序,你可以根据需要改为 sortrank 等。
  • [field:typedir function='MakeDir(@me)'/]typedir 字段存储的是栏目目录,但它可能包含 {cmspath} 这样的变量,需要用 MakeDir 函数处理才能生成正确的URL,这比 {dede:channel} 中的 typelink 稍微复杂一点。
  • [field:typename/]:直接输出栏目名称。

总结与对比

方法 优点 缺点 适用场景
{dede:channel} 官方标准,简单易用,功能强大,支持所有常用参数。 对于极特殊需求可能不够灵活。 90%以上的场景,是首选方法。
{dede:global} 代码简洁。 适用范围窄,仅限顶级栏目。 快速在顶级栏目页调用其子栏目。
{dede:sql} 极度灵活,可以任意组合查询条件。 代码相对复杂,需要了解SQL和表结构,有安全风险(需注意防注入)。 需要根据自定义字段、复杂排序等条件调用栏目时。

常见问题排查 (FAQ)

Q: 为什么我调用出来的子栏目是空的? A: 请检查以下几点:

  1. typeid 是否正确:确认你指定的父栏目ID是否存在。
  2. 该栏目是否真的有子栏目:去后台检查一下。
  3. type 参数是否正确:确保使用了 type='son' 来调用直接子栏目。
  4. 模板缓存:有时候旧模板缓存会导致问题,去后台“系统” -> “一键更新网站” -> “更新HTML” -> “更新栏目HTML”,并选择“更新所有”。

Q: 我想调用当前栏目的子栏目,代码怎么写? A: 最简单的方式就是省略 typeid,假设这个代码放在 article_5.htm(即ID为5的栏目模板)中:

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

typeid 会自动使用当前模板对应的栏目ID 5

希望这些详细的解释和示例能帮助你成功调用子栏目名称!

-- 展开阅读全文 --
头像
increment在C语言中如何正确使用?
« 上一篇 今天
织梦仿笑话模板为何没内涵?
下一篇 » 今天
取消
微信二维码
支付宝二维码

目录[+]