WordPressをhttps化(SSL接続)をしたときに、ページのcanonicalもhttps化しておく必要があります。通常は、サイトの一般設定を変更すれば修正されるはずですが、なぜか修正されない・・・そんな時には無理やりcanonicalをhttps化するしかありません。
そもそも canonicalとは?
和訳すると、「正典の、教会法に基づく、規準的な、標準的な」(形容詞)です(笑)
例えば、当ページで
【All in One SEO】の設定はこれで決定!検索上位サイトの設定内容を比較した このURLは
https://11html.com/plugin/all-in-one-seo/
となっています。
ところが、何の設定もしないと
https://11html.com/plugin/all-in-one-seo/【All in One SEO】の設定はこれで決定!検索上位サイトの設定内容を比較した【All in One SEO】の設定はこれで決定!検索上位サイトの設定内容を比較したhttps://11html.com/plugin/all-in-one-seo/
または
https://11html.com/?post=678
とかなども表示されてしまう場合があります。
あるいは、同一サイト上でも
◎ 新着情報にも本文の一部が表示される。(が本文ではない)
◎ 検索結果にも本文の一部が表示される。(上記と同一だが、本文ではない)
また、他サイトでも
◎ facebookにも本文の一部が表示される。
◎ Google+にも本文の一部が表示される。
◎ twitterにも本文の一部が表示される。
◎ RSSでパクられたサイトにも本文の一部(または全部)が表示される。
などの状況が発生することが考えられます。
こういった時に、「大元の文章はココであり、検索結果に本来表示するURLはこうだ」としておく必要があります。
この「正当性を保つ」のがcanonicalタグということになります。
つまり、類似するページや動的に生成されたページがある場合に「唯一絶対の存在」であり、検索結果に表示するURLを指し示すために使われます。
canonicalの設置方法
All in One SEOで設置する。
【All in One SEO】の設定はこれで決定!検索上位サイトの設定内容を比較したもご参照ください。
All in One SEOでcanonicalをチェックすると、
内の上部にきちんと設置をしてくれます。テーマが勝手に設置する
テーマによっては、勝手にcanonicalを設置します。
「賢威」などは、さすがです。下記のように、ほぼ先頭に配置してくれます。
<title>WordPress活用研究所</title> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="canonical" href="<span class="red b">賢威が設置してくれるcanonicalURL</span>" />
ですのでテーマでcanonicalを設置している場合は、重複しないようにします。
header.phpに自分で設置する
もともとテーマで設置されているcanonicalを削除してから・・・という場合は、
remove_action('wp_head', 'rel_canonical');
これをfunctions.phpに記載しておきます。
その上で、下記のコードをheader.phpのなるべく上部に記載します。
<?php if ( is_singular() ) echo '<link rel="canonical" href="' . get_permalink() . '" />'; ?>
強制的に・・無理やりhttps化する
サイト全体をhttps化させて、一般設定も下記のようにhttpsにして保存しておくと、それまでのcanonicalも基本的にはhttps化されます。
テスト的にcanonicalだけhttpにしておきたいとか、なぜかわからないがhttpのままなので、httpsにしたいという場合は、functions.phpに下記のように記載します。
add_action ( 'wp_head' , 'my_rel_canonical' ) ; function my_rel_canonical () { ob_start () ; rel_canonical () ; $rel_content = ob_get_contents () ; ob_end_clean () ; echo str_replace ( "http:" , "https:" , $rel_content ) ; }
最後のstr_replace で文字の入れ替えをしていますので、httpに統合したい時は逆になります。