dede如何获取顶级栏目链接?

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

使用 GetTopson 标签(最推荐、最简单)

这是 DedeCMS 内置的专用标签,专门用来获取顶级栏目,代码简洁,效率高。

dede 获取顶级栏目链接
(图片来源网络,侵删)

适用场景:在模板文件(如 .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/]:输出栏目的名称,"关于我们"。

完整示例(带样式)

dede 获取顶级栏目链接
(图片来源网络,侵删)
<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>";
?>

代码解析

dede 获取顶级栏目链接
(图片来源网络,侵删)
  • 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 方法一 是解决“获取顶级栏目链接”问题的最佳实践。

-- 展开阅读全文 --
头像
dede生成栏目为何出现500错误?
« 上一篇 今天
织梦二次开发在线预约如何实现?
下一篇 » 今天
取消
微信二维码
支付宝二维码

目录[+]