dede如何全站最新文章不调某栏目?

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

使用自定义SQL(最推荐)

这是最灵活、最直接的方法,我们通过编写一个SQL查询语句,直接从数据库中获取我们想要的数据。

dede调用全站的最新文章 不调用某栏目
(图片来源网络,侵删)

操作步骤:

  1. 找到目标栏目的ID: 你需要确定不调用的那个栏目的ID。

    • 登录你的DedeCMS后台。
    • 进入「栏目管理」。
    • 找到那个你想要排除的栏目,鼠标悬停在上面,浏览器左下角会显示链接,.../catalog_add.php?dopost=edit&channelid=1&cid=5,这里的 cid=5 就是该栏目的ID,假设我们要排除ID为 5 的栏目。
  2. 在模板中添加自定义SQL调用标签: 在你想要显示最新文章的模板文件(通常是 index.htm 或其他自定义的 .htm 文件)中,使用 {dede:sql}

    <h3>全站最新文章(排除“不想要”的栏目)</h3>
    <ul>
      {dede:sql sql='SELECT arc.id, arc.title, arc.typeid, arc.pubdate, tp.typename 
                    FROM dede_archives arc 
                    LEFT JOIN dede_arctype tp ON arc.typeid = tp.id 
                    WHERE arc.typeid != 5 AND arc.arcrank >= 0 
                    ORDER BY arc.pubdate DESC 
                    LIMIT 10'}
        <li>
          <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
          <span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span>
        </li>
      {/dede:sql}
    </ul>

代码详解:

  • {dede:sql sql='...'}: 这是DedeCMS执行自定义SQL的核心标签。
  • SELECT arc.id, arc.title, ...: 我们选择需要显示的字段,如文章ID、标题、栏目ID、发布时间、栏目名称等。
    • arc.id: 文章ID。
    • arc.title: 文章标题。
    • arc.typeid: 文章所属栏目ID。
    • arc.pubdate: 文章发布时间戳。
    • tp.typename: 栏目名称(通过 LEFT JOIN 关联 dede_arctype 表获取)。
    • arc.arcurl: 注意arcurl 字段在 archives 表里不存在,它是一个动态值,我们不能直接 SELECT arc.arcurl,正确的做法是使用 {field:arcurl/} 标签,它会自动根据你的网站规则生成文章链接。
  • FROM dede_archives arc: 指定从 dede_archives (文章主表) 查询,并给它一个别名 arc
  • LEFT JOIN dede_arctype tp ON arc.typeid = tp.id: 关联 dede_arctype (栏目表) 以获取栏目名称。
  • WHERE arc.typeid != 5: 这是关键typeid != 5 的意思是,筛选出栏目ID不等于5的所有文章。请将 5 替换成你自己的栏目ID
    • 如果要排除多个栏目,可以用 AND 连接,WHERE arc.typeid NOT IN (5, 8, 10),这会排除ID为5、8、10的三个栏目。
  • AND arc.arcrank >= 0: 这是一个非常重要的条件。arcrank 是文章的审核状态,-1 表示被审核掉或回收站的文章,>= 0 表示只调用正常发布的文章。
  • ORDER BY arc.pubdate DESC: 按照发布时间倒序排列,保证最新的文章排在前面。
  • LIMIT 10: 限制只返回10条记录,你可以根据需要修改这个数字。
  • [field:arcurl/]: 在循环内部,用于生成文章的完整链接。
  • [field:title/]: 显示文章标题。
  • [field:pubdate function='MyDate("Y-m-d", @me)'/]: 对发布时间戳进行处理,格式化为 "年-月-日" 的形式。

使用 arclist 标签 + typeid 参数(备选方案)

如果你的网站结构简单,或者你只想排除顶级栏目,这个方法会更简单。

操作步骤:

  1. 找到所有你想要调用的栏目的ID: 这个方法不是“排除”,而是“包含”,你需要列出所有需要调用的栏目的ID。

    • 进入「栏目管理」。
    • 记下所有需要调用文章的栏目的ID,你需要调用栏目ID为 1, 2, 3, 4 的文章,而栏目 5 是不需要的。
  2. 在模板中使用 arclist: 将这些ID用英文逗号 隔开,赋值给 typeid 参数。

    dede调用全站的最新文章 不调用某栏目
    (图片来源网络,侵删)
    <h3>全站最新文章(仅包含指定栏目)</h3>
    <ul>
      {dede:arclist typeid='1,2,3,4' titlelen='40' orderby='pubdate' orderway='desc' row='10'}
        <li>
          <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
          <span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span>
        </li>
      {/dede:arclist}
    </ul>

代码详解:

  • typeid='1,2,3,4': 这是核心,这里明确指定了只调用这几个ID的栏目下的文章,你需要手动计算并填入所有需要包含的栏目ID。
  • orderby='pubdate' orderway='desc': 按发布时间倒序排列,与SQL方法中的效果一致,len='40'`: 标题长度限制,防止标题过长影响布局。
  • row='10': 调用文章的数量限制。

这种方法的缺点:

  • 维护麻烦:如果未来新增了栏目,并且你希望新栏目的文章也显示在这里,你必须手动回来修改这个 typeid 值。
  • 不适合复杂排除:如果你有几十个栏目,只想排除一两个,列出所有要包含的ID会非常繁琐。

使用 loop 标签(备选方案)

loop 标签的功能与 sql 类似,但语法稍有不同,它更像是在写一段PHP代码。

<h3>全站最新文章(使用loop标签)</h3>
<ul>
  {dede:loop table='dede_archives' sort='pubdate' row='10' if='typeid!=5 AND arcrank>=0'}
    <li>
      <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
      <span class="info">([field:pubdate function='MyDate("Y-m-d", @me)'/])</span>
    </li>
  {/dede:loop}
</ul>

代码详解:

  • {dede:loop table='...'}: 指定操作的表名。
  • sort='pubdate': 排序字段,等同于SQL的 ORDER BY
  • row='10': 返回记录数。
  • if='typeid!=5 AND arcrank>=0': 这是核心,这里的 if 条件相当于SQL的 WHERE 子句,同样,typeid != 5 是排除指定栏目,arcrank >= 0 是只调用已审核文章。

loop 标签的灵活性不如 sql 标签,因为它不能方便地进行 JOIN 操作(比如获取栏目名称),所以对于这个需求,sql 标签是更优的选择。


总结与推荐

方法 优点 缺点 适用场景
自定义SQL 最灵活、性能最好、逻辑清晰(排除法)、可扩展性强(如JOIN获取更多信息) 需要一点SQL基础,但语法简单 强烈推荐,几乎所有需要复杂筛选的场景都适用。
arclist 标签简单,无需写SQL 维护麻烦(需要手动列出所有包含的ID)、不适合排除少量栏目 网站栏目
dede调用全站的最新文章 不调用某栏目
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
织梦5.7sp1模板源码是资讯站专用吗?
« 上一篇 11-30
全国计算机等级考试二级c 语言程序设计
下一篇 » 11-30

相关文章

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