WordPressから移行して、Coding Agentと書けるブログを作った

#Astro#Cloudflare#AIエージェント#blog#作業環境#ツール選定

はじめに

私は2017年からブログを書いている。2018年には、論文から化学物質名を抽出する自然言語処理のベンチマークにも取り組んだ。この定点観測については、LLMに推論させるより実装させろにも書いた。いまAI for Scienceを事業にしているが、その出発点の一つは、学生の頃から論文を対象に機械学習を試してきたことにある。

そのブログを、WordPressから移行した。

WordPressが嫌いになったわけではない。長い間使ってきたし、ブラウザから記事を書いて公開するには十分便利だった。ただ、Coding Agentを開発だけでなく執筆にも使うようになると、前提が変わった。

Coding Agentが力を発揮するのは、ファイルを読み、差分を作り、テストを実行し、履歴を残せる環境だ。一方、WordPressはGUIを開き、エディタやメディアライブラリを操作することが中心になる。APIをつなぐ方法もあるが、既存のプラグインやサーバーの状態まで含めて、エージェントが安全に扱える形とは言いにくい。

そこで、ブログを「記事を入力する画面」ではなく、自分とCoding Agentが一緒に運用する執筆基盤として作り直すことにした。

移行先をどう選んだか

最初に決めたのは、技術名ではなく要件だった。

  • 記事がMarkdownとして保存され、Gitで差分を確認できる
  • タイトル、公開日、タグ、出自、旧URLなどが構造化されている
  • 記事の追加やURLの生成を機械的に検証できる
  • 動的なサーバーを運用せず、個人のドメインを継続して使える

この要件に対して、フロントエンドには Astro、配信には Cloudflare Workersのstatic assets を選んだ。Astroはcontent collectionsによって、Markdownのfrontmatterをスキーマとして検証できる。記事を単なるテキストではなく、AIが読み書きしやすいデータとして扱える点が決め手だった。

候補を比較した2026年7月24日時点で、AstroはGitHub Starsが61,259、npmの週間ダウンロード数が435万だった。Next.jsはアプリケーション基盤としては強力だが、静的な個人ブログには過剰だった。Hugoも有力な選択肢だったが、すでに社内の別サイトでAstroを使っており、知見と検証資産を共有できる。普及度と必要性の両方を見て、Astroに決めた。

配信は、記事をビルドして静的アセットとして置ければよい。データベースもログインも必要ないため、Cloudflare Workersで十分だった。ブログのドメインは2017年から使ってきたroy29fuku.comを継続し、個人のCloudflareアカウントに分離した。

ブログではなく、執筆基盤として設計する

今回の移行で大事だったのは、Astroを選んだことだけではない。記事がどこで生まれ、どこで公開されるかを分けたことだ。

下書きはpersonal repoのoutput/に置く。ここをpreprintサーバーとみなし、考え途中の記事も含めて集約する。完成した記事をblog repoへ投稿し、公開後の正版はblog repoで管理する。下書きと公開版を双方向に同期しないことで、「どちらが正しい記事か」が曖昧にならない。

blog repoの記事には、本文だけでなく次のような情報を持たせる。

title: "記事のタイトル"
date: 2026-08-19
tags: ["Astro"]
source: "wordpress"
oldUrl: "/旧ブログのURL/"

sourceがあれば移行元を追跡できる。oldUrlがあれば、旧URLから新URLへの301リダイレクトを生成できる。人間が管理画面を見ながら一つずつ対応表を作るのではなく、記事データからサイトの振る舞いを生成する設計にした。

これは、Coding Agentにとっても重要だ。Agentは「この画面を開いて、この記事を探して、画像をアップロードして」と指示されるより、スキーマのあるファイル群とテストを渡された方が、変更の影響範囲を把握しやすい。

7月24日から25日未明までにやったこと

長々と全過程を説明する必要はないが、実際にどう進めたかは残しておきたい。移行は次の順序で進めた。

