核心原则:安全第一
在织梦中执行PHP代码,尤其是用户提交的或来自数据库的内容,存在巨大的安全风险,不正确的使用可能导致网站被植入后门、数据泄露等严重问题。

黄金法则:永远不要信任任何来自数据库或用户输入的PHP代码。 只在你完全可控的环境下执行你编写的代码。
使用 {dede:php} 标签(最官方、最安全)
这是织梦官方提供的、在模板中直接执行PHP代码的标签,它的作用域仅限于当前模板文件,并且默认情况下织梦为了安全,在后台的“系统” -> “系统基本参数” -> “核心设置”中是关闭的。
开启 {dede:php}
- 登录织梦后台。
- 进入
系统 -> 系统基本参数。
- 在左侧菜单选择
核心设置。
- 找到
模板引擎禁PHP标签 选项。
- 将其值从
Y 修改为 N,然后点击“保存”。
Y:禁用,标签无效。
N:启用,标签生效。
使用方法
在需要执行PHP的模板文件(如 index.htm, article_list.htm 等)中,直接使用标签语法。
语法:
(图片来源网络,侵删)
{dede:php}
// 在这里写你的PHP代码
// 输出当前时间
echo date('Y-m-d H:i:s');
{/dede:php}
示例:
在首页模板中,调用一个自定义函数来显示欢迎语。
-
在织梦的核心文件中定义函数(推荐)
为了安全,不要把函数写在模板里,最好的做法是写在织梦的核心文件里,/include/common.inc.php,这个文件在每次页面加载时都会被引入。
打开 /include/common.inc.php,在文件末尾添加你的函数:
// 自定义函数:获取欢迎语
function getWelcomeMessage() {
$hour = date('H');
if ($hour < 6) {
return '夜深了,注意休息!';
} elseif ($hour < 12) {
return '早上好!新的一天开始了!';
} elseif ($hour < 18) {
return '下午好!';
} else {
return '晚上好!';
}
}
-
在模板中调用
在你的首页模板 index.htm 中,使用 {dede:php} 标签来调用这个函数:
(图片来源网络,侵删)
<div class="welcome-message">
{dede:php}
echo getWelcomeMessage();
{/dede:php}
</div>
优点:
- 官方支持:最标准、最稳定的方式。
- 作用域隔离:PHP代码只在当前模板文件中执行,不会影响全局。
- 相对安全:相比其他方法,安全性更高。
缺点:
- 需要在后台开启,有一定门槛。
- 对于复杂的逻辑,可能会使模板文件变得臃肿。
使用 {dede:global} 标签结合PHP文件(灵活且安全)
这种方法适用于那些需要在多个页面重复使用的PHP逻辑,你将代码写在一个独立的PHP文件中,然后在模板中通过 {dede:global} 标签来引入并执行它。
创建PHP文件
在网站根目录下创建一个PHP文件,/my_functions.php。
<?php
// my_functions.php
// 定义一个函数来获取最新的文章列表
function getLatestArticles($limit = 10) {
global $dsql;
$articles = array();
$query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
$dsql->Execute('me', $query);
while ($row = $dsql->GetArray('me')) {
$articles[] = $row;
}
return $articles;
}
?>
在模板中调用
在需要显示最新文章列表的模板文件中,使用 {dede:global}
语法:
{dede:global name='your_function_name' function='your_php_file::your_static_method_or_function'/}
示例:
在首页 index.htm 中调用上面的函数。
<h3>最新文章</h3>
<ul>
{dede:global name='getLatestArticles' function='my_functions::getLatestArticles'/}
</ul>
注意: 这种方法通常需要你的PHP文件中定义的是一个类和静态方法,或者是一个可以被 call_user_func 调用的函数,上面的例子稍微简化了,更标准的写法是使用类:
// my_functions.php
<?php
class my_functions {
public static function getLatestArticles($limit = 10) {
global $dsql;
$articles = array();
$query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
$dsql->Execute('me', $query);
while ($row = $dsql->GetArray('me')) {
$articles[] = $row;
}
return $articles;
}
}
?>
然后在模板中:
{dede:global name='getLatestArticles' function='my_functions::getLatestArticles' limit='5'/}
(织梦会自动将标签的属性作为参数传递给函数)
优点:
- 代码复用:将逻辑与模板分离,非常利于维护。
- 安全性高:PHP文件是独立的,不直接暴露在模板中,不易被恶意注入。
- 灵活性高:可以传递参数。
缺点:
- 语法比
{dede:php} 稍微复杂一些。
修改源码,在特定位置嵌入PHP(不推荐,仅用于二次开发)
如果你需要修改织梦的核心PHP文件(如 index.php, list.php 等)来执行代码,这属于二次开发的范畴。此方法非常危险,可能导致升级困难,且极易引入安全漏洞。
示例:
想在首页 index.php 加载时执行一段代码。
-
打开 /index.php。
-
找到 require_once(dirname(__FILE__)."/include/common.inc.php"); 这一行。
-
在它后面添加你的PHP代码:
// index.php
require_once(dirname(__FILE__)."/include/common.inc.php");
// ==============================================
// 在这里添加你的自定义PHP代码
$current_time = date('Y-m-d H:i:s');
// 可以在这里进行数据库操作、调用函数等
// ==============================================
require_once(DEDEINC."/arc.partview.class.php");
...
优点:
- 功能最强大:可以在任何你想执行代码的地方执行。
- 性能最高:没有模板解析的开销。
缺点:
- 极度危险:直接修改核心文件,一旦出错可能导致整个网站瘫痪。
- 升级困难:下次织梦升级时,你的修改会被覆盖,需要重新修改。
- 破坏性大:代码与织梦核心耦合度高,维护成本高。
使用自定义模型(高级用法)
当你需要让用户在前台提交内容,并且这个内容需要经过复杂的PHP处理时(表单提交、数据计算等),可以创建自定义模型。
- 在后台
核心 -> 内容模型管理 -> 添加模型。
- 定义表单字段,并将字段的“处理函数”指向一个你编写的PHP函数。
- 这个函数通常放在
/include/extend.func.php(用于函数)或 /include/custom.func.php(用于类)中。
这是处理用户输入和复杂数据逻辑最规范、最安全的方式,但实现起来也最复杂。
总结与推荐
方法
适用场景
安全性
推荐度
{dede:php}
在模板中执行少量、简单的PHP代码,如输出变量、调用简单函数。
高
⭐⭐⭐⭐⭐ (首选)
{dede:global}
在多个模板中复用一段复杂的PHP逻辑,代码与模板分离。
高
⭐⭐⭐⭐⭐ (首选)
修改源码
进行深度的二次开发,需要在流程的特定节点插入代码。
低
⭐ (不推荐,除非必要)
自定义模型
处理用户提交的表单数据,或需要复杂后台逻辑的内容模型。
高
⭐⭐⭐⭐ (高级场景)
给新手的建议:
- 从
{dede:php} 标签开始,它最简单直观。
- 当你的代码需要在多处使用时,立刻转向
{dede:global},养成良好的代码分离习惯。
- 永远不要在模板里写复杂的业务逻辑,尽量将逻辑封装到函数或类中。
- 绝对不要开启模板里执行任意代码的功能(如
{dede:eval},这是一个非常危险的标签,新版本织梦已移除),也绝对不要相信从数据库里取出来的PHP代码。
- 登录织梦后台。
- 进入
系统->系统基本参数。 - 在左侧菜单选择
核心设置。 - 找到
模板引擎禁PHP标签选项。 - 将其值从
Y修改为N,然后点击“保存”。Y:禁用,标签无效。N:启用,标签生效。
使用方法
在需要执行PHP的模板文件(如 index.htm, article_list.htm 等)中,直接使用标签语法。
语法:

