多言語サイトに欠かせないhreflangタグを、プラグインを使わず動的に自動設定する記述の紹介です。
特定の記事や特定のカテゴリーを除外できます。
どこから読む?
記述の使い方
前提の環境
ここで紹介している記述は、以下の条件で多言語サイトを構築していサイト向けになります。
- 「サブディレクトリ」に各言語向けのサイトを構築している
- 各言語のスラッグ名は同一のものにしている
例えば、以下のようなURL構成で多言語サイトを構築しているならOKです。
- 日本語向けのサイト:https://sample.com/slag-name
- 英語向けのサイト:https://sample.com/en/slag-name
一方で、サブドメインで多言語サイトを作っている場合や、スラッグ名を統一していない場合には使えない記述となります。
ご注意ください。
記述する場所
ここで紹介する記述は、「head.php」に追記してお使いください。
以下に、各テーマを使用している場合の記述場所一例を説明します。
hreflangの記述場所はheader内ではなくhead内向けの記述です。
<head></head>の中に記述します。
子テーマ向けのカスタマイズです。
親テーマを編集した場合は、テーマアップデートの際などにカスタマイズ内容が消えてしまうのでご注意ください。
Cocoonの場合の記述場所
WordPressテーマCocoonをお使いの場合は、以下の場所に記述します。
外観>テーマファイルエディター>tmp-user>head-inserter.php
hreflangをプラグインなしで自動設定する方法
プラグインを使わずにhreflangタグを動的に各ページに自動設定する方法の紹介です。
hreflangタグを付けたくないページを指定する方法がいくつかあるので、お好きな場所から記述をコピペしてお使いください。
- 全ページにhreflangを自動設定
- 特定のカテゴリーを除外する
- 特定のカテゴリー&特定のスラッグ名を除外する
- 特定のカテゴリー&文字列が含まれるスラッグ名を除外する
- 指定カテゴリー・指定スラッグ・文字列含むスラッグ全てを除外する
全ページにhreflangを自動設定
以下の記述を使うと、サイト内の全ページにhreflangを自動挿入できます。
コピーしました!
<?php
$lang_list = [
['ja', '/'],
['en', '/en/'],
['x-default', '/'],
];
$base_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$current_url = $base_url . $_SERVER["REQUEST_URI"];
$home_url = esc_url(home_url('/'));
$page_url = str_replace($home_url, '', $current_url);
foreach($lang_list as $lang) {
$url = $base_url . $lang[1] . $page_url;
echo '<link rel="alternate" hreflang="'. $lang[0] .'" href="'. $url .'">' . "\n";
}
?>
動的に自動設定できるので、フロントページをはじめ、各記事やカテゴリーページなども含めたサイト内全てのページにhreflangタグを自動挿入できます。
サイト全体を多言語化している場合向けの記述です。
特定のカテゴリーを除外してhreflangを自動設定
以下の記述を使うと、「特定のカテゴリーの記事を除外した」全てのページにhreflangを自動挿入できます。
指定したカテゴリーに含まれる全ての記事に、hreflangが挿入されません。
カテゴリーは、スラッグまたはカテゴリーIDで指定できます。
コピーしました!
<?php
// 除外するカテゴリーをスラッグまたはIDで指定
// $exclude_categories = ['news', 'updates', 'events']; // スラッグの場合
$exclude_categories = [1, 2, 3]; // カテゴリーIDの場合
if(!is_category() &&
!in_category($exclude_categories)) { // 除外するカテゴリーの判定
$lang_list = [
['ja', '/'],
['en', '/en/'],
['x-default', '/'],
];
$base_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$current_url = $base_url . $_SERVER["REQUEST_URI"];
$home_url = esc_url(home_url('/'));
$page_url = str_replace($home_url, '', $current_url);
foreach($lang_list as $lang) {
$url = $base_url . $lang[1] . $page_url;
echo '<link rel="alternate" hreflang="'. $lang[0] .'" href="'. $url .'">' . "\n";
}
}
?>
上記のコードでは「カテゴリーIDを指定する」方法になっています。
カテゴリーのスラッグを指定したい場合は、コメントアウトを外してお好きな方をお使いください。
特定のカテゴリー&特定のスラッグを除外してhreflangを自動設定
以下の記述を使うと、「特定のカテゴリーの記事を除外する」に加えて、「特定のスラッグ名のページを除外」した全てのページにhreflangを自動挿入できます。
コピーしました!
<?php
// 除外するカテゴリーをスラッグまたはIDで指定
//$exclude_categories = ['news', 'updates', 'events']; // スラッグの場合
$exclude_categories = [1, 2, 3]; // カテゴリーIDの場合
$exclude_page_list = [
'abc',
'bca',
'cba',
];
if(!is_page($exclude_page_list) &&
!is_category() &&
!in_category($exclude_categories)) { // 除外するカテゴリーの判定
$lang_list = [
['ja', '/'],
['en', '/en/'],
['x-default', '/'],
];
$base_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$current_url = $base_url . $_SERVER["REQUEST_URI"];
$home_url = esc_url(home_url('/'));
$page_url = str_replace($home_url, '', $current_url);
foreach($lang_list as $lang) {
$url = $base_url . $lang[1] . $page_url;
echo '<link rel="alternate" hreflang="'. $lang[0] .'" href="'. $url .'">' . "\n";
}
}
?>
指定するスラッグ名は「完全一致」型です。
一文字でもスラッグ名が異なるスラッグは、除外対象にはなりません。
カテゴリー除外に加え、除外したい特定のページがいくつかある、といった場合向きの記述です。
特定のカテゴリー&含まれるスラッグ名を除外してhreflangを自動設定
以下の記述を使うと、「特定のカテゴリーの記事を除外する」に加えて、「スラッグに特定の文字を含むページを除外」した全てのページにhreflangを自動挿入できます。
コピーしました!
<?php
// 除外するカテゴリーをスラッグまたはIDで指定
//$exclude_categories = ['news', 'updates', 'events']; // スラッグの場合
$exclude_categories = [10, 9, 8]; // カテゴリーIDの場合
// 除外対象外とするスラッグに含まれる文字列を指定
$include_slug_keywords = [
'potato',
'apple'
]; // スラッグに含まれる文字列
if (
!is_category() && // カテゴリーページでない
!(
in_category($exclude_categories) && // 除外対象のカテゴリーに含まれる
!array_filter($include_slug_keywords, function ($keyword) {
$slug = get_post_field('post_name');
return strpos($slug, $keyword) !== false; // 文字列を含むか判定
})
)
) {
$lang_list = [
['ja', '/'],
['en', '/en/'],
['x-default', '/'],
];
$base_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$current_url = $base_url . $_SERVER["REQUEST_URI"];
$home_url = esc_url(home_url('/'));
$page_url = str_replace($home_url, '', $current_url);
foreach ($lang_list as $lang) {
$url = $base_url . $lang[1] . $page_url;
echo '<link rel="alternate" hreflang="' . $lang[0] . '" href="' . $url . '">' . "\n";
}
}
?>
「指定した文字列が含まれている」スラッグ名のページ、全てが除外対象になります。
スラッグ名を完全一致ではなく、「一定の文字列が含まれている」といった指定条件にしたい場合はこちらの記述をお使いください。
指定カテゴリー・指定スラッグ・文字列含むスラッグ全てを除外してhreflangを自動設定
上記で紹介したコードの「全部盛り」版です。
下記の条件に当てはまるページ全てを除外します。そして、下記の条件に当てはまらないページにのみhreflangを自動挿入します。
- 指定したカテゴリーに含まれている記事
- 指定したスラッグ名と完全一致するページ
- 指定した文字列を含んだスラッグ名のページ
コピーしました!
<?php
// 除外するカテゴリーをスラッグまたはIDで指定
//$exclude_categories = ['news', 'updates', 'events']; // スラッグの場合
$exclude_categories = [1, 2, 3]; // カテゴリーIDの場合
$exclude_page_list = [
'abc',
'bca',
'cba',
];
// 除外対象外とするスラッグに含まれる文字列を指定
$include_slug_keywords = [
'potato',
'apple'
]; // スラッグに含まれる文字列
if (
!is_page($exclude_page_list) && // 除外ページでない
!is_category() && // カテゴリーページでない
!(
in_category($exclude_categories) && // 除外対象のカテゴリーに含まれる
!array_filter($include_slug_keywords, function ($keyword) {
$slug = get_post_field('post_name');
return strpos($slug, $keyword) !== false; // 文字列を含むか判定
})
)
) {
$lang_list = [
['ja', '/'],
['en', '/en/'],
['x-default', '/'],
];
$base_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$current_url = $base_url . $_SERVER["REQUEST_URI"];
$home_url = esc_url(home_url('/'));
$page_url = str_replace($home_url, '', $current_url);
foreach ($lang_list as $lang) {
$url = $base_url . $lang[1] . $page_url;
echo '<link rel="alternate" hreflang="' . $lang[0] . '" href="' . $url . '">' . "\n";
}
}
?>
特定カテゴリーに含まれる記事を全て除外した上で、スラッグでの除外も細かく指定したい場合向けの記述になります。