SEO E-Commerce

Dynamic Price Schema

Cập nhật thuộc tính price và priceCurrency trong schema Offer tự động theo thay đổi giá thực tế trên trang.

5 lượt xem Cập nhật: 30/05/2026

Dynamic Price Schema là gì?

Dynamic Price Schema là cách triển khai thuộc tính pricepriceCurrency trong cấu trúc dữ liệu Offer (thuộc schema.org) sao cho giá hiển thị trong mã nguồn luôn khớp với giá thực tế đang được người dùng nhìn thấy trên trang — kể cả khi giá thay đổi theo thời gian thực (ví dụ: do khuyến mãi, flash sale, điều chỉnh thủ công hoặc tích hợp API giá từ hệ thống quản lý kho).

Khác với giá tĩnh (được viết cứng trong HTML hoặc schema), Dynamic Price Schema sử dụng logic lập trình để đồng bộ giá từ phần hiển thị (DOM) hoặc từ nguồn dữ liệu động (như JSON-LD được sinh ra bởi JavaScript) vào phần schema. Đây không phải một loại schema riêng biệt, mà là cách triển khai đúng và linh hoạt của schema Offer trong môi trường thương mại điện tử hiện đại.

Tại sao quan trọng trong SEO?

Google sử dụng schema để hiểu nội dung trang, đặc biệt là các yếu tố quyết định trải nghiệm người dùng như giá, tồn kho, đánh giá. Khi giá trong schema không khớp với giá hiển thị, Google có thể:

  • Loại bỏ rich result (kết quả mở rộng) như giá sản phẩm trong tìm kiếm hình ảnh hoặc kết quả thông thường;
  • Ghi nhận cảnh báo “Price mismatch” trong Search Console (mục Enhancements > Product);
  • Giảm độ tin cậy tổng thể của trang đối với các tín hiệu chất lượng (tùy trường hợp);
  • Làm chậm quá trình lập chỉ mục rich snippet nếu lỗi lặp lại nhiều lần.

Theo tài liệu chính thức của Google (cập nhật tháng 3/2024), yêu cầu bắt buộc để hiển thị rich result sản phẩm là: “Giá trong schema phải khớp với giá được hiển thị rõ ràng trên trang, bằng cùng đơn vị tiền tệ và không bao gồm thuế/phí ẩn”. Dynamic Price Schema giúp đáp ứng yêu cầu này một cách bền vững — ngay cả khi giá thay đổi hàng phút.

Cách hoạt động

Dynamic Price Schema không phụ thuộc vào công nghệ cụ thể, mà vào nguyên tắc đồng bộ hóa:

  1. Giá được cập nhật trên giao diện (qua JavaScript, AJAX, hoặc SSR với dữ liệu động);
  2. Mã JavaScript đọc giá mới từ DOM (ví dụ: document.querySelector('.price-current').textContent) hoặc từ biến toàn cục (ví dụ: window.productData.price);
  3. Giá được chèn lại vào phần schema (thường là JSON-LD) bằng cách ghi đè hoặc khởi tạo lại khối script[type="application/ld+json"];
  4. Googlebot khi thu thập sẽ đọc schema đã được render đầy đủ — tức là chứa giá mới nhất.

Lưu ý: Nếu dùng Server-Side Rendering (SSR) hoặc Static Site Generation (SSG), giá phải được sinh ra đúng tại thời điểm build hoặc request — không thể dựa hoàn toàn vào client-side JS nếu trang không hỗ trợ SSR/SSG.

Hướng dẫn thực hiện

Dưới đây là hướng dẫn triển khai chuẩn cho website PHP/WordPress và nền tảng JS hiện đại (React/Vue):

  1. Xác định phần tử giá hiển thị: Tìm selector CSS ổn định cho giá hiện tại (ví dụ: .product-price__current, [data-price]);
  2. Đọc giá từ DOM: Dùng parseFloat() để làm sạch ký tự (loại bỏ ‘đ’, ‘VNĐ’, dấu phẩy); đảm bảo chuyển sang định dạng số thập phân chuẩn (dấu chấm);
  3. Định dạng tiền tệ: Lấy giá trị priceCurrency từ thuộc tính data-currency hoặc cấu hình hệ thống — không suy đoán;
  4. Cập nhật schema: Thay thế toàn bộ nội dung <script type="application/ld+json"> hoặc thêm khối mới nếu chưa tồn tại;
  5. Kiểm tra sau render: Dùng DevTools → Console để chạy JSON.parse(document.querySelector('script[type="application/ld+json"]').textContent) và kiểm tra giá có đúng không.

