Canonicalのカスタマイズ

PHP
WEBSITE制作
WEB関連
Wordpress

運用しているサイトで、
日本語/英語表示をパラメータで切り替えているものがある。

https:// ———-.com/?la=en

みたいな感じで英語表示をしているのですが、
まあ、最初は英語でも表示したいなぁ。みたいなのに対応したので、こういったパラメータによる日本語/英語の切り替えだったんですが、日は流れ、担当者が変わり、、、

気がつけば、英語サイトなのにcanonialが日本語と一緒なんだけど?なんで?
みたいなツッコミが入った。いや、前提が。。。

まあ、仕方が無いので対応。


まず、デフォルトのcanonicalタグを消さないといけない。
消し方は以下をfunctions.phpに記載

remove_action('wp_head', 'rel_canonical');

もし、Yoast SEO を入れている場合は、そちらを無効化する必要があり、

add_filter( 'wpseo_canonical', '__return_false' );

これを同じくfunctions.phpに記載。


そして、どう追加するか?ですが、
重要なのは、ページ種類によってURLの書き方が異なる事でしょうか。

切り分け例

if(is_404()){
  return;
}
//フロントページ
if (is_front_page() || is_home() ) {//--------o
  $canonical_url = home_url('/');
}
//カテゴリーページ
else if (is_category()){
  $cate = get_query_var('cat');
  $canonical_url = get_category_link($cate);
}
//タグページ
elseif (is_tag()) {
  $tag_id        = get_query_var('tag_id');
  $canonical_url = get_tag_link($tag_id);
}
//タクソノミーページ
elseif (is_tax()) {
  $term          = get_queried_object();
  $canonical_url = get_term_link($term);
}
//固定・投稿ページ
elseif (is_page() || is_single()) {//--------o
  $canonical_url = get_permalink();
}
//その他
else {
  $canonical_url = null;
}
echo '<link rel="canonical" href="'.$canonical_url.'">';

まず、header.phpに書くかfunctions.phpに書くか?
それはお好みですが、header.phpの場合は<head>内のお好きなところに。
functions.php の場合は、

function rel_canonical_add() {
  //ここに上記ソース
}
add_action( 'wp_head', 'rel_canonical_add', 99);

と言う感じですかね。

切り分け例」の詳しい解説は割愛しますが、
例えば、カテゴリページの場合、その他のタクソノミーページの場合、「get_permalink()」だと、先頭の投稿のURLが返ってきちゃう。(でしたっけ?間違ってたらすみません。)
なので、それぞれのリストページのURLを書き出す方法も変わってきちゃいます。固定ページや詳細ページなどの場合はシンプルに「get_permalink()」で書けたりしますね。

この辺りが肝で、ここさえわかれば、あとは自分の思うままに。
今回の当方の場合はURLにパラメータの「?la=en」が付いている場合はCanonial URLにも「?la=en」を付けたいので、
$_GETで「en」を受け取っていたら、それぞれのURLに「?la=en」を追加する処理をすれば良い。

「echo」の前に

  $lang = get_query_var('la');
  if ( $canonical_url && $lang == 'en' ) $canonical_url.'?la=en';

と書いておけばOKかな。
ちなみにWPで get_query_var(); で独自のパラメータを取得する場合、ちゃんと定期しておかないと取得できなかったりします。それに関して詳しくは以下を参照してください。

関数リファレンス/get query var

以上。

もし将来同じことで悩んだ自分。。または、どこかの誰かのヒントに。


その他参考サイト
WordPressでCanonical URLを設定する方法
【WordPress】canonicalタグを出力する関数を作る