使用 GetTopson 标签(最推荐、最简单)
这是 DedeCMS 内置的专用标签,专门用来获取顶级栏目,代码简洁,效率高。

(图片来源网络,侵删)
适用场景:在模板文件(如 .htm)中直接调用。
代码示例:
{dede:channel type='top' row='10'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码解析:
{dede:channel}:这是 DedeCMS 的栏目列表调用标签。type='top':这是关键参数,它告诉 DedeCMS 只调用顶级栏目。row='10':表示获取的顶级栏目数量,'10'是示例,你可以改成你需要的数字,如row='20'或不写此属性(表示获取所有)。[field:typelink/]:输出栏目的完整链接地址,http://www.yoursite.com/about/。[field:typename/]:输出栏目的名称,"关于我们"。
完整示例(带样式):

(图片来源网络,侵删)
<div class="top-nav">
<ul>
{dede:channel type='top' row='8'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
使用 SQL 查询(最灵活、功能最强)
如果你需要在 PHP 代码(如自定义函数、插件或PHP页面)中获取顶级栏目链接,或者需要对结果进行更复杂的处理,直接执行 SQL 查询是最好的选择。
适用场景:在 PHP 文件中获取数据,或者需要自定义排序、筛选等复杂操作。
代码示例:
<?php
// 引入 DedeCMS 的核心文件
// 注意:这个路径可能根据你的安装位置有所不同,通常在 include/common.inc.php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 1. 准备 SQL 查询语句
// 从 `dede_arctype` 表(栏目表)中查询
// `reid` 为 0 表示顶级栏目
// `ishidden` 为 0 表示显示的栏目
$sql = "SELECT id, typename, typedir FROM `#@__arctype` WHERE reid = 0 AND ishidden = 0 ORDER BY sortrank ASC";
// 2. 执行查询
$dsql->SetQuery($sql);
$dsql->Execute();
// 3. 循环输出结果
echo "<ul>";
while ($row = $dsql->GetArray()) {
// 拼接栏目链接
// $row['typedir'] 存储的是栏目目录,如 '{cmspath}/about/'
// 需要用 str_replace 替换掉系统变量
$typelink = str_replace('{cmspath}', $cfg_cmspath, $row['typedir']);
// 输出 HTML
echo "<li><a href='{$typelink}'>{$row['typename']}</a></li>";
}
echo "</ul>";
?>
代码解析:

(图片来源网络,侵删)
require_once ...:引入 DedeCMS 的数据库连接对象$dsql和其他全局配置。#@__arctype:这是 DedeCMS 的表名前缀机制,#@__会被替换为你数据库中配置的前缀(如dede_)。WHERE reid = 0:这是判断顶级栏目的核心条件。reid字段存储的是父栏目的 ID,顶级栏目没有父栏目,所以为 0。AND ishidden = 0:这是一个常用条件,只获取在前台显示的栏目(非隐藏)。ORDER BY sortrank ASC:按照后台设置的“排序值”进行升序排列。$dsql->GetArray():获取查询结果的一行数据,返回一个关联数组。str_replace('{cmspath}', $cfg_cmspath, $row['typedir']):$row['typedir']中的{cmspath}是一个占位符,需要替换成网站的实际路径,才能得到正确的链接。
在自定义函数/标签中调用
如果你想在模板中调用一个自定义的函数来获取顶级栏目,可以使用 lib_fun.php 文件。
适用场景:封装复杂的逻辑,在模板中通过简单标签重复使用。
步骤 1:创建函数文件
在 /include/ 目录下创建一个名为 my_functions.php 的文件(文件名可以自定义),并写入以下 PHP 函数:
// 文件路径:/include/my_functions.php
<?php
if (!defined('DEDEINC')) exit('dedecms');
/**
* 获取顶级栏目列表
* @param int $num 获取数量
* @return array 栏目数组
*/
function getTopCategories($num = 10) {
global $dsql;
$topCategories = array();
$sql = "SELECT id, typename, typedir FROM `#@__arctype` WHERE reid = 0 AND ishidden = 0 ORDER BY sortrank ASC LIMIT 0, {$num}";
$dsql->SetQuery($sql);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
$row['typelink'] = str_replace('{cmspath}', $cfg_cmspath, $row['typedir']);
$topCategories[] = $row;
}
return $topCategories;
}
?>
步骤 2:引入并调用
在你的模板文件(如 head.htm)中,引入这个文件并使用 {dede:mytopchannel/} 这样的自定义标签来调用。
{dede:include filename="my_functions.htm"/}
{dede:mytopchannel}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:mytopchannel}
注意:要使用自定义标签,你需要修改 /include/taglib/ 目录下的文件或在后台进行标签注册,这稍微复杂一些,对于简单需求,方法一和方法二已经足够。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
GetTopson |
代码最简单,模板内直接使用,效率高,符合 DedeCMS 设计规范。 | 灵活性较低,只能在模板中使用,无法进行复杂的数据处理。 | 绝大多数情况下的首选,尤其是在制作导航栏、页脚链接等。 |
| SQL 查询 | 功能最强大,灵活性最高,可在任何 PHP 代码中使用,可自定义查询条件、排序等。 | 需要编写 PHP 代码,对新手有一定门槛。 | 在 PHP 文件中、插件开发、或需要复杂逻辑处理时使用。 |
| 自定义函数/标签 | 代码逻辑分离,可复用性强,适合封装通用功能。 | 设置步骤较多,需要了解 DedeCMS 的标签机制。 | 当某个获取顶级栏目的功能需要在多个页面重复使用,且逻辑较复杂时。 |
对于绝大多数 DedeCMS 方法一 是解决“获取顶级栏目链接”问题的最佳实践。
