Liên hệ

    Hướng dẫn triển khai dữ liệu có cấu trúc Schema Product, Offer, AggregateRating và BreadcrumbList chuẩn JSON-LD

    Trả lời nhanh

    Triển khai dữ liệu có cấu trúc (Structured Data) theo định dạng JSON-LD cho website thương mại điện tử đòi hỏi sự đồng bộ chặt chẽ giữa mã nguồn kết xuất phía máy chủ và nội dung hiển thị thực tế trên trang chi tiết sản phẩm. Hệ thống cần lồng ghép chính xác thực thể Offer hoặc AggregateOffer cùng AggregateRating và Review vào bên trong thực thể Product, đồng thời khai báo đầy đủ mã định danh toàn cầu GTIN/MPN, đơn vị tiền tệ ISO 4217, trạng thái tồn kho và cấu trúc đường dẫn BreadcrumbList để kích hoạt Rich Results bền vững.

    Trên trang kết quả tìm kiếm (SERP) cạnh tranh khốc liệt của ngành bán lẻ, một đường dẫn sản phẩm hiển thị đầy đủ mức giá, trạng thái còn hàng, phí vận chuyển, số sao đánh giá và đường dẫn phân mục gọn gàng luôn thu hút tỷ lệ nhấp chuột (CTR) vượt trội so với kết quả văn bản thuần túy. Hơn thế nữa, các công cụ tìm kiếm tạo sinh (AI Search / Shopping Graph) hiện nay phụ thuộc trực tiếp vào khối dữ liệu có cấu trúc JSON-LD để trích xuất thông số thương mại chính xác theo thời gian thực.

    Phần 01

    1. Kiến trúc thực thể Schema Product và yêu cầu đồng bộ dữ liệu hiển thị (Visible Content Parity)

    Định dạng JSON-LD (JavaScript Object Notation for Linked Data) được đặt trong thẻ <script type=application/ld+json> là phương thức chuẩn được Google và các công cụ tìm kiếm khuyến nghị để khai báo dữ liệu có cấu trúc vì tính tách biệt hoàn toàn với cấu trúc thẻ giao diện HTML. Tuy nhiên, nguyên tắc bất di bất dịch khi triển khai Schema Product trên trang chi tiết sản phẩm (PDP) là mọi giá trị khai báo trong khối JSON-LD (từ giá bán, đơn vị tiền tệ, tình trạng kho cho đến điểm đánh giá trung bình) đều phải xuất hiện công khai và khớp tuyệt đối với con số mà người dùng nhìn thấy trên màn hình.

    Một lỗi kỹ thuật rất phổ biến trên các hệ thống thương mại điện tử là giá bán trong JSON-LD lấy từ trường giá niêm yết gốc hoặc bị lưu trong bộ nhớ đệm (HTML Cache) cũ, trong khi giá hiển thị trên giao diện lại được cập nhật động bằng JavaScript theo chương trình Flash Sale. Khi trình thu thập của Google phát hiện sự sai lệch giữa giá trong Schema và giá hiển thị thực tế trên giao diện kết xuất, hệ thống không chỉ tước quyền hiển thị đoạn trích phong phú (Rich Snippets) mà còn có thể phát hành cảnh báo tác vụ thủ công về dữ liệu có cấu trúc gây hiểu lầm.

    Bên cạnh các thuộc tính cơ bản như name, image (cần cung cấp mảng hình ảnh độ phân giải cao ở nhiều tỷ lệ khung hình), description và sku, các hệ thống bán lẻ hiện đại cần đặc biệt chú trọng đến nhóm mã định danh thương mại toàn cầu bao gồm gtin13 (mã vạch EAN-13 phổ biến tại Việt Nam), mpn (mã linh kiện của nhà sản xuất) và thực thể brand. Việc cung cấp chính xác mã GTIN và Brand giúp công cụ tìm kiếm khớp nối sản phẩm trên website của bạn vào biểu đồ tri thức mua sắm (Shopping Graph), tạo lợi thế lớn khi xuất hiện trên tab Mua sắm miễn phí (Free Listings) và câu trả lời của trợ lý AI.

    • Khai báo thuộc tính @id duy nhất cho mỗi thực thể (ví dụ: https://tenmien.vn/san-pham/slug#product) để liên kết chặt chẽ các khối dữ liệu trong cùng một đồ thị (@graph).
    • Định dạng số nguyên hoặc số thập phân chuẩn cho trường price (ví dụ: 1590000 thay vì 1.590.000đ) và tách riêng mã tiền tệ VND vào trường priceCurrency.
    • Sử dụng đường dẫn tuyệt đối chuẩn (https://schema.org/InStock, https://schema.org/OutOfStock, https://schema.org/PreOrder) cho thuộc tính availability dựa theo tồn kho thực tế.
    • Tuyệt đối không gắn Schema Product vào trang danh mục (PLP) để gom điểm đánh giá chung của cả danh mục, vì điều này vi phạm nguyên tắc của Google đối với thực thể sản phẩm đơn lẻ.
    Phần 02

    2. Cấu hình chuyên sâu Offer, AggregateOffer, ProductGroup cho sản phẩm đa biến thể và chính sách vận chuyển

    Trong thực tế vận hành thương mại điện tử, rất nhiều mặt hàng tồn tại dưới dạng đa biến thể (Product Variants) với mức giá và trạng thái tồn kho khác nhau tùy theo dung lượng, kích thước hoặc màu sắc. Kể từ khi Google mở rộng hỗ trợ thực thể ProductGroup kết hợp thuộc tính hasVariant và variesBy, việc khai báo cấu trúc cho sản phẩm đa biến thể đã trở nên rõ ràng và chuẩn mực hơn rất nhiều so với cách nhồi nhét nhiều Offer rời rạc trước đây.

    Cụ thể, nếu các biến thể dùng chung một đường dẫn URL hoặc dùng tham số truy vấn (ví dụ ?variant=den-256gb), hệ thống nên khai báo thực thể gốc là ProductGroup chứa thuộc tính productGroupID, liệt kê các chiều biến thiên trong variesBy (như https://schema.org/color, https://schema.org/size), và đưa danh sách từng SKU con vào mảng hasVariant. Mỗi phần tử con trong hasVariant là một thực thể Product hoàn chỉnh có mã SKU riêng, hình ảnh màu sắc tương ứng và khối Offer chứa mức giá cùng tình trạng tồn kho chính xác của riêng biến thể đó.

    Hơn nữa, để hiển thị dòng thông tin Phí giao hàng và Chính sách đổi trả ngay bên dưới kết quả tìm kiếm tự nhiên (Merchant Listing Experiences), bên trong khối Offer cần bổ sung thêm hai thực thể lồng ghép là shippingDetails (kiểu OfferShippingDetails) và hasMerchantReturnPolicy (kiểu MerchantReturnPolicy). Thay vì lặp lại toàn bộ cấu trúc dài dòng của chính sách giao nhận và đổi trả trong từng biến thể, lập trình viên có thể định nghĩa chúng một lần ở đầu mảng @graph kèm khóa @id, sau đó chỉ cần tham chiếu lại khóa @id đó bên trong từng Offer để giữ dung lượng mã HTML luôn gọn nhẹ.

    Bảng ánh xạ các thuộc tính Schema thương mại điện tử trọng yếu và nguồn dữ liệu cơ sở dữ liệu tương ứng
    Thực thể & Thuộc tính SchemaKiểu dữ liệu chuẩn JSON-LDNguồn lấy dữ liệu từ Backend TMĐTTác động hiển thị trên kết quả tìm kiếm (SERP)
    Product > sku, gtin13, mpn, brandText / Brand ObjectBảng products (sku, barcode_ean13, manufacturer_code, brand_name)Định danh chính xác mặt hàng trên Google Shopping Graph và AI Overview
    Offer > price, priceCurrency, priceValidUntilNumber (1250000), Text (VND), ISO 8601 DateGiá bán thực tế sau chiết khấu và thời điểm kết thúc chương trình khuyến mãiHiển thị nhãn giá bán trực tiếp, nhãn Giảm giá (Price Drop) trên SERP
    Offer > availability, itemConditionURL Enum (InStock / OutOfStock, NewCondition)Trạng thái tồn kho khả dụng (available_qty > 0) tại kho mặc địnhHiển thị nhãn Còn hàng màu xanh hoặc Hết hàng ngay dưới tiêu đề
    Offer > shippingDetails & hasMerchantReturnPolicyOfferShippingDetails & MerchantReturnPolicyCấu hình biểu phí vận chuyển tiêu chuẩn và số ngày cho phép đổi trảHiển thị thông tin Giao hàng miễn phí / Phí ship và Đổi trả trong N ngày
    Product > aggregateRating & reviewAggregateRating & Array of ReviewBảng product_reviews (chỉ tính các đánh giá đã duyệt có số lượng > 0)Hiển thị dải ngôi sao vàng, điểm trung bình và tổng số lượt đánh giá
    Phần 03

    3. Quy tắc kiểm duyệt AggregateRating, Review và định tuyến ngữ nghĩa với BreadcrumbList

    Khối ngôi sao đánh giá (AggregateRating) là thành phần mang lại sự chú ý thị giác mạnh mẽ trên trang kết quả tìm kiếm, nhưng cũng là khu vực bị kiểm duyệt gắt gao bởi các thuật toán chống spam dữ liệu có cấu trúc. Quy tắc kỹ thuật quan trọng cần lập trình cứng trong mã nguồn là: chỉ kết xuất thuộc tính aggregateRating và mảng review vào JSON-LD khi và chỉ khi sản phẩm đó đã có ít nhất 1 lượt đánh giá thực tế từ khách hàng (reviewCount >= 1 và ratingValue > 0). Việc cố tình xuất mã aggregateRating với reviewCount: 0 hoặc tự gán cứng điểm 5 sao mặc định cho mọi sản phẩm mới tạo sẽ dẫn đến lỗi cấu trúc nghiêm trọng trên Google Search Console.

    Bên cạnh điểm trung bình, hệ thống nên trích xuất từ 3 đến 5 đánh giá thực tế gần đây có nội dung chi tiết từ cơ sở dữ liệu để đưa vào mảng review bên trong thực thể Product. Mỗi đối tượng Review cần khai báo rõ author (kiểu Person với tên người mua thực tế), datePublished (định dạng ngày tháng chuẩn YYYY-MM-DD), reviewBody (nội dung nhận xét) và reviewRating (chứa ratingValue, bestRating: 5, worstRating: 1). Điều này chứng minh tính xác thực của nguồn dữ liệu đánh giá trực tiếp trên trang.

    Song song với Schema Product, mọi trang trên website thương mại điện tử từ trang danh mục, trang thương hiệu cho đến trang chi tiết sản phẩm đều cần được tích hợp Schema BreadcrumbList. Thay vì để Google hiển thị đường dẫn URL thô trên kết quả tìm kiếm, BreadcrumbList giúp biến đổi dòng đường dẫn thành chuỗi phân cấp tiếng Việt có dấu rõ ràng (ví dụ: Trang chủ > Thiết bị nhà bếp > Máy rửa bát). Cần duy trì thứ tự thuộc tính position tăng dần liên tục từ 1, 2, 3 và thuộc tính item ở phần tử cuối cùng có thể lược bỏ hoặc trỏ chính xác về Canonical URL của trang hiện tại.

    • Kiểm tra điều kiện if (product.reviewCount > 0) ở tầng Server-side trước khi gắn khóa aggregateRating vào đối tượng JSON-LD.
    • Làm sạch (Sanitize) chuỗi văn bản trong description và reviewBody để loại bỏ các thẻ HTML dư thừa, ký tự xuống dòng lỗi hoặc ký tự điều khiển làm hỏng cú pháp JSON.
    • Đồng bộ hoàn toàn chuỗi BreadcrumbList trong JSON-LD với chuỗi đường dẫn danh mục chính (Primary Category) đang hiển thị trên giao diện.
    Phần 04

    4. Quy trình kết xuất phía máy chủ (SSR) và tự động hóa kiểm thử Schema trong luồng CI/CD

    Dù trình thu thập dữ liệu của Google có khả năng thực thi JavaScript (Web Rendering Service), việc đẩy quá trình tạo mã JSON-LD xuống trình duyệt phía khách hàng (Client-side Rendering) luôn tiềm ẩn rủi ro trễ hàng đợi kết xuất, đặc biệt đối với các công cụ tìm kiếm khác và các trình thu thập của mô hình ngôn ngữ lớn (AI Crawlers) vốn chỉ đọc phản hồi HTML tĩnh ban đầu. Do đó, toàn bộ khối dữ liệu có cấu trúc JSON-LD bắt buộc phải được kết xuất sẵn từ phía máy chủ (Server-Side Rendering - SSR) hoặc tạo tĩnh có tái xác thực (ISR) ngay trong tài liệu HTML đầu tiên trả về.

    Để tránh lỗi cú pháp JSON khi tên sản phẩm hoặc mô tả chứa các ký tự đặc biệt, lập trình viên tuyệt đối không được nối chuỗi (String Concatenation) thủ công để tạo thẻ JSON-LD. Thay vào đó, hãy xây dựng một đối tượng dữ liệu có kiểu tĩnh chặt chẽ (TypeScript Interface theo chuẩn schema-dts) ở tầng Backend/Server Component, sau đó tuần tự hóa bằng hàm JSON.stringify kèm cơ chế mã hóa ký tự an toàn chống tấn công XSS (thay thế ký tự < thành \u003c) trước khi nhúng vào thẻ script.

    Cuối cùng, để bảo vệ hệ thống trước các đợt cập nhật tính năng làm mất trường dữ liệu vô tình, quy trình kiểm thử tự động (Automated Testing) cần tích hợp bài kiểm tra xác thực cấu trúc JSON-LD cho các mẫu trang đại diện (sản phẩm đơn, sản phẩm đa biến thể, sản phẩm đang giảm giá, sản phẩm hết hàng và sản phẩm chưa có đánh giá). Kết hợp theo dõi định kỳ báo cáo Đoạn trích sản phẩm (Product Snippets) và Trang thông tin người bán (Merchant Listings) trên Google Search Console sẽ giúp đội ngũ kỹ thuật phát hiện và xử lý sớm mọi cảnh báo thiếu trường khuyến nghị.

    • Sử dụng thư viện kiểu dữ liệu tĩnh hoặc bộ xác thực JSON Schema trong luồng kiểm thử đơn vị (Unit Test) để phát hiện ngay khi thiếu trường price hoặc availability.
    • Kiểm tra thực tế mã nguồn phản hồi bằng công cụ Rich Results Test và Schema Markup Validator trước khi phát hành giao diện trang sản phẩm mới.
    • Kết nối bổ sung nguồn cấp dữ liệu tự động hoặc cho phép Google thu thập dữ liệu cấu trúc trực tiếp để đồng bộ trạng thái giá với Google Merchant Center.
    FAQ

    Câu hỏi thường gặp

    Giải đáp nhanh những điểm thương hiệu bán lẻ D2C, chuỗi cửa hàng đa chi nhánh, doanh nghiệp sản xuất – phân phối B2B và đơn vị xây dựng sàn giao dịch thương mại điện tử hay hỏi về chủ đề này.

    Có nên gắn Schema Product cho danh sách các thẻ sản phẩm trên trang danh mục (Category Page) không?

    Theo tài liệu hướng dẫn chính thức của Google, bạn không nên gắn Schema Product đầy đủ độc lập cho trang danh mục chung, mà trang danh mục nên sử dụng Schema CollectionPage kết hợp ItemList liệt kê đường dẫn (URL) tới các trang chi tiết sản phẩm trong danh sách đó. Toàn bộ Schema Product chi tiết kèm Offer và AggregateRating cần được đặt tại chính trang chi tiết của từng sản phẩm.

    Tại sao Google Search Console báo cảnh báo thiếu trường priceValidUntil dù sản phẩm không có chương trình khuyến mãi?

    Trường priceValidUntil là một thuộc tính khuyến nghị (không bắt buộc nhưng nên có) trong báo cáo Merchant Listings để Google biết mức giá hiện tại có hiệu lực đến khi nào. Đối với các sản phẩm bán theo giá niêm yết thường ngày không có hạn kết thúc khuyến mãi cụ thể, hệ thống có thể tự động gán giá trị priceValidUntil bằng ngày cuối năm hiện tại hoặc cộng thêm 30 đến 90 ngày tính từ thời điểm kết xuất trang để xóa bỏ cảnh báo này.

    Nếu một trang sản phẩm có cả câu hỏi thường gặp thì có thể đặt chung Schema Product và FAQPage trong một thẻ script không?

    Hoàn toàn được và rất khuyến khích. Thay vì tạo nhiều thẻ script rời rạc, bạn nên sử dụng cấu trúc mảng @graph ở cấp ngoài cùng trong một thẻ <script type=application/ld+json> duy nhất, bên trong mảng @graph đó chứa đồng thời các đối tượng WebPage, BreadcrumbList, Product và FAQPage được liên kết với nhau qua thuộc tính @id.

    Nhận tư vấn & báo giá

    Nhận tư vấn kiến trúc & Báo giá chi tiết hệ thống Website Thương mại điện tử

    Hãy cho Uptech biết mô hình bán hàng của bạn (B2C, B2B hay Đa kho/Sàn), số lượng mã sản phẩm (SKU) dự kiến và các phần mềm cổng thanh toán, vận chuyển, ERP/POS cần kết nối. Kỹ sư giải pháp của Uptech sẽ phân tích và gửi bản đề xuất kiến trúc kèm dự toán chi phí minh bạch trong 24 giờ làm việc.

    • Phản hồi kèm sơ đồ kiến trúc đề xuất trong vòng 24 giờ làm việc
    • Tư vấn miễn phí lộ trình đồng bộ tồn kho ERP/POS và cấu trúc SEO danh mục lớn
    • Hợp đồng pháp nhân rõ ràng, bàn giao mã nguồn, xuất hóa đơn GTGT (VAT) đầy đủ
    Nhận tư vấn & báo giá

    Miễn phí khảo sát. Phản hồi trong ngày làm việc gần nhất.

    Bạn cần loại website nào?

    Hoặc nhắn Zalo / gọi 0961 163 961