dede arclist如何调用文章内容?

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

这是一个非常常见的需求,但很多新手会遇到只显示摘要、不显示内容的问题,核心原因在于 安全机制性能考虑

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

  • 直接调用全文?不行。 出于安全(防止SQL注入)和性能(避免查询大字段)的考虑,{dede:arclist} 标签默认不支持直接调用文章的完整 body
  • 最佳实践:使用摘要。 推荐使用文章的摘要字段(description),这是最高效、最标准的做法。
  • 必须调用部分内容?有办法。 如果确实需要调用文章正文的一部分,可以通过自定义函数或修改系统文件来实现,但有一定风险。

调用文章摘要(最推荐、最安全、最标准)

这是 DedeCMS 设计之初就考虑好的方案,你在后台发布文章时,在“或“简介”字段中填写内容,然后在模板中调用。

后台设置摘要

在发布或编辑文章时,确保填写了“信息。

模板标签调用

{dede:arclist} 标签内,使用 [field:description/] 来调用摘要。

基本示例:

dede arclist调用文章内容
(图片来源网络,侵删)
{dede:arclist typeid='1' titlelen='50' row='5'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>[field:description/]...</p>
  </li>
{/dede:arclist}

标签说明:**

说明
[field:description/] 调用文章的摘要内容。
[field:info/] 调用文章摘要,但会自动过滤掉 HTML 标签,只显示纯文本。
[field:infos/] info 类似,但长度更短,适合极简的简介。

优化显示(去除多余的HTML标签和空格): 中可能包含 <p><br> 等标签,或者开头有空格,我们可以使用 striphtmlcnsub 函数来优化显示。

{dede:arclist typeid='1' titlelen='50' row='5'}
  <li>
    <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
    <p>
      <!-- 
        striphtml='true'  去除所有HTML标签
        function='cn_substr(@me, 150)'  截取前150个字符
      -->
      [field:description function='(strip_tags(@me))' ]
      ...
    </p>
  </li>
{/dede:arclist}

调用文章正文的一部分(不推荐,但有解决方案)

如果你忘记写摘要,或者希望动态截取正文内容,可以尝试以下方法。注意:这些方法可能会影响网站性能,请谨慎使用。

方案A:使用自定义函数(推荐,无需修改核心文件)

这是最灵活且最安全的方法,因为它不修改 DedeCMS 的核心文件。

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

步骤 1:创建自定义函数文件

/include/extend.func.php 文件中(如果不存在,请自行创建),添加以下 PHP 函数:

/**
 * 截取HTML内容,并保留一定长度
 * @param string $str  原始HTML内容
 * @param int $start 开始截取的位置
 * @param int $length 截取长度
 * @param string $charset 编码
 * @param bool $ellipsis 是否在截取后添加省略号
 * @return string
 */
function HtmlSub($str, $start = 0, $length = 100, $charset = "utf-8", $ellipsis = '...')
{
    // 1. 过滤掉所有HTML标签和脚本样式
    $str = preg_replace("/<script.*?>.*?<\/script>/si", "", $str);
    $str = preg_replace("/<style.*?>.*?<\/style>/si", "", $str);
    $str = strip_tags($str);
    // 2. 截取纯文本
    $str = mb_substr($str, $start, $length, $charset);
    // 3. 添加省略号
    if (mb_strlen($str, $charset) < mb_strlen(strip_tags($str), $charset)) {
        $str .= $ellipsis;
    }
    return $str;
}

步骤 2:在模板中调用该函数

现在你可以在 {dede:arclist} 中使用这个自定义函数了。

{dede:arclist typeid='1' row='5'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>
      <!-- 
        调用自定义函数 HtmlSub
        @me 表示当前字段的值,这里是[field:body/]
        0 表示从第0个字符开始
        200 表示截取200个字符
      -->
      [field:body function='HtmlSub(@me, 0, 200)'/]
      ...
    </p>
  </li>
{/dede:arclist}

优点:

  • 安全,不修改核心文件。
  • 功能强大,可以过滤掉脚本和样式,只保留纯文本。

缺点:

  • 需要手动修改或创建文件。
  • 每次调用都会执行 PHP 代码,对服务器有一定压力(如果列表文章很多)。

方案B:修改 DedeCMS 核心文件(不推荐,有风险)

警告:此方法会修改 DedeCMS 的核心文件,在升级系统时可能会被覆盖,导致功能失效,请谨慎操作!

步骤 1:找到并修改文件

找到并打开 /include/taglib/arclist.lib.php 文件。

步骤 2:修改代码

  1. 在文件中找到 $row['description'] = $this->TrimCN($row['description']); 这一行(大约在 280 行左右)。
  2. 在它后面,添加以下代码,以获取 body 字段的内容:
// 在 $row['description'] = ...; 这行后面添加
$row['body'] = $row['body'];

步骤 3:在模板中调用

你就可以在模板中通过 [field:body/] 来获取文章的完整正文内容了,然后结合 function 来截取。

{dede:arclist typeid='1' row='5'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>
      <!-- 
        直接调用body,并用mb_substr函数截取
        注意:这里没有过滤HTML标签,如果正文有图片等,也会显示出来
      -->
      [field:body function='mb_substr(@me, 0, 200, "utf-8")'/]...
    </p>
  </li>
{/dede:arclist}

缺点:

  • 风险高:修改核心文件,升级后可能丢失。
  • 性能差body 是一个长文本字段,在列表页中大量查询会严重影响数据库性能和页面加载速度。
  • 显示混乱:直接截取 body 可能会破坏 HTML 结构,导致显示错乱。

总结与建议

方法 优点 缺点 推荐度
调用摘要 性能最佳、安全、标准、官方推荐 需要手动在后台填写摘要 ★★★★★ (强烈推荐)
自定义函数 灵活、安全(不修改核心)、功能可控 需要修改PHP文件,对性能有轻微影响 ★★★★☆ (当摘要无法满足需求时使用)
修改核心文件 实现简单 风险高、性能差、可能破坏HTML ☆☆☆☆☆ (强烈不推荐,仅限紧急情况或测试环境)

给你的最终建议:

养成在后台发布文章时填写摘要的好习惯,这是最专业、最高效的网站建设方式,如果因为某些特殊原因确实需要动态截取内容,请优先选择自定义函数的方法。

-- 展开阅读全文 --
头像
如何去除dede中的标签?
« 上一篇 12-10
C语言如何创建进度条?
下一篇 » 12-10
取消
微信二维码
支付宝二维码