HMJ-Blog主题修改:添加canonical标签规范URL

自媒体 思享 2464浏览

对于搜索引擎来说,URL不同则是不同的页面,而网站经常出现一个页面多个URL的情况,例如带index.html的主页、伪静态后仍然存在的动态地址、以及分页(例如:https://www.4xseo.com/page/2)。canonical标签就是起到一个告知搜索引擎首选URL的作用。避免搜索引擎判断为重复页面给网站“减分”

基本上博主也是代码小白,都是网上找的,这里贴出来一起交流

canonical标签

functions.php添加代码

  1. //完美的canonical
  2. remove_action( 'wp_head', 'rel_canonical' );
  3. function my_rel_canonical() {
  4. global $post;
  5. if (is_single() || is_page()) {
  6. echo "<link rel=\"canonical\" href=\"" . get_permalink( $post->ID ) . "\" />\n";
  7. }
  8. if (is_home() && is_paged()) {
  9. echo "<link rel=\"canonical\" href=\"".home_url("/")."\" />\n";
  10. }
  11. if (is_category() || is_category() && is_paged()) {
  12. echo "<link rel=\"canonical\" href=\"".get_category_link(get_query_var('cat'))."\" />\n";
  13. }
  14. if (is_tag() || is_tag() && is_paged()) {
  15. echo "<link rel=\"canonical\" href=\"".get_term_link(get_query_var('tag'), 'post_tag')."\" />\n";
  16. }
  17. if (is_search() || is_search() && is_paged()) {
  18. echo "<link rel=\"canonical\" href=\"".get_search_link(get_query_var('search'))."\" />\n";
  19. }
  20. if (is_author()) {
  21. echo "<link rel=\"canonical\" href=\"".get_option('home')."\" />\n";
  22. }
  23. if (is_date()) {
  24. echo "<link rel=\"canonical\" href=\"".get_option('home')."\" />\n";
  25. }
  26. }
  27. add_action('wp_head', 'my_rel_canonical');

思享目前就是用的这个代码,添加于fufunctions.php文件中即可

值得注意的是,以上代码主页的首选连接是带“/”的,如需去除,将home_url("/")中的“/”删除即可

除此之外,思享还搜集了两种修改方法

获取链接函数然后调用

首先在functions.php文件中添加分类目录分页链接获取函数,代码如下:

  1. /* wordpress中使用canonical标签
  2. function cx_archive_link( $paged = true ) {
  3.         $link = false;
  4.         if ( is_front_page() ) {
  5.                 $link = home_url( '/' );
  6.         } else if ( is_home() && "page" == get_option('show_on_front') ) {
  7.                 $link = get_permalink( get_option( 'page_for_posts' ) );
  8.         } else if ( is_tax() || is_tag() || is_category() ) {
  9.                 $term = get_queried_object();
  10.                 $link = get_term_link( $term$term->taxonomy );
  11.         } else if ( is_post_type_archive() ) {
  12.                 $link = get_post_type_archive_link( get_post_type() );
  13.         } else if ( is_author() ) {
  14.                 $link = get_author_posts_url( get_query_var('author'), get_query_var('author_name') );
  15.         } else if ( is_single() ) {
  16.                 $link = get_permalink( $id );
  17.         } else if ( is_archive() ) {
  18.                 if ( is_date() ) {
  19.                         if ( is_day() ) {
  20.                                 $link = get_day_link( get_query_var('year'), get_query_var('monthnum'), get_query_var('day') );
  21.                         } else if ( is_month() ) {
  22.                                 $link = get_month_link( get_query_var('year'), get_query_var('monthnum') );
  23.                         } else if ( is_year() ) {
  24.                                 $link = get_year_link( get_query_var('year') );
  25.                         }
  26.                 }
  27.         }
  28.         if ( $paged && $link && get_query_var('paged') > 1 ) {
  29.                 global $wp_rewrite;
  30.                 if ( !$wp_rewrite->using_permalinks() ) {
  31.                         $link = add_query_arg( 'paged', get_query_var('paged'), $link );
  32.                 } else {
  33.                         $link = user_trailingslashit( trailingslashit( $link ) . trailingslashit( $wp_rewrite->pagination_base ) . get_query_var('paged'), 'archive' );
  34.                 }
  35.         }
  36.         echo '<link rel="canonical" href="'.$link.'"/>';
  37. }
  38. add_action('wp_head', 'cx_archive_link');

然后打开主题的头部文件(一般情况下为header.php)在其中添加以下代码:

  1. <?php
  2. if(is_home()) { ?>
  3. <link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
  4. <?php } ?>
  5. <?php
  6. if(is_category()) { ?>
  7. <link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
  8. <?php } ?>
  9. <?php
  10. if(is_single()) { ?>
  11. <link rel="canonical" href="<?php the_permalink(); ?>"/>
  12. <?php }?>
  13. <?php
  14. if(is_tag()) { ?>
  15. <link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
  16. <?php }?>

这样就实现了在wordpress网站上添加了canonical标签,集中网站权重。

直接调用canonical标签

其实,在 WordPress 2.9 发布之后,WordPress 已经默认支持这一标签了,我们无需做任何动作,主题就支持这一标签。
如果我们要在文章也添加canonical标签,则在header.php中添加如下代码:

  1. <?php if(is_single()){?>  
  2. <link rel="canonical" href="<?php echo get_permalink($post->ID);?>" />  
  3. <?php } ?>  
  4. <?php if(is_home()){?>  
  5. <link rel="canonical" href="<?php echo esc_url( home_url( '/' ) ); ?>" />  
  6. <?php } ?>  

以上是文章页和主页的,其他页面只要相应添加即可。大概就是这么个意思,这种方式应该比较好,不过思享比较小白,找不到对应的函数,呜呜~
还要说明一下在 WordPress 的源文件 wp-includes/default-filters.php 中如下代码:

  1. add_action( 'wp_head', 'rel_canonical' );  

rel_canonical()就是WordPress调用的函数,以此来输出 rel=”canonical” 标签的 HTML 代码的。 如果你还想使用以前自己的方法,那么你可以通过下面代码屏蔽掉它:

  1. remove_action( 'wp_head', 'rel_canonical' );  

如果使用插件来输出 Canonical 标签,而又没有在 WordPress 中屏蔽默认的 filter 的话,则会输出重复的 Canonical 标签。

推荐阅读

静态URL和动态URL优化有什么区别?

无论你是静态还是动态,我们都认为同样都是url来对待。...

url中使用#号好不好?

一般来说,url当中的#号是一个锚点的标志位,这样的url打开之后会将访问者的视线定位在指定位置上,令访问者直接看到网页中间的一段内容。自从推特流行开始,#号被附予了新的意义——话题。很多站长直接在#号后面加参数且参数是有效的,即#号去掉与不去掉,打......

用中文URL利于SEO优化吗?

转码时,中文会变成一堆符号,不利于传播,用户反而无法从URL中判断网页的内容。...