{dede:arclist} 是 DedeCMS 最核心、最常用的列表标签,用于调用文章列表,虽然它本身不是一个“执行任意PHP代码”的标签,但 DedeCMS 提供了多种方式,让我们可以在 {dede:arclist} 的循环体内,或者在获取数据后,灵活地嵌入和执行 PHP 逻辑。

我将从“简单直接”到“复杂高级”的顺序,为你介绍几种最常用和最有效的方法。
使用 array 和 runphp 属性(最推荐,最灵活)
这是在 {dede:arclist} 标签内执行 PHP 代码最核心、最强大的方法,它不需要修改模板文件,完全在标签内部完成。
核心思路:
- 使用
array屽数据库查询的SELECT语句,只选择你需要的字段。 - 使用
runphp='yes'属性来启用 PHP 代码执行。 - 在
item属性中定义一个变量名(phpcode),你的 PHP 代码将放在这个变量里。 - 在 PHP 代码中,可以使用
$fields变量来访问当前文章的各个字段(如id,title,arcurl等)。
示例场景: 在文章列表中,显示文章的发布时间,并根据发布时间是否在7天内,显示“新”标签。

模板代码 (index.htm):
<ul>
{dede:arclist typeid='1' titlelen='30' row='10' array='id,title,senddate,arcurl' runphp='yes'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
[field:phpcode/]
</li>
{/dede:arclist}
</ul>
代码解析:
{dede:arclist ... runphp='yes'}: 启用PHP运行模式。array='id,title,senddate,arcurl': 明确告诉 DedeCMS 从数据库中只查询这四个字段,可以提高效率。[field:phpcode/]: 这是一个占位符,{dede:arclist}标签会将其替换为item="phpcode"中定义的PHP代码的执行结果。item='phpcode': 定义PHP代码块的变量名为phpcode,注意,这里的phpcode是我们自己定义的,可以换成任何你喜欢的名字,myphp,custom_code等。
item 属性中的PHP代码:
// $fields 是一个数组,包含了当前文章的所有字段
// $fields['id'], $fields['title'], $fields['senddate']
// 获取当前文章的发布时间戳
$senddate = $fields['senddate'];
// 计算7天前的时间戳
$sevenday_ago = time() - (7 * 24 * 3600);
// 判断发布时间是否在7天内
if ($senddate > $sevenday_ago) {
// 如果是,返回一个红色的“新”标签
$result = ' <span style="color:red; font-weight:bold;">[新]</span>';
} else {
// 否则,返回空字符串
$result = '';
}
// 必须输出或返回最终结果
echo $result;
最终效果:
对于7天内发布的文章,标题后面会显示一个红色的 如果你需要在 示例场景: 先获取一个特定分类的ID,然后再用这个ID去调用文章列表。 模板代码 ( 注意: 如果你的PHP逻辑比较复杂,或者想在多个地方复用,最佳实践是创建一个自定义函数,然后在模板中调用它。 步骤: 创建自定义函数文件
在 文件路径: 在模板中调用自定义函数
现在你可以在任何模板文件中使用这个函数了,包括在 模板代码 ( 优点: 这种方法非常强大,但破坏了DedeCMS的封装性,升级时可能会被覆盖,因此仅作为最后手段。 示例场景: 你想在 步骤: 找到底层文件
修改文件
打开 示例(伪代码,非真实修改): 在模板中使用新字段
修改后,你就可以在模板中直接使用这个新添加的字段了。 警告: 最终建议:[新]
使用
php 标签(适用于循环外的逻辑){dede:arclist} 循环之外执行一些PHP代码(在调用列表前先获取一些变量),你可以直接在模板中使用 DedeCMS 的 {dede:php}

index.htm):{dede:php}
// 假设我们通过某种方式(比如URL参数)得到了分类ID
$typeid = isset($_GET['tid']) ? (int)$_GET['tid'] : 1;
// 将这个ID赋值给一个PHP变量,或者将其设置为全局变量
// 这里我们将其设置为全局变量,以便在arclist标签中可以使用
$GLOBALS['typeid_for_list'] = $typeid;
{/dede:php}
<h2>分类ID为 {$typeid_for_list} 的文章列表</h2>
<ul>
{dede:arclist typeid='{$typeid_for_list}' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{dede:arclist}
</ul>
{dede:php} 标签可以执行任意PHP代码,但使用时要非常小心,避免引入安全风险(如SQL注入、XSS等)。
使用自定义函数(最规范、最推荐用于复杂逻辑)
/include/extend.func.php 文件中添加你的PHP函数,如果这个文件不存在,你可以自己创建一个,DedeCMS 在解析模板时会自动加载这个文件。/include/extend.func.php<?php
/**
* 检查文章是否为最新(7天内)
* @param int $senddate 文章的发布时间戳
* @return string 返回'[新]'标签或空字符串
*/
function isNewArticle($senddate) {
$sevenday_ago = time() - (7 * 24 * 3600);
if ($senddate > $sevenday_ago) {
return ' <span style="color:red; font-weight:bold;">[新]</span>';
}
return '';
}
?>
{dede:arclist} 的 runphp 代码块中。index.htm):<ul>
{dede:arclist typeid='1' titlelen='30' row='10' array='id,title,senddate,arcurl' runphp='yes'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
[field:phpcode/]
</li>
{/dede:arclist}
</ul>
item 属性中的PHP代码(调用自定义函数):// 直接调用我们在 extend.func.php 中定义的函数
// $fields['senddate'] 是当前文章的发布时间戳
$result = isNewArticle($fields['senddate']);
// 输出结果
echo $result;
修改底层PHP文件(不推荐,用于极端情况)
{dede:arclist} 的底层文件中,为每条数据自动添加一个额外的字段。
{dede:arclist} 的底层逻辑通常在 /include/taglib/arclist.lib.php 文件中。arclist.lib.php,找到获取数据并循环处理的部分(通常在一个 while 循环中),在循环内部,你可以添加自定义的PHP代码来修改 $row 数组(代表单条数据的数组)。// ... 在 while($row = $dsql->GetArray()) { ... } 循环内部 ...
// 获取当前行的发布时间戳
$senddate = $row['senddate'];
// 调用我们的自定义函数(如果extend.func.php存在)
if (function_exists('isNewArticle')) {
$row['new_tag'] = isNewArticle($senddate);
} else {
$row['new_tag'] = ''; // 如果函数不存在,则设为空
}
// ... 循环继续 ...
{dede:arclist row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
[field:newtag/] <!-- 直接使用我们添加的新字段 -->
</li>
{/dede:arclist}
总结与推荐
方法
优点
缺点
适用场景
array + runphp灵活、强大、无需修改文件
PHP代码写在模板里,可能稍显杂乱
绝大多数需要在列表内执行PHP逻辑的场景
{dede:php}可以执行任意代码,位置灵活
安全风险高,与模板混合
模板顶部的初始化、全局变量设置等
自定义函数
最规范、可复用、易维护
需要额外创建文件
逻辑复杂或需要在多处复用的场景
修改底层文件
功能最底层,效率可能最高
破坏性大,升级易丢失
极端性能优化或需要修改核心行为的场景
{dede:arclist} 循环内执行简单到中等复杂度的PHP代码,首选 array + runphp。runphp 代码中调用它,这是最专业、最可持续的方案。
