这是一个非常常见的需求,通常分为两种情况:

- 修改已有模板中的
typeid:比如你换了个栏目,或者想在新模板里指向不同的栏目。 - 在全新模板中正确使用
typeid:特别是当模板涉及到“当前栏目”、“父栏目”或“顶级栏目”时,新手很容易出错。
理解 typeid 是什么?
typeid 是织梦模板引擎中的一个核心变量,它的作用是的数据来源,它通常用在标签中,告诉织梦:“请从这个ID为 typeid 的栏目里获取内容”。
typeid 的值通常是一个数字,对应 dede_arctype 表(栏目表)中的 id 字段。
场景一:修改现有模板中的 typeid
当你拿到一个新模板,或者想调整现有模板的栏目指向时,就需要修改 typeid。
修改固定栏目的 typeid
这是最简单直接的情况,你的模板里有一个“公司新闻”的板块,你想让它显示ID为 5 的栏目内容。

操作步骤:
-
找到
typeid的位置: 登录你的网站后台,进入【模板】->【模板管理】,找到你正在使用的模板文件(index.htm首页,list_article.htm列表页,article_article.htm内容页等)。 点击对应的【修改】按钮,进入模板代码编辑界面。 -
定位相关标签: 在模板代码中搜索
typeid,你通常会找到类似下面的标签:-
栏目列表标签 (arclist):
(图片来源网络,侵删){dede:arclist typeid='5' titlelen='24' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:arclist} -
栏目频道标签 (channel):
{dede:channel typeid='5' type='son'} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel}
-
-
修改
typeid的值: 将typeid='5'中的数字5修改为你目标栏目的ID。如何找到栏目的ID?
- 进入后台【核心】->【栏目管理】。
- 将鼠标悬停在你想要修改的栏目名称上,浏览器左下角的状态栏会显示该栏目的ID,
.../catalog_do.php?dopost=edit&channelid=1&cid=5,这里的cid=5就是栏目的ID。 - 或者直接点击【栏目管理】,在列表中查看“栏目名称”旁边的ID数字。
-
更新并生成:
- 在模板编辑器中修改代码后,点击【保存】。
- 进入【生成】->【更新主页HTML】或【更新栏目HTML】/【更新文档HTML】,让修改生效。
修改动态获取的 typeid (重要!)
在列表页 (list_article.htm) 和内容页 (article_article.htm) 中,typeid 通常不是写死的,而是通过 {dede:field name='typeid'/} 自动获取当前栏目的ID。
这种情况下,你通常不需要修改 typeid 本身,而是要确保它指向正确的栏目。
-
在列表页 (
list_article.htm):{dede:field name='typeid'/}会自动获取当前列表页面对应的栏目ID,你只需要在后台确保这个列表页面对应的是正确的栏目即可。一般不需要在模板里动它。 -
页 (
article_article.htm): 同样,{dede:field name='typeid'/}会自动获取当前文章所在栏目的ID。一般也不需要修改。
什么时候需要修改这种动态 typeid?页里调用当前栏目的父栏目或顶级栏目时,就需要用到 typeid 的“父级”和“顶级”用法。
场景二:在模板中高级使用 typeid
这是模板修改的精髓,能让你做出非常灵活的布局。
调用子栏目
如果你想在某个栏目页里显示它所有直接子栏目的列表,可以使用 channel 标签,并将 typeid 设为当前栏目ID,同时加上 type='son'。
模板代码示例 (在 list_article.htm 中):
<h2>子栏目列表</h2>
<ul>
{dede:channel type='son'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
这里的 {dede:field name='typeid'/} 是被省略的,默认就是当前栏目,如果你想明确写出,也可以:
{dede:channel typeid='{dede:field.name='typeid'/}' type='son'}
...
{/dede:channel}
调用顶级栏目
有时,你可能需要一个“全局”的栏目导航,无论在哪个子栏目下,都只显示顶级栏目。
模板代码示例 (可在首页或任何页面使用):
<h2>全站顶级栏目</h2>
<ul>
{dede:channel type='top'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
这里 typeid 被省略,type='top' 告诉织梦忽略 typeid,直接从数据库获取所有顶级栏目。
调用父栏目
如果你想在子栏目页里显示它的直接父栏目信息(比如面包屑导航),可以使用 gettopid 函数。
模板代码示例 (在子栏目列表页或内容页中):
{dede:field name='typeid' function='gettopid(@me)'/}
这段代码的作用是:获取当前栏目ID({dede:field.name='typeid'/}),然后通过 gettopid 函数计算出它的顶级栏目ID。
如果想获取直接父栏目ID,需要自定义一个函数,或者使用更复杂的方法,但 gettopid 是最常用的。
模板更新后,typeid 不生效的常见原因及解决方法
-
未更新缓存或生成HTML:
- 原因:修改了模板文件,但织梦的缓存或生成的静态文件没有更新。
- 解决:进入后台【生成】菜单,依次点击【更新主页HTML】、【更新栏目HTML】、【更新文档HTML】,如果网站是动态的,也要进入【系统】->【系统基本参数】->【性能选项】,清空所有缓存。
-
栏目ID错误或栏目已删除:
- 原因:你填写的
typeid对应的栏目不存在或ID已改变。 - 解决:再次核对【栏目管理】中的栏目ID,确保
typeid的值正确无误。
- 原因:你填写的
-
标签嵌套或语法错误:
- 原因:在修改
typeid时,不小心破坏了标签的语法,比如引号不匹配、标签未闭合等。 - 解决:仔细检查模板代码,确保
{dede:tag}和{/dede:tag}成对出现,引号( 或 )正确闭合。
- 原因:在修改
-
权限问题:
- 原因:服务器上文件权限设置不当,导致模板文件无法被保存或覆盖。
- 解决:通过FTP连接服务器,将模板文件(位于
/templets/default/或你自定义的目录)的权限设置为644或664,目录权限设置为755或775。
| 需求场景 | 解决方案 | 关键标签/代码 |
|---|---|---|
| 指向固定栏目 | 在模板中找到 typeid,将其值修改为目标栏目的ID。 |
typeid='15' |
| 显示当前栏目内容 | 使用 {dede:field name='typeid'/} 自动获取,无需手动修改。 |
{dede:arclist row='10'} (省略typeid) |
| 显示当前栏目的子栏目 | 使用 channel 标签,并设置 type='son'。 |
{dede:channel type='son'} |
| 显示全站顶级栏目 | 使用 channel 标签,并设置 type='top'。 |
{dede:channel type='top'} |
| 获取顶级栏目ID | 页或列表页中使用函数。 | {dede:field name='typeid' function='gettopid(@me)'/} |
| 修改后不生效 | 清空缓存并重新生成网站。 | 后台【生成】菜单 |
希望这份详细的指南能帮助你顺利完成织梦模板的 typeid 修改工作!如果在操作中遇到具体问题,可以提供更详细的错误信息或模板代码,我可以进一步帮你分析。
