ブログをCraft CMSからMovable Type 9にリニューアルしました

2026-01-09
8分で読了
更新: 2026-01-09
325b758c-535b-4128-989d-945a1544c245.webp

目次

こんにちは。年末年始にかけて、このブログを、長年お世話になったCraft CMSから、Movable Type 9(MT9)へと移行しました。

今回はその移行の経緯や、どんな作業をしたのかをお話ししたいと思います。同じようにCMSの移行を検討している方の参考になれば幸いです。

なぜ Movable Type に戻ったのか

「Movable Type に戻った」と書いたのは、このブログはもともとMovable Typeで運用していました。その後Craft CMSに移行して数年が経ちました。

先に言っておくと、Craft CMSには何の不満もありません。使いやすいし、柔軟だし、本当によくできたCMSです。日本での知名度がそこまで高くないのが勿体無くて仕方ありません。それでもMTに戻ることにしたのは、いくつかの理由があります。

やっぱり再構築はいい

Movable Typeの最大の特徴は、HTMLファイルを静的に生成する「再構築」の仕組みです。動的CMSと違って、公開されるのは純粋なHTMLファイル。サーバー負荷も低く、セキュリティ面でも安心感があります。

そして、この「ボタンを押すとHTMLが生成される」という感覚、いまだに好きなんですよね。目に見える形でファイルが出力されるというのは、Web制作者としての原体験に近いものがあるのかもしれません。

もちろん再構築の待ち時間をデメリットに感じる人もいるでしょうか、 npm run build だって待ちますし、待っている間は他のことやればいい。テンプレートの組み方次第では再構築時間はかなり短縮できます。

MT9のエディタが使いやすい

MT9では「 MTRichTextEditor 」という新しいリッチテキストエディタが標準で搭載されています(最新のMT8にも入っています)。これがなかなか使いやすい。簡単なカスタマイズは設定画面が用意されているし、カスタマイズ性も高いです。そして「 HTML構造編集モード 」というのがあり、WordPressのブロックエディタやNotionのようにマークダウン記法を使った入力がサポートされていて、見出しや箇条書きなどがスムーズにできて、記事を書くのが楽になります。

さらに嬉しいのが、 GitHub Flavored Markdown に対応しているエディタも選択できること。コードブロックやテーブルをMarkdown記法で書けるので、技術ブログを書く身としてはとても助かります。

案件でMTを使い続けているから

仕事では今もMovable Typeを使った案件が多くあります。自分のブログでもMTを使うことで、日常的にMTに触れる機会が増え、新しい機能やプラグインのアイデアも生まれやすくなります。

これからもMT向けのプラグインをたくさん作っていきたいと思っているので、自分自身がヘビーユーザーでいることは大切だと考えています。自分で使ってみて初めて気づく改善点も多いですからね。

移行作業の全体像

今回の移行は、大きく分けて以下のフェーズで進めました。

先にお断りしておくと、Craftの方でTwigテンプレートで欲しいデータの形に書き出せばもっと簡単に移行できるかもしれませんが、今回はプログラマティックに進めたかったので以下のようなアプローチを取りました。

Phase 1: 準備

まずはMT9の環境構築から。MT9.0.5をインストールし、日本語ブログ「かたつむりくんのWWW」と英語ブログ「Roy's Web Journal」の2つを作成しました。

URLの構造は以前と同じ /blog/{年}/{月}/{スラッグ} を維持するようにアーカイブマッピングを設定。これにより、既存のURLからのリダイレクトを最小限に抑えることができました。

この移行に際して、「 AITranslatorプラグイン 」を作成しました。このプラグインは、AIによる翻訳を行って、記事/コンテンツデータを作成することができるプラグインです。さらに、管理画面または辞書ファイルを用意することで、テンプレートの中の文言も翻訳することができるテンプレートタグも使えるようになります( <__trans phrase=""> タグのようなイメージ)。今月中に公開・販売できると思いますので楽しみにしていてください。

Phase 2: エクスポート機能の開発

Craft CMS側にデータエクスポート用のモジュールを作成しました。ここが今回の移行で一番手間がかかった部分かもしれません。

modules/
└── migration/
    ├── Module.php
    ├── controllers/
    │   └── ExportController.php
    └── services/
        └── ExportService.php

エクスポート対象は以下の3種類です。

  • カテゴリ: 親子関係を保持したまま出力
  • タグ: すべてのタグを抽出
  • エントリ: 記事本文、メタデータ、カテゴリ・タグの紐付けを含む

Matrix Blockの変換

Craft CMSの特徴的な機能の一つに「Matrix」があります。これは記事本文を様々なブロックタイプで構成できる機能で、リッチテキスト、コードブロック、画像、埋め込みなど、多彩なコンテンツを柔軟に配置できます。

今回の移行では、これらのMatrix Blockを以下のようにHTMLへ変換しました。

ブロックタイプ変換内容
richTextCKEditorの内容をそのまま出力
code言語指定付きのpreタグに変換
imageFancybox対応の画像タグに変換
embediframe埋め込み(YouTube、Xなど)
frameText色付きフレームボックス
tablethead/tbody構造のテーブル
markdownMarkdownテキストをそのまま保持

Phase 3: インポート機能の開発

MT側では、Data APIを利用したインポート処理を実装しました。PHPでImporterクラスを作成し、以下の機能を持たせています。

  • 認証処理: Data APIへのログインとセッション管理
  • カテゴリインポート: 親子関係を維持したカテゴリ作成
  • タグインポート: タグの作成(MTではエントリ作成時に自動生成)
  • エントリインポート: 記事本文、メタデータの登録

IDマッピングも重要なポイントでした。Craft側のIDとMT側のIDを紐付けて保存しておくことで、カテゴリやタグの関連付けを正しく行えるようにしています。

Data API を扱う部分は「bit-part/mt-data-api-php-client」を利用しました。

Phase 4: 本番移行

テストインポートで問題がないことを確認した後、本番移行を実施しました。

  1. カテゴリの全件インポート
  2. タグの全件インポート
  3. 日本語記事の全件インポート
  4. 英語記事は手動で移行(件数が少なかったため)

進捗は100件ごとに保存するようにして、万が一の中断にも対応できるようにしました。

苦労した点

コンテンツ変換の細かい調整

Matrix Blockの変換では、細かいエッジケースへの対応が必要でした。空のブロック、特殊文字のエスケープ、画像の複数枚対応など、実際のデータを見ながら一つずつ対処していった形です。

URL構造の維持

既存のURL構造を維持することは、SEOの観点からも重要でした。Craft側のURLパターンとMT側のアーカイブマッピングを一致させる設定には、少し試行錯誤がありましたね。

移行を終えて

無事にすべての記事を移行することができました。デザインも少し変え、表示速度も向上しました。

Movable Type 9のData APIは、今回のようなCMS間の移行にも十分対応できることがわかりました。同様の移行を検討している方がいれば、Data APIを活用したアプローチも選択肢の一つとしておすすめします。

これからもこのブログを通じて、Web技術に関する情報を発信していきますので、引き続きよろしくお願いします。

技術的な補足

今回の移行で使用した主な技術スタックは以下の通りです。

  • 移行元: Craft CMS 4
  • 移行先: Movable Type 9
  • インポート方式: MT Data API v7
  • HTTPクライアント: Guzzle + Nyholm PSR-17
  • 開発環境: DDEV

以上です。

この記事をシェア

関連記事