Link giữa bài trỏ vào trang 404 vì máy tự đổi tít, 613 bài phải sửa

Anh bia: link tu tro dung tu tit cu, doi tit xong link roi vao trang 404

Bài viết do Nguyễn Nhật Ánh Dương thực hiện, biên soạn theo Chính sách nội dung của Marketing365. Cập nhật lần cuối .

Nội dung
  1. Link nằm giữa bài, bấm vào ra trang không tồn tại
  2. Địa chỉ bài được tính hai lần, ở hai thời điểm khác nhau
  3. Vá ở máy soạn bài trước, dọn bài cũ sau
  4. Mẫu so khớp đầu tiên suýt gỡ nhầm link thật
  5. Số sau khi dọn, và số đo lại hôm nay
  6. Ba chỗ tôi chưa đóng được

Ngày 08/08/2026, tôi bấm thử một link nằm giữa thân một bài trên marketing365.vn. Link đó trỏ sang một bài khác của chính site. Kết quả: trang không tồn tại.

Không có cảnh báo nào trước đó. Bài vẫn đăng bình thường, máy soạn bài vẫn báo chạy xong, log không có dòng lỗi nào. Chỉ có người đọc nào bấm vào mới thấy. Bên dưới là toàn bộ đường đi từ cái link đó tới con số 613 bài phải sửa, và những số tôi đo lại hôm nay 14/08/2026 để biết chỗ nào đã yên và chỗ nào chưa.

Bài dính lỗi đầu tiên tôi tìm ra là bài số 12754. Trong thân bài có một link trỏ về địa chỉ:

https://marketing365.vn/ai-siet-an-toan-nhung-phai-huu-ich-hon/   → 404
https://marketing365.vn/chuan-an-toan-ai-chi-co-y-nghia-khi-giam-sai-sot-ma-van-giu/   → 200

Hai địa chỉ này là của cùng một bài. Cái thứ hai là địa chỉ thật, đang sống. Cái thứ nhất là địa chỉ mà bài đó suýt có — và nó nằm trong chính thân bài đó, dưới dạng một link tự trỏ về mình.

Tôi mở lại đúng địa chỉ cũ đó hôm nay, sáu ngày sau khi dọn. Vẫn 404. Dấu vết còn nguyên, nên phần này không phải tôi kể lại từ trí nhớ.

Địa chỉ bài được tính hai lần, ở hai thời điểm khác nhau

Máy soạn bài của tôi có một cổng chống trùng khuôn: nếu tít mới đúc cùng một dạng với tít đã có, cổng đó viết lại tít. Cổng này là thứ tôi cố tình dựng, và nó làm đúng việc của nó.

Vấn đề nằm ở thứ tự. Chuỗi thao tác thực tế là:

  1. Máy tính ra tên đường dẫn từ tít nháp, rồi ghép sẵn link tự trỏ vào thân bài.
  2. Cổng chống trùng khuôn đổi tít.
  3. WordPress nhận tít mới, tính lại tên đường dẫn theo tít mới.
  4. Link đã ghép ở bước 1 vẫn nằm nguyên trong thân bài, trỏ vào tên đường dẫn không bao giờ tồn tại.

Không có bước nào sai một mình. Bước 1 đúng nếu tít không đổi, bước 2 đúng vì tít trùng khuôn thì phải đổi, bước 3 là WordPress làm đúng chuẩn. Cái sai là tôi để một giá trị được tính ở bước 1 sống sót qua bước 3 mà không tính lại.

Còn một tầng nữa: bản tiếng Anh được dịch từ bản tiếng Việt và chép nguyên thân bài sang. Chép luôn cả cái link hỏng. Một lỗi ở khâu soạn bài thành hai bài chết link.

Vá ở máy soạn bài trước, dọn bài cũ sau

Ba máy soạn bài đều có cùng khối lệnh ghép link tự trỏ. Tôi bỏ khối ghép link ở cả ba. Không sửa cho nó tính lại đường dẫn sau khi đổi tít, mà bỏ hẳn — vì một bài tự đặt link về chính nó thì người đọc bấm vào cũng quay lại đúng chỗ đang đứng, chẳng để làm gì.

Nhưng biến chứa đường dẫn thì tôi giữ lại. Chỗ khác trong cùng máy soạn bài dùng nó để tránh tự trỏ khi gắn link sang các bài chủ đề: nếu địa chỉ bài đang viết trùng với địa chỉ trong danh sách, bỏ qua. Xoá biến đó là gãy chỗ kia. Đây là kiểu hỏng hay gặp khi dọn dẹp: gỡ thứ trông như thừa mà không tra xem còn ai đang dùng.

Cùng lúc đó tôi gỡ luôn một câu văn khuôn mà máy chèn vào cuối mỗi bài — dạng “Bài viết tập trung vào… với góc nhìn cho thị trường Việt Nam.” Câu đó lặp ở mấy trăm bài, không thêm thông tin gì.

Để dọn bài cũ, tôi cần một mẫu so khớp tìm ra link tự trỏ trong từng bài. Cách nghĩ ra đầu tiên: lấy tên đường dẫn lưu trong cơ sở dữ liệu, dựng mẫu từ đó, và cho phép có thêm tiền tố hai chữ cái ở đầu để bắt luôn bản tiếng Anh.

