สรุปคำถาม: ใน Grav CMS เห็นแต่การสร้าง Page ธรรมดา แต่อยากทำเป็นระบบ Blog (มีหน้ารวมบทความและหน้าเนื้อหาย่อย) ต้องเริ่มต้นจัดโครงสร้างอย่างไร 🤔📝
คำถามนี้ยอดเยี่ยมและตรงจุดหัวใจของ Grav เลยครับ! 👏✨ คนส่วนใหญ่ที่เพิ่งลอง Grav จะติดภาพว่ามีแต่หน้า Page นิ่งๆ เพราะ Grav ไม่ได้แยกชนิดโพสต์เหมือน WordPress แต่มันใช้แนวคิด Parent-Child Collection ครับ 🚀
หลักการง่ายมาก: "โฟลเดอร์แม่ทำหน้าที่รวมบทความ (Blog Listing) ส่วนโฟลเดอร์ลูกคือเนื้อหาแต่ละบทความ (Blog Items)" 📂💡
โครงสร้างโฟลเดอร์ตัวอย่าง 📁
ในไดเรกทอรี user/pages/ ให้จัดเรียงลำดับโฟลเดอร์ตามนี้:
user/pages/
├── 01.home/
│ └── default.md
└── 02.blog/ <-- หน้าแม่ (หน้ารวมบทความ)
├── blog.md <-- เรียกใช้ Template "blog"
├── post-01/ <-- บทความที่ 1 (โฟลเดอร์ย่อย)
│ └── item.md <-- เรียกใช้ Template "item"
└── post-02/ <-- บทความที่ 2 (โฟลเดอร์ย่อย)
└── item.md
ทริกสำคัญ: ชื่อไฟล์
.mdจะไปจับคู่กับไฟล์ Twig Template โดยอัตโนมัติ (เช่นblog.mdจะใช้blog.html.twig,item.mdจะใช้item.html.twig) 🎨
ขั้นตอนการตั้งค่า 3 สเต็ป 🛠️
1. ตั้งค่าหน้าแม่ (02.blog/blog.md) 🏠📑
ไฟล์นี้ทำหน้าที่สั่งให้ระบบไป "กวาด" โฟลเดอร์ลูกๆ ทั้งหมดมาแสดงเป็นลิสต์ โดยกำหนดตัวแปร content.items ใน YAML Header:
---
title: บล็อกของฉัน
content:
items: '@self.children' # สั่งให้ดึงหน้าลูกทั้งหมดในโฟลเดอร์นี้
order:
by: date # เรียงตามวันที่
dir: desc # ล่าสุดขึ้นก่อน
limit: 5 # แสดงหน้าละ 5 บทความ
pagination: true # เปิดใช้ระบบแบ่งหน้า (Pagination)
---
# ยินดีต้อนรับสู่บล็อก ☕
ข้อความเกริ่นนำก่อนเข้าสู่รายการบทความ...
2. สร้างบทความย่อย (02.blog/post-01/item.md) ✍️📰
ในแต่ละโฟลเดอร์ลูก ให้สร้างไฟล์ชื่อ item.md พร้อมระบุข้อมูลเมตา:
---
title: เริ่มต้นใช้งาน Grav CMS แบบชิลๆ
date: 2026-11-08 10:00
taxonomy:
category: [tech]
tag: [grav, cms, php]
---
เนื้อหาบทความแบบเต็ม เขียนด้วย Markdown ได้สบายๆ...
3. ตรวจสอบธีมที่ใช้งาน (Theme Support) 🎨🖥️
ธีมเริ่มต้นส่วนใหญ่ของ Grav (เช่น Quark) มีไฟล์ templates/blog.html.twig และ templates/item.html.twig มาให้อยู่แล้ว เมื่อตั้งชื่อไฟล์ตรงกัน ระบบจะแสดงผลหน้ารวมบล็อก มีระบบแบ่งหน้า (Pagination) และแท็กหมวดหมู่ให้ทันทีแบบมืออาชีพ ⚡🚀
ถ้าทำผ่านหน้าต่าง Grav Admin Plugin (GUI):
- กด Add Page ➕
- ตั้งชื่อโฟลเดอร์ เช่น
Blog - ตรงช่อง Page Template ให้เปลี่ยนจาก
Defaultเป็นBlogแล้วบันทึก จากนั้นสร้างหน้าลูกข้างในโดยเลือก Template เป็นItemครับ สะดวกมาก! 🖥️✨