Course schema: Cách tạo JSON-LD, chọn đúng type và kiểm tra triển khai
Course schema là gì và còn giá trị gì đối với SEO?
Course Schema là dữ liệu có cấu trúc dựa trên type Course, dùng để mô tả tên khóa học, nội dung, provider và các lịch học cụ thể. Nói đơn giản, nó giúp công cụ tìm kiếm hiểu được mối quan hệ giữa chương trình đào tạo, đơn vị cung cấp và từng đợt tổ chức khóa học. (Nguồn: Schema.org/Course).
Theo Schema.org, Course mô tả một chuỗi hoạt động hoặc tài liệu giáo dục nhằm phát triển kiến thức, năng lực hay kỹ năng cho người học. Vì vậy, type này phù hợp với chương trình có mục tiêu và cấu trúc đào tạo rõ ràng, không mặc định áp dụng cho mọi nội dung giáo dục.
Giá trị cốt lõi của việc triển khai Course Schema nằm ở ba điểm:
- Chuẩn hóa thông tin khóa học thành các type và property có quan hệ rõ ràng.
- Giảm sự mơ hồ giữa chương trình, lịch khai giảng, đơn vị đào tạo và học phí.
- Tạo tính nhất quán giữa landing page, CMS, LMS và dữ liệu máy đọc.
Schema.org và Google Search khác nhau ở đâu?
Hai nguồn này giải quyết hai lớp vấn đề khác nhau:
Nguồn | Vai trò |
|---|---|
Schema.org | Định nghĩa type, property và quan hệ dữ liệu hợp lệ |
Google Search Central | Quy định chính sách, tính năng tìm kiếm và trạng thái hỗ trợ của Google |
Valid theo Schema.org không đồng nghĩa eligible hoặc được Google hiển thị. Eligibility là khả năng đủ điều kiện kỹ thuật cho một tính năng tìm kiếm, không phải cam kết giao diện đó sẽ xuất hiện.
Tại thời điểm cập nhật bài viết, Google vẫn có tài liệu về Course list structured data. Tính năng được mô tả là khả dụng bằng tiếng Anh tại các khu vực có Google Search. Trạng thái hỗ trợ có thể thay đổi, vì vậy cần kiểm tra lại tài liệu chính thức tại ngày triển khai.

