织梦如何调用指定栏目的子栏目?

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

{dede:channel}

{dede:channel} 是专门用于调用栏目的标签,通过设置其属性,我们可以精确地控制要显示哪些栏目。

织梦调用指定栏目子栏目
(图片来源网络,侵删)

调用指定顶级栏目的直接子栏目(最常用)

这是最常见的需求,比如你在首页要显示“产品中心”这个栏目的所有一级子栏目。

标签语法

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

参数详解

  • typeid='目标栏目的ID':

    • 这是最关键的参数,它告诉织梦,你要调用哪个栏目的子栏目。
    • '目标栏目的ID' 需要替换成你想要获取子栏目的那个顶级栏目在后台的ID,如果你想在首页调用ID为 5 的“产品中心”栏目的子栏目,就写成 typeid='5'
    • 注意:在首页(index.html)模板中,typeid 默认是调用网站的顶级栏目,所以如果你想调用某个特定顶级栏目的子栏目,必须明确指定 typeid
  • type='son':

    • 这个参数指定了调用的栏目类型。
    • son: 表示调用指定 typeid 栏目的直接子栏目(下一级栏目)。
    • self: 表示调用指定 typeid 栏目本身(通常用于面包屑导航)。
    • top: 表示调用网站的顶级栏目(忽略 typeid)。

完整示例

假设你在首页模板 index.html 中,想要调用ID为 5 的“产品中心”栏目的所有子栏目,并以无序列表的形式展示。

织梦调用指定栏目子栏目
(图片来源网络,侵删)
<!-- 在首页模板中调用ID为5的栏目的子栏目 -->
<div class="product-categories">
    <h3>产品分类</h3>
    <ul>
        {dede:channel type='son' typeid='5'}
        <li>
            <a href="[field:typelink/]" title="[field:typename/]">
                [field:typename/]
            </a>
        </li>
        {/dede:channel}
    </ul>
</div>

代码解释:

  • {dede:channel type='son' typeid='5'}: 开始循环,调用ID为5的栏目的直接子栏目。
  • <li>: 每个子栏目都会被包裹在一个 <li> 标签中。
  • [field:typelink/]: 这是一个字段变量,代表子栏目的链接地址。
  • [field:typename/]: 这是字段变量,代表子栏目的名称。
  • </li>: 循环结束,每个子栏目标签闭合。
  • </ul></div>: 容器标签闭合。

调用指定栏目的所有后代栏目(递归调用)

你可能需要显示一个栏目下的所有层级的子栏目,产品中心”下有“系列A”,系列A下还有“产品A1”、“产品A2”。

织梦的 channel 标签本身不支持递归,但我们可以通过自定义函数或SQL标签来实现,这里推荐使用 {dede:sql} 标签,因为它更灵活。

标签语法

{dede:sql sql='SELECT id,typename,typedir FROM dede_arctype WHERE reid = 目标栏目的ID ORDER BY sortrank'}
    <a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">[field:typename/]</a>
{/dede:sql}

参数详解

  • sql='...': 执行自定义的SQL查询语句。
  • SELECT id,typename,typedir FROM dede_arctype: 从 dede_arctype 表(栏目表)中查询栏目的ID、名称和目录。
  • WHERE reid = 目标栏目的ID: 这是关键reid 字段存储的是栏目的父栏目ID,通过设置 reid,我们可以找到所有指定ID栏目的后代栏目(不限层级)。
  • ORDER BY sortrank: 按照后台设置的排序进行排列。
  • [field:typedir function='str_replace("{cmspath}", "", @me)'/]:
    • typedir 字段在数据库中存储的值是 {cmspath}/product/a 这样的形式。
    • function='...' 用于对字段值进行PHP函数处理。
    • str_replace("{cmspath}", "", @me) 的作用是将 {cmspath} 这个占位符替换为空,得到最终的URL路径,如 /product/a

完整示例

同样,调用ID为 5 的“产品中心”栏目的所有后代栏目。

织梦调用指定栏目子栏目
(图片来源网络,侵删)
<div class="all-categories">
    <h3>所有产品系列</h3>
    <ul>
        {dede:sql sql='SELECT id,typename,typedir FROM dede_arctype WHERE reid = 5 ORDER BY sortrank'}
        <li>
            <a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">
                [field:typename/]
            </a>
        </li>
        {/dede:sql}
    </ul>
</div>

调用当前栏目的子栏目

在列表页(list_article_*.html页(article_*.html)模板中,你可能需要调用当前所在栏目的子栏目。

标签语法

在这种情况下,你不需要指定 typeid,因为织梦会自动获取当前栏目的ID。

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

完整示例

在列表页模板 list_article.htm 中,添加以下代码可以显示当前分类的子分类。

<div class="sub-categories">
    <h3>子分类</h3>
    <ul>
        {dede:channel type='son'}
        <li><a href="[field:typelink/]">[field:typename/]</a></li>
        {/dede:channel}
    </ul>
</div>

这段代码在列表页中会自动调用当前栏目(即列表页所展示的栏目)的子栏目。


总结与最佳实践

需求场景 推荐标签 关键参数 说明
调用指定顶级栏目的直接子栏目(如首页调用产品分类) {dede:channel} typeid='目标ID' type='son' 最常用、最标准的方法。
调用指定栏目的所有后代栏目(不限层级) {dede:sql} sql='WHERE reid = 目标ID' 功能更强大,但需要一点SQL基础。
调用当前栏目的子栏目(如在列表页) {dede:channel} type='son' (无需typeid) 织梦会自动识别当前栏目ID,非常方便。

小贴士:如何找到栏目的ID? 登录织梦后台,进入“栏目管理”,将鼠标悬停在你想要查询的栏目名称上,浏览器左下角的状态栏会显示该栏目的编辑链接,.../catalog_add.php?cid=5,其中的 5 就是这个栏目的ID。

希望这份详细的指南能帮助你解决织梦调用子栏目的问题!

-- 展开阅读全文 --
头像
c语言和c加加语言有什么区别
« 上一篇 01-28
织梦为何无法选择上传图片?
下一篇 » 01-28

相关文章

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

目录[+]