dede channel隐藏内容如何强制显示?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文
  1. 后台栏目列表:在【核心】->【栏目管理】中,希望看到所有栏目,包括那些在前端不显示的。
  2. 前端模板调用:在前台页面使用 {dede:channel}{dede:channelartlist} 等标签时,希望调用出所有(包括隐藏的)栏目。

下面我将针对这两种最常见的情况,提供详细的解决方案。

dede channel隐藏的也显示
(图片来源网络,侵删)

在后台栏目管理列表中显示隐藏的栏目

在默认情况下,后台的栏目管理列表已经会显示所有栏目,包括“隐藏”的,但如果你发现某个隐藏的栏目没有显示,或者你想要一个更清晰的筛选视图,可以这样做:

  1. 直接查看:登录DedeCMS后台,进入【核心】->【栏目管理】,这里默认会列出所有一级栏目,如果你创建的隐藏栏目是二级或更深层级的,你需要点击其父栏目左侧的 号来展开查看。

  2. 利用搜索/筛选功能

    • 在后台栏目管理页面,通常会有一个搜索框。
    • 你可以尝试不输入任何关键词,直接点击搜索,这通常会列出所有栏目。
    • 有些版本的DedeCMS可能会有“仅显示隐藏栏目”或类似的筛选选项,但通常不常见,最直接的方法就是展开所有父栏目来查找。

后台默认是显示所有栏目的,如果看不到,大概率是层级没有展开。

dede channel隐藏的也显示
(图片来源网络,侵删)

在前端模板中调用并显示隐藏的栏目

这是最常见的需求,默认情况下,{dede:channel} 等标签会自动过滤掉 ishidden 字段为 1 的隐藏栏目。

要解决这个问题,你需要修改DedeCMS的核心文件。操作前务必备份原文件!

修改 include/taglib/channel.lib.php 文件(推荐)

这是最常用且最安全的方法,因为它只影响你调用标签时的行为,不会改变系统的核心逻辑。

  1. 找到文件include/taglib/channel.lib.php

    dede channel隐藏的也显示
    (图片来源网络,侵删)
  2. 打开文件,找到以下这段代码(大约在第11-16行):

    //    if($type=='top')
    //    {
    //        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid=0 And ishidden<>1 order by sortrank asc";
    //    }
    //    elseif($type=='son')
    //    {
    //        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid='$reid' And ishidden<>1 order by sortrank asc";
    //    }

    你会发现,这段代码被注释掉了(前面有 ),实际起作用的是下面 else 分支里的代码。

  3. 修改SQL查询语句: 继续往下看,找到 else 分支里的 SELECT 语句(大约在第20行左右),这是默认的查询逻辑:

    else
    {
        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc";
    }

    在这个 WHERE 条件中,没有 ishidden<>1 的限制,理论上,这里的 channel 标签已经可以调用出隐藏栏目了。

    问题根源:如果你使用了 type='top'type='son',那么你看到的虽然是注释掉的代码,但DedeCMS在某些版本或特定情况下可能会优先执行这些逻辑,最稳妥的方法是确保所有分支都去掉 ishidden 的限制。

    修改方案

    • 方案A(简单粗暴):将所有 SELECT 语句中的 And ishidden<>1 全部删除,包括被注释掉的那些,以防万一。
    • 方案B(更推荐):给 {dede:channel} 标签添加一个自定义属性,来强制显示隐藏栏目,这需要修改标签解析函数。

    这里我们采用方案A,因为它最直接有效。

    修改后的代码应该是这样的(注意删除了所有 ishidden<>1):

    //    if($type=='top')
    //    {
    //        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid=0 order by sortrank asc";
    //    }
    //    elseif($type=='son')
    //    {
    //        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc";
    //    }
    //    else
    //    {
    //        $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend  FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc";
    //    }

    你只需要找到并修改那个正在执行的 else 分支里的SQL语句即可,但修改所有分支可以保证万无一失。

使用自定义函数(更灵活)

如果你不想修改核心文件,或者你只想在某些特定地方显示隐藏栏目,可以采用自定义函数的方法。

  1. 创建自定义函数文件: 在 include/extend.func.php 文件中(如果此文件不存在,则新建一个)添加以下函数:

    /**
     * 调用所有栏目(包括隐藏的)
     * @param int $reid 父栏目ID,0为顶级
     * @param string $type 栏目类型
     * @return string 返回栏目列表HTML
     */
    function get_all_channel($reid = 0, $type = 'son') {
        global $dsql;
        $sql = "SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend
                FROM `#@__arctype`
                WHERE reid='$reid' ";
        if ($type == 'top') {
            $sql = "SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend
                    FROM `#@__arctype`
                    WHERE reid=0 ";
        }
        $sql .= " ORDER BY sortrank ASC";
        $dsql->SetQuery($sql);
        $dsql->Execute();
        $channels = '';
        while ($row = $dsql->GetArray()) {
            $channels .= "<option value='{$row['id']}'>{$row['typename']}</option>";
        }
        return $channels;
    }

    注意:#@__ 是DedeCMS的数据表前缀,如果你的前缀不是 dede_,系统会自动替换。

  2. 在模板中调用: 在你的模板文件(通常是 templets/ 目录下的文件)中,像这样使用:

    <select name="typeid">
      <option value="0">请选择栏目</option>
      {dede:global name='get_all_channel'/}
    </select>

    这个例子是生成一个下拉列表,你可以根据需要修改函数,让它返回 {dede:channel} 风格的 <a> 标签列表。


总结与推荐

方法 优点 缺点 适用场景
修改 channel.lib.php 一劳永逸,所有 {dede:channel} 调用都会生效。 直接修改核心文件,升级DedeCMS时可能被覆盖。 全站都需要显示隐藏栏目的情况。
自定义函数 灵活安全,不影响核心文件,只在需要的地方调用。 需要额外编写代码,调用方式稍显复杂。 只在个别页面或特定模块需要显示隐藏栏目。

对于大多数用户,我推荐使用【方法一:修改 include/taglib/channel.lib.php 文件】,因为它最直接地解决了问题,且操作简单,请务必在操作前备份原文件,以防万一。

-- 展开阅读全文 --
头像
www.dede0.com是什么网站?
« 上一篇 2025-12-10
C语言如何实现missingnumber算法?
下一篇 » 2025-12-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]