WordPressをhttps化(SSL接続)でcanonicalがhttpsにならないと・・・

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に統合したい時は逆になります。