Course Schema có giúp tăng thứ hạng không?
Bạn không nên coi Course Schema là một yếu tố trực tiếp giúp tăng thứ hạng từ khóa. Dữ liệu có cấu trúc hỗ trợ Semantic SEO bằng cách mô tả nội dung và quan hệ giữa các thực thể rõ ràng hơn. Tuy nhiên, Google không bảo đảm URL sẽ tăng thứ hạng hoặc nhận rich result chỉ vì markup hợp lệ.
Schema phải phản ánh chính xác nội dung người dùng nhìn thấy. Việc thêm học phí, chứng chỉ, giảng viên hoặc đánh giá không tồn tại có thể vi phạm nguyên tắc chung về structured data.
Khi nào nên sử dụng Course, CourseInstance, ItemList hoặc Event?
Hãy chọn schema theo bản chất nội dung, không theo giao diện tìm kiếm mong muốn. Nếu trang có chương trình, mục tiêu học tập hoặc learning outcomes rõ ràng, có thể cân nhắc Course. Nếu trang tập trung vào thời điểm diễn ra cụ thể, cần xem xét CourseInstance hoặc Event.
Trang giới thiệu chương trình học: Course
Sử dụng Course khi trang mô tả một chương trình đào tạo tổng quát, chẳng hạn khóa SEO chuyên sâu hoặc chương trình Digital Marketing kéo dài sáu tháng.
Một khóa học thường có:
- Mục tiêu hoặc kết quả học tập rõ ràng.
- Nội dung gồm bài học, module hoặc chuyên đề.
- Trình độ đầu vào hoặc nhóm học viên mục tiêu.
- Đơn vị đào tạo và người hướng dẫn.
- Cơ chế đánh giá hoặc chứng nhận nếu có.
Không nên đưa toàn bộ dữ liệu của một lịch khai giảng vào Course mà không phân biệt chương trình chung và đợt tổ chức cụ thể.
Một lịch khai giảng cụ thể: CourseInstance
CourseInstance mô tả một lần tổ chức cụ thể của khóa học. Một Course có thể liên kết với nhiều CourseInstance qua hasCourseInstance.
Các dữ liệu thường thuộc về từng đợt học gồm:
startDate: Ngày khai giảng.endDate: Ngày kết thúc.courseMode: Hình thức học.instructor: Giảng viên phụ trách.location: Địa điểm hoặc môi trường học trực tuyến.offers: Học phí và tình trạng đăng ký công khai.
Ví dụ, “SEO Master Class” là chương trình tổng quát. Các lớp khai giảng tháng 5 và tháng 8 là hai CourseInstance riêng.
Trang tổng hợp khóa học: ItemList
ItemList phù hợp với trang danh mục chứa nhiều khóa học. Khi triển khai:
- Mỗi item phải dẫn đến URL khóa học tương ứng.
positionphải phản ánh thứ tự thực tế.- Không dùng URL trang danh mục cho mọi item.
- Mỗi URL nên là URL chuẩn và không trùng lặp.
- Cần kiểm tra trạng thái hỗ trợ Course List của Google tại ngày triển khai.
Theo hướng dẫn Course list của Google, cấu hình dành cho tính năng này cần ít nhất ba khóa học và markup danh sách phù hợp. Đáp ứng yêu cầu không đồng nghĩa Google chắc chắn hiển thị carousel.
Hội thảo hoặc nội dung đơn lẻ: Event hoặc type phù hợp
Workshop hoặc webinar diễn ra vào một ngày cụ thể thường phù hợp hơn với Event. Bài hướng dẫn độc lập cần dùng type phản ánh đúng nội dung, thay vì “nâng cấp” thành khóa học để tạo markup.
Một video ngắn, kỳ thi độc lập hoặc trang tổng quan bằng cấp cũng không tự động đáp ứng bản chất của Course.

Loại trang | Schema phù hợp |
|---|---|
Chương trình đào tạo |
|
Một đợt khai giảng |
|
Danh mục khóa học |
|
Workshop hoặc webinar một lần |
|
Bài hướng dẫn độc lập | Type phản ánh đúng nội dung |
Các thuộc tính quan trọng của Course Schema
Bạn không cần khai báo toàn bộ property trên Schema.org. Một Course Schema chất lượng chỉ chứa dữ liệu có thật, được hiển thị công khai và đồng nhất giữa landing page, CMS hoặc LMS.
Nhóm thuộc tính mô tả khóa học
Thuộc tính | Type | Nguồn dữ liệu | Lưu ý chất lượng |
|---|---|---|---|
| Text | Tên khóa học trên CMS | Không thêm giá, giảm giá hoặc tuyên bố “tốt nhất” |
| Text | Mô tả công khai | Phải khớp nội dung người dùng nhìn thấy |
| Organization hoặc Person | Hồ sơ đơn vị đào tạo | Dùng tên và URL nhất quán toàn website |
| URL | Canonical URL | Sử dụng URL tuyệt đối của khóa học |
| Text | Thông tin tuyển sinh | Chỉ khai báo cấp độ có căn cứ |
| Text hoặc Course | Điều kiện đầu vào | Không tự tạo yêu cầu không có trên trang |
| Text hoặc URL | Chính sách chứng nhận | Chỉ dùng nếu thực sự cấp chứng chỉ |
| Text | Ngôn ngữ giảng dạy | Có thể dùng mã ngôn ngữ như |
provider là đơn vị cung cấp chương trình. Với tổ chức đào tạo, nên khai báo bằng Organization và sử dụng cùng một thực thể trên toàn website.
Nhóm thuộc tính cho lịch học
Thuộc tính | Type | Vai trò |
|---|---|---|
| CourseInstance | Liên kết khóa học với từng đợt tổ chức |
| Text hoặc URL | Hình thức học trực tuyến, trực tiếp hoặc kết hợp |
| Date hoặc DateTime | Ngày bắt đầu |
| Date hoặc DateTime | Ngày kết thúc |
| Person | Giảng viên của đợt học |
| Place hoặc VirtualLocation | Địa điểm hoặc môi trường trực tuyến |
| Offer | Học phí và điều kiện đăng ký công khai |
Học phí, lịch học và giảng viên có thể thay đổi theo từng đợt. Những dữ liệu này nên được đặt trong CourseInstance, thay vì gắn cố định vào mô tả chương trình. Chỉ sử dụng Offer khi thông tin thương mại được hiển thị công khai. Ngày tháng nên dùng định dạng ISO 8601, ví dụ 2026-05-15.

