olragon

Vì sao trang chẳng có title vẫn được 100 điểm SEO?

🌱 mầmgieo #seo#testing#bai-hoc

Viết cho Ai đang viết công cụ chấm điểm, linter, bộ kiểm tra hay giám sát, và ai đang tin một con số xanh mà chưa từng thấy nó đỏ.

Mình có làm một công cụ chấm SEO, và cho tới cuối tháng 10 mình vẫn tin con số nó in ra. Giờ thì mình bớt tin rồi, và bài này kể vì sao.

Mấy con số dưới đây mình đo lại ngày 2/11, chạy đúng code cũ của commit ngay trước bản sửa, trên đúng bộ luật lúc đó.

English: Why did a page with no title score 100 for SEO?.

Chuyện gì xảy ra

Công cụ này có 325 luật, mỗi luật soi một chuyện: có thẻ title chưa, có viewport chưa, robots.txt nằm đâu. Luật gom theo nhóm, mỗi nhóm có trọng số, cộng lại thành một con số to nhất trên báo cáo. Người ta nhìn con số đó trước tiên, và nhiều khi chỉ nhìn con số đó.

Ngày 29/10, một agent đang kiểm tra một câu trên trang hướng dẫn: câu đó nói công cụ chấm ra sao. Thay vì tin câu đó, nó thử đánh rớt hết các luật về thẻ meta của Google. Không title, không viewport. Điểm tổng vẫn là 100.

Đoạn code gây chuyện ngắn tới mức đọc lướt là qua luôn:

const w = CATEGORY_WEIGHTS[cat.category] ?? 0;
if (w > 0) {
  weightedSum += cat.score * w;
  totalWeight += w;
}

Bảng trọng số dùng tên meta-tags. File luật thì ghi meta. Tên chẳng khớp, nên ?? 0 lặng lẽ cho trọng số 0, và if bỏ qua cả nhóm. Chẳng có lỗi nào văng ra, chẳng có dòng log nào. Dòng này nằm đó từ tháng 6.

Tệ tới cỡ nào

Mình lấy code cũ ra chạy lại, chỉ đổi kết quả đậu hay rớt của từng luật:

thửđiểm tổng
code cũ, 325 luật đều đậu100
code cũ, 105 luật bị bỏ quên đều rớt100
code đã sửa, đúng 105 luật đó rớt61

Hơn một phần ba bộ luật chẳng hề đụng tới con số to nhất. Trong đó có meta 27 luật, onpage 16, robots-txt 10, crawl 10, mobile 9, sitemap 8. Đúng mấy chuyện người ta hay nghĩ tới đầu tiên khi nói về SEO.

Bạn thử bấm đây nha. Tám luật này rút gọn từ bộ thật, nhóm và trọng số thì giữ nguyên. Bỏ dấu ở luật nào là cho luật đó rớt.

  • meta có thẻ title
  • meta có viewport
  • onpage có thẻ H1
  • robots-txt có robots.txt
  • sitemap có sitemap
  • technical trả đúng mã trạng thái
  • content bài đủ dài
  • security dùng HTTPS

Sao chừng đó tháng chẳng ai thấy? Vì con số vẫn trông hợp lý. Trang thật hiếm khi đậu hết mấy nhóm còn lại, nên nó ra 84, ra 73, chẳng ra 100. Một con số sai mà trông có lý thì khó bắt hơn một con số vô lý nhiều. Sửa xong, trang làm kỹ của mình từ 84 lên 90, còn một trang thiếu mô tả, thiếu H1, ảnh thiếu alt thì từ 73 xuống 69. Khoảng cách giữa trang tốt và trang kém mới rộng ra đúng hướng.

Cùng con bệnh, nhiều dạng

Ca này chẳng phải ca duy nhất. Trong hai tuần quanh đó có 26 commit sửa lỗi chấm điểm, và đọc lại một lượt mình thấy dạng thì khác, bệnh thì một.

Luật đọc một chỗ chẳng ai ghi vào. Bản quét qua API để robots.txt và sitemap dưới một khoá mà không luật nào đọc. Vậy là cả 8 luật về file trên site đều thấy "không có file", và luật robots.txt rớt trên mọi site. Còn bản dòng lệnh thì cho đậu hết. Cùng một luật, hai đáp án.

