いいですね、Nuxt なら今のワークフローともきれいに繋がりますし、WordPress を完全に捨てられます。
あなたの条件を整理すると:
- WordPress はもう触りたくない(完全廃止)
- ホスティングは Cloudflare に集約したい
- すでに Nuxt + pages ベースでログサイトを作っている
- 記事は MD(MDX 的なもの) で書きたい
- 画像多めのブログ
これに対しての完成形アーキテクチャと、具体的な移行ステップをまとめます。
1. 目指す完成形(Nuxt × Cloudflare 全面移行)
全体構成
- フロントエンド: Nuxt 3(SSG/プリレンダー)
- 記事コンテンツ:
@nuxt/content+ Markdown / MDC(MDX 的にコンポーネント埋め込み) - デプロイ: Cloudflare Pages(ビルドコマンドで静的出力)
- 画像:
- ① とりあえずは
/public/uploads/...で運用 - ② 将来的に Cloudflare Images / R2 に移す(推奨)
- ① とりあえずは
- ログサイト:
既存の
pages/ベースのログをそのまま統合(/logs等)
→ これで 「Cloudflare だけで完結する Nuxt ブログ+ログサイト」 になります。 ConoHa も WordPress も不要です。
2. Nuxt プロジェクト構成イメージ
すでに Nuxt でログサイトを作っているとのことなので、ブログ機能を同じリポジトリ内に足す形を想定します。
root/
nuxt.config.ts
package.json
/pages
index.vue … トップ
logs/
index.vue … ログ一覧
[slug].vue … ログ詳細(既にある想定)
/content
/blog
2025-11-28-first-post.md
...
/components
content/
ProseImage.vue … 画像コンポーネント(Cloudflare Images 対応など)
/public
/uploads … 当面は旧 WP 画像をここへ
@nuxt/content の導入
npm install @nuxt/content
nuxt.config.ts 例:
export default defineNuxtConfig({
modules: ['@nuxt/content'],
content: {
// 必要があればここで MDC/ハイライト等の設定
},
nitro: {
preset: 'static', // 静的出力(Cloudflare Pagesにそのまま載る)
},
})
ブログページ例(pages/blog/[slug].vue):
<script setup lang="ts">
const route = useRoute()
const { data: article } = await useAsyncData('article', () =>
queryContent('/blog')
.where({ _path: `/blog/${route.params.slug}` })
.findOne()
)
</script>
<template>
<div class="prose mx-auto">
<ContentDoc v-if="article" :value="article" />
<p v-else>記事が見つかりませんでした。</p>
</div>
</template>
一覧ページ(pages/blog/index.vue):
<script setup lang="ts">
const { data: articles } = await useAsyncData('articles', () =>
queryContent('/blog').sort({ date: -1 }).find()
)
</script>
<template>
<div class="mx-auto max-w-3xl">
<h1 class="text-2xl font-bold mb-4">Blog</h1>
<ul>
<li v-for="post in articles" :key="post._path" class="mb-2">
<NuxtLink :to="post._path">
{{ post.title }}({{ post.date }})
</NuxtLink>
</li>
</ul>
</div>
</template>
Markdown(MDC) 記事例(content/blog/2025-11-28-first-post.md):
---
title: "移行後初めての投稿"
date: "2025-11-28"
tags: ["移行", "Cloudflare", "Nuxt"]
thumbnail: "/uploads/hero.jpg"
---
# タイトル
ここに本文。
::ProseImage
src="/uploads/sample.jpg"
alt="サンプル画像"
::
コンポーネントも埋め込めるので、ほぼ MDX 的な運用ができます。
3. Cloudflare Pages へのデプロイ設定
build 設定(Cloudflare Pages 側)
- Framework preset: None or Nuxt(あれば)
- Build command:
npm install && npm run generate - Output directory:
Nuxt 3 の場合:
.output/publicまたはdist→nitro.preset = 'static'の場合は.output/publicになるので、そこを指定
package.json の scripts 例:
{
"scripts": {
"dev": "nuxi dev",
"build": "nuxi build",
"generate": "nuxi generate"
}
}
4. WordPress から記事を持ってくる場合の流れ
「もう触りたくない」とはいえ、一度だけエクスポートはしておく価値があります。
- WordPress 管理画面 → ツール → エクスポート → 投稿を XML(WXR)で出力
- ローカルでその XML → Markdown 変換
wordpress-export-to-markdownなどの CLI ツール- あるいは自前スクリプト + AI で変換
- 出力された MD を
content/blog/配下に配置 - frontmatter を整備(title, date, slug, tags, thumbnail)
- 古い URL → 新 URL のマッピングを作成し、
_redirectsで 301 を張る- 例:
/2023/05/old-post/ /blog/old-post 301
- 例:
Cloudflare Pages はプロジェクトルートに _redirects ファイルを置けばリダイレクトが効きます。
5. 画像の扱い(当面と将来)
まずはシンプルに(当面)
- 旧 WordPress の
wp-content/uploadsを丸ごとダウンロード - Nuxt プロジェクトの
/public/uploads以下にそのままコピー - Markdown 内の画像パスを
https://oldsite.com/wp-content/uploads/...→/uploads/...に一括置換
→ これだけで、Cloudflare Pages 上でも全画像がそのまま表示されます。
将来:Cloudflare Images / R2 へ移行
本気で Cloudflare 集約したくなったタイミングで:
- 画像を Cloudflare Images にアップロード
- 返ってくる URL を基底 URL +
id形式で扱う - Nuxt 側では
ProseImageコンポーネントでsrcをhttps://imagedelivery.net/...に差し替え
とすることで、最終的に
- ページ:Cloudflare Pages
- 画像:Cloudflare Images
- その他静的ファイル:Pages(もしくは R2)
という Cloudflare 完結構成になります。
6. ログサイトとの統合
既に pages ベースでログサイトを作っているとのことなので:
/logs配下のルーティングはそのまま維持/blog配下だけ@nuxt/contentを使う- 共通レイアウト(
layouts/default.vue)でヘッダーに Blog / Logs のナビゲーションを追加
という形にすると、「ブログ+ログ」を同一 Nuxt アプリ内で完結できます。
7. この後一緒に詰められること
ここから先は、より具体的に詰められます。
- 実際の
nuxt.config.ts(あなたの既存ログサイト構成を前提にした統合案) content/のディレクトリ構造設計(年別/カテゴリ別など)_redirectsのサンプル(旧 WP パーマリンクのリダイレクト設計)ProseImageコンポーネントで Cloudflare Images 前提の書き方
などもすべて具体的に書けます。
もしよければ「今動いている Nuxt ログサイトの構成(ざっくり)」「記事数のおおよその規模」だけ教えていただければ、それに合わせて nuxt.config.ts と ディレクトリ構造案をそのまま貼れる形で出します。