Mỗi trường nên có một nguồn dữ liệu chính để tránh landing page và JSON-LD hiển thị hai phiên bản khác nhau.
Dữ liệu | Nguồn chính |
|---|---|
Tên, mô tả, cấp độ | CMS hoặc landing page |
Provider | Hồ sơ Organization dùng toàn website |
Lịch học, giảng viên | LMS hoặc hệ thống lịch |
Học phí, trạng thái | Hệ thống tuyển sinh hoặc commerce |
URL | Canonical URL |
Ba nguyên tắc cần duy trì:
- Khớp nội dung hiển thị: Schema không chứa thông tin bị ẩn khỏi người dùng.
- Đồng nhất giữa hệ thống: CMS, LMS và JSON-LD dùng cùng dữ liệu.
- Không điền dữ liệu giả: Thiếu property vẫn tốt hơn khai báo thông tin không có thật.
Mẫu Course Schema JSON-LD cho trang khóa học và danh sách khóa học
Các mẫu Course Schema JSON-LD dưới đây sử dụng dữ liệu minh họa. Hãy thay toàn bộ placeholder và loại bỏ property không có căn cứ trên trang thực tế.
Cảnh báo: Không sao chép nguyên dữ liệu mẫu lên website production. URL, ngày học, học phí, chứng chỉ và giảng viên phải được thay bằng dữ liệu công khai của khóa học.
Mẫu 1 – JSON-LD cho trang khóa học
Mẫu này dành cho trang chi tiết một chương trình có lịch khai giảng cụ thể.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Course",
"@id": "https://example.com/khoa-hoc/[THAY_URL]#course",
"name": "[THAY_TEN_KHOA_HOC]",
"description": "[THAY_MO_TA_KHOA_HOC]",
"url": "https://example.com/khoa-hoc/[THAY_URL]",
"inLanguage": "vi",
"educationalLevel": "[THAY_CAP_DO]",
"coursePrerequisites": "[THAY_DIEU_KIEN_DAU_VAO]",
"educationalCredentialAwarded": "[THAY_CHUNG_CHI]",
"provider": {
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "[THAY_TEN_DON_VI]",
"url": "https://example.com/"
},
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"startDate": "[THAY_NGAY_KHAI_GIANG]",
"endDate": "[THAY_NGAY_KET_THUC]",
"instructor": {
"@type": "Person",
"name": "[THAY_TEN_GIANG_VIEN]"
},
"location": {
"@type": "VirtualLocation",
"url": "https://example.com/lop-hoc-truc-tuyen"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/khoa-hoc/[THAY_URL]",
"price": "[THAY_HOC_PHI]",
"priceCurrency": "VND",
"availability": "https://schema.org/InStock"
}
}
}
</script>
Cần thay các trường sau:
- Thay tên, mô tả, URL, provider và mọi placeholder trong ngoặc vuông.
- Xóa
coursePrerequisiteshoặceducationalCredentialAwardednếu trang không có dữ liệu. - Nếu chưa công khai học phí, hãy loại bỏ toàn bộ object
offers. - Nếu có nhiều lịch khai giảng, dùng một mảng chứa nhiều
CourseInstance. - Duy trì cùng một
@idcho Organization trên toàn website.
Mẫu 2 – JSON-LD cho trang danh sách khóa học
Mẫu ItemList sau mô tả ba URL khóa học riêng biệt. Đây không phải cam kết tạo Course List Carousel.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "[THAY_TEN_DANH_SACH_KHOA_HOC]",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"url": "https://example.com/khoa-hoc/[THAY_URL_KHOA_1]"
},
{
"@type": "ListItem",
"position": 2,
"url": "https://example.com/khoa-hoc/[THAY_URL_KHOA_2]"
},
{
"@type": "ListItem",
"position": 3,
"url": "https://example.com/khoa-hoc/[THAY_URL_KHOA_3]"
}
]
}
</script>
Mỗi ListItem cần một position liên tục và URL riêng. Thứ tự trong JSON-LD nên khớp với danh sách người dùng nhìn thấy.

