使用 GetOneTypeUrl 函数 (最推荐)
这是 DedeCMS 官方推荐的标准方法,因为它能正确处理所有类型的栏目(包括外部链接、频道封面、普通栏目等),并且兼容各种伪静态设置。

(图片来源网络,侵删)
适用场景:在任何需要获取当前栏目 URL 的地方,尤其是在列表页和内容页。
代码示例:
<?php // 获取当前栏目ID(如果在列表页或内容页,通常可以用 $typeid 变量) $currentTypeId = $typeid; // 如果当前变量不存在,你需要先获取它,例如在自定义PHP页面中 // $currentTypeId = $GLOBALS['typeid']; // 使用 GetOneTypeUrl 函数根据栏目ID获取URL $channelUrl = GetOneTypeUrl($currentTypeId); // 输出URL echo $channelUrl; ?>
代码解析:
$typeid:这是 DedeCMS 的一个全局变量,在列表页(list_*.php页(article_*.php)中,它自动代表当前栏目的 ID。GetOneTypeUrl($typeid):这是核心函数。- 它接收一个栏目ID作为参数。
- 它会智能地判断该栏目的类型(是普通列表、频道封面还是外部链接)。
- 它会根据系统设置的“是否使用伪静态”选项,返回正确的静态URL(如
/category/1.html)或动态URL(如/plus/list.php?tid=1)。 - 如果栏目设置为“外部链接”,它会直接返回你设置的外部链接地址。
使用全局变量 $typeurl (仅在列表页有效)
在列表模板文件(list_articled.htm)中,DedeCMS 已经预先计算好了当前栏目的 URL 并存放在全局变量 $typeurl 中,这是一种非常直接的方法,但仅适用于列表页。

(图片来源网络,侵删)
适用场景:仅在列表模板(list_*.htm)中。
代码示例:
<a href="{dede:field name='typeurl'/}">返回上级栏目</a>
或者直接使用PHP代码:
<?php echo $typeurl; ?>
代码解析:
{dede:field name='typeurl'/}:这是 DedeCMS 的一个底层字段,在列表页模板中,它等同于$typeurl变量。$typeurl:这个变量只在列表页存在并有效,在其他页面(如首页、内容页)直接使用会报错或为空,它的通用性不如GetOneTypeUrl。
直接调用 GetOneTypeUrl 并手动指定栏目ID (适用于自定义页面)
如果你在一个不包含 $typeid 变量的自定义 PHP 页面中,并且你知道目标栏目的 ID,可以直接调用 GetOneTypeUrl 函数。
适用场景:自定义的 PHP 页面、首页等需要调用特定栏目 URL 的地方。
代码示例:
假设你想获取 ID 为 5 的栏目的 URL:
<?php // 假设目标栏目的ID是5 $targetTypeId = 5; // 调用函数获取URL $channelUrl = GetOneTypeUrl($targetTypeId); // 输出URL,<a href="...">栏目名称</a> echo "<a href='".$channelUrl."'>我的栏目</a>"; ?>
使用 SQL 查询 (不推荐,了解即可)
虽然可以通过查询 dede_arctype 数据库表来获取栏目信息并拼接 URL,但这是一种非常不推荐的做法,原因如下:
- 代码冗余:需要自己写 SQL 语句,处理数据库连接和结果集,代码量多。
- 逻辑复杂:你需要自己判断栏目类型、是否启用伪静态,然后手动拼接 URL,容易出错。
- 违背 MVC 思想:DedeCMS 已经封装好了这些底层逻辑,直接绕开使用原生 SQL 是不好的习惯。
仅作为知识了解:
<?php
// 不推荐的做法!
global $dsql;
$tid = 5; // 目标栏目ID
$row = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE id = $tid");
if ($row['isdefault'] == -1) {
// 如果是外部链接
$url = $row['typedir'];
} else {
// 普通栏目或频道封面
$url = $row['typedir'];
// 这里还需要根据系统设置处理 {cmspath} 等变量,非常麻烦
}
echo $url;
?>
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
GetOneTypeUrl($typeid) |
官方标准,功能强大,兼容性好,自动处理伪静态和外部链接 | 需要确保 $typeid 变量存在或已定义 |
所有场景,尤其是列表页和内容页 |
$typeurl 变量 |
在列表页中极其简单,直接调用即可 | 仅在列表页有效,通用性差 | *仅在列表模板 `list_.htm` 中** |
手动调用 GetOneTypeUrl |
灵活,可在任何地方调用特定栏目的 URL | 需要手动知道并传入栏目 ID | 自定义页面、首页等需要调用固定栏目 URL 的地方 |
| SQL 查询 | 理论上可行 | 代码冗余、逻辑复杂、易出错、不推荐 | 不推荐使用 |
核心建议:
- 在列表页或内容页:直接使用
<?php echo GetOneTypeUrl($typeid); ?>,这是最标准、最可靠的方式。 - 在列表模板中:可以使用
{dede:field name='typeurl'/},因为它更简洁且专为列表页设计。 - 在任何其他 PHP 文件中:如果你知道栏目 ID,就使用
GetOneTypeUrl(ID),如果你不知道,可能需要先通过其他方式(如根据栏目名查 ID)获取。
