hreflang属性を使って言語情報を設定する
Search Consoleの「インターナショナルターゲティング」の言語の項目で「サイトにhreflangタグがありません」というエラーが出ないようにしました。これはnetやcomなどの汎用のドメインを使っている場合の、地域ターゲティングの国の情報とも関連があるようで、間違った国を設定しているとSEOに影響しそうです。
hreflang属性の使用の目的
グーグルのSearch Consoleを使っていると「インターナショナル ターゲティング」の言語の項目で「サイトにhreflangタグがありません」というエラーメッセージが出ていました。これはどういうことでしょうか。
hreflang属性は、日本語と英語などの2ヶ国語サイトを運用している場合に、 グーグル楽天 の検索ロボットに適切な言語のページがあることを伝えるのに必要なもののようです。
既にページ内にはlang属性を使って言語の設定をしているからhreflangタグは要らないように思えますが、グーグル検索ロボットはlang属性を無視してしまうのです。
もし、日本語だけのサイトであれば、hreflangタグが無くても特に問題ないと思います。
地域ターゲティングの情報の不具合
Search Consoleの「インターナショナル ターゲティング」の国の項目で、私のgTLDドメインのサイトで、設定したことがないのに、勝手に地域ターゲティングの情報の国が「アメリカ合衆国」になっていました。
私のgTLDドメインは net なので、地域ターゲティングがデフォルトで「アメリカ合衆国」になっていたのかも知れません。私はこれを知らなかった為か、最近検索で上位に表示されない傾向が続いていました。
Search Consoleには、次のようにも書かれていたので、hreflangタグが無かった為の不具合かも知れないと思いました。
お客様のサイトで汎用的なトップレベル ドメイン(.com、.org など)が使用されている場合は、地域ターゲティングの情報を基に Google では検索結果へのお客様サイトの表示方法を決定できます。地域ターゲティングにより、地域に関連する検索結果の精度も向上します。お客様のサイトを特定の地域に関連付けたくない場合は、[指定なし] を選択してください。
とにかく、hreflang属性を適切に設置しておいた方が良いようです。SEOにも影響しそうです。もちろん、地域ターゲティングの情報の国は「指定なし」に設定しました。
linkタグにhreflang属性を指定する方法
日本語の他に同じ内容の英語のウエブページがある場合、日本語のウエブページのheadタグ内のlinkタグにhreflang属性を指定するには、headタグ内に次のように書きます。
altarnate というのは、「代わりの」ページという意味で、個々の日本語ページに該当する英語ページを指定しなければならず、英語のトップページを指定するものではありません。
<link rel="alternate" hreflang="en" href="https://example.com/en/***/example.php" />
ここで、言語が英語のページの場合には hreflang="en" を、 hreflang="ja" にします。また、該当する日本語のページへのURLを適切に設定します。つまり、私の場合は次のように「/en」を削除してやりました。
<link rel="alternate" hreflang="ja" href="https://example.com/***/example.php" />
また、ここで注意することは、日本語のページも英語のページも、上記の記述はこの2行共必要だということです。altarnate
の意味からするとおかしいようですが、この2行を記述してください。次のグーグルの Search Console のヘルプページに、このことが詳しく書かれています。
言語や地域のURLにhreflangを使用する
PHPで各ページにhreflang属性を適切に設置する方法
これを実現するには、 PHP楽天 を使って、全てのページで同じスクリプトを使用して、各ページのURLなどを自動的に取得して設定します。
日本語ページに設置する実際のPHPスクリプト
日本語のページに設置する、実際のPHPスクリプトは次のようになりました。
<link rel="alternate" hreflang="ja" href="<?php echo "https://".$_SERVER['SERVER_NAME'].$rq_uri; ?>" /> <?php $en_name='/en'.$rq_uri; $en_name1='/en'.$_SERVER['SCRIPT_NAME']; if (file_exists('..'.$en_name1) or file_exists('.'.$en_name1)) { ?> <link rel="alternate" hreflang="en" href="<?php echo "https://".$_SERVER['SERVER_NAME'].${en_name}; ?>" /> <?php } ?>
ここで、 $_SERVER['SCRIPT_NAME'] は、そのページのURLからドメイン名までを削除したものです。URLが https://example.com/***/example.php なら /***/example.php となります。
$rq_uri の部分について説明すると、$_SERVER['REQUEST_URI']部分はURL部の後半(/***/example.php等)を表しています。ファイル名がindex.phpの場合は、index.phpが除かれています。そこで、この部分を変更し正規表現を使って、次のように「?」以降のパラメータなどを取り除いたものを使いました。
<?php $rq_uri = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']); ?>
次に $en_name には、「/en」を付加したものを設定しています。これが英語ページへのアドレスです。
実際に英語のページが存在するかどうかをPHPで確かめて、存在した場合のみ、linkタグでhreflang属性を設定するようにしています。
かなり、複雑なスクリプトとなりましたが、これは、index.phpの有無を Google のSearch Console が別ページと判断して、 hreflang の設定で一部がエラーになったので、これを回避した為です。
英語ページに設置する実際のPHPスクリプト
英語のページに設置する、実際のPHPスクリプトは次のようになりました。
<link rel="alternate" hreflang="en" href="<?php echo "https://".$_SERVER['SERVER_NAME'].$rq_uri; ?>" /> <?php $p_name=substr($rq_uri,3); $p_name1=substr($_SERVER['SCRIPT_NAME'],3); if (file_exists('..'.$p_name1)) { ?> <link rel="alternate" hreflang="ja" href="<?php echo "https://".$_SERVER['SERVER_NAME'].${p_name}; ?>" /> <?php } ?>
ここで、$p_nameは substr() の機能を使って、 $_SERVER['SCRIPT_NAME'] から /en の3文字を取り除いています。
そして、ひとつ上のディレクトリーに上がってファイルが実際に存在するかどうかを確認しています。ファイルが存在した場合のみ、linkタグでhreflang属性を設定するようにしています。
Search Consoleでエラーが無いかどうかを確認する
linkタグにhreflang属性を設置したら、何日かしてSearch Consoleで「インターナショナル ターゲティング」の言語の項目がエラーになっていないかどうかを確認しましょう。エラーを修正してもエラーが消えるのに2ヶ月以上掛かるようです。気長に待ちましょう。