dede为何不显示指定栏目内容?

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

使用 typeid 排除参数(最推荐、最灵活)

这是最常用且最灵活的方法,适用于几乎所有使用 {dede:arclist}{dede:channelartlist} 等标签调用内容的地方,核心思想是在调用标签时,使用 typeid 参数来指定你想要显示的栏目ID,并用逗号隔开。

dede 不显示指定栏目内容
(图片来源网络,侵删)

找到要排除的栏目ID

你需要知道哪些栏目的ID是你不想显示的。

  • 登录 DedeCMS 后台。
  • 进入【栏目】->【栏目管理】。
  • 将鼠标悬停在你想要排除的栏目名称上,浏览器状态栏或链接的 href 属性中会显示 typeid=X,这个 X 就是该栏目的 ID,记下这些 ID。

你不想显示 ID 为 5 (关于我们) 和 6 (联系我们) 的栏目。

在模板文件中使用 typeid 参数

dede 不显示指定栏目内容
(图片来源网络,侵删)

打开你想要修改的模板文件(index.htmlist_article.htm 等),找到调用文章列表的标签,如 {dede:arclist}

修改前 (默认调用所有子栏目):

{dede:arclist titlelen='30' row='10'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:arclist}

修改后 (排除指定栏目): 假设你的主栏目 ID 是 1,你想在它的首页显示除 56 外的所有子栏目内容,你需要将 typeid 设置为 1(表示只调用 1 的子栏目),然后用 notypeid 排除。

{dede:arclist typeid='1' notypeid='5,6' titlelen='30' row='10'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:arclist}

参数说明:

dede 不显示指定栏目内容
(图片来源网络,侵删)
  • typeid='1': 指定只调用 ID 为 1 的栏目及其所有子栏目的文章,这是关键,它限定了范围。
  • notypeid='5,6': typeid 指定的范围内,再排除掉 ID 为 5 和 6 的栏目
  • 注意typeidnotypeid 通常是配合使用的,如果你只写 notypeid 而不写 typeid,可能会无效或调用全站内容,不符合大多数需求。

适用场景:

  • 首页文章列表
  • 栏目页文章列表
  • 任何需要自定义内容调用的地方

修改 PHP 源文件(适用于首页特定模块)

如果你只想在首页的某个特定模块(如首页主内容区)排除某个栏目,并且不想修改模板标签,可以直接修改 PHP 文件,这种方法针对性强,但升级 DedeCMS 时可能会被覆盖。

场景: 修改首页主内容区 index.php 的文章调用逻辑。

操作步骤:

  1. 找到文件:

    • 打开 include/common.inc.php 文件,这个文件通常包含一些全局的函数和配置。
    • 在文件中找到 $typeid 或类似的变量定义,或者在需要修改的函数(如 GetArcList)中查找。
  2. 添加排除逻辑: 在 SQL 查询语句中添加 AND 条件来排除指定栏目。

    原始代码可能类似这样:

    // 在某个函数中,如 GetArcList()
    $query = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath
                 FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 order by sortrank asc limit 0, $typeidnum ";

    修改后,添加 AND id NOT IN (...) 条件: 假设我们要排除 ID 为 56 的栏目。

    // 在某个函数中,如 GetArcList()
    $query = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath
                 FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 AND id NOT IN (5,6) order by sortrank asc limit 0, $typeidnum ";

    这里的 AND id NOT IN (5,6) 就是排除条件。

⚠️ 警告:

  • 这种方法直接修改核心文件,有风险。
  • 如果你的 DedeCMS 是二次开发版本,不同版本的代码可能不同,需要仔细定位。
  • 升级 DedeCMS 时,这个修改会被覆盖,需要重新修改。

使用 channel 标签并设置 typeid(适用于栏目导航)

如果你是在制作首页或栏目页的导航栏,不想让某个导航项显示,可以使用 {dede:channel} 标签并配合 typeid 参数。

修改前 (显示所有顶级栏目):

{dede:channel type='top' row='8'}
    <li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}

修改后 (只显示指定的顶级栏目): 假设你只想显示 ID 为 1,2,3,4 的顶级栏目。

{dede:channel typeid='1,2,3,4' type='top' row='8'}
    <li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}

这种方法是通过“只包含”来实现“不显示”,而不是“排除”。


总结与推荐

方法 优点 缺点 推荐场景
typeid + notypeid 灵活、安全、非侵入式,符合模板分离思想,升级无忧。 需要手动在模板中修改。 绝大多数情况下的首选,特别是首页、列表页的内容调用。
修改PHP源文件 针对性强,直接修改数据查询逻辑。 有风险,可能破坏系统,升级后失效,不推荐普通用户使用。 特殊定制需求,且无法通过模板实现时(非常罕见)。
channel 简单直接,专门用于栏目导航。 只能通过“包含”来实现“排除”,不够灵活。 需要控制导航栏显示哪些栏目时。

给你的最终建议:

优先使用方法一,它是最标准、最安全、最可持续的解决方案,花一分钟找到栏目的 ID,然后在模板文件中稍作修改,就能完美解决问题。

-- 展开阅读全文 --
头像
dede如何统计当前栏目文章数?
« 上一篇 01-24
C语言reverse函数如何实现字符串反转?
下一篇 » 01-24

相关文章

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

目录[+]