dede列表页如何调用副栏目的文章?

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

使用SQL直接查询(最推荐、最灵活)

这是最直接、最高效的方法,通过自定义SQL语句,我们可以一次性获取当前栏目及其所有副栏目的文章。

dede列表页调用副栏目文章
(图片来源网络,侵删)

适用场景

  • 需要完全自定义调用逻辑,不受限于默认标签。
  • 对性能有一定要求,希望减少数据库查询次数。
  • 需要复杂的排序或筛选条件。

操作步骤

  1. 找到并打开你的列表页模板文件。 这个文件通常位于 /templets/你的栏目目录/ list_article.htm

  2. 在需要调用副栏目文章的位置,添加以下代码

    dede列表页调用副栏目文章
    (图片来源网络,侵删)
{dede:sql sql='
    SELECT 
        a.id, a.title, a.litpic, a.description, a.pubdate, a.typeid, t.typename, t.isdefault, t.namerule, t.moresite, t.siteurl, t.sitepath, t.ispart, t.core, t.addtable, a.arcrank, a.click, a.money
    FROM 
        `#@__archives` a
    LEFT JOIN 
        `#@__arctype` t ON a.typeid = t.id
    WHERE 
        a.typeid IN ([!--thisid--], (SELECT pid FROM `#@__arctype` WHERE id = [!--thisid--]))
    ORDER BY 
        a.sortrank DESC, a.id DESC
    LIMIT 
        0, 10
'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
    </li>
{/dede:sql}

代码详解

  • {dede:sql ...}:这是DedeCMS的自定义SQL查询标签。
  • SELECT ... FROM ...:标准的SQL查询语句,我们选择了文章表(#@__archives)和栏目表(#@__arctype)的相关字段。
  • a.typeid IN ([!--thisid--], (SELECT pid FROM#@__arctypeWHERE id = [!--thisid--])):这是SQL的核心。
    • [!--thisid--]:这是DedeCMS的内置变量,代表当前栏目的ID。
    • IN (...):表示 typeid 字段的值在括号内的任意一个。
    • [!--thisid--]:匹配当前栏目本身。
    • (SELECT pid FROM#@__arctypeWHERE id = [!--thisid--]):这是一个子查询,它会查找当前栏目ID的父栏目ID(pid),在DedeCMS中,副栏目是通过将一个栏目的父ID(pid)设置为目标栏目的ID来实现的,所以这个子查询的结果就是当前栏目的所有副栏目的ID。
    • 注意:这个SQL假设副栏目的数量只有一个(即一个父栏目对应一个子栏目作为副栏目),如果支持多个副栏目,更健壮的写法是查询副栏目表 #@__arctypetopid 字段等于当前栏目ID的记录,请根据你的实际栏目结构调整。
  • ORDER BY a.sortrank DESC, a.id DESC:按文章的排序值和ID降序排列,这是DedeCMS的默认排序方式。
  • LIMIT 0, 10:限制查询结果为10条,你可以根据需要修改。
  • [field:arcurl/][field:title/]:在SQL查询结果中,可以直接使用 field 标签来输出字段值。arcurl 是一个特殊字段,会自动生成文章的完整链接。

使用 channel 标签循环调用(简单易用)

如果你的副栏目数量不多,并且希望保持模板的“织梦风格”,可以循环调用每个副栏目,然后再在每个副栏目下调用文章。

适用场景

  • 副栏目数量较少(例如1-3个)。
  • 希望代码结构清晰,易于理解和维护。
  • 对性能要求不高。

操作步骤

dede列表页调用副栏目文章
(图片来源网络,侵删)
  1. 打开列表页模板文件 (/templets/你的栏目目录/ list_article.htm)。

  2. 添加以下代码

<!-- 调用当前栏目和所有副栏目的文章 -->
{dede:channel type='son' currentid='[!--thisid--]'}
    <div class="sub-channel-list">
        <h3>栏目:[field:typename/]</h3>
        <ul>
            {dede:arclist row='8' titlelen='30'}
                <li>
                    <a href="[field:arcurl/]">[field:title/]</a>
                </li>
            {/dede:arclist}
        </ul>
    </div>
{/dede:channel}

代码详解

  • {dede:channel type='son' currentid='[!--thisid--]'}
    • type='son':表示获取当前栏目的“子栏目”,在DedeCMS的栏目体系中,副栏目就是通过设置子栏目来实现的。
    • currentid='[!--thisid--]':指定当前栏目ID,确保只获取当前栏目的子栏目。
  • [field:typename/]:输出子栏目的名称。
  • {dede:arclist ...}:在 channel 标签的循环体内,使用 arclist 标签来调用该子栏目下的文章。
    • row='8':每个副栏目调用8篇文章。
    • titlelen='30'长度限制为30个字符。

优点:代码结构清晰,符合织梦标签的使用习惯。 缺点:如果副栏目很多,会产生多次数据库查询,性能较差。


使用 getarclist 函数(进阶方法)

这个方法与方法一类似,但使用了PHP函数的方式,在某些模板引擎(如早期版本)或需要更复杂逻辑时可能更方便。

操作步骤

  1. 打开列表页模板文件

  2. 添加以下代码

{dede:getarclist typeid='[!--thisid--],~son' row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
    </li>
{/dede:getarclist}

代码详解

  • {dede:getarclist ...}:调用文章列表的函数标签。
  • typeid='[!--thisid--],~son':这是关键。
    • [!--thisid--]:包含当前栏目。
    • ~son:这是一个特殊用法,表示包含当前栏目的所有“子栏目”(即副栏目)。
  • row='10':总共调用10篇文章,len='30'`:标题长度限制。

优点:标签简洁,一行代码搞定。 缺点:灵活性不如直接写SQL,且 ~son 的性能可能不如优化的SQL查询。


总结与建议

方法 优点 缺点 推荐度
SQL查询 性能最好、最灵活、功能强大 需要懂一些SQL语法,代码稍复杂 ⭐⭐⭐⭐⭐ (强烈推荐)
channel循环 代码结构清晰、易于理解 副栏目多时性能差、代码冗余 ⭐⭐⭐ (适合少量副栏目)
getarclist 代码非常简洁 灵活性差,性能一般 ⭐⭐ (备选方案)

最终建议

对于绝大多数网站,方法一(SQL查询)是最佳选择,它既保证了性能,又提供了足够的灵活性,是专业开发者的首选,如果你只是临时做一个简单的网站,副栏目也只有一个,那么方法二也是一个不错的选择。

-- 展开阅读全文 --
头像
dede文章页如何移动到其他栏目?
« 上一篇 01-21
C语言程序一行写不下时如何换行?
下一篇 » 01-21

相关文章

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

目录[+]