我会按照从最推荐、最安全到不推荐、有风险的顺序为你介绍几种方法。

(图片来源网络,侵删)
使用 {dede:include} 标签(最常用、最推荐)
这是 Dedecms 官方提供的、用于在模板中引入其他模板文件(或包含PHP代码的文件)的标准方法,它是最灵活、最规范的方式。
适用场景:
- 引入一个独立的模板文件(如
head.htm,footer.htm)。 - 引入一个包含PHP逻辑和HTML混合的文件。
语法:
{dede:include file='文件路径' ismake='是否为绝对路径'}
参数说明:

(图片来源网络,侵删)
file:必需参数,要引入的文件路径。- 相对路径:相对于
templets/你的模板目录/的路径,引入include/目录下的side.php文件,就写include/side.php。 - 绝对路径:如果你想引入
templets/system/目录下的文件,可以设置ismake='yes',然后写完整路径,如templets/system/float.htm,但通常不推荐这样做,不利于模板迁移。
- 相对路径:相对于
ismake:可选参数,默认为no。no表示相对路径,yes表示绝对路径。
示例:
假设你的模板文件是 article_article.htm,你想在文章内容下方引入一个 "相关文章" 的列表,而这个列表的逻辑和HTML都写在 include/related_articles.php 文件中。
-
创建
include/related_articles.php文件 这个文件里可以写PHP代码,也可以直接写HTML,DedeCMS 在解析时会先执行其中的PHP代码。<!-- include/related_articles.php --> <?php // 获取当前文章的ID $arcID = $aid; // 调用DedeCMS的内置函数来获取相关文章 // 这里只是示例,具体SQL或函数根据你的需求来写 $relatedItems = array(); // 假设我们有一个简单的逻辑来获取相关文章 // 在实际项目中,你可能会查询数据库或使用DedeCMS提供的标签 $dsql = new DedeSql(false); $sql = "SELECT * FROM `dede_archives` WHERE id != $arcID ORDER BY rand() LIMIT 5"; $dsql->SetQuery($sql); $dsql->Execute('me'); while ($row = $dsql->GetArray('me')) { $relatedItems[] = $row; } ?> <div class="related-articles"> <h3>相关文章</h3> <ul> <?php if (!empty($relatedItems)): ?> <?php foreach ($relatedItems as $item): ?> <li> <a href="<?php echo GetOneArchive($item['id']); ?>"> <?php echo $item['title']; ?> </a> </li> <?php endforeach; ?> <?php else: ?> <li>暂无相关文章</li> <?php endif; ?> </ul> </div> -
在模板文件
article_article.htm中引入 在你想要显示相关文章的位置,加入以下标签:
(图片来源网络,侵删)<!-- article_article.htm --> <article> {dede:field.body/} </article> <!-- 引入我们创建的相关文章文件 --> {dede:include file='include/related_articles.php'/} <footer> <!-- 页脚内容 --> </footer>
优点:
- 官方支持:最标准、最稳定的方式。
- 灵活:可以引入任何类型的文件,只要服务器能解析。
- 安全:DedeCMS会对引入路径进行一定的安全检查,比直接使用
require或include函数更安全。
使用 {dede:php} 标签(用于执行内联PHP代码)
如果你的PHP代码逻辑比较简单,不想创建单独的文件,可以直接在模板文件中使用这个标签。
适用场景:
- 在模板中执行一些简单的PHP变量计算、条件判断等。
- 不建议在这里写复杂的数据库查询或业务逻辑,会使模板难以维护。
语法:
{dede:php}
// 在这里写你的PHP代码
// 注意:这里的代码可以直接访问DedeCMS的全局变量,如 $arcID, $typeid 等
{/dede:php}
示例: 在文章模板中,根据文章ID的奇偶数给文章内容添加不同的CSS类。
<article class="{dede:php}
if ($arcID % 2 == 0) {
echo 'even-content';
} else {
echo 'odd-content';
}
{/dede:php}">
{dede:field.body/}
</article>
优点:
- 方便快捷,适合简单逻辑。
- 代码和模板放在一起,逻辑直观。
缺点:
- 可维护性差:如果PHP代码变多,会使模板文件变得臃肿和混乱。
- 违反关注点分离原则:模板应该只负责展示,不应该包含复杂的业务逻辑。
直接使用 PHP 函数(不推荐,有安全风险)
这是最直接的方法,但也是最危险的方法,它完全绕过了DedeCMS的安全机制。
适用场景:
- 仅在完全可控的本地开发环境,且你非常清楚风险时,用于快速调试。
- 绝不用于生产环境。
语法:
<?php
// 直接在这里写PHP代码
require_once('/path/to/your/file.php');
// 或者
$result = your_custom_function();
?>
示例:
<div class="custom-box">
<?php
// 假设这是一个自定义的函数,在extend.func.php中定义
echo getCustomAd();
?>
</div>
巨大风险:
- 安全漏洞:直接使用
require,include,file_get_contents等函数,如果文件路径由用户输入控制(如?id=../config.php),极易导致 文件包含漏洞,导致网站被黑客控制。 - 路径问题:相对路径是基于当前执行脚本的,而不是模板文件所在的位置,很容易出错。
- 破坏模板结构:直接使用PHP标签会破坏DedeCMS模板的标签解析机制,可能导致其他标签失效。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 | 适用场景 |
|---|---|---|---|---|
{dede:include} |
安全、灵活、官方推荐 | 需要创建单独文件 | ⭐⭐⭐⭐⭐ | 绝大多数情况下的首选,引入独立的模板或逻辑文件。 |
{dede:php} |
方便,适合简单逻辑 | 可维护性差,混合业务逻辑 | ⭐⭐⭐ | 简单的变量处理、条件判断,避免复杂代码。 |
| 直接PHP | 直接、快速 | 极高风险、不安全 | ⭐ | 强烈不推荐,仅用于本地临时调试。 |
最佳实践建议:
- 优先使用
{dede:include}:将你的PHP代码和HTML放在一个独立的文件中(例如在templets/你的模板/include/目录下),然后在模板中用{dede:include}引入,这是最清晰、最安全、最易于维护的方式。 - 将复杂逻辑封装到函数:如果某个功能需要在多个模板中复用,不要在每个模板里都写一遍,最好的做法是:
- 在
extend.func.php文件中定义一个自定义函数。 - 在模板中使用
{dede:php}调用这个函数,或者使用DedeCMS的{dede:field function='myFunction()' /}标签来调用。
- 在
- 保持模板的纯粹性:尽量让
.htm模板文件只包含HTML和DedeCMS标签,避免直接嵌入大段的PHP代码。
{dede:include} 的文件路径再强调一下:
如果你的模板目录是 /templets/default/,{dede:include file='include/header.php'} 实际上引入的是 /templets/default/include/header.php,这个规则一定要记清楚。
