dede如何调用分类文章并限制显示字数?

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

使用官方推荐标签(最安全、最规范)

这是DedeCMS官方文档中推荐的方法,兼容性最好,也最不容易出错,它通过 {dede:field} 标签的 function 属性来调用PHP函数进行截取。

dede调用分类下文章并限制字数
(图片来源网络,侵删)

场景1:限制文章标题的字数

目标:调用“分类ID”为 1 的文章列表,只显示标题,且标题最多显示 20 个字符。

代码示例:

{dede:arclist typeid='1' titlelen='50' orderby='pubdate' row='10'}
    <li>
        <a href="[field:arcurl/]">[field:title function='cn_substr(@me,20)'/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"]</span>
    </li>
{/dede:arclist}

代码详解:

  • {dede:arclist ...}:这是调用文章列表的主标签。
    • typeid='1'指定要调用的分类ID,请将 1 替换为您自己的分类ID。
    • titlelen='50':这个属性是在数据库查询时就限制标题的长度,主要用于列表页显示完整标题,我们这里更推荐用下面的 function 来做最终显示,所以这个值可以设大一些或省略。
    • orderby='pubdate':按发布时间降序排列,你也可以用 click (点击量)、id (文章ID) 等。
    • row='10':获取 10 条文章记录。
  • [field:arcurl/]:文章的链接地址。
  • [field:title function='cn_substr(@me,20)'/]:这是实现标题截取的核心。
    • field:title:获取文章标题的字段内容。
    • function='...':对获取到的内容执行一个PHP函数。
    • cn_substr(@me,20):这是一个DedeCMS内置的PHP函数。
      • @me:代表当前标签的原始值,也就是 field:title 的完整内容。
      • 20:表示截取前 20 个字符。
      • 注意cn_substr 是一个按字节截取的函数,对于英文字符和半角符号算1个字节,对于中文字符算2个字节,20个字节大约等于10个汉字,如果你希望按“字”来截取(比如20个汉字),可以使用 mb_substr 函数(需要服务器开启mbstring扩展)。
  • [field:pubdate function="MyDate('Y-m-d',@me)"]:格式化发布日期。

场景2:限制文章摘要(简介)的字数

目标:调用“分类ID”为 1 的文章列表,显示文章摘要,且摘要最多显示 100 个字符。

dede调用分类下文章并限制字数
(图片来源网络,侵删)

代码示例:

{dede:arclist typeid='1' orderby='pubdate' row='5'}
    <div class="article-item">
        <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
        <p>[field:description function='cn_substr(@me,100)'/]...</p>
    </div>
{/dede:arclist}

代码详解:

  • [field:description function='cn_substr(@me,100)'/]截取类似,这里是对文章的摘要(description 字段)进行截取。
    • @mefield:description 的完整内容。
    • 100 是截取的字节长度。
    • 最后手动加上 表示摘要被截断了,这是一个很好的用户体验习惯。

使用自定义函数(更灵活,推荐用于摘要)

cn_substr 无法满足需求时(比如需要处理特殊符号、或者需要更复杂的逻辑),我们可以自定义一个PHP函数,然后在模板中调用它,这种方法尤其适合处理文章摘要。

步骤1:在 /include/extend.func.php 文件中添加自定义函数

请用FTP或文件管理器打开您的网站根目录下的 /include/extend.func.php 文件,如果这个文件不存在,请自行创建,在文件末尾 ?> 的前面,添加以下代码:

dede调用分类下文章并限制字数
(图片来源网络,侵删)
/**
 * 截取字符串并过滤掉HTML标签
 * @param string $str 需要截取的字符串
 * @param int $length 截取长度
 * @param string $dot 结尾符号
 * @return string
 */
function cutstr_html($str, $length, $dot = '...')
{
    // 1. 先去除HTML标签
    $str = strip_tags($str);
    // 2. 去除多余的空白和换行
    $str = preg_replace('/\s/', '', $str);
    // 3. 使用DedeCMS自带的cn_substr函数进行截取
    // (如果你的环境支持mbstring,也可以使用 mb_substr($str, 0, $length, 'utf-8') )
    $str = cn_substr($str, $length);
    // 4. 如果原始长度大于截取长度,则添加结尾符号
    if (strlen($str) > $length) {
        $str .= $dot;
    }
    return $str;
}

函数说明: 这个函数 cutstr_html 会先清除掉所有的HTML标签(<p>, <a> 等),然后再进行截取,这样可以避免HTML标签被截断导致页面样式错乱。

步骤2:在模板中调用自定义函数

你可以在任何模板文件中使用这个新函数了。

代码示例:

{dede:arclist typeid='2' row='8' orderby='pubdate'}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
        <p>
            [field:body function='cutstr_html(@me, 150)'/] <!-- 注意:这里用的是 body 字段,它包含了文章的完整内容 -->
        </p>
    </li>
{/dede:arclist}

代码详解:

  • [field:body function='cutstr_html(@me, 150)'/]
    • 我们这里使用了 field:body,因为它包含了文章的完整内容(不含HTML标签的话,description 也可以,但body更通用)。
    • function='cutstr_html(@me, 150)':调用我们刚刚在 extend.func.php 中定义的函数。
    • @mefield:body 的完整内容。
    • 150 是我们希望截取的字节长度。
    • 函数会自动处理掉HTML标签并添加 。

总结与建议

需求场景 推荐方法 优点 缺点
字数 [field:title function='cn_substr(@me,N)'/] 简单、高效、官方推荐 按字节截取,对中文处理可能不直观
限制摘要字数 自定义函数 cutstr_html 最灵活、最健壮,能过滤HTML,避免页面错乱 需要修改PHP文件,对新手稍复杂
简单截取摘要 [field:description function='cn_substr(@me,N)'/] 简单直接 如果摘要里有HTML标签,可能被截断

给您的建议:

  1. :直接使用方法一的 cn_substr 即可,非常方便。
  2. 限制摘要/内容:强烈推荐使用方法二(自定义函数),虽然多了一步操作,但它能从根本上解决因HTML标签被截断而导致的页面布局混乱问题,是更专业、更稳妥的做法。

希望这个详细的教程能帮助到您!

-- 展开阅读全文 --
头像
dede如何统计每个栏目的文章数量?
« 上一篇 2025-12-21
vs2010如何运行C语言程序?
下一篇 » 2025-12-21

相关文章

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

目录[+]