使用 cn_substr 函数直接截取(最常用)
这是最直接、最简单的方法,直接在模板文件中使用 DedeCMS 自带的字符串截断函数 cn_substr。

(图片来源网络,侵删)
函数说明:
cn_substr($str, $start, $length)
$str: 要截取的字符串,这里就是文章标题{dede:field.title/}。$start: 开始截取的位置(从0开始)。$length: 要截取的字符长度。
操作步骤:
- 打开你的列表页模板文件,通常位于
/templets/你的模板目录/list_*.php。 - 找到显示文章标题的标签,通常是
{dede:field.title/}。 - 将其替换为
cn_substr函数。
示例代码: 只显示前 20 个字符。
{dede:list pagesize='10'}
<li>
<!-- 原始方式显示完整标题 -->
<!-- <a href="[field:arcurl/]">[field:title/]</a> -->
<!-- 使用 cn_substr 显示短标题,只显示前20个字符 -->
<a href="[field:arcurl/]">[field:title function='cn_substr(@me, 20)'/]</a>
<!-- 如果标题长度超过20个字符,后面可以加上省略号 -->
<a href="[field:arcurl/]">[field:title function='cn_substr(@me, 20) "..."/]</a>
</li>
{/dede:list}
代码解释:

(图片来源网络,侵删)
[field:title function='cn_substr(@me, 20)'/]:[field:title/]: 获取当前文章的标题。function='...': 对获取到的值执行函数操作。@me: DedeCMS 模板中的特殊变量,代表当前标签的原始值,在这里就是{field:title}的完整内容。cn_substr(@me, 20): 对@me)执行cn_substr函数,截取前 20 个字符。
使用 substring 函数(ASCII 字符截取)
中不包含中文等全角字符,或者你只想按字节(Byte)截取,可以使用 substring 函数,它和 cn_substr 的区别在于,cn_substr 是按字符(一个汉字算一个字符)来计算的,而 substring 是按字节(一个汉字可能占 2-3 个字节)来计算的。
示例代码:
{dede:list pagesize='10'}
<li>
<!-- 使用 substring 截取前10个字节 -->
<a href="[field:arcurl/]">[field:title function='substring(@me, 0, 10)'/]</a>
</li>
{/dede:list}
注意: 对于包含中文的标题,使用 substring 很容易导致截断处出现乱码(如“标题abc变”),因此强烈推荐使用 cn_substr。
使用自定义函数(最灵活)
当你有更复杂的需求时,比如想自定义截取后的样式、添加更多判断逻辑,最好的方法是创建一个自定义函数。

(图片来源网络,侵删)
操作步骤:
-
创建自定义函数文件:
- 在
/include/目录下创建一个新文件,myfunctions.php。 - 在这个文件中定义你的函数,这里我们定义一个
get_short_title函数,它可以在截断后自动添加省略号,并且处理了标题过长的情况。
// 文件路径: /include/myfunctions.php if(!defined('DEDEINC')) exit('Request Error!'); /** * 获取短标题 * @param string $title 原始标题 * @param int $length 截取长度 * @return string 处理后的短标题 */ function get_short_title($title, $length = 20) { // 如果标题长度小于等于指定长度,直接返回 if (mb_strlen($title, 'UTF-8') <= $length) { return $title; } // 否则进行截断并添加省略号 return mb_substr($title, 0, $length, 'UTF-8') . '...'; } - 在
-
引入自定义函数文件:
- 在你的列表页模板文件(
list_*.php)的最顶部,引入你刚刚创建的文件。
{dede:config} <!-- 在模板顶部引入自定义函数文件 --> <?php require_once(DEDEROOT.'/include/myfunctions.php'); ?> {/dede:config} - 在你的列表页模板文件(
-
在模板中使用自定义函数:
- 现在可以在模板中调用你的
get_short_title函数了。
{dede:list pagesize='10'} <li> <!-- 调用自定义函数,截取前15个字符 --> <a href="[field:arcurl/]">[field:title function='get_short_title(@me, 15)'/]</a> </li> {/dede:list} - 现在可以在模板中调用你的
优点:
- 逻辑清晰:所有自定义逻辑都放在 PHP 文件中,模板文件更干净。
- 可复用:这个函数可以在任何其他模板(如文章页
article_*.php)中调用。 - 功能强大:可以轻松扩展,比如添加过滤 HTML 标签、自定义省略号样式等。
修改 DedeCMS 核心文件(不推荐,除非你确定后果)
这种方法是直接修改 DedeCMS 的源代码,让 {dede:field.title/} 默认就显示短标题。极不推荐,因为升级 DedeCMS 时你的修改会被覆盖,且可能导致意想不到的问题。
仅作了解:
你可以在 /include/helpers/arc.listview.class.php 文件中找到处理列表标签的逻辑,修改它,使其在输出标题时自动调用截断函数,但这属于“黑魔法”,强烈建议不要使用。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
cn_substr |
简单、快速、直接,无需修改文件 | 功能单一,无法处理复杂逻辑 | 绝大多数情况下的首选,日常使用完全足够。 |
substring |
适用于纯英文或按字节截取的场景 | 对中文不友好,易出乱码 | 标题纯为英文,且对字节长度有严格要求时。 |
| 自定义函数 | 最灵活、最规范,可扩展性强 | 需要额外创建文件和引入 | 有复杂需求,如自定义省略号、过滤内容、多处复用。 |
| 修改核心 | 一劳永逸(理论上) | 破坏系统完整性,升级麻烦,风险高 | 不推荐新手使用,仅用于深度定制且不打算升级的系统。 |
对于绝大多数用户,我强烈推荐使用【方法一】或【方法三】。
- 如果只是简单截取,用 方法一。
- 如果项目较大,希望代码更规范、功能更强大,用 方法三。