Tham số khai báo đàng hoàng mà chẳng ai đọc. Ba luật của Bing ghi rõ also_check_header, nghe rất có trách nhiệm. Engine chưa từng đọc khoá đó. Một trang chặn index bằng header vẫn đậu.

Số đo chưa từng đo. Kích thước ảnh chia sẻ đọc ra -1, vì API ảnh chỉ có số thật sau khi gọi metadata(). Mọi ảnh đều báo "chưa đo được", nên phần kiểm tra kích thước chưa chạy lần nào.

Regex nhắm cả trang. Luật soft 404 tìm chữ 404 trong toàn bộ HTML. Trang hướng dẫn về soft 404 của chính công cụ này rớt luật soft 404, và trang 404 đúng chuẩn cũng rớt luôn.

Luật hỏi nhầm trang. Thiếu schema Product làm mọi trang chẳng bán gì mất điểm. Trang bài viết bị phạt vì chẳng phải sản phẩm.

Nghe thì mỗi cái một kiểu. Nhưng cả năm đều giống nhau ở một điểm: kết quả của luật chẳng dính gì tới thứ nó nói là đang kiểm tra, và chẳng có gì trong hệ thống la lên.

Mình đổi cách kiểm tra ra sao

Test cũ kiểm từng luật: đưa trang thiếu title vô, luật báo thiếu. Luật đúng, test xanh, và điểm tổng vẫn 100. Chẳng có test nào hỏi câu ở giữa: kết quả đó có đi tới con số cuối cùng không.

Test mới đi ngược lại: cứ đánh rớt nguyên một nhóm, rồi đòi điểm tổng phải tụt.

for (const cat of categories) {
  const total = scoreResults(rules.map((rule) => ({
    rule, passed: rule.category !== cat,
  }))).total;
  expect(total).toBeLessThan(100);
}

Và một test nữa: mọi tên nhóm trong file luật phải tìm thấy trọng số, nên tên mới mà quên khai báo là đỏ ngay chứ chẳng lặng lẽ về 0. Còn khi sửa một luật, agent giờ phải thử nó trên một trang 404 thật và trên đúng trang đang nhắm tới, rồi mới commit. Luật soft 404 ở trên chính là bài học đó.

Câu mình mang theo từ chuyện này ngắn thôi: bạn đã thấy cái kiểm tra này đỏ chưa? Linter, cảnh báo giám sát, bài test, điểm số, cái nào chưa từng đỏ thì mình chưa biết nó có làm việc không. Xanh hoài có thể là tốt. Cũng có thể là dây chưa nối.

Con số mình suýt chép sai

Lúc viết bài này mình suýt phạm đúng lỗi đó. Commit sửa lỗi, tài liệu và cả comment trong test đều ghi 156 trên 325 luật. Con số đẹp, ghi ở ba chỗ, mình định chép luôn.

Rồi mình đếm lại từ file luật ở commit trước bản sửa. Ra 105. Bảng trong chính tài liệu đó cộng lại cũng chỉ 108. Bản sửa thì đúng, chỉ có con số kể về nó là sai, và chẳng biết sai từ đâu. Một con số ghi ở ba chỗ thì vẫn là một con số chưa ai đếm lại.

Chưa biết gì

  • Năm dạng trên là năm dạng mình đã gặp. Chắc còn dạng khác, và bài test mới chỉ bắt được mấy lỗi nối dây, chẳng bắt nổi luật viết sai ý.
  • Trọng số 25% cho kỹ thuật, 20% cho thẻ meta là ý kiến của mình, chẳng phải của Google. Điểm giờ phản ánh đúng các luật, còn các luật có phản ánh đúng thứ hạng hay không thì mình chưa có cách đo cho đàng hoàng.
  • Mình chưa biết có nên in một con số to như vậy không. Người ta thích nó, mà chính vì nó gọn nên lỗi mới trốn lâu tới vậy.

Bạn có cái kiểm tra nào xanh suốt mấy năm rồi mới phát hiện ra chưa từng chạy không? Viết cho mình một lá thư bên dưới nha.

Gửi Ba rồng một lá thư

Đọc xong muốn nói gì thì viết cho mình nha. Thư chỉ tới tay mình, chẳng tự hiện lên trang. Lá nào hay mà bạn cho phép, mình chép lại dưới bài, không kèm tên bạn.

Mảnh vườn giữ gì từ lá thư này

Từ terminal cũng gửi được: curl -d 'msg=…' olragon.com/garden/score-100-vi/letter