dede如何调用父栏目下的文章?

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

准备工作:获取当前栏目的父栏目ID

在 DedeCMS 的模板文件中,有一个非常重要的全局变量 $type,它包含了当前栏目的所有信息,我们可以从中轻松获取父栏目的ID。

dede调用父栏目文章
(图片来源网络,侵删)
<?php
$parentid = $type->topid; // 获取当前栏目的顶级栏目ID
$parentid = $type->reid;  // 获取当前栏目的直接父栏目ID
?>
  • $type->reid: 获取当前栏目的直接父栏目的ID,如果你在“新闻”栏目下,想调用“公司简介”栏目的文章(假设它们是同级),并且它们的父栏目是“关于我们”,那么你应该用 reid
  • $type->topid: 获取当前栏目的顶级栏目的ID,无论当前栏目在哪一层级,它都能找到最顶层的那个栏目ID。

在大多数情况下,我们使用 $type->reid 就足够了。


调用父栏目的最新文章(最常用)

这是最常见的需求,即在当前页面调用其父栏目下的最新 N 篇文章。

场景示例

假设网站结构如下:

  • 关于我们 (顶级栏目, ID=2)
    • 公司简介 (子栏目, ID=3)
    • 企业文化 (子栏目, ID=4)
    • 发展历程 (子栏目, ID=5)

当用户访问“公司简介”(ID=3) 这个页面时,我们希望在页面上显示“关于我们”(ID=2) 这个顶级栏目下的最新文章。

dede调用父栏目文章
(图片来源网络,侵删)

模板代码

将以下代码放置在你需要显示父栏目文章的模板文件中(article_article.htmlist_category.htm)。

<h3>关于我们栏目最新文章</h3>
<ul>
  {dede:sql sql="SELECT id, title, pubdate FROM `dede_archives` WHERE typeid=~reid ORDER BY pubdate DESC LIMIT 0, 10"}
    <li>
      <a href="[field:arcurl/]">[field:title/]</a>
      <span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
    </li>
  {/dede:sql}
</ul>

代码解析

  1. typeid=~reid:

    • typeid: 这是 arclistsql 标签中用于指定栏目ID的参数。
    • ~reid: 这是 DedeCMS 的一个特殊用法。 符号在这里表示“取反”或“非”,但在 typeid 参数的上下文中,它被巧妙地用来直接引用一个 PHP 变量。~reid 的意思就是“使用 $type->reid 这个变量的值作为 typeid”。
    • typeid=~reid 就等同于 typeid=2(在“公司简介”页面)。
  2. FROMdede_archives``:

    • dede_archives 是 DedeCMS 存储文章核心数据的表,我们直接查询这个表来获取文章列表。
  3. SELECT id, title, pubdate:

    dede调用父栏目文章
    (图片来源网络,侵删)

    我们只需要文章的ID(用于生成链接)、标题和发布时间,所以只查询这三个字段,效率更高。

  4. ORDER BY pubdate DESC:

    按照发布时间降序排列,确保最新的文章排在最前面。

  5. LIMIT 0, 10:

    限制只调用10篇文章,你可以根据需要修改这个数字。

  6. [field:arcurl/]:

    • 使用 sql 标签时,[field:arcurl/] 可以自动生成文章的完整链接,非常方便。

使用 arclist 标签调用(更符合DedeCMS习惯)

如果你更喜欢使用 DedeCMS 原生的 arclist 标签,同样可以实现。

模板代码

<h3>关于我们栏目最新文章 (arclist)</h3>
<ul>
  {dede:arclist typeid=~reid titlelen='40' row='10' orderby='pubdate'}
    <li>
      <a href="[field:arcurl/]">[field:title/]</a>
      <span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
    </li>
  {/dede:arclist}
</ul>

代码解析

  • typeid=~reid: 和 sql 标签一样,这是核心,用来指定父栏目的ID。
  • titlelen='40': 标题长度限制,防止标题过长影响布局。
  • row='10': 调用文章的数量。
  • orderby='pubdate': 按发布时间排序。

arclist 标签使用起来更简单,功能也更丰富,是 DedeCMS 首选的列表调用标签。


调用父栏目的子栏目中的文章

有时候需求更复杂一点:不是调用父栏目自己的文章(如果父栏目允许发布文章的话),而是调用父栏目下所有子栏目的文章。

场景示例

继续上面的例子,在“公司简介”(ID=3) 页面,我们想显示“关于我们”(ID=2) 下的“公司简介”、“企业文化”、“发展历程”所有子栏目的最新文章。

模板代码

<h3>关于我们旗下所有子栏目的最新文章</h3>
<ul>
  {dede:sql sql="SELECT id, title, pubdate FROM `dede_archives` WHERE typeid IN (SELECT id FROM `dede_arctype` WHERE reid=~reid) ORDER BY pubdate DESC LIMIT 0, 15"}
    <li>
      <a href="[field:arcurl/]">[field:title/]</a>
      <span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
    </li>
  {/dede:sql}
</ul>

代码解析

关键在于这句 WHERE typeid IN (SELECT id FROM dede_arctype WHERE reid=~reid)

  1. 内层查询 (SELECT id FROM dede_arctype WHERE reid=~reid):
    • 这个子查询会去 dede_arctype (栏目表) 中查找所有 reid (父栏目ID) 等于当前栏目父ID (~reid) 的栏目。
    • 在我们的例子中,它会返回 3, 4, 5 这三个ID。
  2. 外层查询 WHERE typeid IN (...):
    • 主查询会筛选出 typeid (文章所属栏目ID) 在 3, 4, 5 这个集合中的所有文章。
    • 这样就实现了调用父栏目下所有子栏目文章的目的。

总结与建议

需求场景 推荐方法 核心代码/标签
调用父栏目的最新文章 方法一 (SQL)方法二 (arclist) typeid=~reid
调用父栏目所有子栏目的文章 方法三 (嵌套SQL) typeid IN (SELECT id FROM dede_arctype WHERE reid=~reid)

最佳实践建议:

  1. 优先使用 arclist:对于简单的父栏目文章调用,{dede:arclist typeid=~reid ...} 是最简单、最标准、也最不容易出错的方式。
  2. 复杂需求用 sql:当需要调用子栏目文章或进行更复杂的数据筛选时,{dede:sql ...} 提供了更大的灵活性。
  3. 注意缓存:DedeCMS 有强大的缓存机制,当你修改了模板代码后,如果页面没有立即更新,请到后台“生成” -> “更新HTML” -> “更新栏目”,或者清除一下缓存。
  4. 检查权限:确保你调用的父栏目是“允许发布文章”的,否则 arclist 标签可能不会返回任何结果,你可以在后台“栏目” -> “高级选项”中设置。

希望这些详细的解释和代码能帮助你完美解决在 DedeCMS 中调用父栏目文章的问题!

-- 展开阅读全文 --
头像
dede按更新时间排序
« 上一篇 03-15
织梦网站为何突然打开变慢?
下一篇 » 03-15

相关文章

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