DedeCMS提示信息文字怎么改:源码+模板完整改造
织梦DedeCMS默认弹窗的DEDECMS提示信息标题如何改成品牌名?本文给出全站10处包含该文案的文件清单、common.func.php源码修改、message.htm模板重写带响应式样式、sed与PowerShell批量替换脚本、Git版本化、XSS防御与Puppeteer自动化回归测试。
做了这么多年的织梦仿站和企业站维护,我手上经手过的DEDECMS项目少说也有上百个。每次客户拿到一个新做的站,最先发现的小毛病,几乎不是栏目分类有问题,也不是模板样式没对齐,而是登录提交一条评论、留言失败、或者投票之后跳出来的那行字——"DEDECMS提示信息!"。
这行文字本身没什么大问题,但它对一个想要做品牌的网站来说,确实显得不够自家。客户经常会问我:保哥,这几个字能不能改成我们公司的名字?要不就改成网站的logo文字?说实话,这种需求从我做织梦的第一年就开始遇到,到现在依然不少。今天我就把多年来积累的修改方式,连同我自己踩过的坑,统一整理成一篇笔记,方便后来者直接照搬上手。
为什么这行提示文字值得花时间改
很多新手会觉得,提示信息只是用户在某些动作之后才能看到的小弹窗,谁会在意呢?我以前也这么想过,直到有一次给一个本地的家居企业客户做完站,他们的运营人员在上线第二周就找到我,说:保哥,我们老板看到那个跳转页弹的还是DEDECMS,问我们花的钱去哪了。
从那次以后我就开始重视这件事。一个网站的细节体验,往往就藏在这种角落里。从SEO的角度看,搜索引擎抓取站点的时候不会专门解析这行字,但它会影响品牌词在页面里的覆盖率。从用户体验的角度看,提示信息出现的瞬间,用户的注意力是集中的,这时候出现你的品牌名而不是CMS名字,效果远比页脚一行版权信息好得多。
所以我现在每次仿站交付前,都会把这件事放进上线前检查清单里。改一次只要几分钟,但一旦不改,可能客户半年都念叨这事。
织梦提示信息背后的源码定位
要改一段提示文字,先得搞清楚它到底从哪里来。织梦的提示文字主要由两部分构成,一部分写在PHP文件里,一部分写在模板里。
PHP端的逻辑核心在 include/common.func.php 这个文件中,这里有一个名为 ShowMsg 的函数,它负责接收提示标题、跳转链接、跳转时间这些参数,然后输出一段HTML。模板端则在 templets/system/message.htm 或者 templets/plus/message.htm 中,这两个文件是真正负责把提示界面渲染出来的载体。
搞清楚这层关系,后面要改什么、改在哪里,思路就会清晰很多。我在带新人的时候,总是会强调一句话:织梦的所有奇怪现象都能通过 grep 一下源码找到答案,这套系统就是个没怎么加密的 PHP 程序,没有什么神秘的魔法。
DedeCMS 全站包含"DEDECMS提示信息"的所有文件清单
我在客户站上跑过完整 grep,发现远不止 common.func.php 和 message.htm 两个文件,下面是 5.7 SP2 GBK 版的完整命中清单:
| 路径 | 命中次数 | 说明 |
|---|---|---|
| include/common.func.php | 2 | ShowMsg 函数 + showMsg 兼容函数 |
| templets/system/message.htm | 2 | 系统提示模板 |
| templets/plus/message.htm | 2 | 前台插件类提示模板 |
| member/templets/message.htm | 2 | 会员中心提示模板 |
| plus/list_old.php | 1 | 旧版列表回退提示 |
| plus/feedback.php | 1 | 评论提交反馈提示 |
| plus/vote.php | 1 | 投票结果提示 |
| plus/recommend.php | 1 | 推荐文章提示 |
| plus/digg_ajax.php | 1 | 顶踩 Ajax 反馈 |
| plus/diy.php | 1 | 自定义表单提交结果 |
如果你只改前两个,会员中心和插件页面依然显示老文案。这就是为什么很多教程教完客户改 common.func.php 后客户回头说"还有几个页面没改",原因就在这。
最直接的方式:修改common.func.php
大多数教程里讲的都是这种方式,因为它最容易理解,也最容易上手。打开 include/common.func.php,搜索关键字 DEDECMS,你会发现两处出现"DEDECMS提示信息"这几个字。
// 修改前
$htmlhead = '<html>\r\n<head>\r\n<title>DEDECMS提示信息</title>\r\n';
// 后面还有一段类似的输出
echo '<div class='title'>DEDECMS提示信息!</div>';你只要把这两处的"DEDECMS提示信息"替换成你想要的文字,例如"保哥笔记 友情提示"或者"某某公司 系统提示",保存上传覆盖,刷新一下页面,提示文字就更新了。
// 修改后示例
$htmlhead = '<html>\r\n<head>\r\n<title>保哥笔记 友情提示</title>\r\n';
echo '<div class='title'>保哥笔记 友情提示!</div>';这种方式有一个潜在的坑:织梦本身的升级补丁经常会覆盖 common.func.php。如果你后续打了官方补丁,可能会把你之前改过的文字又恢复回去。我个人的做法是把改动写进一份 patch 笔记里,每次升级完先 diff 一下,再把自己的改动重新打回去。
ShowMsg、ShowMsgFinish、ShowMsgWait 三个函数的差异
织梦的提示函数其实是一族而不是单个函数:
- ShowMsg($msg, $gourl, $onlymsg=0, $limittime=0):标准提示函数,输出 message.htm 渲染的页面,自动跳转
- ShowMsgFinish($title, $msg, $gourl):完成态提示,常用于发布文章成功后
- ShowMsgWait($title, $msg, $url, $sec):等待态提示,倒计时跳转
三者都在 common.func.php 里定义,且都包含 "DEDECMS提示信息" 字面。建议三处都改成同一个品牌文案,保持一致性。
更稳妥的方式:直接修改message.htm模板
说实话,我现在已经很少改 common.func.php 了,更倾向于改模板文件,因为模板文件被升级覆盖的概率小很多。
打开 templets/system/message.htm,里面是一个标准的HTML文档结构。把里面的两个"DEDECMS提示信息"改成你的品牌名,再顺手把样式也调一下,让它和主站风格一致。比如把 body 的字体调成你网站常用的字体,把 .title 的颜色改成主色调,这样提示页就不再是裸奔的样子了。
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>保哥笔记 友情提示</title>
<link rel='icon' href='/favicon.ico'>
<style type='text/css'>
body { font-family: 'PingFang SC','Microsoft YaHei',sans-serif; background: #f6f8fa; margin:0; }
.main { max-width: 600px; margin: 80px auto; background: #fff; padding: 40px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,.06); }
.brand { display:flex; align-items:center; margin-bottom: 20px; }
.brand img { height: 32px; margin-right: 12px; }
.brand span { font-size: 18px; color: #2563eb; font-weight: 600; }
.title { font-size: 16px; color: #111; margin-bottom: 12px; }
.content { font-size: 14px; color: #333; line-height: 1.8; padding: 16px; background: #f8fafc; border-radius: 6px; }
.foot { font-size: 12px; color: #999; margin-top: 24px; text-align: right; }
@media (max-width: 640px) { .main { margin: 20px; padding: 24px; } }
</style>
</head>
<body>
<div class='main'>
<div class='brand'><img src='/logo.svg' alt='保哥笔记'><span>保哥笔记</span></div>
<div class='title'>友情提示</div>
<div class='content'>{dede:global.msg/}</div>
<div class='foot'>{dede:global.foot/}</div>
</div>
</body>
</html>保存覆盖后,所有触发提示的动作都会用这个新模板渲染,效果立竿见影。我顺便加了 viewport meta 和移动端 media query,让提示页在手机上也是友好的。
给提示页加上倒计时进度条
原版的跳转倒计时只是一行小字,体验不好。我后来习惯加一条进度条:
<div class='countdown'>
<span id='secLeft'>5</span> 秒后自动跳转,
<a href='{dede:global.gourl/}'>立即跳转</a>
</div>
<div class='bar-wrap'><div class='bar' id='bar'></div></div>
<style>
.bar-wrap { height: 4px; background: #e5e7eb; border-radius: 2px; margin-top: 12px; overflow: hidden; }
.bar { height: 100%; width: 100%; background: #2563eb; transition: width 1s linear; }
</style>
<script>
var sec = 5, bar = document.getElementById('bar'), sp = document.getElementById('secLeft');
var t = setInterval(function(){
sec--; sp.textContent = sec; bar.style.width = (sec*20)+'%';
if (sec <= 0) { clearInterval(t); location.href = '{dede:global.gourl/}'; }
}, 1000);
</script>容易被忽略的plus/message.htm
很多人改完 templets/system/message.htm 之后觉得万事大吉,结果切到会员中心或者评论页,依然看到"DEDECMS提示信息"。这是因为 plus 目录下还有一个独立的提示模板。
我自己的习惯是改一份就同步另一份,而且把两个文件的样式做成完全一样的。这样无论提示信息从哪里来,用户看到的视觉效果都是统一的。否则用户在前台一种风格、在会员中心又看到另一种风格,整个站点的质感立刻就掉了一截。
如果你装了第三方插件,有些插件还会自带自己的提示模板,比如某些会员系统、问答系统。这时候要做的就是 grep 一下整个项目里所有的 message.htm,把它们都过一遍。
# 在项目根目录下查找所有 message 模板
grep -rl 'DEDECMS提示信息' ./templets ./plus ./member
# 一行命令一次性替换所有
grep -rl 'DEDECMS提示信息' ./templets ./plus ./member | xargs sed -i 's/DEDECMS提示信息/保哥笔记 友情提示/g'这条命令我每次接手一个新站都会跑一次,少则几个文件,多则十几个,全部统一成同一份品牌文案,整体感会强很多。注意 sed -i 在 macOS 上要写成 sed -i ''(带空字符串),Linux 上不用。
用 PowerShell 在 Windows Server 上批量替换
如果客户用的是 Windows Server + IIS 部署,没有 sed 可用,PowerShell 一行能搞定:
Get-ChildItem -Path 'D:\wwwroot\client' -Recurse -Include '*.htm','*.php' |
ForEach-Object {
$c = [System.IO.File]::ReadAllText($_.FullName, [System.Text.Encoding]::GetEncoding('GBK'))
if ($c -match 'DEDECMS提示信息') {
$c2 = $c -replace 'DEDECMS提示信息','保哥笔记 友情提示'
[System.IO.File]::WriteAllText($_.FullName, $c2, [System.Text.Encoding]::GetEncoding('GBK'))
Write-Host "Patched: $($_.FullName)"
}
}注意织梦 GBK 站点要用 GetEncoding('GBK') 读写,UTF-8 站点改成 UTF8。直接 Get-Content -Raw 会按系统默认编码读,混编情况下容易乱码。
如何在不破坏升级路径的前提下做改动
做织梦项目的人最怕的就是改一次就再也不敢升级了。我自己摸索出来的一套规范是这样的:
第一,所有源码层面的改动,都要写进 notes/patch.md,包括文件路径、修改前的关键字、修改后的内容、修改时间。第二,所有模板层面的改动,都要复制一份原始文件加 .bak 后缀,方便随时回滚。第三,每次升级补丁前先做一次完整压缩备份,文件名带上日期。
# 备份 include 目录下的关键文件
cp include/common.func.php include/common.func.php.bak.20260507
# 备份模板
cp templets/system/message.htm templets/system/message.htm.bak.20260507这样的好习惯,一旦养成会受益很多年。我手里有几个站从 2014 年一路用到今天,正是靠着这套笔记体系才能稳定维护下来。
用 Git 替代 .bak 备份是更好的方案
更专业的做法是给整个织梦站点初始化一个 Git 仓库,所有改动用 commit 记录:
cd /www/wwwroot/yoursite
git init
git add .
git commit -m 'initial dedecms 5.7 SP2 baseline'
# 改完之后
git add include/common.func.php templets/system/message.htm
git commit -m 'rebrand: DEDECMS提示信息 → 保哥笔记 友情提示'
# 升级补丁前先切到一个 patch 分支
git checkout -b official-patch-2026-05
# 应用官方 patch
# 然后 merge 回 main,conflict 解决一次即可Git 的好处是 diff 一目了然、回滚极快、可以追溯何时为什么改的。.gitignore 里把 data/、uploads/ 这两个动态目录排除即可。
修改完别忘了回归测试
改完之后不要急着关 SSH,建议把所有可能触发提示的动作都点一遍。我自己用的清单大概是这些:
第一类是会员动作,包括登录失败、注册成功、密码错误、邮箱未验证。第二类是内容互动,包括发表评论、评论审核中、收藏成功、点赞成功。第三类是后台动作,包括登录提示、权限不足、数据保存成功。第四类是支付或订单,如果你的站点用了商城插件,这块也要测。
每点一次都看看弹出来的提示页面,标题、正文、跳转倒计时是不是都符合预期。如果有遗漏的"DEDECMS提示信息",就再回去 grep 一遍源码,找到对应的位置补上。
用 Puppeteer 自动化回归测试
如果客户站规模较大、提示页类型多,可以写一个 Node + Puppeteer 脚本自动遍历所有提示场景:
const puppeteer = require('puppeteer');
const scenarios = [
{ name: '评论提交', url: 'https://example.com/plus/feedback.php?aid=1', method: 'POST', body: { msg: 'test' } },
{ name: '投票', url: 'https://example.com/plus/vote.php?dopost=send' },
{ name: '会员注册', url: 'https://example.com/member/reg_new.php', method: 'POST' },
// ...
];
(async () => {
const browser = await puppeteer.launch();
for (const s of scenarios) {
const page = await browser.newPage();
await page.goto(s.url);
const title = await page.title();
if (title.includes('DEDECMS')) console.error('FAIL:', s.name, title);
else console.log('OK:', s.name, title);
await page.close();
}
await browser.close();
})();这个脚本可以放到 CI 里,每次升级补丁后自动跑一遍,第一时间发现哪些提示页又被还原了。
ShowMsg 的 XSS 防御注意事项
改完文字之后顺便把安全性也看一眼。原版 ShowMsg 函数把 $msg 直接拼到 HTML 里输出,如果某个调用方传入了用户可控数据(比如评论内容),就会触发存储型 XSS。改写 message.htm 时建议加一道防御:
// 在 message.htm 里把
<div class='content'>{dede:global.msg/}</div>
// 改成(如果你确定 msg 永远是文本不含 HTML)
<div class='content'>{dede:global.msg function='htmlspecialchars(@me, ENT_QUOTES, "UTF-8")'/}</div>这样即使有插件不小心把用户输入直接传给 ShowMsg,也会被 htmlspecialchars 拦截一道。注意 dede 标签的 function 参数里如果包含双引号要用 HTML 实体写。
保哥的几条经验总结
做了这么多年织梦,我对这种小细节的修改已经形成了固定流程。第一,先改模板,能不动 PHP 就不动。第二,所有改动都做记录,方便升级。第三,前后台、插件、模板都要扫一遍。第四,改完之后必须做一遍完整的点击测试。
表面看起来这只是一个文字替换的小活,但它背后体现的是一个站长对网站细节的态度。我经常跟同行说一句话:织梦不是一个完美的 CMS,但它给了我们足够多的自由度,让我们可以把每一个角落都改成自己想要的样子,问题在于你愿不愿意花这个时间。
常见问题解答
修改完common.func.php上传后还是显示原来的字,是缓存问题吗?
大概率是浏览器缓存或者织梦自身的页面缓存。先在浏览器里 Ctrl+F5 强制刷新,如果还不行就进后台"系统-系统基本参数"后随便保存一次,再到"生成-更新主页 HTML"里重新生成一次。如果还是没生效,回去检查文件是否真的上传成功,特别注意 FTP 工具有时候会因为编码问题导致 PHP 文件没真正覆盖。GBK 站点用 UTF-8 编辑器保存 PHP 文件会让中文变成乱码,这是新人最容易踩的坑。
我改了message.htm但有些提示页还是老样子,怎么办?
那基本就是 plus/message.htm 或者 member/templets/message.htm 没改,或者站点里装了第三方插件自带模板。建议在项目根目录运行一次 grep -rl 'DEDECMS提示信息' . 命令,把所有包含旧文字的文件都列出来,逐一处理。改完之后再运行一次同样的 grep,确认没有漏网之鱼。
织梦升级会把我的改动覆盖回去吗?
会。所以我才反复强调要做笔记和备份。我的建议是把所有改动整理成一份 patch 文件,每次升级完用 diff 比对一下,再把改动重新打回去。如果改动比较多,可以写一个 shell 脚本一键应用,效率会高很多。最稳的方式是用 Git,每次官方 patch 在独立分支应用,然后 merge 回主分支,冲突自动定位。
能不能不改源码,只通过模板把提示文字盖掉?
大部分场景是可以的,因为提示页面的标题和正文最终都是由模板控制的。但 common.func.php 里有些直接 echo 出来的字符串依然会绕过模板,建议两边都过一遍最稳妥。如果你是仿站交付,模板和源码我都会帮客户改,确保上线后看不到任何 CMS 默认文案。具体来说,ShowMsg 里的 htmlhead 部分是绕过模板直接 echo 的,只能改源码;模板里的部分才走 message.htm 渲染。
移动端访问提示页布局错乱怎么办?
原版 message.htm 没加 viewport meta、CSS 也是固定宽度,手机上显示会很丑。本文第四节的样式模板已经加了 viewport 和 media query,把固定 600px 宽度改成 max-width + 自适应 margin,手机上看完全正常。如果你想更进一步,可以把样式抽到单独的 CSS 文件,方便后续整体改皮肤。
多语言站点怎么处理提示文字?
织梦本身不支持原生 i18n。变通办法是根据 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 在 ShowMsg 函数顶部判断语种,预先选择不同的 message.htm 模板。或者更彻底一点:把 message.htm 里的提示文字全部抽到一份 lang.php 文件里,提示函数读 $LANG[$key] 输出。改造工作量稍大,但一次到位。
客户希望提示页带上品牌 logo 和导航栏,怎么做?
把 message.htm 改写成 layout 嵌套结构,复用主站的 header.htm 和 footer.htm 即可。具体写法是把 {dede:include filename='head.htm'/} 和 {dede:include filename='foot.htm'/} 放在 main 区块外面,提示内容放中间。这样提示页和正文页视觉完全统一,用户体验会好得多。但要注意 head.htm 里如果有依赖 cookie 或 session 的逻辑,提示页可能拿不到,先在测试环境试一下。
提示页跳转倒计时能不能动态控制?
能。ShowMsg 函数的第四个参数 $limittime 就是跳转秒数。在调用 ShowMsg 的地方传入不同值即可。比如成功类提示用 2 秒(快速跳走),失败类提示用 5 秒(让用户有时间读完原因)。如果想做"用户主动确认才跳转",把模板里的 setInterval 改成给"立即跳转"按钮加 onclick 即可,去掉自动跳转。
本文标题:《DedeCMS提示信息文字怎么改:源码+模板完整改造》
本文链接:https://zhangwenbao.com/dedecms-prompt-message.html
版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0