“当前一级栏目”指的是当前所在的栏目(无论它本身是几级栏目)的顶级父栏目。

(图片来源网络,侵删)
下面我将从几个方面详细解释如何获取和使用“当前一级栏目”的信息。
获取当前一级栏目的核心方法
在织梦的模板文件(.htm)中,我们主要通过PHP代码和系统内置的channel标签来实现。
使用 {dede:field name='typeid'} 获取当前栏目ID,然后通过PHP查询
这是最常用也是最灵活的方法,可以获取当前一级栏目的任何信息。
步骤:

(图片来源网络,侵删)
- 在模板文件中,首先获取当前页面的栏目ID。
- 使用PHP的
GetTopid()函数(这是一个织梦自定义函数)来获取该ID对应的一级栏目ID。 - 使用
GetOneType()函数获取该一级栏目的完整信息数组。 - 通过数组索引(如
['typename'],['typedir']等)来调用你需要的字段。
代码示例:
{dede:arclist typeid='topid' titlelen='30'}
<!-- 这里可以列出当前一级栏目下的所有子栏目或文章 -->
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 方法一:直接在模板中嵌入PHP代码 -->
{dede:php}
// 1. 获取当前页面的栏目ID
$typeid = $GLOBALS['typeid'];
// 2. 如果typeid存在(说明在栏目页或内容页)
if ($typeid) {
// 3. 使用GetTopid()函数获取顶级栏目ID
$topid = GetTopid($typeid);
// 4. 使用GetOneType()函数获取顶级栏目的完整信息
$topType = GetOneType($topid);
// 5. 现在你可以使用 $topType 数组中的任何字段了
$topTypeName = $topType['typename']; // 顶级栏目名称
$topTypeDir = $topType['typedir']; // 顶级栏目目录
$topTypeDescription = $topType['description']; // 顶级栏目描述
// 输出结果(或用于其他逻辑)
echo "<h1>当前一级栏目是:" . $topTypeName . "</h1>";
echo "<p>目录地址:" . $topTypeDir . "</p>";
}
{/dede:php}
使用 {dede:channel} 标签获取一级栏目
{dede:channel} 标签主要用于栏目列表,通过设置其属性,可以只显示一级栏目。
1 获取所有一级栏目
如果你想获取网站所有的顶级栏目,可以使用 typeid='0' 和 reid='0'。
{dede:channel type='top' typeid='0'}
<li><a href="[field:typedir/]">[field:typename/]</a></li>
{/dede:channel}
type='top':只显示顶级栏目。typeid='0':从顶级栏目开始查询。reid='0':父栏目ID为0的,也就是顶级栏目。
2 高亮显示当前所在的一级栏目
这是“当前一级栏目”最经典的应用场景,结合上面的方法一,我们可以实现高亮。

(图片来源网络,侵删)
思路:
- 用方法一获取当前一级栏目的ID (
$topid)。 - 在
{dede:channel}循环中,判断循环出来的栏目ID是否等于$topid,如果相等,则添加高亮样式。
代码示例:
{dede:php}
// 获取当前一级栏目ID
$typeid = $GLOBALS['typeid'];
$current_topid = $typeid ? GetTopid($typeid) : 0;
{/dede:php}
<ul class="nav">
{dede:channel type='top' typeid='0'}
<li>
<a href="[field:typedir/]"
[field:id runphp='yes']
if(@me == $current_topid) echo "class='current'";
else @me = "";
[/field:id]>
[field:typename/]
</a>
</li>
{/dede:channel}
</ul>
[field:id runphp='yes']...[/field:id]:这是一个强大的技巧,可以在标签运行时执行PHP代码。if(@me == $current_topid):判断当前循环的栏目ID (@me) 是否等于我们获取到的当前一级栏目ID。echo "class='current'":如果相等,就输出class='current',你可以在CSS中定义.current的样式(如加粗、变色等)。
常见应用场景
面包屑导航
面包屑导航通常显示 首页 > 一级栏目 > 二级栏目 > ... > 当前页面。
织梦自带的 {dede:position} 标签默认会显示所有层级的栏目,如果我们想让它只显示“首页”和“当前一级栏目”,可以结合上面的方法进行改造。
{dede:php}
$typeid = $GLOBALS['typeid'];
if ($typeid) {
$topid = GetTopid($typeid);
$topType = GetOneType($topid);
// 手动构建面包屑
$breadcrumb = "<a href='/'>首页</a> » <a href='{$topType['typedir']}'>{$topType['typename']}</a>";
echo $breadcrumb;
} else {
// 如果不在任何栏目下(例如首页),只显示首页
echo "<a href='/'>首页</a>";
}
{/dede:php}
获取当前一级栏目的描述或关键词
这个需求常用于SEO优化,将当前一级栏目的描述或关键词作为页面的meta信息。
<head>
<meta name="description" content="{dede:php}$typeid=$GLOBALS['typeid']; if($typeid){$topid=GetTopid($typeid);$topType=GetOneType($topid);echo $topType['description'];}{/dede:php}" />
<meta name="keywords" content="{dede:php}$typeid=$GLOBALS['typeid']; if($typeid){$topid=GetTopid($typeid);$topType=GetOneType($topid);echo $topType['keywords'];}{/dede:php}" />
</head>
| 需求 | 推荐方法 | 关键代码/标签 |
|---|---|---|
| 获取当前一级栏目的ID | GetTopid() 函数 |
{dede:php}$topid = GetTopid($GLOBALS['typeid']);{/dede:php} |
| 获取当前一级栏目的信息 | GetOneType() 函数 |
{dede:php}$topType = GetOneType($topid); echo $topType['typename'];{/dede:php} |
| 列出所有一级栏目 | {dede:channel}
| |
| 高亮当前一级栏目 | 结合 GetTopid() 和 {dede:channel} 的 runphp 属性 |
[field:id runphp='yes']if(@me == $current_topid) echo "class='active'";[/field:id] |
| 自定义面包屑/SEO信息 | 嵌入PHP代码,手动拼接 | 使用$topType数组中的字段 |
对于绝大多数“当前一级栏目”的需求,方法一(GetTopid() + GetOneType())是核心和基础,掌握它就能灵活应对各种复杂场景。
