2540 字
13 分鐘

【WordPress 搬家 Astro 教學】告別主機費!靜態部落格重建、R2 圖床與 Cloudflare Pages 實戰完整紀錄

經營 WordPress 部落格這幾年,Kent 一直很在意網站速度與每個月固定的主機維護費用。直到深入接觸了 Astro 這個現代化靜態站點生成(SSG)框架,才下定決心將累積了上百篇文章的部落格徹底搬家。

這篇文章將完整公開從 WordPress 遷移到 Astro 的全流程實戰紀錄:從利用 REST API 自動化抓取文章、圖片轉移至 Cloudflare R2 圖床、配置 Cloudflare Pages 免費部署,到解決過程中的各種技術坑點,分享給想打造極速網站的站長與前端開發者!


⚡ 30 秒速查:WordPress vs Astro 搬家前後全方位對比#

比較維度舊架構:WordPress 傳統動態站新架構:Astro 5 + Cloudflare
💰 主機費用每月 NT$300 ~ 1,000+(隨流量增長)NT$ 0 元(Cloudflare Pages 免費方案)
🚀 載入速度PageSpeed 50~70 分(受限於 PHP/MySQL)PageSpeed 95~100 分(極速 HTML/CDN 快取)
🛡️ 資安維護需持續更新核心、主題與外掛防範漏洞零後端伺服器,無資料庫注入與被駭風險
🖼️ 圖片圖床存放在主機空間,佔容量且耗頻寬Cloudflare R2(S3 相容,免收傳出流量費)
🔍 站內搜尋依賴資料庫查詢或重度外掛Pagefind 建置時預先建立離線索引(極速)
✍️ 寫作方式網頁後台視覺化區塊編輯器本機 Markdown / MDX 檔 + Git 版本控制
🛠️ 技術門檻低(外掛隨裝即用)中高(需具備 Node.js、Git 與前端基本概念)

為什麼決定告別 WordPress?#

WordPress 作為全球市佔率第一的 CMS,外掛生態系成熟、SEO 工具完整,後台操作也非常直覺。但隨著部落格文章數量破百,以下幾個痛點逐漸浮現:

  1. 網站速度與 Core Web Vitals 瓶頸:每次經過 PHP 即時運算與多個外掛的 JavaScript 渲染,首次載入時間(TTFB 與 LCP)很難維持在綠色滿分區間。
  2. 固定主機租用支出:對於非營利或個人科技部落格,每年幾千元的主機費雖非巨款,但累積下來也是一筆開銷,且流量暴增時還要擔心主機超載。
  3. 外掛維護與資安焦慮:WordPress 核心與外掛每週都有安全性更新,若不及時修補隨時有被惡意機器人掃描注入的風險。

Astro 是什麼?靜態網站的核心優勢#

Astro 是一個專為「內容驅動型網站(Content-Driven Websites)」打造的現代化靜態網站框架。

  • 預設零 JavaScript (Zero JS by default):Astro 會在 Build(建置)時期直接將程式碼編譯成乾淨的靜態 HTML/CSS,訪客造訪時不需要在瀏覽器下載肥大的 JS bundle,速度自然極致飛快。
  • 群島架構 (Islands Architecture):若頁面需要互動(如站內搜尋框、深色模式切換按鈕),僅針對該區塊載入輕量 Svelte 或 Vue 元件,其餘部分維持純靜態。
  • 搭配 Cloudflare Pages 實現「零主機費」:靜態檔案直接託管在 Cloudflare 的全球邊緣 CDN 節點,全球訪客都能就近秒開網頁。

佈景主題與前端技術棧選型#

Kent 本次選擇了 Fuwari 作為基礎主題進行客製化二次開發,專案整體技術棧配置如下:

  • Astro 5.x — 核心 SSG 靜態網站框架與檔案路由
  • Svelte 5.x — 搜尋彈窗、側欄收折、深淺色外觀切換互動元件
  • Tailwind CSS 3.x — 現代化原子樣式庫
  • Pagefind — 建置時自動提取中英文關鍵字的靜態全文檢索
  • Cloudflare Pages — 全球邊緣託管與自動化持續部署(CI/CD)
  • Cloudflare R2 — 圖片專用物件儲存與 CDN 圖床

