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 以两种语言管理项目、新闻和页面,并提供媒体库、联系方式,以及首页计数器和区块。结构化数据中包含邮寄地址、商业登记号和营业时间——这三项信息旧网站发布在主题的页脚小工具里,任何文章、任何导入程序都看不到。
挑战
WordPress 把一些事实藏了起来。邮寄地址、商业登记号和营业时间放在主题的页脚小工具里,而不在任何文章中,因此内容导出永远看不到它们;第二个电话号码在旧网站的三个地方彼此矛盾。希腊语网址还会打破最直观的数据库设计:经过百分号编码后,它们常常超过 191 个字符,而且共享很长的前缀,于是前缀索引会把确实不同的地址当成重复而拒绝。此外,双语编辑器有一种无声的故障:一次漏掉某种语言的保存,与有人故意清空该语言无从区分。
解决方案
每一项更正都是独立编号的迁移步骤,因此从 WordPress 全新重建时,会重现客户确认过的电话号码和找回的地址,而不是把旧错误再导入一遍。重定向以旧路径的 SHA-256 哈希保证唯一,而不是依赖前缀。每个归档路径段只在其所属语言下解析,这样同一条目不会同时存在于两个网址而分散自身排名。每个翻译表单都会按语言提交一个存在标记——正是它让缺失的语言表示「未改动」而非「删除」——后台冒烟测试套件也为此保留了回归测试。文件名在音译前先做 NFC 规范化,因为 macOS 与 Linux 会把同一个希腊语名称存成不同的字节。
图片集

首页——中心资质放在最前,项目一键可达

项目——进行中与已结束,一键切换

项目页面——通栏正文,由中心自行撰写和排版

新闻——从 WordPress 迁移的九十篇文章,两种语言齐全

自学工具——指南与资料汇于一处

关于我们——资质、名录与欧洲网络,一读即知

联系——邮箱、两部电话和地址,分列四张卡片

首页——欢迎语之下,是战略、认证与学习工具

在研项目——中心当下的工作,海报先行

公告——谁能报名、该打给谁,一目了然

目标群体——中心培训哪些人,一一列明

我们的工作——Interreg、Erasmus+ 和 ESPA,轻点即达

手机首页——无需滚动,即可来电或发邮件

手机菜单——六个栏目,每个都便于点按

首页计数器——四个由中心自行修改的数字

英文版——同一个归档,拥有自己的网址

手机新闻列表——日期、标题、摘要,清清楚楚

手机上的自学资料——一张卡片一份指南,轻松点开

手机联系页——轻点发邮件,轻点打电话





