问题
One Mind Agency是一家创意机构,需要一个英语和意大利语双语网站来展示作品、赢得新业务。团队希望在熟悉的后台发布案例,每一条咨询都要进入销售管道,而不是落在收件箱里。主机是共享的:Node可以运行构建,但不能常驻运行服务器。
我做了什么
我构建了三个部分,它们并存于同一个域名下。
- Next.js静态前端——首页、作品、单个案例、关于我们和联系页面,导出为/en/和/it/下的普通文件。响应快速,无需维持任何进程运行。
- /cms下的无头WordPress——一个定制插件注册Case Study文章类型及其字段(客户、年份、类别、强调色、摘要、署名),并通过REST API连同翻译一起对外提供。公开的WordPress页面会重定向到真正的网站。
- 自动重建——编辑保存内容时,WordPress会设置一个标记。服务器上的任务约5分钟内检测到标记,重建网站并替换文件,并用锁确保两次构建永不重叠。
- 联系表单直通CRM——一个小型PHP桥接程序把每条咨询转为EspoCRM中的Lead,附带预算区间和语言。CRM密钥保留在服务器上,永远不会到达浏览器。
- 垃圾信息与滥用防护——隐藏的蜜罐字段、每个IP地址每30秒限一次请求、来源白名单,以及对每个字段的严格校验。
- 没有失效图片——如果某个案例指向的图片文件已不存在,API不返回任何内容,页面改为显示色块占位。
技术栈
采用静态导出的Next.js 15、React 19、Tailwind CSS、Framer Motion和Lenis。WordPress搭配ACF和Polylang。EspoCRM。Hetzner上的PHP 8.2和MariaDB 10.11。
为什么这样做
服务器只允许Node用于构建,不能运行长驻进程。因此网站在构建时生成并以静态文件提供,而WordPress和CRM运行在服务器原有的PHP上。编辑保留常规后台,访客得到的是纯HTML。


