DEV Community

Cover image for Generating meta descriptions at scale: kiểm tra trùng, độ dài và data-nosnippet bằng code
Onic Ai
Onic Ai

Posted on Originally published at onic.vn

Generating meta descriptions at scale: kiểm tra trùng, độ dài và data-nosnippet bằng code

Website thương mại điện tử có vài nghìn sản phẩm, theme để mọi trang dùng chung một thẻ meta name="description". Trên Google, hàng chục kết quả hiện cùng một dòng mô tả. Ticket được giao cho developer: "làm mô tả riêng cho từng trang". Bài này đi qua cách làm việc đó bằng code, dựa trên những gì tài liệu Google Search Central nói về snippet.

Meta description không phải thứ Google bắt buộc hiển thị

Snippet trên trang kết quả chủ yếu được tạo từ nội dung trang. Google chỉ dùng thẻ mô tả khi nó mô tả trang chính xác hơn chữ lấy trực tiếp từ trang, và snippet thay đổi theo từng câu tìm kiếm. Thẻ mô tả cũng không được dùng để xếp hạng, điều Google đã nói từ năm 2009.

Với developer, điều này có nghĩa: mục tiêu không phải "có thẻ meta", mà là "mỗi trang có một mô tả riêng, đọc được, khớp nội dung". Google khuyến khích website lớn tạo mô tả tự động từ dữ liệu riêng của từng trang, miễn là kết quả khác nhau và đọc được như câu văn.

Sinh mô tả từ dữ liệu sản phẩm

Một mô tả tốt có ba phần: câu chính có từ khóa, chi tiết cụ thể, lời mời ngắn. Với trang sản phẩm, dữ liệu có sẵn đã đủ cho cả ba:

def mo_ta_san_pham(p: dict) -> str:
    phan = [f"{p['ten']} {p['quy_cach']}".strip()]
    if p.get("chat_lieu"):
        phan.append(f"chất liệu {p['chat_lieu']}")
    if p.get("gia"):
        phan.append(f"giá {p['gia']:,}đ".replace(",", "."))
    cau = ", ".join(phan) + "."
    if p.get("chinh_sach"):
        cau += f" {p['chinh_sach']}."
    cau += " Xem chi tiết và đặt hàng."
    return cau
Enter fullscreen mode Exit fullscreen mode

Kết quả là câu văn có nghĩa, không phải chuỗi từ khóa, và mỗi sản phẩm khác nhau vì dữ liệu khác nhau.

Kiểm tra độ dài: cảnh báo, đừng chặn cứng

Google không giới hạn độ dài thẻ mô tả nhưng cắt cho vừa màn hình. Khoảng 120–155 ký tự là vừa trên phần lớn thiết bị, và ý chính nên nằm trong 120 ký tự đầu vì điện thoại hiển thị ngắn hơn. Một ca thật trên Onic.vn: mô tả 157 ký tự bị Google cắt ở "không bỏ sót khách ...".

def kiem_tra_do_dai(mo_ta: str) -> list:
    canh_bao = []
    n = len(mo_ta)
    if n < 70:
        canh_bao.append(f"Quá ngắn ({n} ký tự)")
    if n > 155:
        canh_bao.append(f"Có thể bị cắt ({n} ký tự), phần sau ký tự 155: {mo_ta[155:]!r}")
    return canh_bao
Enter fullscreen mode Exit fullscreen mode

Ngưỡng ở đây là heuristic. Google cắt theo độ rộng hiển thị chứ không theo số ký tự, nên dùng nó để cảnh báo, không dùng để chặn deploy.

Tìm mô tả trùng trên toàn website

Google nói mô tả giống hệt hoặc gần giống trên mọi trang không giúp ích gì. Gom mô tả của mọi URL rồi nhóm lại:

from collections import defaultdict

def nhom_trung(trang: dict) -> dict:
    """trang: {url: mo_ta}"""
    nhom = defaultdict(list)
    for url, mo_ta in trang.items():
        khoa = " ".join(mo_ta.lower().split())
        nhom[khoa].append(url)
    return {k: v for k, v in nhom.items() if len(v) > 1}
Enter fullscreen mode Exit fullscreen mode

Nếu các trang trùng cả title lẫn mô tả, có thể vấn đề không nằm ở thẻ meta mà ở việc nhiều trang đang nhắm cùng một từ khóa. Khi đó cách đúng là gộp trang, không phải viết lại chữ.

data-nosnippet cho phần không nên hiển thị

Snippet có thể được lấy từ bất kỳ đoạn nào trong trang. Phần như banner khuyến mãi, thông báo cookie hay chữ trong chân trang không nên xuất hiện dưới tiêu đề. Gắn thuộc tính data-nosnippet cho phần đó:

<div data-nosnippet>
  Giảm 20% cho đơn đầu tiên, nhập mã CHAO20.
</div>
Enter fullscreen mode Exit fullscreen mode

Thuộc tính này dùng được trên span, div và section.

Đo kết quả

Meta description không đổi thứ hạng. Thứ cần đo là lượt nhấp và CTR theo trang trong Search Console, so sánh vài tuần trước và sau khi deploy. Phần viết mô tả cho người đọc, gồm 8 cách và mẫu cho 6 ngành, có trong bài Meta description là gì trên Onic.vn.


Bài gốc: https://onic.vn/kien-thuc/meta-description-la-gi/

Top comments (0)