核心實戰一:文章資料無痛自動化遷移#

面對上百篇既有文章,手動複製貼上極耗時間。Kent 撰寫了一套 Node.js 自動化遷移腳本,分為兩大階段:

Step 1:透過 WordPress REST API 抓取原始文章#

WordPress 內建開放的 REST API,不需要額外安裝外掛即可透過端點抓取:

https://你的網域/wp-json/wp/v2/posts

抓取腳本的關鍵設計:#

  1. 分頁處理:讀取 Response Header 中的 X-WP-TotalPages 決定總頁數(每頁抓取 100 筆)。
  2. 自動重試機制 (Retry):加入 3 次失敗重試與每次 1 秒間隔,避免網路短暫抖動導致中斷。
  3. 請求節流 (Rate Limiting):每頁抓取間隔 300ms,保護源站伺服器不被觸發限流。
  4. 關聯資源打包:同步抓取 media(媒體庫)、categories(分類)與 tags(標籤)存為 JSON。
Terminal window
node fetch-all.js

Step 2:將 JSON 轉為 Astro Markdown (.md)#

取得原始資料後,透過 convert.js 腳本批次轉換為帶有 YAML Frontmatter 的 Markdown 檔案:

  1. HTML 轉 Markdown:採用 turndown 套件,將 WordPress 的複雜 HTML 標籤精準轉換為語意化 Markdown。
  2. 精選圖片 (Featured Image) 判定:優先提取文章的 featured_media,若無則自動提取內文第一張圖片做為封面圖。
  3. SEO 描述清理:優先使用 WordPress 摘要,自動過濾 HTML 殘留符號,並控制在 120~160 字元內。
  4. 自動產生 Frontmatter:動態組成包含 titlepublishedupdatedimagecategorytags 的標準格式。
Terminal window
node convert.js

腳本執行完畢後,產生的 .md 檔案直接放入 src/content/posts/ 即可被 Astro Content Collections 自動讀取。


核心實戰二:圖片遷移至 Cloudflare R2 圖床#

原本 WordPress 圖片存放在主機 /wp-content/uploads/ 目錄。遷移至靜態站點後,將所有圖片移至 Cloudflare R2 物件儲存,不僅釋放本機儲存空間,更能享有全球 CDN 快取。

💡 為什麼選擇 Cloudflare R2?

與 AWS S3 相比,Cloudflare R2 完全不收取對外傳輸流量費用(Zero Egress Fees,即讀取/下載圖片免流量費)!每個月還提供 10GB 免費儲存空間,對於個人部落格與技術圖片庫來說幾乎零成本。

1. 建立 R2 儲存貯體 (Bucket)#

  1. 登入 Cloudflare Dashboard ➔ 點選 《 R2 物件儲存 》《 建立儲存貯體 》(如:blog3c-assets)。
  2. 進入 Bucket 設定 ➔ 綁定 自訂網域(如:img.blog3c.net)。
  3. 於 R2 API 頁面建立 Token,取得 Access Key IDSecret Access Key

2. 使用 rclone 批次同步圖片#

rclone 支援 S3 相容協定,設定檔 ~/.config/rclone/rclone.conf 設定如下:

[r2]
type = s3
provider = Cloudflare
access_key_id = YOUR_ACCESS_KEY_ID
secret_access_key = YOUR_SECRET_ACCESS_KEY
endpoint = https://<ACCOUNT_ID>.r2.cloudflarestorage.com

執行同步腳本並設定一年靜態快取標頭:

Terminal window
rclone sync ./images r2:blog3c-assets --progress \
--header-upload "Cache-Control: public, max-age=31536000, immutable"

核心實戰三:Cloudflare Pages 部署與全自動化流程#

部落格建置完成後,透過 Wrangler CLI 部署至 Cloudflare Pages:

Terminal window
npm run deploy

此指令自動完成的流水線:#

  1. astro build — 編譯產出極速靜態 HTML/CSS/JS 檔案於 dist/
  2. pagefind --site dist — 掃描生成站內離線搜尋索引庫。
  3. wrangler pages deploy dist --branch master — 將靜態資源同步至 Cloudflare Pages 正式環境。
  4. node scripts/purge-cache.js — 呼叫 Cloudflare API 清理邊緣快取,確保訪客立即看到最新文章。

