dede arclist如何获取文章内容?

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

最推荐、最规范的方法是使用 arcurl + GetOneArchive 的组合,下面我将为你详细介绍几种方法,从最佳实践到不推荐的“曲线救国”方法。

dede arclist 获取文章内容
(图片来源网络,侵删)

最佳实践(强烈推荐)

这是最标准、最高效的方法,适用于列表页调用单篇文章的完整内容,最新文章”、“热门文章”等模块。

核心思路:

  1. 使用 arclist 获取文章的 ID (id)。
  2. 使用 dede:field 标签配合 function 函数,根据 ID 调用 GetOneArchive 方法获取文章的完整内容。

示例代码:

假设你想要在首页调用一篇指定 ID 的文章(ID=1)的完整内容。

dede arclist 获取文章内容
(图片来源网络,侵删)
{dede:arclist idlist='1' titlelen='50'}
    <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
    <!-- 使用 function 调用 PHP 函数获取文章内容 -->
    [field:id function="GetOneArchive(@me, 'content')"/]
{/dede:arclist}

代码详解:

  • {dede:arclist idlist='1'}: 我们只指定要获取 ID 为 1 的文章。idlist 参数可以指定多个 ID,用逗号隔开,如 '1,3,5'
  • [field:id function="GetOneArchive(@me, 'content')/"]: 这是核心部分。
    • field:id: 获取当前文章的 ID。
    • function="...": 调用一个自定义的 PHP 函数。
    • @me: 这是 arclist 循环中当前文章的 ID 值。
    • GetOneArchive(@me, 'content'): 这是一个自定义函数,你需要将其添加到 /include/extend.func.php 文件中。

步骤 1:创建自定义函数

打开你的 DedeCMS 根目录下的 /include/extend.func.php 文件(如果不存在,请创建这个文件),在文件末尾添加以下 PHP 函数代码:

/**
 * 根据文章ID获取文章的完整内容
 * @param int $aid 文章ID
 * @param string $field 需要获取的字段名,这里固定为 'body' 或 'content'
 * @return string 文章内容
 */
function GetOneArchive($aid, $field = 'body') {
    global $dsql;
    if (empty($aid)) {
        return '';
    }
    // 从 dede_archives 表获取 body 字段
    $row = $dsql->GetOne("SELECT `body` FROM `dede_archives` WHERE `id` = $aid");
    // 从 dede_addonarticle 表获取 body 字段 (更推荐,因为内容在附加表)
    // $row = $dsql->GetOne("SELECT `body` FROM `dede_addonarticle` WHERE `aid` = $aid");
    if (is_array($row)) {
        // 返回经过处理的 HTML 内容
        return $row['body'];
    } else {
        return '';
    }
}

步骤 2:在模板中使用

dede arclist 获取文章内容
(图片来源网络,侵删)

你就可以像上面的示例代码一样,在任何模板文件中使用这个函数了。

{dede:arclist idlist='1' titlelen='50'}
    <h3>[field:title/]</h3>
    <div class="content">
        [field:id function="GetOneArchive(@me, 'content')"/]
    </div>
{/dede:arclist}

不推荐的“曲线救国”方法(仅作了解)

有些老教程或特定场景下,可能会使用 arclisttextlinkinnertext 等方式,通过获取文章页面的某个部分来“模拟”获取内容。这种方法非常不推荐,原因如下:

  • 效率低下:需要额外请求一次文章页面,会增加服务器负担。
  • 不稳定:如果文章页面的模板结构发生变化,调用就会失败。
  • 安全性差:直接输出未经处理的 HTML 可能存在 XSS 风险。

示例(仅作了解,请勿在生产环境使用):

{dede:arclist idlist='1' channelid='1' addfields='body'}
    [field:body/]
{/dede:arclist}

为什么这个代码通常无效? arclist 默认不支持直接调用附加表(如 dede_addonarticle)中的 body 字段,虽然 addfields 参数理论上可以,但在 DedeCMS 的标准机制下,它通常只在 list 标签(列表页标签)中才被正确解析,在 arclist 中经常失效或无法正常输出内容。这通常不是一个可靠的解决方案


在文章详情页获取内容

如果你已经在文章的详情页(如 article_article.htm),获取内容就非常简单了,直接使用 field 标签即可。

<h1>[field:title/]</h1>
<div class="article-content">
    [field:body/]
</div>
  • [field:body/]: 直接输出文章的完整内容。
  • [field:content/]: 在某些模板或版本中,contentbody 是等价的,也可以使用。

总结与对比

方法 优点 缺点 适用场景
方法一 (推荐) 高效、稳定、标准 需要修改 extend.func.php 文件 列表页调用单篇文章完整内容,如“最新推荐”、“编辑推荐”等。
方法二 (不推荐) 代码看起来简单 低效、不稳定、不可靠 不推荐在任何场景下使用。
方法三 (详情页) 极其简单,无需额外操作 只能在文章详情页使用 *页(article_.htm)**。

最终建议:

请务必使用 方法一,虽然它比直接写标签多了一步(创建函数),但这是 DedeCMS 二次开发中最规范、最可靠的方式,能确保你的网站长期稳定运行。

-- 展开阅读全文 --
头像
Visual Studio如何配置C语言开发环境?
« 上一篇 12-06
switch的default必须放在最后吗?
下一篇 » 12-06
取消
微信二维码
支付宝二维码

目录[+]