dede如何调用来源相同的文章?

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

准备工作:确保文章有来源

请确保你的文章模型中已经有了“来源”这个字段,在 DedeCMS 后台,这通常对应的是 source 字段。

dede调用来源相同的文章
(图片来源网络,侵删)
  1. 检查字段是否存在:登录后台,进入“核心” -> “内容模型管理” -> 选择你的文章模型(如“文章模型”) -> “字段管理”,查看是否存在 source 字段。
  2. 发布文章时填写来源:在发布文章时,记得在“文章来源”或相应位置填写来源信息,CSDN”、“知乎”、“官方博客”等,这个字段需要被正确填写,才能被调用出来。

使用自定义SQL查询(推荐,更灵活)

这种方法的核心是使用 dede:sql 标签,直接执行你想要的 SQL 语句,它的优点是完全自定义,可以配合其他字段进行复杂的查询。

基本语法

{dede:sql sql='你的SQL语句'}
    <li>
        <a href='[field:arcurl/]'>[field:title/]</a>
    </li>
{/dede:sql}

示例1:调用来源为“CSDN”的所有文章

假设你想调用所有来源为“CSDN”的文章,并且按发布时间倒序排列。

<h3>来自 CSDN 的相关文章</h3>
<ul>
    {dede:sql sql="SELECT * FROM `dede_archives` WHERE source = 'CSDN' ORDER BY pubdate DESC"}
        <li>
            <a href='[field:arcurl/]'>[field:title/]</a>
            <span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
        </li>
    {dede:sql}
</ul>

代码解析:

  • sql="SELECT * FROM ...":这是标准的 SQL 查询语句。
  • dede_archives:DedeCMS 存储文章基本信息的核心表。
  • WHERE source = 'CSDN':这是筛选条件,表示只查找 source 字段值为 'CSDN' 的记录。注意:字符串值需要用单引号括起来。
  • ORDER BY pubdate DESC:按发布时间(pubdate 字段)降序排列,确保最新的文章显示在最前面。
  • [field:arcurl/]:调用文章的链接。
  • [field:title/]:调用文章的标题。
  • [field:pubdate .../]:调用文章的发布时间,并使用 function 进行格式化,使其更易读。

示例2:调用当前文章来源的其他文章(非常实用)

这个场景很常见:在文章详情页,显示与本文来源相同的其他文章。

dede调用来源相同的文章
(图片来源网络,侵删)
<h3>更多来自 [field:source/] 的文章</h3>
<ul>
    {dede:sql sql="SELECT * FROM `dede_archives` WHERE source = '[field:source/]' AND id <> [field:id] ORDER BY pubdate DESC LIMIT 10"}
        <li>
            <a href='[field:arcurl/]'>[field:title/]</a>
        </li>
    {dede:sql}
</ul>

代码解析:

  • source = '[field:source/]':这里使用了 DedeCMS 的变量替换,[field:source/] 会被当前文章的来源值所替代,如果当前文章来源是“知乎”,SQL 就变成了 WHERE source = '知乎'
  • AND id <> [field:id]:这个条件非常重要,它排除了当前文章本身,避免显示重复。
  • LIMIT 10:限制只调用 10 条记录,防止内容过多。

使用 arclist 标签配合子查询

arclist 是 DedeCMS 最常用的列表标签,虽然它本身不直接支持按 source 字段筛选,但我们可以通过它的 typeidchannelid 属性配合自定义SQL来实现,或者更巧妙地使用 subday 等属性,但对于按来源筛选,直接使用 dede:sql 更清晰。

如果你非常想用 arclist,可以这样实现(原理是通过一个子查询来获取指定来源的文章ID):

<h3>来自 CSDN 的相关文章</h3>
<ul>
    {dede:arclist typeid='0' channelid='1' titlelen='40' row='10'}
        {dede:sql sql='SELECT id FROM dede_archives WHERE source = "CSDN" AND id IN ([field:id/])'}
            <li>
                <a href='[field:arcurl/]'>[field:title/]</a>
            </li>
        {/dede:sql}
    {/dede:arclist}
</ul>

注意: 这种方法比较绕,且 arclistidlist 属性通常不支持动态值,所以这种方法在灵活性上不如第一种。强烈推荐优先使用方法一 (dede:sql)

dede调用来源相同的文章
(图片来源网络,侵删)

总结与建议

方法 优点 缺点 适用场景
dede:sql 灵活、强大、直接,可编写任意复杂SQL,性能较好。 需要用户具备基本的SQL知识。 所有需要自定义查询的场景,特别是调用来源、自定义字段等。
arclist + SQL 可以利用 arclist 的其他样式功能。 代码复杂,可读性差,灵活性低,不推荐。 极少数需要与 arclist 特定样式结合的复杂需求。

最终推荐:

直接使用 方法一 (dede:sql),它是解决这类问题的最标准、最高效的方式。

特别提醒:

  • 在模板中编写SQL时,请确保你的表名(如 dede_archives)和字段名(如 source, pubdate, id)与你的数据库结构一致,通常默认安装下,这些名称是固定的。
  • 如果你的文章来源可能包含单引号(如 O'Reilly),需要进行转义处理,否则SQL会出错,但在大多数情况下,来源是普通文本,无需担心。
-- 展开阅读全文 --
头像
dede隐藏栏目文章标题如何显示?
« 上一篇 今天
dede数据库还原后为何为空?
下一篇 » 今天

相关文章

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

目录[+]