返回作品集
Mesogeiako — 职业培训中心与定制 CMS

Mesogeiako — 职业培训中心与定制 CMS

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 会把同一个希腊语名称存成不同的字节。