はじめに
こんにちは、@tmaru-engです。
個人利用していたほぼ休眠状態ながら、閉鎖しづらいWordPressサイトがあります。
一昨年くらいに「LambdaとSQLiteでの実現」や「静的サイトとして維持」などと検討したことがあったんですが、そのときは結局断念した経緯があります。
先日、CloudflareからEmDashというCMS機能のプラグインをリリースされました。
「WordPressの精神的後継者」というキャッチコピーで、あのとき自分が考えていた方向に近いものが出てきたなという気がしたため試してみました。
結論としては、ローカルでPoCを作るところから始めコンテンツのインポート自体は問題なくできました。
きちんと内容を読まずに細かなセットアップ部分は生成AI先生に頼った結果、途中で「インポートしたはずなのにサイトが空に見える」というハマりどころがあって、原因がわかるまでちょっと焦りました。
ちなみに操作感などを触ってみるだけであれば公開されているデモサイトで触ることができます。
EmDash ってどんなもの?
TypeScript + AstroベースのフルスタックCMSで、DBはローカルならSQLite、本番はCloudflare D1か PostgreSQLが選べるようです。
プラグインはサンドボックス内で動くのでWordPressのような「プラグイン起因の脆弱性」が起きにくい設計になっていて、MCP サーバーも内蔵されているようです。
やりたかったこと
今回の目的は次の3点でした。
- WordPress の記事や固定ページを EmDash に取り込めるか
- 取り込んだコンテンツが実際に表示できるか
- 本番公開まで持っていけそうかを見極めること(ローカルで感触をつかむ)
最初から本番構築に行くのではなく、まずはローカルで確認してから判断する方針にしました。
環境構築
まず emdash-cms/emdash をローカルに取得し、README と移行ドキュメントを読みました。
検証には templates/blank を使いました。余計なダミーデータが少なく、「移行データが入ったかどうか」を見分けやすいからです。
# 依存関係インストール
pnpm install
# monorepo ビルド
pnpm build
# blank テンプレートを初期化(SQLite DB 作成)
cd templates/blank
pnpm dev
http://localhost:4321/_emdash/admin で管理画面が起動します。初回は3ステップのセットアップウィザードが走ります。
step 2:アカウント作成
step 3:パスキー設定(パスワードレスで認証する)
セットアップが完了するとサインイン画面になり、パスキーのほか GitHub / Google でもログインできます。デフォルトでパスキーに対応しているのは使い勝手が良さそうでした。
アカウント作成完了。ロール「管理者」が付与された状態
ログイン後のダッシュボードはこんな感じで、インポート前なのでコンテンツはまだ空の状態です。
WordPress 側の準備とインポート方法
WordPress からの移行方法は主に2つありました。
- WXR(
.xml)エクスポートを使う方法 - WordPress 側に EmDash Exporter プラグイン(emdash-cms/wp-emdash)を入れて API 経由で取り込む方法
Exporter プラグインを使うと、下書きや非公開投稿などなど取り込み対象が増えるようだったため今回はこちらのExporterを使う方法で進めました。ただ、プラグインのインストールも少しだけ手間取りました。
ちなみに、WXRエクスポートの場合は、WordPress 側は管理画面の ツール → エクスポート から .xml を取得するだけでデータの取得ができました。
インポートしてみた
EmDash の管理画面から Settings → Import → WordPress を開くとこのような画面になります。WXR ファイルをアップロードするか、WordPress サイトの URL を直接入力する方法が選べます。
今回は Exporter プラグインを WordPress側に入れて、URL 入力で直接接続する方法で進めました。
プラグインのインストールは zipを直接アップロードする形だったのですが、入手可能なzip をそのままアップロードしても「有効なプラグインが見つかりません」エラーになるため、zipを展開してから正しいディレクトリzipにしてアップロードが正解でした。
URL 接続が成功すると、Exporter が検出されてコンテンツ数のプレビューが出ます。
インポートのレビュー画面では、著者マッピングや取り込むコンテンツの選択ができます。
ローカル環境なので OAuth は「HTTPS 必須」エラーが出ましたが、そのまま進んでもインポート自体は可能でした。
著者のマッピング機能としてWordPressの著者を EmDash のユーザーに対応付けることができます。
メディアのインポートも同じフローで進みます。
インポートが完了するとこのような結果画面になりました。
ダッシュボードにも投稿が反映されています。
ハマったポイント
インポートは完了したものの、ここで問題が起きました。
管理画面からは記事が見えているのですが、公開サイトを開くと何も表示されない。最初はなんらかの原因で「移行に失敗したか」と思いましたが、原因は別のところにありました。
使っていた blankテンプレートには、公開側のページ実装がなかったことが原因でした。
blank は本当に最小構成で、トップページが出るだけ。CMS としては動いていてデータも入っているのに、公開フロントにpostsやpagesを表示するルートがそもそもない、という状態でした。
移行失敗ではなく、確認に使ったテンプレートが表示用ではなかったために発生したようです。
解決:templates/blog に切り替えて表示確認
表示確認のため、今度は templates/blog に同じデータベースを載せて起動しました。
blog テンプレートには最初から次の公開ルートがあります。
/posts/posts/[slug]/pages/[slug]/category/[slug]/tag/[slug]
これで改めて確認すると、投稿一覧も記事詳細も正常に表示されました。
おわりに
今回のローカル検証で分かったのは、WordPressからEmDashへのインポート自体は、かなり現実的そうだと感じました。
また、Exporter経由で手軽に取り込めることが確認できました。
ただ、移行時にはまったことからわかるようにWordPressのテンプレートなどはそのまま利用することができなそうだったため、EmDash用に再度作成する必要はありそうでした。
今回はローカルで感触をつかんだところで止まっています。
移行の検討をしたのですが、EmDashはCloudflareの有料プランにする必要があるようで、現在のレンタルサーバの価格と大差ないもしくは移行後の方が少しだけ高くなりそうだったため一旦は見送ることになりました。
同じような構成で無料で使えるプラットフォームの互換性などがあればコスト的にも勝てそうな気がします。
機能としては非常に面白く使いやすいものだと感じたので、もし実際に移行された方や、もっと深くEmDashを試してみた方がいれば、コメントなどで教えていただけますと幸いです。















