Mesogeiako — 职业培训中心与定制 CMS
1 周
|
设计与全栈开发
Mesogeiako 是塞萨洛尼基一家持牌的终身学习与职业培训中心,它的网站原本在 WordPress 和 BeTheme 页面构建器上一路长大。这次重建保留了全部内容,却没有留下平台的任何部分。它是运行在 MySQL 上的纯 PHP 8.5——一个前端控制器、一个十五行的自动加载器,不用框架、不用 Composer、没有构建步骤——大约五千行源代码和两千行模板。希腊语是默认语言,英语位于 /en/ 之下,而两种语言的对等是结构性的,不是后补的:每个项目、每条新闻、每个页面都是一行条目加上每种语言一行译文;slug 放在译文上,因此希腊语页面保留源自希腊语的网址;增加第三种语言也无需改动数据库结构。迁移本身就是代码,而不是一次性导出。二十一个有序、可重复执行的步骤从 WordPress 源数据重建整个网站——解析 Muffin Builder 内容、剥离模板化文字、统一标题层级、合并重复新闻、把内嵌的 data-URI 图片提取为文件——并以两种语言迁移了 33 个项目、90 条新闻和 20 个页面,另有 798 条重定向,让旧链接落到对应的新页面。媒体库中的每张图片都是 200 KB 以下的 WebP:质量从 82 逐级降到 40,之后再逐步缩小尺寸直到达标,原图随即删除。管理后台让培训中心用 TinyMCE 以两种语言管理项目、新闻和页面,并提供媒体库、联系方式,以及首页计数器和区块。结构化数据中包含邮寄地址、商业登记号和营业时间——这三项信息旧网站发布在主题的页脚小工具里,任何文章、任何导入程序都看不到。
技术栈
PHP 8.5
MySQL
Vanilla JS
GSAP
TinyMCE 7
WebP pipeline (GD)
i18n (EL/EN)
SEO
WordPress migration
挑战
WordPress 把一些事实藏了起来。邮寄地址、商业登记号和营业时间放在主题的页脚小工具里,而不在任何文章中,因此内容导出永远看不到它们;第二个电话号码在旧网站的三个地方彼此矛盾。希腊语网址还会打破最直观的数据库设计:经过百分号编码后,它们常常超过 191 个字符,而且共享很长的前缀,于是前缀索引会把确实不同的地址当成重复而拒绝。此外,双语编辑器有一种无声的故障:一次漏掉某种语言的保存,与有人故意清空该语言无从区分。
解决方案
每一项更正都是独立编号的迁移步骤,因此从 WordPress 全新重建时,会重现客户确认过的电话号码和找回的地址,而不是把旧错误再导入一遍。重定向以旧路径的 SHA-256 哈希保证唯一,而不是依赖前缀。每个归档路径段只在其所属语言下解析,这样同一条目不会同时存在于两个网址而分散自身排名。每个翻译表单都会按语言提交一个存在标记——正是它让缺失的语言表示「未改动」而非「删除」——后台冒烟测试套件也为此保留了回归测试。文件名在音译前先做 NFC 规范化,因为 macOS 与 Linux 会把同一个希腊语名称存成不同的字节。
图片集
在研项目——中心当下的工作,放在首页
首页计数器——四个由中心自行修改的数字
项目——进行中与已结束,一键切换
新闻——从 WordPress 迁移的九十篇文章,两种语言齐全
自学工具——指南与资料汇于一处
联系——旧网站藏在页脚小工具里的地址
英文版——同一个归档,拥有自己的网址
仪表盘——中心发布了什么,哪些译文仍待检查
项目——每一行都有两种语言,未检查的译文一目了然
编辑器——希腊语与英语标签页、SEO 字段、富文本
计数器——首页数字,两种语言一起编辑
联系方式——一张表单、两种语言,全站同步显示
媒体——每张图片都转换为 200 KB 以下的 WebP