Nên chọn mẫu nào?
Tình huống | Cấu trúc |
|---|---|
Trang chi tiết một khóa học |
|
Khóa học có lịch khai giảng |
|
Trang tổng hợp khóa học |
|
Website có danh mục và trang chi tiết | Dùng từng type tại đúng template |
Cách thêm Course Schema vào website và WordPress
Phương án triển khai phụ thuộc vào số lượng khóa học, tần suất cập nhật và nguồn dữ liệu. Nguyên tắc quan trọng nhất là chỉ có một nguồn chịu trách nhiệm tạo Course markup.
Chèn JSON-LD thủ công
- Chọn mẫu phù hợp với trang chi tiết hoặc trang danh sách.
- Thay dữ liệu minh họa bằng thông tin đang hiển thị công khai.
- Chèn script vào phần
<head>hoặc<body>của template. - Kiểm tra code trước khi xuất bản bằng JSON validator và Schema Markup Validator.
- Kiểm tra URL đã render để xác nhận script xuất hiện trong phiên bản máy tìm kiếm nhận được.
Cách thủ công phù hợp khi website chỉ có vài khóa học và nội dung ít thay đổi. Rủi ro lớn nhất là học phí hoặc lịch học đã cập nhật trên trang nhưng JSON-LD vẫn giữ dữ liệu cũ.
Dùng plugin trên WordPress
Sử dụng plugin giúp người không chuyên về lập trình quản lý schema thuận tiện hơn. Tuy nhiên, plugin không bảo đảm output phù hợp với mọi theme, LMS hoặc custom field.
Checklist đánh giá gồm:
- Cho phép chọn đúng
Course, không ép dùng type mặc định. - Có khả năng map dữ liệu từ custom field.
- Kiểm soát được
CourseInstance, giảng viên và lịch học. - Cho phép tắt schema do plugin hoặc theme khác tạo.
- Không tự thêm dữ liệu không xuất hiện trên landing page.
- Output xuất hiện trong source hoặc rendered HTML.
- Không tạo nhiều object
Coursemâu thuẫn trên cùng URL.
Cảnh báo: Theme, plugin SEO và LMS có thể cùng sinh schema. Duplicate markup không chỉ làm thừa code mà còn tạo nhiều phiên bản học phí, provider hoặc lịch học khác nhau.
Tạo schema động theo template
Website có hàng chục hoặc hàng trăm khóa học nên map dữ liệu trực tiếp từ CMS hoặc LMS. Hệ thống chỉ sinh property khi trường tương ứng có giá trị.
Quy trình nên gồm:
- Map tên, mô tả và URL từ CMS.
- Lấy lịch học và giảng viên từ LMS.
- Đồng bộ học phí với hệ thống tuyển sinh.
- Test một nhóm URL đại diện trước khi mở rộng.
- Theo dõi lỗi sau mỗi lần cập nhật template.
Phương án | Ưu điểm | Rủi ro | Phù hợp |
|---|---|---|---|
Thủ công | Kiểm soát trực tiếp | Dễ lỗi khi cập nhật | Website ít khóa học |
Plugin | Dễ thao tác | Trùng hoặc sai markup | WordPress quy mô nhỏ |
Template động | Khả năng mở rộng tốt | Phụ thuộc chất lượng dữ liệu | Website hoặc LMS lớn |