{dede:php}
// 在这里写你的PHP代码
// 输出当前时间
echo date('Y-m-d H:i:s');
{/dede:php}
示例: 在首页模板中,调用一个自定义函数来显示欢迎语。
-
在织梦的核心文件中定义函数(推荐) 为了安全,不要把函数写在模板里,最好的做法是写在织梦的核心文件里,
/include/common.inc.php,这个文件在每次页面加载时都会被引入。打开
/include/common.inc.php,在文件末尾添加你的函数:// 自定义函数:获取欢迎语 function getWelcomeMessage() { $hour = date('H'); if ($hour < 6) { return '夜深了,注意休息!'; } elseif ($hour < 12) { return '早上好!新的一天开始了!'; } elseif ($hour < 18) { return '下午好!'; } else { return '晚上好!'; } } -
在模板中调用 在你的首页模板
index.htm中,使用{dede:php}标签来调用这个函数:
(图片来源网络,侵删)<div class="welcome-message"> {dede:php} echo getWelcomeMessage(); {/dede:php} </div>
优点:
- 官方支持:最标准、最稳定的方式。
- 作用域隔离:PHP代码只在当前模板文件中执行,不会影响全局。
- 相对安全:相比其他方法,安全性更高。
缺点:
- 需要在后台开启,有一定门槛。
- 对于复杂的逻辑,可能会使模板文件变得臃肿。
使用 {dede:global} 标签结合PHP文件(灵活且安全)
这种方法适用于那些需要在多个页面重复使用的PHP逻辑,你将代码写在一个独立的PHP文件中,然后在模板中通过 {dede:global} 标签来引入并执行它。
创建PHP文件
在网站根目录下创建一个PHP文件,/my_functions.php。
<?php
// my_functions.php
// 定义一个函数来获取最新的文章列表
function getLatestArticles($limit = 10) {
global $dsql;
$articles = array();
$query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
$dsql->Execute('me', $query);
while ($row = $dsql->GetArray('me')) {
$articles[] = $row;
}
return $articles;
}
?>
在模板中调用
在需要显示最新文章列表的模板文件中,使用 语法: 示例:
在首页 注意: 这种方法通常需要你的PHP文件中定义的是一个类和静态方法,或者是一个可以被 然后在模板中: (织梦会自动将标签的属性作为参数传递给函数) 如果你需要修改织梦的核心PHP文件(如 示例:
想在首页 打开 找到 在它后面添加你的PHP代码: 当你需要让用户在前台提交内容,并且这个内容需要经过复杂的PHP处理时(表单提交、数据计算等),可以创建自定义模型。 这是处理用户输入和复杂数据逻辑最规范、最安全的方式,但实现起来也最复杂。 给新手的建议:{dede:global}
{dede:global name='your_function_name' function='your_php_file::your_static_method_or_function'/}
index.htm 中调用上面的函数。<h3>最新文章</h3>
<ul>
{dede:global name='getLatestArticles' function='my_functions::getLatestArticles'/}
</ul>
call_user_func 调用的函数,上面的例子稍微简化了,更标准的写法是使用类:// my_functions.php
<?php
class my_functions {
public static function getLatestArticles($limit = 10) {
global $dsql;
$articles = array();
$query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
$dsql->Execute('me', $query);
while ($row = $dsql->GetArray('me')) {
$articles[] = $row;
}
return $articles;
}
}
?>
{dede:global name='getLatestArticles' function='my_functions::getLatestArticles' limit='5'/}
优点:
缺点:
{dede:php} 稍微复杂一些。
修改源码,在特定位置嵌入PHP(不推荐,仅用于二次开发)
index.php, list.php 等)来执行代码,这属于二次开发的范畴。此方法非常危险,可能导致升级困难,且极易引入安全漏洞。index.php 加载时执行一段代码。
/index.php。require_once(dirname(__FILE__)."/include/common.inc.php"); 这一行。// index.php
require_once(dirname(__FILE__)."/include/common.inc.php");
// ==============================================
// 在这里添加你的自定义PHP代码
$current_time = date('Y-m-d H:i:s');
// 可以在这里进行数据库操作、调用函数等
// ==============================================
require_once(DEDEINC."/arc.partview.class.php");
...
优点:
缺点:
使用自定义模型(高级用法)
核心 -> 内容模型管理 -> 添加模型。/include/extend.func.php(用于函数)或 /include/custom.func.php(用于类)中。
总结与推荐
方法
适用场景
安全性
推荐度
{dede:php}在模板中执行少量、简单的PHP代码,如输出变量、调用简单函数。
高
⭐⭐⭐⭐⭐ (首选)
{dede:global}在多个模板中复用一段复杂的PHP逻辑,代码与模板分离。
高
⭐⭐⭐⭐⭐ (首选)
修改源码
进行深度的二次开发,需要在流程的特定节点插入代码。
低
⭐ (不推荐,除非必要)
自定义模型
处理用户提交的表单数据,或需要复杂后台逻辑的内容模型。
高
⭐⭐⭐⭐ (高级场景)
{dede:php} 标签开始,它最简单直观。{dede:global},养成良好的代码分离习惯。{dede:eval},这是一个非常危险的标签,新版本织梦已移除),也绝对不要相信从数据库里取出来的PHP代码。
