Hướng dẫn cách đặt link Pagination Canonical

Một trong các vấn đề mà các bạn hay gặp phải trong quá trình Audit Onpage SEO là các link pagination dạng page/2/ thường xuyên xuất hiện trong chỉ dấu Google Search Console ở các mục Trang trùng lặp. Nếu set noindex, các URL này lại xuất hiện ở mục Trang bị đánh dấu noindex. Bài viết sau sẽ hướng dẫn cách fix lỗi trên.

Đoạn code mẫu có ở cuối bài, nhưng mình mong các bạn đọc kĩ để hiểu tại sao cần làm thế nhé. Nếu bài viết hũu ích, đừng quên bấm vote 5 sao vào cuối bài viết!!!

Mr. Khôi

Vấn đề của link pagination

Đầu tiên, mình cần hiểu cấu trúc của pagination page làm nhiệm vụ gì. Từ bài viết về Pagination của SERanking, mình cho rằng các vấn đề như sau:

Việc index trang 1 là điều hiển nhiên, ví dụ trang đầu của danh mục, trang đầu của danh mục sản phẩm.

Khi bot quét tới các trang sau trang 1 thông qua menu pagination, nếu mình không có định hướng cho bot về việc trang này là gì, bot sẽ dễ nhầm nó với trang đầu.

Một cách non-tech, mình hiểu vấn đề là nhiều bài viết khi được cập nhật thêm thì nó dẫn tới tụt về trang 2, trang 3. Khi quét của bot gặp các bài viết (đã có lúc nào đó ở trang 1), nay lại xuất hiện trên trang 2, trang 3, nó sẽ nhận diện một sự trùng lặp nhất định và cho vào mục “Trang trùng lặp nhưng chưa chọn chính tắc”.

Về phương án, Rank Math và nhiều plugin sẽ noindex luôn các trang pagination này. Thực tế lại cho thấy, chỉ nên làm điều này ngay thời điểm sơ khởi của web mới cho lên, còn khi vận hành web chạy một thời gian dài và đã dính index các trang pagination này, việc noindex sẽ không sớm có kết quả (thường mình chờ dài cổ mà không có dấu hiệu gì khác cả).

Một dấu hiệu Google mong muốn: Pagination nên có canonical về trang đầu tiên, đó là chính Google Search Console cũng muốn mình xác định chính tắc ở các trang này nên mới xếp vào mục đó.

Từ kết quả đó, mình kết luận: Canonical là phương án tốt nhất.

Cách làm link Canonical cho pagination như thế nào?

Đầu tiên, mình nghĩ tới giải pháp sử dụng các filter hook của plugin SEO có sẵn. Ví dụ RankMath có hook

add_filter( 'rank_math/frontend/canonical', function() {})

Rất tiếc, khi thử nghiệm thì nó không nhận canonical link hàng loạt mà phải manual input bằng tay cho từng link. Thêm vào đó, khi test kĩ thì thấy dù set rồi nó vẫn không nhận đúng, kiểu như là Canonical URL của page 2 vẫn là page 2. Ủa???

Bởi vậy, mình tính tới phương án tạo luôn đoạn code rel trong thẻ HEAD.

<link rel="canonical">

Với WordPress, bạn sẽ xác định chỉ trên các Pagination mới cần đoạn mã trên, nên đây là đáp án mình đã thử nghiệm thành công.

Lưu ý:

  • Copy đoạn code trên vào trong theme, file functions.php (nằm trong dấu <?php)
  • Sử dụng PHP 7.4 trở lên.
add_action( 'wp_head', function() {
	$paged = get_query_var('paged') ?? 1;
	
	if ($paged > 1) {
		$link = $_SERVER['REQUEST_URI'];
		$arr = explode('/page/', $link);
		$canonical = site_url( $arr[0]. '/' );
		
		echo '<link rel="canonical" href="' . esc_url_raw( $canonical ) . '">';
	}
} );

Trình tự code hiểu như sau:

Xác định page hiện tại có phải là page chứa pagination không. Điều này áp dụng cho các trường hợp:

  • Danh mục có pagination link
  • Trang mà có nhiều pagination link

Sau đó đọc URL để loại bỏ đoạn chứa /page/x trước khi set canonical URL.

Tham khảo

Mẹo: Tắt hẳn chức năng Canonical URL của Rank Math

add_filter( 'rank_math/frontend/canonical', '__return_null' );

Mẹo: Tắt hẳn chức năng Canonical URL của Yoast SEO

add_filter( 'wpseo_canonical', '__return_false' );

Kết luận

Mình nghĩ đây là đáp án chuẩn và có thể áp dụng một cách kĩ thuật. Tuy nhiên, nếu bạn gặp vấn đề không ổn với code trên, hãy mở topic trên nhóm Tối ưu Web nhé.

4.3/5 - (6 bình chọn)