Với WordPress: Có thể dùng hook wp_footer kết hợp JavaScript hoặc plugin hỗ trợ schema động (ví dụ: Rank Math Pro hoặc Yoast Premium — nhưng cần bật tùy chọn “Cập nhật giá tự động”).

Lỗi thường gặp

Lỗi Nguyên nhân Cách khắc phục
Giá trong schema cao hơn giá hiển thị Schema được render server-side, nhưng giá trên giao diện thay đổi sau qua JS — schema không được cập nhật lại Thêm đoạn JS cập nhật schema sau khi giá DOM thay đổi (dùng MutationObserver hoặc sự kiện tùy chỉnh)
Giá hiển thị “0.00” hoặc “NaN” trong schema JavaScript không tìm thấy phần tử giá, hoặc nội dung chứa ký tự không thể parse (ví dụ: “Liên hệ”) Thêm kiểm tra tồn tại phần tử và xử lý fallback (ví dụ: giữ nguyên giá cũ hoặc bỏ thuộc tính price nếu không xác định được)
Google hiển thị cảnh báo “Missing price” Schema bị xóa hoặc không render do lỗi JS, hoặc giá không nằm trong khối Offer hợp lệ Kiểm tra cấu trúc schema bằng Rich Results Test; đảm bảo @typeOffer và nằm trong Product

Ví dụ thực tế

Dưới đây là đoạn mã JavaScript đơn giản cập nhật Dynamic Price Schema cho sản phẩm có giá thay đổi theo khuyến mãi:

function updatePriceSchema() {
  const priceEl = document.querySelector('[data-product-price]');
  const currencyEl = document.querySelector('[data-product-currency]');
  
  if (!priceEl || !currencyEl) return;
  
  const rawPrice = priceEl.textContent.trim().replace(/[^\d.,]/g, '').replace(',', '.');
  const price = parseFloat(rawPrice);
  const currency = currencyEl.getAttribute('data-currency') || 'VND';
  
  if (isNaN(price)) return;
  
  const schemaScript = document.querySelector('script[type="application/ld+json"]');
  if (!schemaScript) return;
  
  try {
    const schema = JSON.parse(schemaScript.textContent);
    if (schema['@type'] === 'Product' && schema.offers && schema.offers['@type'] === 'Offer') {
      schema.offers.price = price.toFixed(2);
      schema.offers.priceCurrency = currency;
      schemaScript.textContent = JSON.stringify(schema);
    }
  } catch (e) {
    console.warn('Lỗi cập nhật schema:', e);
  }
}

// Chạy khi DOM tải xong và sau mỗi lần cập nhật giá
document.addEventListener('DOMContentLoaded', updatePriceSchema);

Sau khi triển khai, kiểm tra bằng Rich Results Test sẽ thấy giá trong schema khớp chính xác với giá hiển thị — kể cả khi bạn nhấn nút “Áp dụng mã giảm giá”.

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

Dynamic Price Schema có cần thiết nếu giá hiếm khi thay đổi?

Có, vì ngay cả khi giá chỉ thay đổi vài lần/năm, việc đồng bộ thủ công dễ bỏ sót. Một lần sai có thể khiến rich result bị tắt trong vài tuần. Triển khai động giúp duy trì tính nhất quán lâu dài — đặc biệt khi có nhiều người quản trị website.

Có thể dùng Dynamic Price Schema cho sản phẩm có nhiều biến thể (size/màu)?

Có thể — nhưng cần đảm bảo schema phản ánh đúng biến thể đang được chọn. Mỗi biến thể nên có khối Offer riêng trong schema (theo chuẩn schema.org/Product với mảng offers). Việc cập nhật phải dựa trên trạng thái hiện tại của form lựa chọn.

Google có phạt nếu dùng Dynamic Price Schema sai cách?

Không phạt trực tiếp, nhưng Google sẽ không hiển thị rich result nếu phát hiện sai lệch giá. Không có hình phạt thuật toán, nhưng mất cơ hội hiển thị nổi bật — tương đương với việc giảm CTR và lưu lượng truy cập hữu cơ từ tìm kiếm sản phẩm.