Trong bài viết [Phần 1], mình đã hướng dẫn các xuất bài viết trên WordPress và chuyển đổi thành file Markdown để sử dụng với các công cụ tạo static site. Bài viết [Phần 2] hôm nay sẽ hướng dẫn cách cài đặt Astro cùng các cấu hình cần thiết để sử dụng làm blog, thay thế cho WordPress.
1. Cài đặt Astro
Mình sẽ sử dụng theme Astro Starter Pro cho tiết kiệm thời gian phát triển.
Cài đặt bằng lệnh sau
npm create astro@latest -- --template devgelo-labs/astro-starter-pro
Truy cập vào thư mục vừa tạo và khởi động dev server
cd bldl-blognpm run dev> bldl-blog@0.0.1 dev> astro dev
07:10:52 [types] Generated 0ms07:10:53 [content] Syncing content07:10:53 [content] Synced content
astro v5.16.8 ready in 1293 ms
┃ Local http://localhost:4321/┃ Network use --host to expose
07:10:53 watching for file changes...Sau đó truy cập vào địa chỉ http://localhost:4321 , nếu thấy hiện ra website nghĩa là Astro đã được cài đặt thành công.

2. Copy bài viết và ảnh vào
Mình sẽ xóa các bài viết demo đi kèm theo theme và copy bài viết của blog cùng hình ảnh đã xử lý ở Phần 1 vào thư mục tương ứng
rm -rf src/content/blog/*
cp ~/blog-migration/output/posts/*.md src/content/blog/
mkdir -p public/imagescp -r ~/blog-migration/output/posts/images/. public/images/3. Cập nhật Content Schema
Sau khi copy nội dung và hình ảnh vào, site dev chắc chắn sẽ bị lỗi do một số thông số không khớp. Cần phải chỉnh lại trong file src/content.config.ts
import { defineCollection, z } from "astro:content";import { glob } from "astro/loaders";
const blog = defineCollection({ loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/blog" }), schema: z.object({ title: z.string(), description: z.string().optional(), pubDatetime: z.coerce.date(), author: z.string(), image: z.string().optional(), tags: z.array(z.string()).optional(), categories: z.array(z.string()).optional(), }),});
export const collections = { blog };4. Chỉnh cấu trúc thư mục để khớp URL của WordPress
Trên WordPress, các bài viết được truy cập theo slug /%postname%/ — không có /blog/ nên mình cần phải di chuyển file [...slug].astro từ thư mục blog ra ngoài
mv src/pages/blog/[...slug].astro src/pages/[...slug].astroTương tự hai thư mục category và tag cũng cần phải di dời ra ngoài để khớp với URL cũ của WordPress. Cấu trúc thư mục sau khi chỉnh sửa src/pages sẽ như sau
.├── 404.astro├── [...slug].astro├── about.astro├── blog│ └── [...page].astro├── category│ └── [category].astro├── contact.astro├── index.astro├── robots.txt.ts├── rss.xml.js└── tags └── [tag].astro5. Cập nhật trang chủ, social links,…
Tiếp theo, mình sẽ dọn dẹp hết tất cả các components không sử dụng, cập nhật Header, NavBar, Footer và các thông tin liên quan cho khớp với nội dung trên blog hiện tại.
Khuyến khích bạn nên dùng Visual Studio Code và git để dễ kiểm soát thay đổi và phục hồi lại khi cần.
6. Kiểm tra trên local
Sau khi hoàn tất việc cập nhật nội dung, mình cho chạy lại dev mode để kiểm tra thành quả
npm run devTrang chủ đã hiện ra ngon lành, chưa giống 100% với trang gốc bên WordPress lắm. Vậy là tạm ổn rồi! Phần giao diện có thể tùy biến sau.

Sau đó, cũng cần kiểm tra các link của bài viết, category, tag có khớp với link bên WordPress không
-
http://localhost:4321/blog→ trang blog khớp -
http://localhost:4321/ten-bai-viet-cu→ trang bài viết khớp. -
http://localhost:4321/categories/du-lich→ trang danh mục khớp -
http://localhost:4321/tags/airbnb→ trang tag khớp
Vậy là xong Giai đoạn 2: blog đã được chuyển thành công từ WordPress qua Astro. Tuy nhiên hiện tại blog vẫn đang chạy trên local, chưa được đẩy lên cloud. Trong các bài viết kế tiếp, mình sẽ chia sẻ cách lưu trữ hình ảnh trên Cloudflare R2 và đưa blog lên Cloudflare Pages.