Quy trình kiểm tra Course Schema sau khi triển khai
Không nên chỉ dán code vào một công cụ rồi kết luận schema đã hoàn tất. Quy trình đúng gồm bốn tầng:
Bước 1 – Kiểm tra cú pháp JSON-LD
Trước tiên, bạn cần xác nhận JSON-LD có thể parse được. Hãy kiểm tra:
- Dấu ngoặc mở và đóng.
- Dấu phẩy giữa các property.
- Dấu nháy kép.
- URL tuyệt đối.
- Chuỗi ký tự đặc biệt.
- Cấu trúc object và array.
Syntax error khiến code không thể phân tích. Warning thường cho biết markup vẫn đọc được nhưng có dữ liệu thiếu, không phù hợp hoặc cần xem xét.
Bước 2 – Kiểm tra bằng Schema Markup Validator
Dùng Schema Markup Validator để kiểm tra type và property theo vocabulary Schema.org.
Công cụ giúp phát hiện:
- Property không thuộc type tương ứng.
- Quan hệ sai giữa
CoursevàCourseInstance. providerkhông phải Organization hoặc Person phù hợp.instructor,locationhoặcoffersđặt sai cấu trúc.
Bước 3 – Kiểm tra bằng Rich Results Test
Rich Results Test kiểm tra markup theo những tính năng Google đang hỗ trợ. Công cụ có thể nhận code trực tiếp hoặc URL đã xuất bản.
Nếu công cụ không báo cáo một Course rich result, không nên mặc định kết luận Course sai. Có thể vocabulary vẫn hợp lệ nhưng không có tính năng Google tương ứng hoặc trạng thái hỗ trợ đã thay đổi.
Bước 4 – Kiểm tra bằng Google Search Console
Sử dụng URL Inspection để kiểm tra:
- URL có thể crawl và index hay không.
- Google chọn canonical nào.
- HTML đã render có chứa JSON-LD không.
- Phiên bản Google nhận được có phải phiên bản mới không.
- Enhancement report tương ứng còn tồn tại hay không.
Sau khi triển khai hàng loạt, hãy kiểm tra URL đại diện cho từng template, loại khóa học và nguồn dữ liệu.
Công cụ | Kiểm tra | Không dùng để kết luận |
|---|---|---|
JSON validator | Cú pháp | Google có hiển thị hay không |
Schema Markup Validator | Vocabulary | Đủ điều kiện hiển thị rich result hay không |
Rich Results Test | Tính năng Google hỗ trợ | Chắc chắn được hiển thị |
URL Inspection | Crawl, render và index | Hiệu quả ranking |
Xu hướng lỗi theo URL | Toàn bộ tính hợp lệ Schema.org |
Những lỗi Course Schema thường gặp và cách xử lý
Lỗi Course Schema thường xuất phát từ ba nhóm: Chọn sai type, dữ liệu không nhất quán hoặc markup không được Google crawl và render đúng.
Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
Dùng | Chọn type theo mục tiêu rich result | Đánh giá lại nội dung; chuyển sang |
| Lấy nguyên tiêu đề bán hàng | Chỉ giữ tên chính thức của khóa học |
Thiếu hoặc sai | Không thống nhất hồ sơ tổ chức | Tạo một Organization dùng chung với tên và URL chính xác |
| Mọi item trỏ về trang danh mục | Gắn URL chi tiết riêng cho từng khóa học |
Schema không khớp landing page | JSON-LD lấy dữ liệu cũ | Đồng bộ schema với dữ liệu người dùng đang nhìn thấy |
Duplicate schema | Theme, plugin và LMS cùng tạo markup | Chọn một nguồn chính và tắt các output còn lại |
Lịch hoặc offer hết hạn | Không có cơ chế cập nhật | Xóa đợt học cũ hoặc cập nhật trạng thái, ngày và học phí |
JSON-LD không có trong rendered HTML | Script tải lỗi hoặc bị chặn | Kiểm tra rendered HTML bằng URL Inspection |
Markup hợp lệ nhưng không có rich result | Tính năng không hỗ trợ hoặc Google không lựa chọn | Kiểm tra tài liệu hiện hành, crawl, index và chính sách |
Trong các dự án Technical SEO, hai lỗi khó phát hiện nhất thường là duplicate schema và dữ liệu cũ. CMS có thể hiển thị học phí mới, trong khi plugin SEO vẫn lấy giá từ custom field đã ngừng sử dụng.

