WordPressのパーマリンク設定がデフォルト(動的URL)の場合の重複コンテンツ対策
WordPressのパーマリンク設定がデフォルト(URLがhttp://サイト名/?p=123の形式)で運用しているサイトの重複コンテンツ対策は簡単ではありません。何故なら存在しないURLでもHTMLレスポンスコードの200を返して、あたかもページが存在するように振舞う場合があり、プラグインでは対策不可。結局ソースを弄って対策しましたが、その方法について紹介します。
あなたのWordpressサイトは重複コンテンツ対策できていますか?
以下のテストで重複対策できているのか、ご確認ください。
1. http://www.exapmle.com/?p=123 ・・・個別記事のURLです。※ ドメイン名や記事IDは適宜ご自分のサイト名のものに修正してください。
1-1. http://www.exapmle.com/?p123 ・・・イコールを抜きます。
2. http://www.exapmle.com/?m=2014 ・・・2014年の記事を新しい記事の順に表示します。
2-1. http://www.exapmle.com/?m2014 ・・・イコールを抜きます。
3. http://www.exapmle.com/?m=2014&paged=2 ・・・2014年の記事を新しい記事の順に表示したときの2ページ目を表示します。
3-1. http://www.exapmle.com/?m2014&paged=2 ・・・イコールを抜きます。
4. http://www.exapmle.com/?cat=5 ・・・カテゴリの記事を新しい記事の順に表示します。 ※ カテゴリのIDはご自分のサイトでカテゴリをクリックすると分かります。
4-1. http://www.exapmle.com/?cat5 ・・・イコールを抜きます。
5. http://www.exapmle.com/?cat=5&paged=2 ・・・カテゴリの記事を新しい記事の順に表示したときの2ページ目を表示します。
5-1. http://www.exapmle.com/?cat5&paged=2 ・・・イコールを抜きます。
これらの上記テストで下線を引いたURLは存在しないURLなので、「ページが存在しない」と表示されればOK。
もし、何事も無くページが表示されるなら、マウスで右クリックしてソースを表示し、「canonical」をいう文字を検索します。
そして「canonical」が示すURLが正しければOK。しかし、「canonical」をいう文字が無かったり、URLが間違っていた場合は重複エラーになっています。そして、ほとんどのパーマリンクをデフォルトで運用しているWordpressのサイトでは2-1、3-1、4-1、5-1のテストでNGになります。
そもそも重複コンテンツはなぜダメなの?
重複コンテンツがあるとサイトの品質が低いと評価されてGoogleの掲載順位が下がります。これはパンダアップデートが導入されたときから言われていたことですが、実際にウェブマスターツールの「HTMLの改善」に重複したURLが表示され、管理者に重複コンテンツの修正を促しています。
下の画面は4ヶ月前に重複コンテンツの対策をしたときのウェブマスターツールの「HTMLの改善」画面ですが、存在しないデタラメな文字列のURLなのに404(ページが存在しない)を返さないで200(ページが存在する)を返しているため、重複コンテンツとして認識されています。
簡単に解決できるか!?
重複コンテンツを解決する定番の方法は、対策用のプラグインを入れることですが、パーマリンクをデフォルトで運用しているWordpressではこの方法が使えません。私は定番のプラグインである「WordPress SEO by Yoast」と「All in One SEO Pack」を確認しただけですが、前者は上記テストの2でNG(m=2012を指定してもcanonicalは最新の年である2014を引っ張って来てしまう)、後者は動的URLに対応していないため、URLの&が/になってしまいました。
※ 他にも重複対策用のプラグインがありますが、上記以外のプラグインは調べていません。もしかしたら、それで解決できる可能性はあります。
重複コンテンツ対策
基本的な対策は以下の2つ。
存在しないページにはHTTPステータスコード404を返し、それが不可能な場合には重複したページにcanonicalを挿入します。
① 存在しないページとしてHTTPステータスコード404を返す。
functon.phpに以下を追加します。
function check_invalid_query_vars( $wp ) { global $wp_query; if ( ! is_admin() && $wp_query->is_main_query() ) { foreach ( $wp->query_vars as $key => $val ) { $wp_query_var = (string)$wp_query->get( $key ); if ( $wp_query_var != $val ) { $wp_query->set_404(); status_header( 404 ); break; } } } } add_action( 'wp', 'check_invalid_query_vars' );
一番最後の?>の上にでも挿入すればOKです。
② canonicalを挿入する。
WordPressの個別記事は自動的にcanonicalが挿入されますが、それ以外は挿入されません。
そのため、日付やカテゴリ、そしてこれらが複数ページになった場合にcanonicalを挿入するようにします。
functon.phpに以下を追加します。
remove_action('wp_head', 'rel_canonical');
一番最後の?>の上にでも挿入すればOKです。
header.phpの<head>~</head>に以下を追加します。
<?php if ( is_home() ) { $canonical_url=get_bloginfo('url')."/"; if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'?paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php } else if (is_category()) { $canonical_url=get_category_link(get_query_var('cat')); if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'&paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php } else if (is_year()) { $canonical_url=get_year_link(get_the_time('Y')); if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'&paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php }else if (is_month()) { $canonical_url=get_month_link(get_the_time('Y'),get_the_time('m')); if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'&paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php } else if (is_day()) { $canonical_url=get_day_link(get_the_time('Y'),get_the_time('m'),get_the_time('d')); if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'&paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php } else if (is_page()||is_single()) { $canonical_url=get_permalink(); if ( $paged >= 2 || $page >= 2) { $canonical_url=$canonical_url.'&paged='.max( $paged, $page ); } ?> <link rel="canonical" href="<?php echo $canonical_url; ?>" /> <?php } ?>
私はTitleの下に挿入していますが、お好きな場所に入れてください。
但し、お約束ですが自己責任でお願いします。