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ヶ月以上掛かるようです。気長に待ちましょう。