店のサイトを載せてきたCMSを、配れる形に切り出してNext.jsにも移した ― NextCode CMS
動いている店のサイトは触らない。名前を変えるのも、機能を足すのも、切り出した方でやる。
スマホ119と住まい119のサイトは、同じCMSの上で動いています。CakePHP 2.10で作られた、ページの上でブロックを積んで組み立てるタイプのCMSです。もとは別の方が作ったもので、作者から改変して使う了解をもらっています。

これを、ほかの店にも入れられる形に切り出したのが NextCode CMS です。最初のコミットは2026年6月12日。7月には、同じものをNext.jsへ移すことも始めました。
1本番には手を付けず、別の箱へ切り出した
最初に決めたのは、スマホ119の本番を触らないことでした。
本番のコードには、CMSの古い名前がそのまま残っています。手元のリポジトリで数えると、app と lib の中だけで75ファイル。全部を新しい名前に置き換える案もありました。ただ、クラス名からファイル名、データベースの参照までつながっていて、営業中の修理店のサイトでやる工事ではない。訪問者に見える名前でもないので、その案は捨てました。
代わりに本番からコピーを取り、店だけで使っている機能、APIキー、古いテーマを抜いて、配布用のリポジトリを新しく作っています。名前を変えたのはこちらだけです。
26月12日の1日で、v1.0からv2.2まで
この日のコミットは31回あります。朝7時4分のv1.0.0から、夜8時過ぎのブロック編集ツールバーの調整まで。
重かったのはPHP 8への対応です。v1.0.0の時点では、CakePHP 2.10の制約でPHP 7.4までしか動きませんでした。そこで、PHP 8で動くように手を入れた有志のフォークにフレームワークを差し替え、アプリ側に残っていた each() を約20か所書き換えています。PHP 8では、親クラスとメソッドの引数の形が合わないだけで即エラーになる所もあった。
記事のエディタは、2013年製のCKEditor 4.2のままでした。これをSunEditorに入れ替えたのがv2.2.0です。同じ日のうちに、AI接客チャット(v1.2.0)と、AIでの記事・画像生成(v2.0.0)も入りました。
3ブロックが増えるほど、壊れ方を先に決めておく
ブロックは、v1.0.0の時点で15種類。今はプラグインのフォルダで数えて72種類あります。ほかに管理画面のプラグインが24、テーマが4つ。
増やしていく途中で、嫌な壊れ方を見つけました。ブロックのプラグインのフォルダを消すと、そのブロックを使っているページだけでなく、サイト全体がエラー(HTTP 500)になる。全ページ共通の場所にそのブロックが1つ置いてあるだけで、どのページも開かなくなっていたんです。
直し方は、無いブロックは無いなりに表示すること。編集中は代わりの枠を出し、公開画面では空にする。テスト用のサイトでブロックのフォルダ名を変えても、ページが200で返るのを確かめてから入れました。
時刻の間違いもありました。サーバーもMySQLも日本時間なのに、CakePHPの設定1行が世界標準時を指していて、深夜から朝9時前までの間は、カレンダーの「今日」が前の日になっていた。9時間ずれる、というやつです。
アップデートも、失敗したときの形から決めています。管理画面から1クリックで更新できますが、落としてきたZIPはSHA-256で照合し、適用の前にデータベースのバックアップを自動で取る。バックアップが取れなければ更新しません。
4Next.jsへは「作り直さない」と決めて移した
7月14日の夜、同じCMSをNext.jsに移し始めました。作品ページから開けるデモは、こちらのNext.js版です。
気をつけたのは、良かれと思って設計し直さないこと。最初にPHP版のソースから仕様を書き出して、115項目のチェックリストにしました。進める順番は「機能、管理画面、ブロック、テーマ」。見た目は最後に回しています。
それでも、そのまま移せない所はありました。PHP版は、ブロックやテーマをサーバーにファイルとして置けば足せます。Vercelは動いている最中にファイルを書き足せないので、この仕組みが成り立たない。Next.js版では、ブロックをコードの中の一覧として持つ形に変えました。
PHP版とNext.js版の違い(2026年7月時点の記録から)
| PHP版(配布版) | Next.js版(デモ) | |
|---|---|---|
| 動かす場所 | 共用レンタルサーバー(PHP 7.4〜8.5) | Vercel(東京)+Supabase |
| ブロックの足し方 | プラグインのフォルダを置く | コードの中の一覧に登録 |
| ブロックの数 | 72種 | 元の72種のうち65種を移植 |
| 更新のしかた | 管理画面から1クリック(照合と事前バックアップつき) | デプロイし直す |
| 実際の店のサイト | ◎スマホ119・住まい119が稼働中 | デモと見本ページ |
移してから見つかった不具合もあります。初めて来た人がログインしようとすると、必ず「不正なトークンです」で失敗していた。最初のアクセスで発行したセッションのcookieが、同じリクエストの画面描画からは見えず、フォームに別の値が埋まっていたのが原因でした。
画像のアップロードでは、PNGのデータが文字列として送られて壊れ、91バイトの画像が121バイトの別物になっていました。デモの中身が文字だけだったので、画像の経路を一度も通していなかった。
速さはコミットの記録で、トップページが1.1秒から0.39秒、ブロックの追加が2.1秒から約0.5秒。設定値を1件ずつ取りに行っていたのを1回にまとめ、並べ替えの更新を順番待ちから同時に投げる形に変えた結果です。
5正直に言うと、どれが本体か決めきれていない
今、同じ系統のCMSが4つあります。古い名前のまま動いているスマホ119の本番。配布版から枝分かれして、予約フォームやヒーロー動画の部品が先に進んでいる住まい119の本番。配布版のNextCode CMS。それからNext.js版。
Next.js版は「PHP版が正典」という決まりで移しました。ところが、住まい119の側で先に直った部品がある。ヒーロー動画を切り替えながら流す仕組みは、配布版を通らずに、住まい119からNext.js版へ直接持ってきています。正典が1つに決まらないんですよね。
元のコードの癖をどこまで引き継ぐかも、まだ分かりません。移植の仕様書には、元のバグや癖を「そのまま残すか、直して差分を書くか判断が要る」と書いた項目があります。完全に写すなら残す。直すなら、もう完全な移植ではなくなる。
Next.js版の機能のコミットは7月18日で止まっています。Next.js版を広げるのが先か、住まい119の変更を配布版に戻すのが先か。そこはまだ決めていません。
6次に書くこと
4つを1つにまとめられたら、どこをどう寄せたかをまた書きます。
この記事を書いた人
NextCode(沖縄県宜野湾市)は、iOSアプリ・ホームページ/LP・NFCデジタル名刺・AI業務自動化を作っている開発スタジオです。ここで書いているのは、実際に作って公開したものと、その過程で詰まったことだけです。
お問い合わせフォームは24時間受け付けています。