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

functions.php添加代码
remove_action( 'wp_head', 'rel_canonical' );
function my_rel_canonical() {
global $post;
if (is_single() || is_page()) {
echo "<link rel=\"canonical\" href=\"" . get_permalink( $post->ID ) . "\" />\n";
}
if (is_home() && is_paged()) {
echo "<link rel=\"canonical\" href=\"".home_url("/")."\" />\n";
}
if (is_category() || is_category() && is_paged()) {
echo "<link rel=\"canonical\" href=\"".get_category_link(get_query_var('cat'))."\" />\n";
}
if (is_tag() || is_tag() && is_paged()) {
echo "<link rel=\"canonical\" href=\"".get_term_link(get_query_var('tag'), 'post_tag')."\" />\n";
}
if (is_search() || is_search() && is_paged()) {
echo "<link rel=\"canonical\" href=\"".get_search_link(get_query_var('search'))."\" />\n";
}
if (is_author()) {
echo "<link rel=\"canonical\" href=\"".get_option('home')."\" />\n";
}
if (is_date()) {
echo "<link rel=\"canonical\" href=\"".get_option('home')."\" />\n";
}
}
add_action('wp_head', 'my_rel_canonical');
思享目前就是用的这个代码,添加于fufunctions.php文件中即可
值得注意的是,以上代码主页的首选连接是带“/”的,如需去除,将home_url("/")中的“/”删除即可
除此之外,思享还搜集了两种修改方法
获取链接函数然后调用
首先在functions.php文件中添加分类目录分页链接获取函数,代码如下:
/* wordpress中使用canonical标签
function cx_archive_link( $paged = true ) {
$link = false;
if ( is_front_page() ) {
$link = home_url( '/' );
} else if ( is_home() && "page" == get_option('show_on_front') ) {
$link = get_permalink( get_option( 'page_for_posts' ) );
} else if ( is_tax() || is_tag() || is_category() ) {
$term = get_queried_object();
$link = get_term_link( $term, $term->taxonomy );
} else if ( is_post_type_archive() ) {
$link = get_post_type_archive_link( get_post_type() );
} else if ( is_author() ) {
$link = get_author_posts_url( get_query_var('author'), get_query_var('author_name') );
} else if ( is_single() ) {
$link = get_permalink( $id );
} else if ( is_archive() ) {
if ( is_date() ) {
if ( is_day() ) {
$link = get_day_link( get_query_var('year'), get_query_var('monthnum'), get_query_var('day') );
} else if ( is_month() ) {
$link = get_month_link( get_query_var('year'), get_query_var('monthnum') );
} else if ( is_year() ) {
$link = get_year_link( get_query_var('year') );
}
}
}
if ( $paged && $link && get_query_var('paged') > 1 ) {
global $wp_rewrite;
if ( !$wp_rewrite->using_permalinks() ) {
$link = add_query_arg( 'paged', get_query_var('paged'), $link );
} else {
$link = user_trailingslashit( trailingslashit( $link ) . trailingslashit( $wp_rewrite->pagination_base ) . get_query_var('paged'), 'archive' );
}
}
echo '<link rel="canonical" href="'.$link.'"/>';
}
add_action('wp_head', 'cx_archive_link');
然后打开主题的头部文件(一般情况下为header.php)在其中添加以下代码:
<?php
if(is_home()) { ?>
<link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
<?php } ?>
<?php
if(is_category()) { ?>
<link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
<?php } ?>
<?php
if(is_single()) { ?>
<link rel="canonical" href="<?php the_permalink(); ?>"/>
<?php }?>
<?php
if(is_tag()) { ?>
<link rel="canonical" href="<?php echo v7v3_archive_link();?>"/>
<?php }?>
这样就实现了在wordpress网站上添加了canonical标签,集中网站权重。
直接调用canonical标签
其实,在 WordPress 2.9 发布之后,WordPress 已经默认支持这一标签了,我们无需做任何动作,主题就支持这一标签。
如果我们要在文章也添加canonical标签,则在header.php中添加如下代码:
<?php if(is_single()){?>
<link rel="canonical" href="<?php echo get_permalink($post->ID);?>" />
<?php } ?>
<?php if(is_home()){?>
<link rel="canonical" href="<?php echo esc_url( home_url( '/' ) ); ?>" />
<?php } ?>
以上是文章页和主页的,其他页面只要相应添加即可。大概就是这么个意思,这种方式应该比较好,不过思享比较小白,找不到对应的函数,呜呜~
还要说明一下在 WordPress 的源文件 wp-includes/default-filters.php 中如下代码:
add_action( 'wp_head', 'rel_canonical' );
rel_canonical()就是WordPress调用的函数,以此来输出 rel=”canonical” 标签的 HTML 代码的。 如果你还想使用以前自己的方法,那么你可以通过下面代码屏蔽掉它:
remove_action( 'wp_head', 'rel_canonical' );
如果使用插件来输出 Canonical 标签,而又没有在 WordPress 中屏蔽默认的 filter 的话,则会输出重复的 Canonical 标签。