Phần 1: Hướng dẫn Code chức năng kiểm tra link nội bộ
Khi xây dựng một trang web trên nền tảng WordPress, việc tối ưu hóa SEO là vô cùng quan trọng để cải thiện thứ hạng trên công cụ tìm kiếm. Một trong những yếu tố quan trọng trong SEO là cấu trúc liên kết nội bộ, giúp các bài viết liên kết với nhau, tăng khả năng lập chỉ mục và cải thiện trải nghiệm người dùng.
Trong bài viết này, muathemewpgiare sẽ hướng dẫn các bạn cách tạo một chức năng kiểm tra liên kết nội bộ trong bài viết WordPress, giúp bạn phát hiện các bài viết chưa có liên kết nội bộ hoặc những bài viết chưa được đề cập trong các bài viết khác.
Đọc thêm: Tối Ưu Hóa SEO Cho Các Doanh Nghiệp Nhỏ Năm 2025 Mới Nhất
1. Liên Kết Nội Bộ Là Gì và Tại Sao Nó Quan Trọng?
Liên kết nội bộ (internal links) là các liên kết từ một trang này tới một trang khác trong cùng một website. Chúng không chỉ giúp người dùng điều hướng dễ dàng mà còn giúp công cụ tìm kiếm (như Google) hiểu rõ hơn về cấu trúc website của bạn. Một cấu trúc liên kết nội bộ tốt sẽ giúp:
Tăng khả năng lập chỉ mục cho các trang mới hoặc ít được biết đến.
Cải thiện trải nghiệm người dùng khi họ dễ dàng truy cập các bài viết liên quan.
Phân phối PageRank (hoặc độ uy tín) đều khắp các bài viết, giúp các trang quan trọng hơn dễ dàng đạt thứ hạng cao hơn.
2. Cách Kiểm Tra Liên Kết Nội Bộ Trong Bài Viết WordPress
Chức năng kiểm tra liên kết nội bộ giúp bạn phát hiện những bài viết chưa có liên kết nội bộ, từ đó bạn có thể cải thiện SEO cho chúng. Dưới đây là cách bạn có thể xây dựng một công cụ kiểm tra liên kết nội bộ trong WordPress.
3. Viết Mã Kiểm Tra Liên Kết Nội Bộ
Bước 1: Tạo Menu trong WordPress Admin
Đầu tiên, bạn cần tạo một mục menu trong WordPress để hiển thị các công cụ kiểm tra SEO. Đoạn mã dưới đây sẽ giúp bạn thêm một submenu trong trang Tools để kiểm tra liên kết nội bộ.
1 2 3 4 5 6 7 8 9 10 11 | add_action('admin_menu', 'muatheme_seo_audit_menu'); function muatheme_seo_audit_menu() { add_submenu_page( 'tools.php', 'Phân tích SEO nội bộ nâng cao', 'SEO nội bộ nâng cao', 'manage_options', 'seo-noi-bo-nang-cao', 'muatheme_seo_audit_page' ); } |
Bước 2: Phân Tích Liên Kết Nội Bộ Trong Các Bài Viết
Tiếp theo, chúng ta cần viết một hàm kiểm tra xem mỗi bài viết có liên kết nội bộ với các bài viết khác trong cùng một website hay không. Chúng ta sẽ kiểm tra nội dung bài viết, tìm kiếm các URL của bài viết khác và xác nhận xem bài viết hiện tại có liên kết nội bộ nào hay không.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | function muatheme_seo_audit_page() { echo '<div class="wrap"><h1>📊 Phân tích SEO nội bộ nâng cao</h1>'; // Nhận filter $selected_cat = isset($_GET['cat']) ? intval($_GET['cat']) : 0; $selected_month = isset($_GET['month']) ? $_GET['month'] : ''; // Filter form echo '<form method="get"> <input type="hidden" name="page" value="seo-noi-bo-nang-cao" /> <label>Chuyên mục:</label> '; wp_dropdown_categories([ 'show_option_all' => 'Tất cả', 'name' => 'cat', 'selected' => $selected_cat, 'hide_empty' => 0, ]); echo ' <label>Tháng:</label> <select name="month"> <option value="">Tất cả</option>'; for ($i = 0; $i < 12; $i++) { $month_val = date('Y-m', strtotime("-$i months")); $selected = ($selected_month == $month_val) ? 'selected' : ''; echo "<option value='$month_val' $selected>$month_val</option>"; } echo '</select> <input type="submit" class="button" value="Lọc"> </form><br>'; // Lấy danh sách bài viết $args = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, ]; if ($selected_cat) $args['cat'] = $selected_cat; if ($selected_month) { $args['date_query'] = [ [ 'year' => explode('-', $selected_month)[0], 'month' => explode('-', $selected_month)[1], ], ]; } $posts = get_posts($args); $total = count($posts); $no_links = []; $no_mentions = []; $both = []; foreach ($posts as $post) { $id = $post->ID; $title = wp_strip_all_tags($post->post_title); $url = get_permalink($id); $has_link = false; $has_mention = false; foreach ($posts as $other) { if ($other->ID == $id) continue; $content = wp_strip_all_tags($other->post_content); $raw = $other->post_content; if (strpos($raw, $url) !== false) $has_link = true; if (stripos($content, $title) !== false) $has_mention = true; if ($has_link && $has_mention) break; } if (!$has_link) $no_links[] = $post; if (!$has_mention) $no_mentions[] = $post; if (!$has_link && !$has_mention) $both[] = $post; } // Tổng quan echo "<h2>Tổng quan</h2> <ul style='font-size: 16px;'> <li>📌 Tổng bài viết: <strong>$total</strong></li> <li>🔗 Không có liên kết nội bộ: <strong>" . count($no_links) . "</strong></li> <li>🔍 Không được nhắc tên: <strong>" . count($no_mentions) . "</strong></li> <li>🚨 Mồ côi tuyệt đối: <strong style='color:red'>" . count($both) . "</strong></li> </ul>"; // Bảng chi tiết echo "<h2>📋 Danh sách chi tiết</h2>"; echo "<table class='widefat striped'><thead><tr> <th>Tiêu đề</th><th>Chuyên mục</th><th>Ngày</th> <th>Điểm SEO</th><th>Liên kết?</th><th>Nhắc tên?</th> <th>Gợi ý chèn link</th><th>Sửa</th> </tr></thead><tbody>"; foreach ($posts as $p) { $cats = get_the_category($p->ID); $cat_names = implode(', ', wp_list_pluck($cats, 'name')); $has_link = !in_array($p, $no_links); $has_mention = !in_array($p, $no_mentions); $seo_score = 0; if ($has_link) $seo_score += 50; if ($has_mention) $seo_score += 50; $score_color = $seo_score == 100 ? 'green' : ($seo_score >= 50 ? 'orange' : 'red'); // Gợi ý chèn link $suggest = ''; if (!$has_link) { $related = get_posts([ 'category__in' => wp_list_pluck($cats, 'term_id'), 'post__not_in' => [$p->ID], 'numberposts' => 1, ]); if ($related) { $suggest = '<a href="' . get_edit_post_link($related[0]->ID) . '" target="_blank">' . esc_html($related[0]->post_title) . '</a>'; } else { $suggest = 'Không có'; } } echo "<tr> <td><a href='" . get_permalink($p->ID) . "' target='_blank'>" . esc_html($p->post_title) . "</a></td> <td>$cat_names</td> <td>" . get_the_date('d/m/Y', $p->ID) . "</td> <td style='color:$score_color; font-weight:bold'>$seo_score%</td> <td style='color:" . ($has_link ? "green" : "red") . "'>" . ($has_link ? "✔️" : "❌") . "</td> <td style='color:" . ($has_mention ? "green" : "red") . "'>" . ($has_mention ? "✔️" : "❌") . "</td> <td>$suggest</td> <td><a href='" . get_edit_post_link($p->ID) . "'>✏️ Sửa</a></td> </tr>"; } echo "</tbody></table></div>"; } |
4. Cải Thiện Tính Năng Kiểm Tra Liên Kết Nội Bộ
Để tăng tính hiệu quả và hỗ trợ SEO tốt hơn, bạn có thể cải thiện thêm các tính năng như:
Đề xuất bài viết liên quan: Khi một bài viết không có liên kết nội bộ, bạn có thể gợi ý các bài viết có liên quan để người quản trị có thể thêm liên kết.
Kiểm tra các liên kết bị hỏng: Thêm chức năng kiểm tra các liên kết bị hỏng (404) để đảm bảo các liên kết không dẫn tới trang lỗi.
Cập nhật liên kết tự động: Cung cấp tính năng tự động cập nhật hoặc tạo liên kết nội bộ khi người dùng viết bài mới.
5. Kết Luận
Việc kiểm tra và cải thiện cấu trúc liên kết nội bộ trong WordPress không chỉ giúp tối ưu SEO mà còn cải thiện trải nghiệm người dùng. Chức năng kiểm tra liên kết nội bộ mà chúng ta vừa xây dựng giúp bạn dễ dàng phát hiện các bài viết chưa được liên kết với các bài viết khác, từ đó cải thiện khả năng liên kết nội bộ và SEO cho website của bạn.
Hãy tích hợp chức năng này vào website của bạn và theo dõi sự cải thiện trong thứ hạng tìm kiếm của Google cũng như trải nghiệm người dùng! Chúc các bạn thành công nhé.
Phần 2: Update chức năng kiểm tra link nội bộ trong bài viết wordpress
Ở phần 1, mình đã hướng dẫn cơ bản chức năng kiểm tra link nội bộ trong bài viết, ở phần 2 này mình xin phép update thêm một vài phần nữa:
Các cải tiến của chức năng
Form tìm kiếm và lọc: Được thiết kế với nền sáng, các input và dropdown được cách điệu đẹp mắt với các viền bo tròn và padding để dễ sử dụng.
Bảng chi tiết: Các cột trong bảng có chiều rộng đồng đều và có màu nền nhẹ, giúp dễ dàng phân biệt các hàng. Dữ liệu được hiển thị với các biểu tượng và màu sắc dễ nhìn để thể hiện trạng thái SEO (liên kết và nhắc tên).
Gợi ý bài viết: Bài viết liên quan được hiển thị rõ ràng và có sự phân biệt rõ ràng về tỷ lệ liên quan với bài viết chính, dễ dàng nhận ra sự liên quan giữa các bài viết.
Phân trang: Các liên kết phân trang được cải tiến với kiểu dáng nút hiện đại, dễ bấm và dễ phân biệt.
Đổi tên các function và class thành
muatheme_wpgiare004_
để tránh xung đột với các function khác trong hệ thống.Đảm bảo cấu trúc mã dễ bảo trì và dễ mở rộng.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | function muatheme_wpgiare004_seo_audit_menu() { add_submenu_page( 'tools.php', 'Phân tích SEO nội bộ nâng cao', 'SEO nội bộ nâng cao', 'manage_options', 'seo-noi-bo-nang-cao', 'muatheme_wpgiare004_seo_audit_page' ); } // Hàm xử lý hiển thị trang phân tích SEO function muatheme_wpgiare004_seo_audit_page() { ?> <div class="wrap"> <h1 style="font-size: 24px; font-weight: bold; color: #2c3e50;">📊 Phân tích SEO nội bộ nâng cao</h1> <?php // Nhận filter $selected_cat = isset($_GET['cat']) ? intval($_GET['cat']) : 0; $selected_month = isset($_GET['month']) ? $_GET['month'] : ''; $search_term = isset($_GET['search_term']) ? sanitize_text_field($_GET['search_term']) : ''; // Filter form muatheme_wpgiare004_filter_form($selected_cat, $selected_month, $search_term); // Lấy danh sách bài viết $args = muatheme_wpgiare004_get_posts_query($selected_cat, $selected_month, $search_term); $posts = get_posts($args); // Phân tích các bài viết muatheme_wpgiare004_analyze_posts($posts); // Phân trang (Optional, nếu có nhiều bài viết) muatheme_wpgiare004_pagination($args); ?> </div> <?php } // Hàm hiển thị form lọc SEO function muatheme_wpgiare004_filter_form($selected_cat, $selected_month, $search_term) { ?> <form method="get" class="seo-filter-form" style="background-color: #f9f9f9; padding: 15px; border-radius: 8px; margin-bottom: 30px;"> <input type="hidden" name="page" value="seo-noi-bo-nang-cao" /> <label style="font-weight: bold;">Chuyên mục:</label> <?php wp_dropdown_categories([ 'show_option_all' => 'Tất cả', 'name' => 'cat', 'selected' => $selected_cat, 'hide_empty' => 0, ]); ?> <label style="font-weight: bold;">Tháng:</label> <select name="month" class="seo-dropdown" style="padding: 6px 12px; border-radius: 4px; border: 1px solid #ccc;"> <option value="">Tất cả</option> <?php for ($i = 0; $i < 12; $i++) { $month_val = date('Y-m', strtotime("-$i months")); $selected = ($selected_month == $month_val) ? 'selected' : ''; echo "<option value='$month_val' $selected>$month_val</option>"; } ?> </select> <label style="font-weight: bold;">Tìm kiếm:</label> <input type="text" name="search_term" value="<?php echo esc_attr($search_term); ?>" class="seo-input" style="padding: 6px 12px; border-radius: 4px; border: 1px solid #ccc;" /> <input type="submit" class="button button-primary" value="Lọc" style="background-color: #0073aa; color: #fff; padding: 8px 16px; border-radius: 4px; cursor: pointer;" /> </form> <?php } // Hàm lấy danh sách bài viết theo điều kiện lọc function muatheme_wpgiare004_get_posts_query($selected_cat, $selected_month, $search_term) { $args = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 20, // Số bài viết trên mỗi trang 'paged' => isset($_GET['paged']) ? intval($_GET['paged']) : 1, ]; if ($selected_cat) $args['cat'] = $selected_cat; if ($selected_month) { $args['date_query'] = [ [ 'year' => explode('-', $selected_month)[0], 'month' => explode('-', $selected_month)[1], ], ]; } if ($search_term) $args['s'] = $search_term; return $args; } // Hàm phân tích SEO các bài viết function muatheme_wpgiare004_analyze_posts($posts) { $no_links = []; $no_mentions = []; $both = []; foreach ($posts as $post) { $id = $post->ID; $title = wp_strip_all_tags($post->post_title); $url = get_permalink($id); $has_link = false; $has_mention = false; foreach ($posts as $other) { if ($other->ID == $id) continue; $content = wp_strip_all_tags($other->post_content); $raw = $other->post_content; if (strpos($raw, $url) !== false) $has_link = true; if (stripos($content, $title) !== false) $has_mention = true; if ($has_link && $has_mention) break; } if (!$has_link) $no_links[] = $post; if (!$has_mention) $no_mentions[] = $post; if (!$has_link && !$has_mention) $both[] = $post; } // Hiển thị tổng quan muatheme_wpgiare004_display_overview(count($posts), count($no_links), count($no_mentions), count($both)); // Hiển thị bảng chi tiết muatheme_wpgiare004_display_posts_table($posts, $no_links, $no_mentions); } // Hiển thị tổng quan SEO function muatheme_wpgiare004_display_overview($total, $no_links, $no_mentions, $both) { echo "<h2 style='color: #2980b9;'>Tổng quan</h2> <ul style='font-size: 16px;'> <li>📌 Tổng bài viết: <strong>$total</strong></li> <li>🔗 Không có liên kết nội bộ: <strong>" . $no_links . "</strong></li> <li>🔍 Không được nhắc tên: <strong>" . $no_mentions . "</strong></li> <li>🚨 Mồ côi tuyệt đối: <strong style='color:red'>" . $both . "</strong></li> </ul>"; } // Hiển thị bảng chi tiết các bài viết function muatheme_wpgiare004_display_posts_table($posts, $no_links, $no_mentions) { echo "<h2 style='color: #2980b9;'>📋 Danh sách chi tiết</h2>"; echo "<table class='widefat striped' style='width: 100%; border-collapse: collapse;'> <thead> <tr style='background-color: #f1f1f1;'> <th style='padding: 10px; text-align: left;'>Tiêu đề</th> <th style='padding: 10px; text-align: left;'>Chuyên mục</th> <th style='padding: 10px; text-align: left;'>Ngày</th> <th style='padding: 10px; text-align: left;'>Điểm SEO</th> <th style='padding: 10px; text-align: left;'>Liên kết?</th> <th style='padding: 10px; text-align: left;'>Nhắc tên?</th> <th style='padding: 10px; text-align: left;'>Gợi ý chèn link</th> <th style='padding: 10px; text-align: left;'>Sửa</th> </tr> </thead> <tbody>"; foreach ($posts as $post) { $cats = get_the_category($post->ID); $cat_names = implode(', ', wp_list_pluck($cats, 'name')); $has_link = !in_array($post, $no_links); $has_mention = !in_array($post, $no_mentions); $seo_score = 0; if ($has_link) $seo_score += 50; if ($has_mention) $seo_score += 50; $score_color = $seo_score == 100 ? 'green' : ($seo_score >= 50 ? 'orange' : 'red'); // Gợi ý chèn link $suggest = muatheme_wpgiare004_suggest_links($post, $cats); echo "<tr style='border-bottom: 1px solid #ddd;'> <td style='padding: 10px;'>" . esc_html($post->post_title) . "</td> <td style='padding: 10px;'>$cat_names</td> <td style='padding: 10px;'>" . get_the_date('d/m/Y', $post->ID) . "</td> <td style='padding: 10px; color:$score_color; font-weight:bold'>$seo_score%</td> <td style='padding: 10px; color:" . ($has_link ? "green" : "red") . "'>" . ($has_link ? "✔️" : "❌") . "</td> <td style='padding: 10px; color:" . ($has_mention ? "green" : "red") . "'>" . ($has_mention ? "✔️" : "❌") . "</td> <td style='padding: 10px;'>$suggest</td> <td style='padding: 10px;'><a href='" . get_edit_post_link($post->ID) . "'>✏️ Sửa</a></td> </tr>"; } echo "</tbody></table>"; } // Hàm gợi ý chèn link (Gợi ý nhiều bài hơn) function muatheme_wpgiare004_suggest_links($post, $cats) { $suggest = ''; $related_posts = get_posts([ 'category__in' => wp_list_pluck($cats, 'term_id'), 'post__not_in' => [$post->ID], 'numberposts' => 5, // Gợi ý 5 bài viết 'orderby' => 'rand', // Lấy các bài viết ngẫu nhiên ]); if ($related_posts) { $suggest = '<ul>'; foreach ($related_posts as $related) { $suggest .= '<li><a href="' . get_edit_post_link($related->ID) . '" target="_blank">' . esc_html($related->post_title) . '</a></li>'; } $suggest .= '</ul>'; } else { $suggest = 'Không có bài viết liên quan'; } return $suggest; } // Hàm phân trang (optional) function muatheme_wpgiare004_pagination($args) { $total_posts = wp_count_posts('post')->publish; $posts_per_page = $args['posts_per_page']; $total_pages = ceil($total_posts / $posts_per_page); echo '<div class="tablenav" style="padding: 10px;"> <div class="alignleft actions">Trang: '; for ($i = 1; $i <= $total_pages; $i++) { echo "<a href='?page=seo-noi-bo-nang-cao&paged=$i' style='padding: 5px 10px; margin-right: 5px; border: 1px solid #ccc; border-radius: 4px;'>" . $i . "</a>"; } echo '</div></div>'; } |
- Tổng hợp 30 mẫu css button mới nhất 2025 cho website
- SimilarWeb là gì? Công cụ và tính năng chính của SimilarWeb mà SEOers không thể bỏ qua 2025
- Các Phương Pháp Quảng Cáo Website Miễn Phí Hiệu Quả
- Tự Học JavaScript Từ Con Số 0: Lộ Trình Học, Tài Nguyên, Mẹo Học Dễ Nhớ
- #1 Hướng dẫn code chức năng đăng nhập để xem nội dung hoặc bài viết