# cách 1 — dựng mẫu từ tên đường dẫn lưu trong kho
'#https://marketing365\.vn/(?:[a-z]{2}/)?' . preg_quote($post->post_name) . '/#'

# cách 2 — lấy đúng đường dẫn thật của từng bài
$path = parse_url(get_permalink($id), PHP_URL_PATH);
'#https://marketing365\.vn' . preg_quote($path, '#') . '#'

Cách 1 có một lỗ. Bản tiếng Anh của một bài có thể dùng chung tên đường dẫn với bản tiếng Việt, chỉ khác tiền tố ngôn ngữ. Nghĩa là /en/<cùng-tên>/ không phải bài đang xét — nó là một bài khác. Link trỏ sang đó là link thật, phải giữ. Cái tiền tố hai chữ cái tôi thêm vào cho “chắc ăn” chính là chỗ suýt gỡ nhầm.

Tôi chạy cả hai cách rồi so danh sách. Cả hai đều ra 613 bài, nên lần này không có gì bị hại. Nhưng điều đó chỉ biết được sau khi so, không phải trước. Nếu chỉ chạy cách 1 rồi ghi đè, tôi sẽ không bao giờ biết mình vừa đi qua chỗ nào.

Trước khi ghi, tôi đổ toàn bộ thân bài cũ của 613 bài đó ra một file sao lưu. Thao tác đụng vào thân bài hàng loạt mà không có bản cũ để đối chiếu thì không có đường lùi.

Số sau khi dọn, và số đo lại hôm nay

Đợt dọn 08/08 chạm vào 613 bài: 310 đoạn văn khuôn và 310 link tự trỏ bị gỡ. Quét lại ngay sau đó: không còn bài nào.

Hôm nay tôi đo lại từ đầu, không tin vào bản ghi cũ. Quét toàn bộ 1.634 bài đã đăng, rút mọi link nội bộ trong thân bài rồi đối chiếu từng đường dẫn với bài thật:

  • 4.428 link nội bộ trong thân bài, rơi vào 787 đường dẫn khác nhau.
  • 0 đường dẫn không tìm ra bài nào.

Con số 0 tự nó không đáng tin — một bộ kiểm tra hỏng cũng cho ra 0. Nên tôi thử ngược: đưa đúng cái đường dẫn đã chết ở đầu bài vào bộ kiểm tra. Nó báo không tìm ra bài nào, đúng như phải thế. Rồi đưa đường dẫn thật của cùng bài đó vào, nó trả về đúng số 12754. Bộ kiểm tra phân biệt được hai thứ, con số 0 mới có nghĩa.

Bang tong hop bon buoc dan toi link chet va cac so do lai ngay 14/08/2026 tren marketing365.vn
Phần trên lấy từ nhật ký thao tác ngày 08/08/2026. Phần dưới đo lại trên toàn bộ bài đã đăng của marketing365.vn ngày 14/08/2026.

Ba chỗ tôi chưa đóng được

Thứ nhất, 14 bài vẫn còn link trỏ về chính mình. Loại này khác loại ở đầu bài: nó trỏ về địa chỉ hiện tại, đúng địa chỉ, không 404 — chỉ vô dụng. Đáng chú ý là 5 trong 14 bài đó đăng sau ngày dọn: 09, 10, 11, 12 và 13/08. Nghĩa là còn một luồng ra bài thứ hai vẫn đang chèn link tự trỏ, và luồng đó tôi chưa vá. Vá ba máy soạn bài không có nghĩa là vá hết.

Thứ hai, 3 bài vẫn còn câu văn khuôn “…với góc nhìn cho thị trường Việt Nam.” Số nhỏ, nhưng nó cho thấy mẫu so khớp của tôi hôm 08/08 không bắt hết mọi biến thể của câu đó.

Thứ ba, một chỗ tôi từng đếm hụt. Trang bài 12754 hiện chứa địa chỉ của chính nó 15 lượt: thẻ khai bản gốc, hai thẻ khai bản ngôn ngữ, thẻ chia sẻ mạng xã hội, hai đầu mối nhúng bài, nút chia sẻ, link huỷ trả lời bình luận… Toàn bộ là của giao diện và đều đúng chuẩn — gỡ là hỏng. Lần trước tôi ghi lại con số nhỏ hơn vì đếm hẹp hơn. Lần này tôi đếm mọi lượt xuất hiện, và ghi rõ cách đếm để lần sau còn so được. Đây cũng là cái bẫy tôi từng dính khi đo bài phình gấp 9 lần lúc hiển thị: đếm cả phần giao diện tự thêm vào rồi tưởng đó là phần của bài.

Bài học tôi rút ra không phải “đừng ghép link tự động”. Mà là: một giá trị dựng từ thứ có thể thay đổi ở bước sau thì phải tính lại ở bước sau, hoặc đừng dựng sẵn. Ở vụ 412 bài bị gắn link lạc đề, cũng chính khối lệnh gắn link tự động đó sinh chuyện — chỉ khác kiểu hỏng.

Và với 14 bài còn lại, tôi để nguyên chờ soát luồng ra bài thứ hai. Gỡ ngọn trước khi tìm ra gốc thì tuần sau lại có bài mới đúng kiểu đó.

Có thể bạn thích

Để lại bình luận