【WordPress】apartment morningのデータ設計、2つ



「apartment morning実装のハマりどころ」の続きです。今回はデータの持ち方、特に「原稿そのものには手を加えない」という方針と、それを破ったことで起きた事故の話です。
原稿の最終行を「検出」するだけで、本文には一切手を加えない
2作目の結びの言葉「また、明日。」は、著者の原稿にそのまま書かれている一文です。この一文を特別なアニメーション表示にしたいとき、選んだ方法は「本文に特別なタグを埋め込む」ではなく「表示するときに検出する」でした。
実装側は生のpost_contentから行の配列を取り出し、「最終行が結びの文言と完全一致するときだけ」その行を切り出して特別な表示にします。本文自体は無加工のまま残ります。
$lines = explode("n", trim($post_content));
$last = end($lines);
if ($last === 'また、明日。') {
array_pop($lines);
// $last を特別なアニメーション表示用のマークアップで出力
}
表示用の特殊処理と、原稿そのものを分離しておくことで、原稿は原稿のまま、あとから読んでも普通の文章として成立します。表示の都合を、データそのものに持ち込まない、という判断です。
リナンバリング事故から学んだ「タイトルキー」の鉄則
話数を1話挿入して、全篇の番号をリナンバリングする作業をしたことがあります。最初のバージョンでは「旧番号→新番号」という位置対応だけで本文を移し替えていました。結果、3話分ほど本文とタイトルがズレる、という事故を起こしてしまいました。
番号という「あとから変わりうる値」をキーにして紐付けをすると、順序がひとつでもズレた瞬間に全部が連鎖的にズレます。以降は、削除前に全篇の本文をタイトルをキーにしたJSONへダンプし、タイトルで再紐付けする方式に切り替えました。
// 削除前に、番号ではなくタイトルをキーにして退避
$backup = [];
foreach ($episodes as $ep) {
$backup[$ep->post_title] = $ep->post_content;
}
file_put_contents('backup.json', json_encode($backup, JSON_UNESCAPED_UNICODE));
// 再構築時は、タイトルで本文を引き当てる
$content = $backup[$new_title] ?? null;
「連番」のようないつでも変わりうる値は、データを結びつけるキーにしない。これはapartment morning以外の実装でも活きる、地味だけど大事な鉄則だと思います。
さいごに
3回に分けて、apartment morningのデザインと実装の工夫を紹介してきました。設計判断、ハマりどころ、データ設計、どれも「表示の都合とデータの都合を混ぜない」という一本の筋が通っていたように思います。読んでくださってありがとうございました。





