Code canonical tránh trùng lặp nội dung Yoast SEO, Rank math, SEOPress plugin

Chi tiết về thẻ canonical là gì bạn có thể tìm hiểu rõ hơn bằng Google nhé, nói ngắn gọn thẻ này là thành phần HTML nằm ở phần header của website, khai báo và sử dụng linh hoạt thẻ này để giải quyết các trang bị trùng lặp nội dung.

1 ví dụ ngắn gọn hy vọng bạn sẽ hiểu đó là ở các chuyên mục nếu có nhiều phân trang khác nhau nếu bạn cho các bài phân trang index, follow mà không set thẻ canonical về trang đầu tiên sẽ dính ngay lỗi trùng lặp nội dung trong Google search console.

Vd mình có chuyên mục: https://vutruso.com/kien-thuc-ve-wordpress/page/3/ theo url bạn có thể thấy chúng đang ở page/3/ giờ nếu bạn không đặt thẻ rel canonical về trang đầu là https://vutruso.com/kien-thuc-ve-wordpress/ thì sẽ bị trùng lặp nội dung ở các /page/*/ và trang đầu.

Gần đây mình gặp khá nhiều dự án mà khách cần hỗ trợ set /page/*/ về trang đầu nên mình tiện thể chia sẽ nó lên đây để nếu ai gặp phải tình trạng này thì có thể áp dụng.

Giải quyết bài toán này bạn có thể sử dụng filter do Yoast SEO cung cấp và code 1 hàm như dưới đây. bạn cho vào file functions.php là được. (Xem hình phía dưới bạn sẽ hiểu vấn đề)

// custom wpseo_canonical /page
add_filter('wpseo_canonical', 'vutruso_wpseo_canonical');
function vutruso_wpseo_canonical($canonical) {
    if (is_paged()) {
        if (is_home()) {
            return home_url();
        }

        if (is_archive()) {
            $url = get_category_link(get_queried_object_id());
            return $url;
        }
    }

    return $canonical;
}

Đoạn code trên sử dụng filter do Yoast SEO cung cấp wpseo_canonical

– Nếu là trang chủ nó sẽ trả về url trang chủ
– Nếu là phân trang nó sẽ lấy canonical về trang đầu tiên của chuyên mục

Vậy là xong, hy vọng đoạn code ngắn ở trên sẽ giúp ích cho bạn trong việc giải quyết vấn đề trùng lặp nội dung trong SEO hoặc fix được lỗi trùng lặp nội dung tron .

Bonus

Nếu bạn nào dùng SEOPress thì có thể sử dụng code phía dưới này.

function vutruso_canonical($html) {
	//If we are on a paginated archive, filter the canonical tag to always return the first page URL
	//vd: https://vutruso.com/kien-thuc-ve-wordpress/page/3/ -> https://vutruso.com/kien-thuc-ve-wordpress/
	    if (is_paged()) {
       		$html = '<link rel="canonical" href="'.htmlspecialchars(urldecode(get_pagenum_link('1'))).'" />';
    	}
	
	return $html;
}
add_filter('seopress_titles_canonical','vutruso_canonical');

Nếu dùng Plugin Rank math SEO bạn có thể dùng code dưới đây.

add_filter( 'rank_math/frontend/canonical', function( $canonical ) {
  if ( is_tax( 'product_cat' ) && is_paged() ) {
    $object = get_queried_object();
    return get_term_link( $object->term_id );
  }elseif ( is_category()  and is_paged()) {
    $object = get_queried_object();
    return get_term_link( $object->term_id );
  }
  return $canonical;
});

Ngoài ra bạn cũng có thể sử dụng code phía dưới cũng được, code sẽ kiểm tra điều kiện nếu có page thì tự động thêm vào thẻ canonical ở trang gốc

//Neu co phan trang thi them the canonical vao header voi hook wp_head
//vd: https://vutruso.com/kien-thuc-ve-wordpress/page/3/ -> https://vutruso.com/kien-thuc-ve-wordpress/
add_filter( 'wp_head', 'vutruso_paginated_archive_canonical_url' );
function vutruso_paginated_archive_canonical_url() {
    if ( is_paged() && is_archive() ) {
        $first_page_url = get_pagenum_link( 1 );
        
        if ( $first_page_url ) {
            echo '<link rel="canonical" href="' . esc_url( $first_page_url ) . '" />' . "\n";
        }
    }
}

Good luck!

daotiendung

Tiến Dũng Đào chuyên quản lý, vận hành các dịch vụ website. Anh có nhiều năm kinh nghiệm về VPS, Hosting, technical SEO, CMS. Đặc biệt yêu thích WordPress với hơn 5 năm phát triển theme và plugin. Sở thích của anh là đọc, viết blog, đi du lịch, tập võ và chia sẻ các kiến thức cho mọi người.

Bài viết liên quan