TL;DR
freeCodeCamp vừa đăng tutorial của Shinobis (21/04/2026) hướng dẫn dựng knowledge graph tự động cho blog chỉ bằng PHP thuần và JSON-LD. Không plugin, không API ngoài, không NLP. Mục tiêu: thay vì khai báo metadata rời rạc, ghép author, organization, post, topic và bản dịch thành một @graph duy nhất với @id bền vững — để LLM và search engine nhận ra blog của bạn là một hệ tri thức liên kết, không phải các trang riêng lẻ.
Bằng chứng từ tác giả: 52 bài × 3 ngôn ngữ trong 3 tháng → indexed pages từ 26 lên 48, keyword "llms txt" đạt top 4 Google, ChatGPT chấm graph 9.1/10.
Knowledge Graph tự động khác gì JSON-LD tĩnh
JSON-LD tĩnh (kiểu mỗi bài chèn 1 block BlogPosting) chỉ khai báo tôi là một bài viết. Knowledge graph tự động khai báo tôi là bài viết X, viết bởi Person A của Organization B, nói về topic C, nhắc tool D, có liên quan tới bài E và bản dịch F — và mọi thực thể đều có @id ổn định trên toàn site.
Điểm khác biệt cốt lõi: persistent identifier. Cùng một author URL https://yoursite.com/#author xuất hiện trên 100 bài → AI hiểu đó là một thực thể duy nhất, gán authority. Static JSON-LD không có ràng buộc này.
Vì sao 2026 là năm của structured data
Số liệu thị trường rất khắc nghiệt với ai bỏ qua schema:
- 81% các trang được AI engine trích dẫn có schema markup, JSON-LD chiếm áp đảo.
- Trang có schema toàn diện được trích dẫn trong AI answer nhiều hơn 3.2 lần.
- ChatGPT ưu tiên
Article+FAQPage; Perplexity dựa vào entity-rich schema để gắn footnote.
Năm 2026 structured data đã chuyển vai trò: từ nice-to-have cho rich snippet sang hạ tầng bắt buộc của Generative Engine Optimization (GEO). Static JSON-LD lỗi thời vì nó không kể được câu chuyện liên kết giữa các trang.
Cách tutorial hoạt động
Toàn bộ logic gói trong vài hàm PHP, ghép 5 entity vào một mảng @graph:
| Bước | Schema type | Cách phát sinh |
|---|---|---|
| Person, Organization, WebSite | Person, Organization, WebSite | Helper function trả về entity với @id cố định (/#author, /#organization, /#website) |
| Bài viết | BlogPosting + WebPage | Đọc title, excerpt, dates, URL từ DB; thêm abstract riêng để LLM đánh giá |
| Topic / tool | Thing | strpos() match content với map associative array → đẩy vào about và mentions |
| Bài liên quan | — | Query bảng post_connections → render thành relatedLink + citation |
| Bản dịch đa ngôn ngữ | CreativeWork | Query bảng post_translations → property workTranslation |
Encode bằng json_encode($graph, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE). Hết. Tác giả khẳng định thẳng: "Do you need NLP for entity detection? No." Một map keyword đủ chạy production cho blog cỡ trăm bài.
So sánh các cách dựng schema
| Tiêu chí | Plugin (Yoast / Rank Math) | JSON-LD tĩnh thủ công | Auto graph (PHP thuần) |
|---|---|---|---|
| Cài đặt | Install + config UI | Paste block mỗi bài | Code 1 lần, chạy mãi |
| Entity linking xuyên trang | Hạn chế | Không có | Có (@id bền vững) |
| Phát hiện topic/tool | Tag thủ công | Thủ công | Tự động (keyword map) |
| Đa ngôn ngữ | Phụ thuộc plugin | Khó | Built-in qua workTranslation |
| CMS hỗ trợ | Thường chỉ WordPress | Bất kỳ | Bất kỳ stack PHP |
| Chi phí runtime | Plugin overhead | 0 | Vài ms / page (cache trên 1000 bài) |
Ai nên áp dụng
- Indie blogger / solo publisher đang chạy đua AI-search visibility nhưng không muốn lệ thuộc plugin.
- Site đa ngôn ngữ cần consolidate authority qua các bản dịch —
workTranslationgiải quyết gọn. - Blog có topic cluster sẵn, các bài đã reference lẫn nhau nhưng chưa có cách báo cho AI biết mối liên kết.
- Dev tự host PHP CMS không phải WordPress (Laravel, Symfony, custom) — không có plugin SEO ready-made.
Hạn chế & chi phí
- Detection bằng keyword: không bắt synonym, không hiểu ngữ cảnh. NLP giúp nhưng tăng độ phức tạp đáng kể.
- Hai topic có substring trùng có thể bị match lẫn — phải kiểm soát map cẩn thận.
- Generate runtime: với blog >1000 bài cần cache JSON-LD output, tránh truy vấn DB mỗi request.
- Bảo trì topic/tool map: taxonomy mọc lên thì map cũng phải mọc — đây là tax cố hữu của approach không-NLP.
- Không tự disambiguate: "Apple" công ty vs "apple" trái cây — bạn phải tự khoanh.
Bước tiếp theo
Nếu bạn đang sở hữu blog PHP và quan tâm việc được LLM trích dẫn, bài này là blueprint đầy đủ nhất hiện có — đọc kỹ đoạn về @id bền vững và abstract property, đó là hai chi tiết hay bị bỏ sót khi copy schema từ Google docs. Hướng tiến hoá tự nhiên: thêm caching layer (Redis hoặc file cache theo post_id + updated_at), thay strpos() bằng entity extraction service khi quy mô vượt vài nghìn bài, và port pattern này sang Laravel/Symfony view composer hoặc Next.js metadata API cho hệ Node.
Nguồn: freeCodeCamp — Build an Automatic Knowledge Graph with PHP and JSON-LD, Search Engine Land, Rankeo Schema Guide 2026.