Trong phần 2 này, chúng ta sẽ nâng cấp hệ thống lên một level mới: tự động lấy từ khóa từ Tag của WordPress, sau đó chèn link nội bộ trỏ về trang lưu trữ tag tương ứng. Bạn chỉ cần tạo tag như bình thường, hệ thống sẽ tự hiểu đâu là từ khóa cần nội link.
Vấn đề của cách làm thủ công (Phần 1)
Ở phiên bản đầu tiên, ta phải tự định nghĩa mảng từ khóa nội bộ như sau:
function get_internal_keywords() {
return [
'UIkit' => 'https://inithtml.com/uikit/',
'WordPress' => 'https://inithtml.com/tag/wordpress/',
'SEO' => 'https://inithtml.com/tag/seo/',
];
}
Cách này có vài hạn chế:
- Mỗi lần muốn thêm từ khóa nội bộ, bạn phải sửa code.
- Dễ trùng lặp: một số từ khóa đã tồn tại dưới dạng
taghoặccategory. - Khó bảo trì khi website ngày càng lớn.
Trong khi đó, Tag trong WordPress vốn đã là một dạng “từ khóa nội dung”. Tại sao không tận dụng luôn chúng để làm nguồn dữ liệu cho hệ thống internal link?
Ý tưởng: Dùng Tag làm nguồn từ khóa nội bộ
Thay vì tự viết mảng từ khóa, chúng ta sẽ:
- Lấy danh sách tất cả Tag trong site bằng
get_tags(). - Mỗi Tag sẽ tạo thành một cặp:
- Từ khóa: tên Tag (ví dụ:
WordPress,SEO onpage). - Liên kết: URL trang lưu trữ Tag dùng
get_tag_link().
- Từ khóa: tên Tag (ví dụ:
- Duyệt nội dung bài viết, dùng regex để tìm các từ khóa đó và chèn thẻ
<a>trỏ về trang Tag.
“Tận dụng Tag để làm từ khóa nội bộ giúp nội dung thống nhất, dễ quản lý và không cần đụng vào code mỗi lần thêm chủ đề mới.”
Mã PHP mẫu (v2 – tự động lấy từ Tag)
Dưới đây là phiên bản nâng cấp của hàm chèn từ khóa nội bộ. Bạn có thể coi đây là “v2” – thay thế cho phiên bản dùng mảng thủ công.
// Lấy danh sách Tag để làm từ khóa nội bộ
function init_get_internal_keywords_from_tags() {
$tags = get_tags([
'hide_empty' => false, // true nếu chỉ muốn dùng tag có bài viết
]);
$keywords = [];
if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
foreach ( $tags as $tag ) {
// Tên tag sẽ là từ khóa, link tag là URL đích
$keywords[ $tag->name ] = get_tag_link( $tag->term_id );
}
}
return $keywords;
}
// Hàm tự động chèn link nội bộ từ Tag
function init_auto_internal_link_from_tags( $content ) {
if ( is_singular() && in_the_loop() && is_main_query() ) {
$keywords = init_get_internal_keywords_from_tags();
if ( empty( $keywords ) ) {
return $content;
}
// Các thẻ HTML cần tránh chèn link vào bên trong
$blocked_tags = 'a|script|style|pre|code';
foreach ( $keywords as $keyword => $url ) {
// Bỏ qua nếu keyword rỗng
if ( ! $keyword || ! $url ) {
continue;
}
// Regex:
// - \b để match cả từ
// - tránh match trong thẻ cấm bằng negative lookahead
$regex = '/
(?<!["\/]) # không match trong attribute
\b(' . preg_quote( $keyword, '/' ) . ')\b # từ khóa chính xác
(?![^<>]*<\/(?:' . $blocked_tags . ')>) # không nằm trong thẻ cấm
/ix';
$replacement = '<a href="' . esc_url( $url ) . '" class="auto-internal-link" rel="internal">$1</a>';
// Giới hạn mỗi từ khóa chỉ chèn 1 lần trong 1 bài
$content = preg_replace( $regex, $replacement, $content, 1 );
}
}
return $content;
}
add_filter( 'the_content', 'init_auto_internal_link_from_tags', 12 );
Giải thích nhanh từng phần
init_get_internal_keywords_from_tags():- Dùng
get_tags()để lấy toàn bộ tag trên site. - Trả về mảng dạng
'Tên Tag' => 'URL Tag'.
- Dùng
init_auto_internal_link_from_tags():- Chỉ chạy trong nội dung bài đơn:
is_singular() && in_the_loop() && is_main_query(). - Duyệt từng từ khóa (tức là từng tag).
- Regex đảm bảo:
- Match đúng từ cần tìm (có
\b). - Không match bên trong các thẻ
<a>,<script>,<style>,<pre>,<code>.
- Match đúng từ cần tìm (có
preg_replace(..., 1)giúp giới hạn mỗi từ khóa chỉ chèn 1 lần.
- Chỉ chạy trong nội dung bài đơn:
Tùy biến thêm cho phù hợp dự án
Bạn có thể mở rộng hoặc tinh chỉnh cho phù hợp với website thực tế:
- Giới hạn chỉ dùng một số Tag nhất định
Ví dụ, chỉ nội link với tag thuộc một nhóm nhất định, hoặc có prefix đặc biệt trong tên. - Không nội link theo tag chính của bài viết hiện tại
Trong một số trường hợp, bạn có thể muốn:- Chỉ nội link sang các chủ đề liên quan nhưng không trùng với tag chính của bài.
- Hoặc ưu tiên nội link theo nhóm tag quan trọng.
- Thêm class hoặc data attribute để tracking
Ví dụ:$replacement = '<a href="' . esc_url( $url ) . '" class="auto-internal-link" data-source="tag">$1</a>';Điều này giúp bạn tracking click bằng Google Analytics, Plausible hoặc các công cụ phân tích khác.
- Tăng/giảm số lần chèn mỗi từ khóa
Nếu muốn mỗi keyword xuất hiện tối đa 2–3 lần, chỉ cần sửa tham số cuối trongpreg_replace():$content = preg_replace( $regex, $replacement, $content, 3 );
Một số lưu ý khi dùng Tag làm từ khóa nội bộ
- Tên Tag nên rõ ràng, không quá chung chung (ví dụ: “bài viết”, “xem thêm”…) để tránh chèn link vào những đoạn không cần thiết.
- Không dùng quá nhiều Tag chỉ để nội link, hãy giữ Tag đúng bản chất phân loại nội dung.
- Nếu website có rất nhiều Tag, bạn có thể:
- Giới hạn số tag xử lý (ví dụ: top 50 tag quan trọng).
- Hoặc thêm điều kiện chỉ lấy những tag có nhiều bài viết.
- Luôn kiểm tra lại một số bài mẫu để đảm bảo regex không chèn sai vị trí hoặc phá vỡ HTML.
Kết luận
Bằng cách tận dụng Tag trong WordPress làm nguồn dữ liệu từ khóa nội bộ, bạn đã:
- Giảm bớt việc phải quản lý mảng từ khóa thủ công.
- Đồng bộ được hệ thống phân loại nội dung với chiến lược internal link.
- Đặt nền tảng để mở rộng lên các phiên bản nâng cao hơn (kết hợp Category, Custom Taxonomy, ưu tiên từ khóa quan trọng…).
Đây là bước thứ hai trong series “Tự động chèn từ khóa nội bộ”. Ở các phần tiếp theo, bạn có thể tiếp tục nâng cấp:
- Thêm giao diện cấu hình trong Admin để bật/tắt nhóm từ khóa.
- Ưu tiên một số Tag “chiến lược” với anchor text tùy biến.
- Kết hợp thêm logic theo độ dài bài viết, vị trí đoạn văn, hoặc loại post.
Hãy thử kích hoạt phiên bản v2 này trên staging hoặc một vài bài viết mẫu, theo dõi hiệu quả nội link và tối ưu dần cho phù hợp với cấu trúc nội dung của riêng bạn.
Bình luận