Markup hợp lệ có thể không xuất hiện vì tính năng tương ứng không còn hoặc chưa được Google hỗ trợ. URL cũng có thể chưa đáp ứng yêu cầu kỹ thuật, nội dung hoặc chính sách. Trong trường hợp khác, Google chưa crawl, render hoặc index phiên bản mới. Ngay cả khi mọi điều kiện đã được đáp ứng, Google vẫn có quyền không lựa chọn giao diện đặc biệt cho truy vấn cụ thể.
Valid markup là điều kiện kỹ thuật, không phải cam kết hiển thị.
Câu hỏi thường gặp
Sự khác biệt giữa Course và CourseInstance là gì?
Course là thực thể mô tả chương trình đào tạo tổng quát (ví dụ: "Khóa học Lập trình Python Cơ bản"), bao gồm các thông tin ổn định như mục tiêu học tập, người hướng dẫn và mô tả chương trình. Ngược lại, CourseInstance mô tả một đợt khai giảng hoặc một sự kiện đào tạo cụ thể trong chương trình đó (ví dụ: "Lớp Python khai giảng ngày 15/10/2026 tại Hà Nội").
Một Course có thể chứa nhiều CourseInstance để phản ánh các lịch học, hình thức đào tạo (online/onsite) hoặc mức học phí khác nhau theo từng thời điểm.
Tại sao đã thêm đúng code JSON-LD nhưng không thấy kết quả hiển thị trên Google?
Việc triển khai markup hợp lệ theo Schema.org chỉ là điều kiện kỹ thuật cần, không phải là cam kết hiển thị giao diện đặc biệt trên Google. Các thuật toán của Google có quyền lựa chọn hiển thị hoặc không dựa trên nhiều yếu tố khác như chính sách nội dung, độ uy tín của website và tính phù hợp với truy vấn người dùng.
Ngoài ra, hãy đảm bảo rằng dữ liệu trong JSON-LD của bạn đồng nhất với nội dung công khai trên trang và được trình thu thập thông tin của Google (Googlebot) truy cập, render thành công khi kiểm tra thông qua công cụ URL Inspection trong Google Search Console.
Làm thế nào để phân biệt khi nào dùng ItemList và khi nào dùng Course?
- Sử dụng
Coursecho các trang chi tiết về một khóa học cụ thể, nơi người dùng có thể xem nội dung đào tạo và đăng ký. - Sử dụng
ItemListcho các trang danh mục hoặc trang tổng hợp danh sách nhiều khóa học để Google hiểu được cấu trúc nhóm nội dung.
Đặc biệt, nếu bạn muốn nhắm đến tính năng "Course List carousel", việc áp dụng ItemList với ít nhất ba mục (ListItem) có URL duy nhất là yêu cầu bắt buộc theo chính sách của Google.
Xem thêm:
- HowTo Schema là gì? Cách triển khai chuẩn SEO bằng JSON-LD
- Schema Product: Hướng dẫn khai báo Structured Data chuẩn SEO
- Article Schema là gì? Hướng dẫn triển khai chuẩn SEO
Kết luận
Triển khai course schema đúng nên bắt đầu từ việc chọn chính xác Course, CourseInstance, ItemList hoặc Event. Mọi property phải phản ánh dữ liệu thật, công khai và đồng nhất giữa landing page, CMS, LMS với hệ thống tuyển sinh. Sau khi chèn JSON-LD, bạn cần kiểm tra schema qua cú pháp, vocabulary, Google eligibility và HTML đã render.

.jpg&w=160&q=75)


