[{"data":1,"prerenderedAt":1490},["ShallowReactive",2],{"content-/wordpress-to-nuxt-cloudflare-migration":3,"all-pages-for-dir":1468,"related-/wordpress-to-nuxt-cloudflare-migration":1469,"og-image-/wordpress-to-nuxt-cloudflare-migration":1489},{"id":4,"title":5,"body":6,"category":1456,"concepts":1456,"description":1457,"extension":899,"meta":1458,"navigation":475,"ogImage":1456,"path":1459,"project_name":1456,"published":1460,"publishedAt":1461,"seo":1462,"source":1456,"stem":1463,"tags":1464,"todo":1456,"unpublished":1460,"updatedAt":1461,"__hash__":1467},"pages/2025-11/2025-11-29/wordpress-to-nuxt-cloudflare-migration.md","WordPress から Nuxt + Cloudflare への完全移行ガイド",{"type":7,"value":8,"toc":1437},"minimark",[9,13,16,35,47,50,55,59,112,119,121,125,128,138,144,167,173,280,287,586,592,889,895,1048,1050,1054,1058,1094,1100,1198,1200,1204,1211,1256,1262,1264,1268,1272,1299,1302,1306,1309,1336,1339,1350,1353,1355,1359,1366,1388,1391,1393,1397,1400,1424,1427,1433],[10,11,12],"p",{},"いいですね、Nuxt なら今のワークフローともきれいに繋がりますし、WordPress を完全に捨てられます。",[10,14,15],{},"あなたの条件を整理すると：",[17,18,19,23,26,29,32],"ul",{},[20,21,22],"li",{},"WordPress はもう触りたくない（完全廃止）",[20,24,25],{},"ホスティングは Cloudflare に集約したい",[20,27,28],{},"すでに Nuxt + pages ベースでログサイトを作っている",[20,30,31],{},"記事は MD(MDX 的なもの) で書きたい",[20,33,34],{},"画像多めのブログ",[10,36,37,38,42,43,46],{},"これに対しての",[39,40,41],"strong",{},"完成形アーキテクチャ","と、",[39,44,45],{},"具体的な移行ステップ","をまとめます。",[48,49],"hr",{},[51,52,54],"h2",{"id":53},"_1-目指す完成形nuxt-cloudflare-全面移行","1. 目指す完成形（Nuxt × Cloudflare 全面移行）",[56,57,58],"h3",{"id":58},"全体構成",[17,60,61,67,75,82,101],{},[20,62,63,64],{},"フロントエンド：\n",[39,65,66],{},"Nuxt 3（SSG／プリレンダー）",[20,68,69,70,74],{},"記事コンテンツ：\n",[71,72,73],"code",{},"@nuxt/content"," + Markdown / MDC（MDX 的にコンポーネント埋め込み）",[20,76,77,78,81],{},"デプロイ：\n",[39,79,80],{},"Cloudflare Pages","（ビルドコマンドで静的出力）",[20,83,84,85],{},"画像：",[17,86,87,94],{},[20,88,89,90,93],{},"① とりあえずは ",[71,91,92],{},"/public/uploads/..."," で運用",[20,95,96,97,100],{},"② 将来的に ",[39,98,99],{},"Cloudflare Images / R2"," に移す（推奨）",[20,102,103,104,107,108,111],{},"ログサイト：\n既存の ",[71,105,106],{},"pages/"," ベースのログをそのまま統合（",[71,109,110],{},"/logs"," 等）",[10,113,114,115,118],{},"→ これで ",[39,116,117],{},"「Cloudflare だけで完結する Nuxt ブログ＋ログサイト」"," になります。\nConoHa も WordPress も不要です。",[48,120],{},[51,122,124],{"id":123},"_2-nuxt-プロジェクト構成イメージ","2. Nuxt プロジェクト構成イメージ",[10,126,127],{},"すでに Nuxt でログサイトを作っているとのことなので、ブログ機能を同じリポジトリ内に足す形を想定します。",[129,130,136],"pre",{"className":131,"code":133,"language":134,"meta":135},[132],"language-text","root/\n  nuxt.config.ts\n  package.json\n  /pages\n    index.vue          … トップ\n    logs/\n      index.vue        … ログ一覧\n      [slug].vue       … ログ詳細（既にある想定）\n  /content\n    /blog\n      2025-11-28-first-post.md\n      ...\n  /components\n    content/\n      ProseImage.vue   … 画像コンポーネント（Cloudflare Images 対応など）\n  /public\n    /uploads           … 当面は旧 WP 画像をここへ\n","text","",[71,137,133],{"__ignoreMap":135},[56,139,141,143],{"id":140},"nuxtcontent-の導入",[71,142,73],{}," の導入",[129,145,149],{"className":146,"code":147,"language":148,"meta":135,"style":135},"language-bash shiki shiki-themes vitesse-light vitesse-light","npm install @nuxt/content\n","bash",[71,150,151],{"__ignoreMap":135},[152,153,156,160,164],"span",{"class":154,"line":155},"line",1,[152,157,159],{"class":158},"senZ8","npm",[152,161,163],{"class":162},"sdGka"," install",[152,165,166],{"class":162}," @nuxt/content\n",[10,168,169,172],{},[71,170,171],{},"nuxt.config.ts"," 例：",[129,174,178],{"className":175,"code":176,"language":177,"meta":135,"style":135},"language-ts shiki shiki-themes vitesse-light vitesse-light","export default defineNuxtConfig({\n  modules: ['@nuxt/content'],\n  content: {\n    // 必要があればここで MDC/ハイライト等の設定\n  },\n  nitro: {\n    preset: 'static', // 静的出力（Cloudflare Pagesにそのまま載る）\n  },\n})\n","ts",[71,179,180,196,217,226,233,239,247,269,274],{"__ignoreMap":135},[152,181,182,186,189,192],{"class":154,"line":155},[152,183,185],{"class":184},"sHkkW","export",[152,187,188],{"class":184}," default",[152,190,191],{"class":158}," defineNuxtConfig",[152,193,195],{"class":194},"shFtX","({\n",[152,197,199,203,206,210,212,214],{"class":154,"line":198},2,[152,200,202],{"class":201},"sz8Xr","  modules",[152,204,205],{"class":194},": [",[152,207,209],{"class":208},"sMJiu","'",[152,211,73],{"class":162},[152,213,209],{"class":208},[152,215,216],{"class":194},"],\n",[152,218,220,223],{"class":154,"line":219},3,[152,221,222],{"class":201},"  content",[152,224,225],{"class":194},": {\n",[152,227,229],{"class":154,"line":228},4,[152,230,232],{"class":231},"sxvE3","    // 必要があればここで MDC/ハイライト等の設定\n",[152,234,236],{"class":154,"line":235},5,[152,237,238],{"class":194},"  },\n",[152,240,242,245],{"class":154,"line":241},6,[152,243,244],{"class":201},"  nitro",[152,246,225],{"class":194},[152,248,250,253,256,258,261,263,266],{"class":154,"line":249},7,[152,251,252],{"class":201},"    preset",[152,254,255],{"class":194},": ",[152,257,209],{"class":208},[152,259,260],{"class":162},"static",[152,262,209],{"class":208},[152,264,265],{"class":194},", ",[152,267,268],{"class":231},"// 静的出力（Cloudflare Pagesにそのまま載る）\n",[152,270,272],{"class":154,"line":271},8,[152,273,238],{"class":194},[152,275,277],{"class":154,"line":276},9,[152,278,279],{"class":194},"})\n",[10,281,282,283,286],{},"ブログページ例（",[71,284,285],{},"pages/blog/[slug].vue","）：",[129,288,292],{"className":289,"code":290,"language":291,"meta":135,"style":135},"language-vue shiki shiki-themes vitesse-light vitesse-light","\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\nconst { data: article } = await useAsyncData('article', () =>\n  queryContent('/blog')\n    .where({ _path: `/blog/${route.params.slug}` })\n    .findOne()\n)\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"prose mx-auto\">\n    \u003CContentDoc v-if=\"article\" :value=\"article\" />\n    \u003Cp v-else>記事が見つかりませんでした。\u003C/p>\n  \u003C/div>\n\u003C/template>\n","vue",[71,293,294,322,340,386,403,449,458,462,471,477,487,510,544,567,577],{"__ignoreMap":135},[152,295,296,299,302,306,309,312,315,317,319],{"class":154,"line":155},[152,297,298],{"class":194},"\u003C",[152,300,301],{"class":184},"script",[152,303,305],{"class":304},"s4oTP"," setup",[152,307,308],{"class":304}," lang",[152,310,311],{"class":194},"=",[152,313,314],{"class":208},"\"",[152,316,177],{"class":162},[152,318,314],{"class":208},[152,320,321],{"class":194},">\n",[152,323,324,328,331,334,337],{"class":154,"line":198},[152,325,327],{"class":326},"stQ0i","const ",[152,329,330],{"class":304},"route",[152,332,333],{"class":194}," =",[152,335,336],{"class":158}," useRoute",[152,338,339],{"class":194},"()\n",[152,341,342,344,347,350,353,356,359,361,364,367,370,372,375,377,380,383],{"class":154,"line":219},[152,343,327],{"class":326},[152,345,346],{"class":194},"{",[152,348,349],{"class":304}," data",[152,351,352],{"class":194},":",[152,354,355],{"class":304}," article",[152,357,358],{"class":194}," }",[152,360,333],{"class":194},[152,362,363],{"class":184}," await",[152,365,366],{"class":158}," useAsyncData",[152,368,369],{"class":194},"(",[152,371,209],{"class":208},[152,373,374],{"class":162},"article",[152,376,209],{"class":208},[152,378,379],{"class":194},",",[152,381,382],{"class":194}," ()",[152,384,385],{"class":194}," =>\n",[152,387,388,391,393,395,398,400],{"class":154,"line":228},[152,389,390],{"class":158},"  queryContent",[152,392,369],{"class":194},[152,394,209],{"class":208},[152,396,397],{"class":162},"/blog",[152,399,209],{"class":208},[152,401,402],{"class":194},")\n",[152,404,405,408,411,414,417,419,422,425,428,430,433,436,438,441,444,446],{"class":154,"line":235},[152,406,407],{"class":194},"    .",[152,409,410],{"class":158},"where",[152,412,413],{"class":194},"({ ",[152,415,416],{"class":201},"_path",[152,418,255],{"class":194},[152,420,421],{"class":208},"`",[152,423,424],{"class":162},"/blog/",[152,426,427],{"class":184},"${",[152,429,330],{"class":162},[152,431,432],{"class":194},".",[152,434,435],{"class":162},"params",[152,437,432],{"class":194},[152,439,440],{"class":162},"slug",[152,442,443],{"class":184},"}",[152,445,421],{"class":208},[152,447,448],{"class":194}," })\n",[152,450,451,453,456],{"class":154,"line":241},[152,452,407],{"class":194},[152,454,455],{"class":158},"findOne",[152,457,339],{"class":194},[152,459,460],{"class":154,"line":249},[152,461,402],{"class":194},[152,463,464,467,469],{"class":154,"line":271},[152,465,466],{"class":194},"\u003C/",[152,468,301],{"class":184},[152,470,321],{"class":194},[152,472,473],{"class":154,"line":276},[152,474,476],{"emptyLinePlaceholder":475},true,"\n",[152,478,480,482,485],{"class":154,"line":479},10,[152,481,298],{"class":194},[152,483,484],{"class":184},"template",[152,486,321],{"class":194},[152,488,490,493,496,499,501,503,506,508],{"class":154,"line":489},11,[152,491,492],{"class":194},"  \u003C",[152,494,495],{"class":184},"div",[152,497,498],{"class":304}," class",[152,500,311],{"class":194},[152,502,314],{"class":208},[152,504,505],{"class":162},"prose mx-auto",[152,507,314],{"class":208},[152,509,321],{"class":194},[152,511,513,516,519,522,524,526,528,530,533,535,537,539,541],{"class":154,"line":512},12,[152,514,515],{"class":194},"    \u003C",[152,517,518],{"class":184},"ContentDoc",[152,520,521],{"class":304}," v-if",[152,523,311],{"class":194},[152,525,314],{"class":208},[152,527,374],{"class":162},[152,529,314],{"class":208},[152,531,532],{"class":304}," :value",[152,534,311],{"class":194},[152,536,314],{"class":208},[152,538,374],{"class":162},[152,540,314],{"class":208},[152,542,543],{"class":194}," />\n",[152,545,547,549,551,554,557,561,563,565],{"class":154,"line":546},13,[152,548,515],{"class":194},[152,550,10],{"class":184},[152,552,553],{"class":304}," v-else",[152,555,556],{"class":194},">",[152,558,560],{"class":559},"sG7-3","記事が見つかりませんでした。",[152,562,466],{"class":194},[152,564,10],{"class":184},[152,566,321],{"class":194},[152,568,570,573,575],{"class":154,"line":569},14,[152,571,572],{"class":194},"  \u003C/",[152,574,495],{"class":184},[152,576,321],{"class":194},[152,578,580,582,584],{"class":154,"line":579},15,[152,581,466],{"class":194},[152,583,484],{"class":184},[152,585,321],{"class":194},[10,587,588,589,286],{},"一覧ページ（",[71,590,591],{},"pages/blog/index.vue",[129,593,595],{"className":289,"code":594,"language":291,"meta":135,"style":135},"\u003Cscript setup lang=\"ts\">\nconst { data: articles } = await useAsyncData('articles', () =>\n  queryContent('/blog').sort({ date: -1 }).find()\n)\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"mx-auto max-w-3xl\">\n    \u003Ch1 class=\"text-2xl font-bold mb-4\">Blog\u003C/h1>\n    \u003Cul>\n      \u003Cli v-for=\"post in articles\" :key=\"post._path\" class=\"mb-2\">\n        \u003CNuxtLink :to=\"post._path\">\n          {{ post.title }}（{{ post.date }}）\n        \u003C/NuxtLink>\n      \u003C/li>\n    \u003C/ul>\n  \u003C/div>\n\u003C/template>\n",[71,596,597,617,653,693,697,705,709,717,736,765,773,817,838,843,852,861,871,880],{"__ignoreMap":135},[152,598,599,601,603,605,607,609,611,613,615],{"class":154,"line":155},[152,600,298],{"class":194},[152,602,301],{"class":184},[152,604,305],{"class":304},[152,606,308],{"class":304},[152,608,311],{"class":194},[152,610,314],{"class":208},[152,612,177],{"class":162},[152,614,314],{"class":208},[152,616,321],{"class":194},[152,618,619,621,623,625,627,630,632,634,636,638,640,642,645,647,649,651],{"class":154,"line":198},[152,620,327],{"class":326},[152,622,346],{"class":194},[152,624,349],{"class":304},[152,626,352],{"class":194},[152,628,629],{"class":304}," articles",[152,631,358],{"class":194},[152,633,333],{"class":194},[152,635,363],{"class":184},[152,637,366],{"class":158},[152,639,369],{"class":194},[152,641,209],{"class":208},[152,643,644],{"class":162},"articles",[152,646,209],{"class":208},[152,648,379],{"class":194},[152,650,382],{"class":194},[152,652,385],{"class":194},[152,654,655,657,659,661,663,665,668,671,673,676,678,681,685,688,691],{"class":154,"line":219},[152,656,390],{"class":158},[152,658,369],{"class":194},[152,660,209],{"class":208},[152,662,397],{"class":162},[152,664,209],{"class":208},[152,666,667],{"class":194},").",[152,669,670],{"class":158},"sort",[152,672,413],{"class":194},[152,674,675],{"class":201},"date",[152,677,255],{"class":194},[152,679,680],{"class":326},"-",[152,682,684],{"class":683},"sM54T","1",[152,686,687],{"class":194}," }).",[152,689,690],{"class":158},"find",[152,692,339],{"class":194},[152,694,695],{"class":154,"line":228},[152,696,402],{"class":194},[152,698,699,701,703],{"class":154,"line":235},[152,700,466],{"class":194},[152,702,301],{"class":184},[152,704,321],{"class":194},[152,706,707],{"class":154,"line":241},[152,708,476],{"emptyLinePlaceholder":475},[152,710,711,713,715],{"class":154,"line":249},[152,712,298],{"class":194},[152,714,484],{"class":184},[152,716,321],{"class":194},[152,718,719,721,723,725,727,729,732,734],{"class":154,"line":271},[152,720,492],{"class":194},[152,722,495],{"class":184},[152,724,498],{"class":304},[152,726,311],{"class":194},[152,728,314],{"class":208},[152,730,731],{"class":162},"mx-auto max-w-3xl",[152,733,314],{"class":208},[152,735,321],{"class":194},[152,737,738,740,743,745,747,749,752,754,756,759,761,763],{"class":154,"line":276},[152,739,515],{"class":194},[152,741,742],{"class":184},"h1",[152,744,498],{"class":304},[152,746,311],{"class":194},[152,748,314],{"class":208},[152,750,751],{"class":162},"text-2xl font-bold mb-4",[152,753,314],{"class":208},[152,755,556],{"class":194},[152,757,758],{"class":559},"Blog",[152,760,466],{"class":194},[152,762,742],{"class":184},[152,764,321],{"class":194},[152,766,767,769,771],{"class":154,"line":479},[152,768,515],{"class":194},[152,770,17],{"class":184},[152,772,321],{"class":194},[152,774,775,778,780,783,785,787,790,792,795,797,799,802,804,806,808,810,813,815],{"class":154,"line":489},[152,776,777],{"class":194},"      \u003C",[152,779,20],{"class":184},[152,781,782],{"class":304}," v-for",[152,784,311],{"class":194},[152,786,314],{"class":208},[152,788,789],{"class":162},"post in articles",[152,791,314],{"class":208},[152,793,794],{"class":304}," :key",[152,796,311],{"class":194},[152,798,314],{"class":208},[152,800,801],{"class":162},"post._path",[152,803,314],{"class":208},[152,805,498],{"class":304},[152,807,311],{"class":194},[152,809,314],{"class":208},[152,811,812],{"class":162},"mb-2",[152,814,314],{"class":208},[152,816,321],{"class":194},[152,818,819,822,825,828,830,832,834,836],{"class":154,"line":512},[152,820,821],{"class":194},"        \u003C",[152,823,824],{"class":184},"NuxtLink",[152,826,827],{"class":304}," :to",[152,829,311],{"class":194},[152,831,314],{"class":208},[152,833,801],{"class":162},[152,835,314],{"class":208},[152,837,321],{"class":194},[152,839,840],{"class":154,"line":546},[152,841,842],{"class":559},"          {{ post.title }}（{{ post.date }}）\n",[152,844,845,848,850],{"class":154,"line":569},[152,846,847],{"class":194},"        \u003C/",[152,849,824],{"class":184},[152,851,321],{"class":194},[152,853,854,857,859],{"class":154,"line":579},[152,855,856],{"class":194},"      \u003C/",[152,858,20],{"class":184},[152,860,321],{"class":194},[152,862,864,867,869],{"class":154,"line":863},16,[152,865,866],{"class":194},"    \u003C/",[152,868,17],{"class":184},[152,870,321],{"class":194},[152,872,874,876,878],{"class":154,"line":873},17,[152,875,572],{"class":194},[152,877,495],{"class":184},[152,879,321],{"class":194},[152,881,883,885,887],{"class":154,"line":882},18,[152,884,466],{"class":194},[152,886,484],{"class":184},[152,888,321],{"class":194},[10,890,891,892,286],{},"Markdown(MDC) 記事例（",[71,893,894],{},"content/blog/2025-11-28-first-post.md",[129,896,900],{"className":897,"code":898,"language":899,"meta":135,"style":135},"language-md shiki shiki-themes vitesse-light vitesse-light","---\ntitle: \"移行後初めての投稿\"\ndate: \"2025-11-28\"\ntags: [\"移行\", \"Cloudflare\", \"Nuxt\"]\nthumbnail: \"/uploads/hero.jpg\"\n---\n\n# タイトル\n\nここに本文。\n\n::ProseImage\nsrc=\"/uploads/sample.jpg\"\nalt=\"サンプル画像\"\n::\n\nコンポーネントも埋め込めるので、ほぼ MDX 的な運用ができます。\n","md",[71,901,902,907,923,936,974,988,992,996,1006,1010,1015,1019,1024,1029,1034,1039,1043],{"__ignoreMap":135},[152,903,904],{"class":154,"line":155},[152,905,906],{"class":194},"---\n",[152,908,909,912,914,917,920],{"class":154,"line":198},[152,910,911],{"class":201},"title",[152,913,352],{"class":194},[152,915,916],{"class":208}," \"",[152,918,919],{"class":162},"移行後初めての投稿",[152,921,922],{"class":208},"\"\n",[152,924,925,927,929,931,934],{"class":154,"line":219},[152,926,675],{"class":201},[152,928,352],{"class":194},[152,930,916],{"class":208},[152,932,933],{"class":162},"2025-11-28",[152,935,922],{"class":208},[152,937,938,941,943,946,948,951,953,955,957,960,962,964,966,969,971],{"class":154,"line":228},[152,939,940],{"class":201},"tags",[152,942,352],{"class":194},[152,944,945],{"class":194}," [",[152,947,314],{"class":208},[152,949,950],{"class":162},"移行",[152,952,314],{"class":208},[152,954,379],{"class":194},[152,956,916],{"class":208},[152,958,959],{"class":162},"Cloudflare",[152,961,314],{"class":208},[152,963,379],{"class":194},[152,965,916],{"class":208},[152,967,968],{"class":162},"Nuxt",[152,970,314],{"class":208},[152,972,973],{"class":194},"]\n",[152,975,976,979,981,983,986],{"class":154,"line":235},[152,977,978],{"class":201},"thumbnail",[152,980,352],{"class":194},[152,982,916],{"class":208},[152,984,985],{"class":162},"/uploads/hero.jpg",[152,987,922],{"class":208},[152,989,990],{"class":154,"line":241},[152,991,906],{"class":194},[152,993,994],{"class":154,"line":249},[152,995,476],{"emptyLinePlaceholder":475},[152,997,998,1002],{"class":154,"line":271},[152,999,1001],{"class":1000},"sFA8A","#",[152,1003,1005],{"class":1004},"syTZV"," タイトル\n",[152,1007,1008],{"class":154,"line":276},[152,1009,476],{"emptyLinePlaceholder":475},[152,1011,1012],{"class":154,"line":479},[152,1013,1014],{"class":559},"ここに本文。\n",[152,1016,1017],{"class":154,"line":489},[152,1018,476],{"emptyLinePlaceholder":475},[152,1020,1021],{"class":154,"line":512},[152,1022,1023],{"class":559},"::ProseImage\n",[152,1025,1026],{"class":154,"line":546},[152,1027,1028],{"class":559},"src=\"/uploads/sample.jpg\"\n",[152,1030,1031],{"class":154,"line":569},[152,1032,1033],{"class":559},"alt=\"サンプル画像\"\n",[152,1035,1036],{"class":154,"line":579},[152,1037,1038],{"class":559},"::\n",[152,1040,1041],{"class":154,"line":863},[152,1042,476],{"emptyLinePlaceholder":475},[152,1044,1045],{"class":154,"line":873},[152,1046,1047],{"class":559},"コンポーネントも埋め込めるので、ほぼ MDX 的な運用ができます。\n",[48,1049],{},[51,1051,1053],{"id":1052},"_3-cloudflare-pages-へのデプロイ設定","3. Cloudflare Pages へのデプロイ設定",[56,1055,1057],{"id":1056},"build-設定cloudflare-pages-側","build 設定（Cloudflare Pages 側）",[17,1059,1060,1070,1076],{},[20,1061,1062,1063,1066,1067,1069],{},"Framework preset: ",[39,1064,1065],{},"None"," or ",[39,1068,968],{},"（あれば）",[20,1071,1072,1073],{},"Build command:\n",[71,1074,1075],{},"npm install && npm run generate",[20,1077,1078,1079,1082,1083,1086,1087,1090,1091,1093],{},"Output directory:\nNuxt 3 の場合：",[71,1080,1081],{},".output/public"," または ",[71,1084,1085],{},"dist","\n→ ",[71,1088,1089],{},"nitro.preset = 'static'"," の場合は ",[71,1092,1081],{}," になるので、そこを指定",[10,1095,1096,1099],{},[71,1097,1098],{},"package.json"," の scripts 例：",[129,1101,1105],{"className":1102,"code":1103,"language":1104,"meta":135,"style":135},"language-json shiki shiki-themes vitesse-light vitesse-light","{\n  \"scripts\": {\n    \"dev\": \"nuxi dev\",\n    \"build\": \"nuxi build\",\n    \"generate\": \"nuxi generate\"\n  }\n}\n","json",[71,1106,1107,1112,1128,1150,1170,1188,1193],{"__ignoreMap":135},[152,1108,1109],{"class":154,"line":155},[152,1110,1111],{"class":194},"{\n",[152,1113,1114,1118,1121,1123,1125],{"class":154,"line":198},[152,1115,1117],{"class":1116},"sqvqQ","  \"",[152,1119,1120],{"class":201},"scripts",[152,1122,314],{"class":1116},[152,1124,352],{"class":194},[152,1126,1127],{"class":194}," {\n",[152,1129,1130,1133,1136,1138,1140,1142,1145,1147],{"class":154,"line":219},[152,1131,1132],{"class":1116},"    \"",[152,1134,1135],{"class":201},"dev",[152,1137,314],{"class":1116},[152,1139,352],{"class":194},[152,1141,916],{"class":208},[152,1143,1144],{"class":162},"nuxi dev",[152,1146,314],{"class":208},[152,1148,1149],{"class":194},",\n",[152,1151,1152,1154,1157,1159,1161,1163,1166,1168],{"class":154,"line":228},[152,1153,1132],{"class":1116},[152,1155,1156],{"class":201},"build",[152,1158,314],{"class":1116},[152,1160,352],{"class":194},[152,1162,916],{"class":208},[152,1164,1165],{"class":162},"nuxi build",[152,1167,314],{"class":208},[152,1169,1149],{"class":194},[152,1171,1172,1174,1177,1179,1181,1183,1186],{"class":154,"line":235},[152,1173,1132],{"class":1116},[152,1175,1176],{"class":201},"generate",[152,1178,314],{"class":1116},[152,1180,352],{"class":194},[152,1182,916],{"class":208},[152,1184,1185],{"class":162},"nuxi generate",[152,1187,922],{"class":208},[152,1189,1190],{"class":154,"line":241},[152,1191,1192],{"class":194},"  }\n",[152,1194,1195],{"class":154,"line":249},[152,1196,1197],{"class":194},"}\n",[48,1199],{},[51,1201,1203],{"id":1202},"_4-wordpress-から記事を持ってくる場合の流れ","4. WordPress から記事を持ってくる場合の流れ",[10,1205,1206,1207,1210],{},"「もう触りたくない」とはいえ、",[39,1208,1209],{},"一度だけエクスポートはしておく価値","があります。",[1212,1213,1214,1217,1231,1238,1241],"ol",{},[20,1215,1216],{},"WordPress 管理画面 → ツール → エクスポート → 投稿を XML（WXR）で出力",[20,1218,1219,1220],{},"ローカルでその XML → Markdown 変換",[17,1221,1222,1228],{},[20,1223,1224,1227],{},[71,1225,1226],{},"wordpress-export-to-markdown"," などの CLI ツール",[20,1229,1230],{},"あるいは自前スクリプト + AI で変換",[20,1232,1233,1234,1237],{},"出力された MD を ",[71,1235,1236],{},"content/blog/"," 配下に配置",[20,1239,1240],{},"frontmatter を整備（title, date, slug, tags, thumbnail）",[20,1242,1243,1244,1247,1248],{},"古い URL → 新 URL のマッピングを作成し、",[71,1245,1246],{},"_redirects"," で 301 を張る",[17,1249,1250],{},[20,1251,1252,1253],{},"例：",[71,1254,1255],{},"/2023/05/old-post/  /blog/old-post  301",[10,1257,1258,1259,1261],{},"Cloudflare Pages はプロジェクトルートに ",[71,1260,1246],{}," ファイルを置けばリダイレクトが効きます。",[48,1263],{},[51,1265,1267],{"id":1266},"_5-画像の扱い当面と将来","5. 画像の扱い（当面と将来）",[56,1269,1271],{"id":1270},"まずはシンプルに当面","まずはシンプルに（当面）",[17,1273,1274,1281,1288],{},[20,1275,1276,1277,1280],{},"旧 WordPress の ",[71,1278,1279],{},"wp-content/uploads"," を丸ごとダウンロード",[20,1282,1283,1284,1287],{},"Nuxt プロジェクトの ",[71,1285,1286],{},"/public/uploads"," 以下にそのままコピー",[20,1289,1290,1291,1294,1295,1298],{},"Markdown 内の画像パスを\n",[71,1292,1293],{},"https://oldsite.com/wp-content/uploads/..."," → ",[71,1296,1297],{},"/uploads/..."," に一括置換",[10,1300,1301],{},"→ これだけで、Cloudflare Pages 上でも全画像がそのまま表示されます。",[56,1303,1305],{"id":1304},"将来cloudflare-images-r2-へ移行","将来：Cloudflare Images / R2 へ移行",[10,1307,1308],{},"本気で Cloudflare 集約したくなったタイミングで：",[17,1310,1311,1314,1321],{},[20,1312,1313],{},"画像を Cloudflare Images にアップロード",[20,1315,1316,1317,1320],{},"返ってくる URL を基底 URL + ",[71,1318,1319],{},"id"," 形式で扱う",[20,1322,1323,1324,1327,1328,1331,1332,1335],{},"Nuxt 側では ",[71,1325,1326],{},"ProseImage"," コンポーネントで\n",[71,1329,1330],{},"src"," を ",[71,1333,1334],{},"https://imagedelivery.net/..."," に差し替え",[10,1337,1338],{},"とすることで、最終的に",[17,1340,1341,1344,1347],{},[20,1342,1343],{},"ページ：Cloudflare Pages",[20,1345,1346],{},"画像：Cloudflare Images",[20,1348,1349],{},"その他静的ファイル：Pages（もしくは R2）",[10,1351,1352],{},"という Cloudflare 完結構成になります。",[48,1354],{},[51,1356,1358],{"id":1357},"_6-ログサイトとの統合","6. ログサイトとの統合",[10,1360,1361,1362,1365],{},"既に ",[71,1363,1364],{},"pages"," ベースでログサイトを作っているとのことなので：",[17,1367,1368,1373,1381],{},[20,1369,1370,1372],{},[71,1371,110],{}," 配下のルーティングはそのまま維持",[20,1374,1375,1377,1378,1380],{},[71,1376,397],{}," 配下だけ ",[71,1379,73],{}," を使う",[20,1382,1383,1384,1387],{},"共通レイアウト（",[71,1385,1386],{},"layouts/default.vue","）でヘッダーに Blog / Logs のナビゲーションを追加",[10,1389,1390],{},"という形にすると、「ブログ＋ログ」を同一 Nuxt アプリ内で完結できます。",[48,1392],{},[51,1394,1396],{"id":1395},"_7-この後一緒に詰められること","7. この後一緒に詰められること",[10,1398,1399],{},"ここから先は、より具体的に詰められます。",[17,1401,1402,1408,1414,1419],{},[20,1403,1404,1405,1407],{},"実際の ",[71,1406,171],{},"（あなたの既存ログサイト構成を前提にした統合案）",[20,1409,1410,1413],{},[71,1411,1412],{},"content/"," のディレクトリ構造設計（年別／カテゴリ別など）",[20,1415,1416,1418],{},[71,1417,1246],{}," のサンプル（旧 WP パーマリンクのリダイレクト設計）",[20,1420,1421,1423],{},[71,1422,1326],{}," コンポーネントで Cloudflare Images 前提の書き方",[10,1425,1426],{},"などもすべて具体的に書けます。",[10,1428,1429,1430,1432],{},"もしよければ「今動いている Nuxt ログサイトの構成（ざっくり）」「記事数のおおよその規模」だけ教えていただければ、それに合わせて ",[71,1431,171],{}," と ディレクトリ構造案をそのまま貼れる形で出します。",[1434,1435,1436],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sFA8A, html code.shiki .sFA8A{--shiki-default:#999999;--shiki-default-font-weight:bold;--shiki-dark:#999999;--shiki-dark-font-weight:bold}html pre.shiki code .syTZV, html code.shiki .syTZV{--shiki-default:#1C6B48;--shiki-default-font-weight:bold;--shiki-dark:#1C6B48;--shiki-dark-font-weight:bold}html pre.shiki code .sqvqQ, html code.shiki .sqvqQ{--shiki-default:#99841877;--shiki-dark:#99841877}",{"title":135,"searchDepth":198,"depth":198,"links":1438},[1439,1442,1446,1449,1450,1454,1455],{"id":53,"depth":198,"text":54,"children":1440},[1441],{"id":58,"depth":219,"text":58},{"id":123,"depth":198,"text":124,"children":1443},[1444],{"id":140,"depth":219,"text":1445},"@nuxt/content の導入",{"id":1052,"depth":198,"text":1053,"children":1447},[1448],{"id":1056,"depth":219,"text":1057},{"id":1202,"depth":198,"text":1203},{"id":1266,"depth":198,"text":1267,"children":1451},[1452,1453],{"id":1270,"depth":219,"text":1271},{"id":1304,"depth":219,"text":1305},{"id":1357,"depth":198,"text":1358},{"id":1395,"depth":198,"text":1396},null,"WordPress を廃止し、Nuxt 3 + @nuxt/content + Cloudflare Pages でブログとログサイトを統合する完成形アーキテクチャと具体的な移行ステップ",{},"/wordpress-to-nuxt-cloudflare-migration",false,"2025-11-29T00:00:00.000Z",{"title":5,"description":1457},"2025-11/2025-11-29/wordpress-to-nuxt-cloudflare-migration",[968,959,1465,1466,73],"WordPress","migration","TztNKRdqRIAUBKE-L4AKCTuyNGurfMq6paEfbAudfBA",[],[1470,1474,1478,1481,1485],{"title":1471,"path":1472,"publishedAt":1473},"WordPressブログをNuxt 3 + Cloudflare Pagesに移行した記録","/pon-blog-wordpress-to-nuxt3-migration-2026-02-11","2026-02-11T00:00:00.000Z",{"title":1475,"path":1476,"publishedAt":1477},"Cloudflare PagesとWorkers Static Assetsの違い、エッジキャッシュが効く仕組み","/cloudflare-pages-workers-static-assets","2026-07-22T00:00:00.000Z",{"title":1479,"path":1480,"publishedAt":1477},"Webサービスの技術構成 2026年版 — Vue.js/Nuxt/Astroの使い分けとその理由","/web-tech-stack-2026",{"title":1482,"path":1483,"publishedAt":1484},"Cloudflare Pages はもう Workers の中に住んでいる ― Static Assets 統合後の地図","/cloudflare-pages-to-workers-static-assets","2026-06-29T00:00:00.000Z",{"title":1486,"path":1487,"publishedAt":1488},"Nuxt Content の database lock と auto-import 衝突によるビルドエラー - dev起動失敗から measure-deploy で再発するまでの2連続","/nuxt-content-db-lock-and-auto-import-conflict","2026-06-13T00:00:00.000Z","https://log.eurekapu.com/og/blog/wordpress-to-nuxt-cloudflare-migration.png?v=2025-11-29T00%3A00%3A00.000Z&title=WordPress%20%E3%81%8B%E3%82%89%20Nuxt%20%2B%20Cloudflare%20%E3%81%B8%E3%81%AE%E5%AE%8C%E5%85%A8%E7%A7%BB%E8%A1%8C%E3%82%AC%E3%82%A4%E3%83%89&author=Kei%20Komatsu&sig=8d6e9b168e9eead9",1785654965564]