WordPress mặc định và các plugin SEO như Rank Math thường tạo ra các thẻ canonical không tối ưu cho các trang phân trang. Trong bài viết này, tôi sẽ hướng dẫn bạn khắc phục vấn đề này một cách triệt để, đặc biệt cho các trang dùng WooCommerce và các taxonomy tùy chỉnh.
Vấn đề với Canonical URL trong WordPress
Khi một trang web có nhiều trang phân trang, như trang 2, trang 3 của danh mục sản phẩm hoặc bài viết, WordPress thường chỉ định URL của trang đầu tiên làm canonical URL. Điều này có thể gây ra các vấn đề:
- Google có thể bỏ qua việc lập chỉ mục các trang phân trang
- Nội dung trên các trang phân trang có thể bị coi là trùng lặp
- Dữ liệu phân tích có thể không chính xác
Giải pháp toàn diện
Đoạn code dưới đây sẽ giúp bạn sửa vấn đề canonical cho tất cả các loại trang trong WordPress, bao gồm:
- Trang danh mục và thẻ thông thường
- Trang danh mục và thẻ sản phẩm WooCommerce
- Trang lưu trữ theo tác giả, ngày tháng
- Các custom taxonomy
- Trang tìm kiếm
- Và nhiều loại trang khác
Mã này đặc biệt hiệu quả khi bạn sử dụng plugin Rank Math SEO, nhưng cũng có thể điều chỉnh cho các plugin SEO khác.
add_filter( 'rank_math/frontend/canonical', function( $canonical ) {
if (is_paged() || is_shop() || is_product_category() || is_product_tag() || is_tax()) {
$canonical = '';
if (is_category()) {
$canonical = get_category_link(get_queried_object_id());
} elseif (is_tag()) {
$canonical = get_tag_link(get_queried_object_id());
} elseif (is_tax()) {
// Hỗ trợ tất cả các custom taxonomy
$canonical = get_term_link(get_queried_object());
} elseif (is_author()) {
$canonical = get_author_posts_url(get_queried_object_id());
} elseif (is_post_type_archive()) {
$canonical = get_post_type_archive_link(get_post_type());
} elseif (is_home() || is_front_page()) {
$canonical = home_url('/');
} elseif (is_shop()) {
$canonical = function_exists('wc_get_page_id') ? get_permalink(wc_get_page_id('shop')) : home_url('/shop/');
} elseif (is_product_category()) {
$canonical = get_term_link(get_queried_object());
} elseif (is_product_tag()) {
$canonical = get_term_link(get_queried_object());
} elseif (function_exists('is_product') && is_product()) {
$canonical = get_permalink(get_queried_object_id());
} elseif (is_singular()) {
// Hỗ trợ tất cả các loại post type
$canonical = get_permalink(get_queried_object_id());
} elseif (is_search()) {
// Hỗ trợ trang tìm kiếm
$canonical = get_search_link(get_search_query());
} elseif (is_date()) {
// Hỗ trợ trang lưu trữ theo ngày/tháng/năm
if (is_day()) {
$canonical = get_day_link(get_query_var('year'), get_query_var('monthnum'), get_query_var('day'));
} elseif (is_month()) {
$canonical = get_month_link(get_query_var('year'), get_query_var('monthnum'));
} elseif (is_year()) {
$canonical = get_year_link(get_query_var('year'));
}
} else {
global $wp;
$canonical = home_url($wp->request);
}
// Loại bỏ phần phân trang từ URL
$canonical = preg_replace('/page\/[0-9]+\/?$/', '', $canonical);
$canonical = remove_query_arg(['paged', 'page'], $canonical);
// Đảm bảo URL kết thúc bằng dấu gạch chéo
$canonical = trailingslashit($canonical);
// Xuất ra thẻ canonical
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
// Ngăn Rank Math tạo thẻ canonical khác
return '';
}
return $canonical;
}, 10, 1 );
Cách triển khai mã
Để sử dụng đoạn mã này, bạn có một số lựa chọn:
Cách 1: Thêm vào file functions.php của theme con (Child Theme)
- Truy cập vào thư mục theme con của bạn (nếu chưa có, hãy tạo một theme con)
- Mở file functions.php
- Dán đoạn code trên vào cuối file
- Lưu lại
Cách 2: Tạo plugin đơn giản
- Tạo một file PHP mới có tên
fix-canonical-urls.php - Dán đoạn mã sau vào đầu file:
fix-canonical-urls.php - Tải file lên thư mục
/wp-content/plugins/ - Kích hoạt plugin trong trang quản trị WordPress
<?php
/*
Plugin Name: Fix Canonical URLs for Pagination
Description: Sửa lỗi canonical URL cho các trang phân trang trong WordPress và WooCommerce
Version: 1.0
Author: Nguyen Lap
*/
// Đoạn mã sửa canonical URL
add_filter( 'rank_math/frontend/canonical', function( $canonical ) {
// Dán phần code ở trên vào đây
}, 10, 1 );
Lợi ích của giải pháp này
- Tạo canonical URL chuẩn cho tất cả các trang
- Hỗ trợ đầy đủ WooCommerce và các custom taxonomy
- Tránh nội dung trùng lặp trong mắt Google
- Cải thiện SEO cho các trang phân trang
- Dữ liệu phân tích chính xác hơn
Lưu ý
- Đoạn mã này được thiết kế cho Rank Math. Nếu bạn đang sử dụng Yoast SEO hoặc All in One SEO, bạn cần thay đổi tên hook tương ứng.
- Sau khi áp dụng, hãy xóa cache của website và plugin cache nếu có.
- Kiểm tra trang web của bạn bằng công cụ kiểm tra HTML để đảm bảo không có thẻ canonical trùng lặp.
Hy vọng rằng hướng dẫn này sẽ giúp bạn khắc phục vấn đề canonical URL cho các trang phân trang trên website WordPress của mình. Nếu bạn có bất kỳ câu hỏi hoặc gặp vấn đề gì, đừng ngần ngại để lại bình luận bên dưới!

