本文约 5,641 字,预计阅读 15 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:验收通过那一刻,才是纠纷的开始
很多建站项目在”甲方说 OK”之后就进入了失控状态:源码还在乙方服务器上,甲方要改个东西还得找人;商业主题是用乙方账号买的,第二年续费成了谈判筹码;后台账号给了甲方一个管理员权限,三个月后他们自己装了一堆来路不明的插件,站点被挂马,然后要求乙方免费修复。
交付不是”把网站给他”,而是把控制权、知识、责任三样东西完整地转移过去。缺任何一样,项目都不算结束,后续会持续消耗你的精力(或让客户持续受制于人)。
一套完整的交付流程应该包含五个部分:交付前自检、演示与培训、权限与账号交接、文档交付、质保与边界约定。每个部分都有可打勾的具体条目。
原理分析:交付要转移的三样东西
第一样:控制权(Control)。 域名注册商账号、云服务商账号、服务器 SSH、WordPress 后台管理员、CDN、邮箱服务、第三方插件授权。判断标准是:在不经过你的情况下,客户能不能随时换掉你? 如果答案是不能,说明控制权还在你手上,这是对客户的不负责任,也是你自己的法律风险。
第二样:知识(Knowledge)。 客户会不会用?能不能自己发文章、换图片、加产品、看表单数据?会不会做备份?出问题时知道联系谁?知识没转移,就会有源源不断的”帮我改一下这个标题”的低价值工单。
第三样:责任(Responsibility)。 交付之后谁负责什么?bug 归你,内容修改归客户,服务器故障归谁,安全事件归谁。边界不清会导致”网站被黑了,你们当初没做好安全”这种扯皮。
交付的常见模式对比:
| 模式 | 做法 | 优点 | 风险 |
|---|---|---|---|
| 全部自持 | 乙方代管服务器与域名 | 客户省心 | 客户被绑定,乙方有持续责任 |
| 完全交接 | 所有账号归甲方 | 责任清晰 | 甲方无技术能力时易出问题 |
| 交接 + 托管服务 | 账号归甲方,乙方签运维合同 | 责任清晰 + 有支持 | 需要签好 SLA |
推荐第三种:账号全部归甲方,同时签一份运维服务合同。 这样客户随时可以换人(你的服务质量由市场检验),你也能获得持续的运维收入,责任边界写进合同即可。
保姆级实操:五步完成交付
步骤 1:交付前自检(上线前 24 小时)。 逐项打勾,别到客户面前才发现:
# 1. 确认核心、主题、插件均为最新且无已知漏洞
wp core version
wp plugin list --status=active --format=csv --fields=name,version,update
wp theme list --format=csv --fields=name,version,update
# 2. 清理开发期遗留数据
wp post delete $(wp post list --post_type=post --post_status=draft --format=ids) --force
wp option get blogdescription # 检查是否残留"又一个 WordPress 站点"
wp post list --post_type=page --format=csv --fields=ID,post_title
# 3. 检查是否有测试内容、测试数据、测试账号
wp user list --format=csv --fields=user_login,user_email,roles
# 4. 固定链接与站点地址确认
wp option get home
wp option get siteurl
wp option get permalink_structure
wp rewrite flush --hard
# 5. 关闭开发期的调试开关(关键!)
wp config get WP_DEBUG
wp config set WP_DEBUG false --raw --type=constant
wp config set WP_DEBUG_DISPLAY false --raw --type=constant
wp config set DISALLOW_FILE_EDIT true --raw --type=constant # 禁止后台编辑主题文件
# 6. 检查站点可见性(开发期可能设置了"阻止搜索引擎索引")
wp option get blog_public # 必须返回 1
还需要检查:robots.txt 是否允许抓取、是否残留 noindex、站点地图是否可访问、表单是否指向正确的收件邮箱(开发期常填的是开发者邮箱)。
步骤 2:录制演示与培训。 培训的目标不是”讲一遍后台”,而是让客户能独立完成最高频的三件事。一般企业站来说就是:发布文章、添加产品、查看表单数据。
培训建议录屏(10–15 分钟,按功能分段),比现场讲一次有效得多——客户会忘,但视频可以反复看。内容结构:
## 培训大纲(企业站示例,20 分钟)
1. 后台登录与界面认识(3 分钟)
- 登录地址、忘记密码怎么办、双因素认证
2. 发布一篇新闻(6 分钟)
- 文章 vs 页面的区别
- 区块编辑器的基本操作:段落、标题、图片、列表
- 分类与标签的选择
- SEO 标题与描述填写
- 预览与发布
3. 添加一个产品(5 分钟)
- 自定义字段填写规范
- 图片尺寸要求与压缩
- PDF 手册上传
4. 查看表单数据与导出(3 分钟)
- 后台表单入口
- 导出 CSV
- 邮件通知设置
5. 日常注意事项(3 分钟)
- 不要安装来源不明的插件
- 更新前先备份
- 遇到问题联系谁、响应时效
培训里一定要讲”不要做什么”:不要装破解版插件/主题、不要用管理员账号日常发文(建一个编辑账号)、不要在服务器上直接改文件(用子主题)、更新前先看有没有备份。
步骤 3:权限与账号交接。 这是最需要细致的一步。
WordPress 后台账号:
# 创建客户的正式管理员账号(不要用开发期的临时账号)
wp user create client_admin admin@客户域名.com \
--role=administrator \
--user_pass='生成的强随机密码' \
--display_name='客户管理员'
# 为日常编辑创建权限受限的账号
wp user create client_editor editor@客户域名.com \
--role=editor \
--user_pass='另一个强随机密码'
# 清理开发期账号:降级而不是删除,保留内容归属
wp user set-role dev_account subscriber
wp user list --format=csv --fields=user_login,roles,user_email
用 WP-CLI 生成强随机密码:
# Linux 下生成 20 位随机密码
openssl rand -base64 24 | tr -d '/+=' | head -c 20; echo
账号交接清单(做成表格,逐项确认已移交):
| 序号 | 账号类型 | 移交内容 | 是否以客户主体注册 | 确认 |
|---|---|---|---|---|
| 1 | 域名注册商 | 账号、密码、注册邮箱 | 是 | ☐ |
| 2 | 云服务商 | 主账号、子账号、安全组配置 | 是 | ☐ |
| 3 | 服务器 | IP、SSH 密钥、sudo 账号 | — | ☐ |
| 4 | WordPress 后台 | 管理员账号、密码 | — | ☐ |
| 5 | CDN | 账号、加速域名配置 | 是 | ☐ |
| 6 | 对象存储 | AccessKey、Bucket 信息 | 是 | ☐ |
| 7 | 商业主题/插件 | 授权码、购买凭证(客户名义) | 是 | ☐ |
| 8 | 企业邮箱 / 发信服务 | SMTP 配置、API Key | 是 | ☐ |
| 9 | 统计与分析 | GA4、百度统计、Search Console | 是 | ☐ |
| 10 | 备案信息 | 备案号、备案密码 | 是 | ☐ |
密码交接的安全方式:不要通过微信/邮件明文发送。用一次性加密链接(如 Bitwarden Send、国内的密码保险箱分享),或者当面交付密封信封。
步骤 4:源码与文档交付。 用 Git 仓库交付,而不是打个压缩包发过去:
# 在客户服务器或代码托管平台初始化仓库
cd /var/www/html
git init
git remote add origin git@客户仓库地址:client/site.git
# .gitignore:不提交 WordPress 核心、上传文件、配置文件
cat > .gitignore <<'EOF'
# WordPress 核心(由 composer 或官方包管理,不入库)
/wp-admin/
/wp-includes/
/wp-*.php
/index.php
/xmlrpc.php
/license.txt
/readme.html
# 上传的媒体文件(体积大,由备份方案处理)
/wp-content/uploads/
# 配置文件(含数据库凭据,绝不入库)
/wp-config.php
wp-config.php
# 缓存与临时文件
/wp-content/cache/
/wp-content/upgrade/
*.log
.DS_Store
EOF
# 只提交自研代码
git add wp-content/themes/客户子主题/
git add wp-content/plugins/自定义插件/
git add .gitignore README.md
git commit -m "Initial commit: 客户官网子主题与自定义插件"
git push -u origin main
交付文档清单:
## 交付文档
1. 《网站后台使用手册》PDF
- 按培训大纲组织,每步配截图
2. 《服务器环境说明》
- 操作系统版本、Nginx/PHP/MySQL 版本
- 目录结构说明
- cron 任务清单及作用
- 备份脚本位置与执行方式
3. 《第三方服务清单》
- 插件/主题授权信息、到期时间、续费方式
- CDN、对象存储、邮件服务等配置说明
4. 《应急预案》
- 网站打不开的排查顺序
- 如何恢复备份(含命令)
- 联系人与响应时效
步骤 5:约定质保边界并签字。 这一步决定了交付后你还会被打扰多久:
## 质保条款(示例)
**质保期**:上线之日起 3 个月
**免费修复范围**:
- 交付功能清单内 Must 项的缺陷(bug)
- 主流浏览器下的显示错位
- 因交付代码本身导致的性能或安全问题
**不属于质保范围(另行报价)**:
- 新增功能、页面或字段
- 内容修改、图片替换、文案调整
- 因客户自行安装插件/修改代码导致的问题
- 因服务器环境变更(如客户自行升级 PHP)导致的问题
- 第三方服务(支付、短信、地图)接口变更导致的问题
- 服务器被攻击、被墙、欠费导致的故障
**响应时效**:
- P0(站点不可访问):2 小时内响应
- P1(核心功能异常):1 个工作日内响应
- P2(一般问题):3 个工作日内响应
常见踩坑
- 忘记关 WP_DEBUG。 上线后错误信息直接显示在页面上,泄露服务器路径和数据库表前缀。
- 忘了改 blog_public。 开发期勾了”阻止搜索引擎索引”,上线后一直没取消,三个月后客户问”为什么搜不到我们网站”。
- 表单收件邮箱还是开发者的。 客户的表单提交数据全发到了乙方邮箱,等发现时已经丢了几十条线索。
- 商业主题用乙方账号购买。 第二年续费要找乙方,等于变相绑定。必须在需求阶段就写进合同。
- 只给了一个管理员账号。 客户所有同事都用这一个账号,无法追溯操作,且容易误删内容。应该给”1 个管理员 + 若干编辑”。
- 源码交付是个压缩包。 后续改动无法追溯版本。必须用 Git,并写好
.gitignore排除核心文件与配置。 - 案例:一次”交付后无法维护”的项目。 乙方用某可视化页面构建器做了全站,内容以短代码形式存在
post_content里。交付时只给了后台账号和一份”使用说明”,但说明里没讲清楚”必须用这个构建器编辑,否则排版会乱”。半年后客户换了运营人员,用区块编辑器改了一篇文章,整页布局崩了。客户认为是 bug,乙方认为是误操作,双方僵持。最后乙方花了一周重做那一版页面。教训:交付前要在需求文档里明确”内容的可移植性要求”——优先使用区块编辑器或 ACF 字段存储内容,避免使用会把内容锁死在构建器里的方案;如果用了构建器,必须在培训里明确告知风险,并在后台显著位置提示。相关内容在 网站需求文档怎么写 的需求模板里有对应条款。
总结
交付的判断标准是”客户可以完全不依赖你,也可以选择继续雇你”。执行顺序:上线前 24 小时自检(关调试、清测试数据、确认索引与邮箱)→ 录屏培训(讲清高频操作与”不要做什么”)→ 账号逐项交接(全部以客户主体注册,密码加密交付)→ Git 交付源码 + 四份文档 → 签质保条款明确边界。其中”账号全部归客户主体”这一条最容易被忽略,也最容易引发后续纠纷。 交付前应配合 网站验收清单 逐项核对,交付后的运维责任划分可以参考 中小企业网站运维分工,技术层面的安全检查则按 网站上线安全基线配置 执行。
