织梦调用上级栏目文章

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 织梦建站 正文

使用 channelartlist 标签(推荐,最灵活)

这是最推荐、最灵活的方法。channelartlist 标签可以循环指定的一组栏目,并在每个栏目循环内部使用 list 标签来调用该栏目的文章,我们可以利用它来同时调用当前栏目和上级栏目。

织梦调用上级栏目文章
(图片来源网络,侵删)

适用场景: 在当前栏目的列表页,同时显示当前栏目的文章列表和上级栏目的文章列表。

实现步骤:

  1. 获取当前栏目的ID和上级栏目的ID。 在织梦模板中,可以通过 typeid 变量获取当前栏目ID,通过 topid 变量获取顶级栏目ID,通过 reid 变量获取直接上级栏目ID,我们需要的是 reid

  2. 使用 channelartlist 我们将当前栏目ID和上级栏目ID组合起来,传递给 channelartlisttypeid 属性。

    织梦调用上级栏目文章
    (图片来源网络,侵删)

代码示例:

假设您想在列表页的上方,先显示上级栏目的几篇文章,然后再显示当前栏目的文章列表。

{dede:channelartlist typeid='[field:reid],[field:typeid]'}
  <!-- 第一个循环:上级栏目 -->
  <div class="parent-channel">
    <h2><a href="[field:typeurl/]">[field:typename/]</a> (上级栏目)</h2>
    <ul>
      {dede:list pagesize='5'}
      <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
      </li>
      {/dede:list}
    </ul>
  </div>
  <!-- 第二个循环:当前栏目 -->
  <div class="current-channel">
    <h2><a href="[field:typeurl/]">[field:typename/]</a> (当前栏目)</h2>
    <ul>
      {dede:list pagesize='10'}
      <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
      </li>
      {/dede:list}
    </ul>
    <!-- 如果需要分页,把分页代码放在所有循环的外面 -->
    <!-- {dede:pagelist listsize='4' listitem='pre,next,end,option,info'/} -->
  </div>
{/dede:channelartlist}

代码解释:

  • typeid='[field:reid],[field:typeid]': 这是核心,它告诉 channelartlist 标签要循环两个栏目:第一个是当前栏目的上级栏目(reid),第二个是当前栏目本身(typeid)。
  • {dede:channelartlist}...{/dede:channelartlist}: 这个大循环会执行两次,分别对应上级栏目和当前栏目。
  • [field:typeurl/][field:typename/]: 在循环内部,这两个变量会随着当前循环的栏目而改变,分别显示栏目的链接和名称。
  • {dede:list}: 在 channelartlist 内部使用 list 标签来调用该栏目的文章列表。
  • 注意: 分页标签 {dede:pagelist} 应该放在 channelartlist外面,而不是在某个 list 循环的内部,因为整个 channelartlist 的内容都属于当前栏目列表页。

直接使用 sql 查询标签(最直接,性能最好)

如果您只想简单地调用上级栏目的几篇文章,不涉及复杂的循环逻辑,直接使用 sql 标签查询数据库是最直接的方法。

织梦调用上级栏目文章
(图片来源网络,侵删)

适用场景: 只需要在页面的某个特定位置(如侧边栏)显示上级栏目的几篇文章。

实现步骤:

  1. 编写SQL查询语句。 语句需要:从 dede_archives 表中查询条件是所属栏目ID等于当前栏目的上级栏目ID并按发布时间降序排序限制数量为5条

  2. 使用 {dede:sql} 标签执行查询。

代码示例:

<h2>推荐文章(来自上级栏目)</h2>
<ul>
  {dede:sql sql="SELECT id, title, pubdate FROM dede_archives WHERE typeid = ~reid~ ORDER BY pubdate DESC LIMIT 0,5"}
    <li>
      <a href="[field:arcurl/]">[field:title/]</a>
      <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
  {/dede:sql}
</ul>

代码解释:

  • sql="...": 这里是标准的SQL查询语句。
  • typeid = ~reid~: 这是关键。~reid~ 是织梦模板引擎的一个特殊用法,它会自动替换为当前栏目的 reid(上级栏目ID)值,注意是波浪线 ,不是单引号 。
  • LIMIT 0,5: 表示从第0条记录开始,获取5条记录。
  • [field:arcurl/]: 在 sql 标签中,arcurl 需要通过函数 GetArcUrl(@id) 来生成,织梦默认支持 [field:arcurl/],但如果出现问题,可以使用 [field:id function='GetArcUrl(@me)'/]

使用 list 标签的 typeid 属性(最简单)

如果您的页面结构非常简单,只是想在当前栏目文章列表的旁边,再列一个上级栏目的文章块,可以直接使用两个独立的 list

适用场景: 页面布局简单,只需要并排显示两个栏目的文章列表。

代码示例:

<div class="main-content">
  <!-- 当前栏目文章列表 -->
  <div class="current-list">
    <h2>当前栏目文章</h2>
    {dede:list pagesize='10'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:list}
  </div>
  <!-- 上级栏目文章列表 -->
  <div class="parent-list">
    <h2>上级栏目推荐</h2>
    {dede:list typeid='[field:reid]' pagesize='5'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:list}
  </div>
</div>

代码解释:

  • {dede:list typeid='[field:reid]'}: 在第二个 list 标签中,通过 typeid 属性直接指定了要调用的栏目ID为当前栏目的上级栏目ID [field:reid]
  • 注意: 这种方法会触发两次独立的数据库查询,如果文章数量较多,可能会对页面加载速度产生轻微影响,但对于大多数网站来说,这点影响可以忽略不计。

总结与选择建议

方法 优点 缺点 适用场景
channelartlist 最灵活,代码结构清晰,易于管理,符合织梦标签哲学。 语法稍复杂,需要理解嵌套循环。 强烈推荐,需要在同一页面展示多个栏目文章列表的复杂布局。
sql 性能最好,直接查询数据库,效率高。 需要懂SQL,可读性稍差,硬编码了表名(dede_archives)。 只需要在页面某个角落调用少量上级栏目文章,如侧边栏、推荐位。
list 最简单,代码直观,容易理解。 会触发多次查询,对于复杂页面可能不够优雅。 页面布局非常简单,只需要并排显示两个栏目文章列表的初级需求。

对于绝大多数情况,方法一 (channelartlist) 是最佳选择,因为它既灵活又高效,并且是织梦官方推崇的用法。

-- 展开阅读全文 --
头像
c语言是如何体现结构思想的
« 上一篇 03-05
织梦数据库链接文件配置在哪?
下一篇 » 03-05

相关文章

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