時期 作業
7月24日 ブログの役割、掲載基準、URL方針を決める
7月24日夕方 Astro + Cloudflare Workersのrepoを立ち上げる
7月24日夜 WordPressのエクスポートを解析し、記事と画像のインベントリを作る
7月24日夜〜25日未明 移行対象を選別し、Markdown化・画像移行・301生成を行う
7月25日 astro checkとビルドを通し、移行結果を確認する

WordPressのエクスポートはWXR形式で、12MB、2,055 itemあった。主な内訳は公開記事184、下書き49、固定ページ10、添付1,809だった。しかも、XML宣言より前にPHPのWarningが混入し、本文には不正な制御文字も含まれていた。そのままでは正しくパースできないので、入力を正規化してから解析した。

画像はWXRに含まれず、記事から参照されるURLしか残らない。X Serverを解約する前に、uploadsを2,518ファイル、260MBのミラーとして保全した。移行対象の記事が参照する画像は、そのミラーから1,166点を新ブログへコピーした。

記事はすべて移したわけではない。サイトの役割を「Science Aidの活動と、私の仕事の哲学を伝える場」と定め、技術記事は過去からの専門性を示すものとして残した。一方、役割に合わないものや空のページは削除した。Swampdogの33回、SummerEyeの14回の連載は、そのまま記事を増やすのではなく、それぞれ一つのまとめ記事に集約した。

最終的に、WordPress由来の記事は133本になった。旧ブログのURL構造は整理されていない部分があったため、そのまま引き継がず、スラッグを再設計した。旧URLからの301リダイレクトは、記事・連載の集約・固定ページなどを含めて最終的に194件になった。

移行後はastro checkを通し、ビルドも成功した。WordPressの管理画面を再現するのではなく、記事データと生成処理に置き換えたことで、移行作業そのものもテスト可能になった。

Coding Agentに任せたこと、人間が決めたこと

Coding Agentには、エクスポートの解析、インベントリ作成、Markdown化、画像URLの書き換え、リダイレクト生成、チェックとビルドを担当させた。133本の記事を人間が管理画面から手で移すのは、時間がかかるだけでなく、抜け漏れの検出も難しい。

一方で、何を残すかはAgentに決めさせなかった。技術記事を残すのか、連載をまとめるのか、旧URLを維持するのか、個人のサイトと会社のサイトをどう分けるのか。これらはサイトの役割と、これから何を伝えたいかに関する判断だからだ。

私がやったのは、すべての作業を自分で抱えることではない。判断が必要なところを先に決め、機械的に処理できる部分はAgentに任せ、結果をテストと差分で確認できる状態を作ることだった。

これはWordPressの置き換えではない

今回の移行によって、非技術者が管理画面から記事を編集できるというWordPressの利点は失われた。複数人で日々更新するメディアなら、WordPressや別のGUIベースのCMSの方が適しているだろう。

私の場合は、記事を書く場所とコードを書く場所を分ける理由がなくなっていた。執筆も開発も、調査し、ファイルを変更し、レビューし、履歴を残す仕事になったからだ。

だから、必要だったのは「最新の技術でブログを作ること」ではない。自分の仕事の進め方に対して、古い道具がどこでボトルネックになっているかを見つけ、そのボトルネックを取り除くことだった。

まとめ

2017年から続けてきたブログを、WordPressからAstro + Cloudflare Workersへ移行した。2018年から論文のNLPに取り組んできた経験も、今のAI for Scienceの仕事も、同じ場所に蓄積していく。

これからは、記事をブラウザの管理画面へ貼り付けるのではなく、Gitで管理されたMarkdownとして書く。Coding Agentには、文章の推敲だけでなく、リンクの整合性や構造の検証、公開に必要な実装まで任せられる。

AI Agentという新しい技術が登場したときに重要なのは、Agentに何を尋ねるかだけではない。Agentが仕事をしやすい環境を、自分の仕事に合わせて用意できるかどうかだ。今回の移行は、その環境をブログにも適用した最初の一歩になった。