核心實戰四:SEO、結構化資料與 GA 追蹤優化#

WordPress 搬到 Astro 最大的挑戰在於失去 SEO 外掛(如 Rank Math/Yoast)。在 Astro 中需自行於版型確保符合現代 SEO 規範:

1. Google Analytics (Partytown 非同步載入)#

src/layouts/Layout.astro 中結合 Partytown,將 GA 追蹤腳本移至背景 Web Worker 執行,避免阻礙主執行緒,確保 Core Web Vitals 保持綠色滿分。

2. Schema.org 結構化資料 (JSON-LD)#

為每篇文章注入符合 Google 複合式結果(Rich Results)規範的 BlogPostingBreadcrumbList 麵包屑結構化資料:

<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "BlogPosting",
"headline": "文章標題",
"image": ["https://img.blog3c.net/cover.webp"],
"datePublished": "2026-04-28T00:00:00.000Z",
"dateModified": "2026-08-18T00:00:00.000Z",
"author": { "@type": "Person", "name": "Kent" },
"publisher": { "@type": "Organization", "name": "攻城濕不說的秘密" }
},
{
"@type": "BreadcrumbList",
"itemListElement": [...]
}
]
}
</script>

3. Open Graph 與 Twitter 社群預覽卡片#

為每篇文章動態計算絕對圖片網址,並設定預設 Fallback 分享縮圖,確保在 LINE、Facebook 與 Twitter 分享時呈現吸睛的卡片。


搬家過程踩過的「坑」與解決方案#

⚠️ 必看避坑指南

搬家過程中幾個容易讓人卡關的問題與正確解法:

  1. Wrangler 部署後顯示「Cloudflare Pages not deploying」
    • 原因:Wrangler 初始化時若未明確指定分支,Cloudflare Pages 正式環境分支與本地推送分支對不上。
    • 解法:在 deploy 指令強制加入 --branch masterwrangler pages deploy dist --branch master)。
  2. 舊網址 301 轉址無限迴圈 (Redirect Loop)
    • 原因:舊網址為 /blog/*,若在 _redirects 使用萬用字元會誤匹配到新網址 /blog/post/*
    • 解法:改用具名參數規則 /blog/:slug /blog/post/:slug 301 精準比對單層路徑。
  3. robots.txt 誤封鎖靜態資源
    • 原因:主題預設若含有 Disallow: /_astro/,會導致 Googlebot 與 PageSpeed 無法讀取編譯後的 CSS/JS 檔案。
    • 解法:在 src/pages/robots.txt.ts 明確設定 Allow: / 並放行各大 AI 搜尋爬蟲。
  4. HTML 實體字元殘留
    • 原因:WordPress REST API 導出的 JSON 可能含有 &#8211;&#8217; 等符號。
    • 解法:在轉換腳本中使用正則表達式或 HTML 解碼套件先做字串清理。

搬家後的真實心得總結#

部落格從 WordPress 遷移至 Astro 靜態站點後,帶來的改善非常顯著:

  • 速度有感提升:首頁與內文頁面在各國測試均能實現「秒開」,PageSpeed 效能分數穩居 95 分以上。
  • 維護成本歸零:徹底告別每月的主機帳單,Cloudflare Pages 與 R2 的免費額度對個人技術部落格綽綽有餘。
  • 寫作更專注:改用本機 VS Code / Markdown 寫作搭配 Git 版本控制,排版乾淨且不用擔心線上編輯器當機遺失內容。

如果你也正為 WordPress 速度緩慢或主機支出感到困擾,Astro + Cloudflare Pages 絕對是 2026 年最值得投入的部落格重構方案!


🔗 延伸閱讀推薦#

【WordPress 搬家 Astro 教學】告別主機費!靜態部落格重建、R2 圖床與 Cloudflare Pages 實戰完整紀錄
https://blog3c.net/blog/post/wordpress-to-astro-migration/
作者
Kent
發佈於
2026-04-28
許可協議
CC BY-NC-SA 4.0