WordPress:canonicalタグをプラグインなしで制御する

WordPress:canonicalタグをプラグインなしで制御する

テーマをゼロから作ってみる(10)です。有料無料問わず公開されているテーマやプラグインをできるだけ使わずにサイトを立ち上げてみようというプロジェクトです。この記事現在はまだ Genesis Framework を使っている状態です。

現在は SEO 対策進行中です。カテゴリーページや記事一覧ページは noindex にする予定でしたので canonical は考えていなかったのですが、index にしたほうがいいのではないかと思い始め、その場合は canonical を入れたほうがいいだろうということでその方法です。

01WordPress デフォルトの canonical タグ

現時点の最新の WordPress 6.1.1 では、投稿ページと固定ページに canonical タグが入ります。要は条件分岐タグ is_singular() に true を返す場合には canonical タグが挿入されるということです。

ただし、ややこしいケースがひとつあります。同じ固定ページでも、設定 > 表示設定 > ホームページの表示で固定ページを選択した場合、ホームページに選んだ固定ページは is_front_page() と is_singular() のいずれにも true を返しますので canonical タグが挿入されますが、投稿ページに選んだ固定ページは is_singular() には false を返し、is_home() に true を返しますので canonical タグは表示されません。

02現在のサイト構成

現在のサイト構成を整理します。下のリンク先にデモサイトがあります。

  • ゼロから作る WordPress テーマ(現在停止中)

まず、現在の各ページとテンプレートファイル、そして index, canonical の関係を整理してみます。言葉があれこれ入り乱れていますので、サイトのトップページは「ホームページ」、各記事ページは「投稿ページ」、記事一覧ページは「ブログページ」と統一することにします。

ページ名テンプレートindexcanonical
ホームページfront_page.phpmax-image-preview:large 自動自動出力
投稿ページsingle.phpmax-image-preview:large 自動自動出力
ブログページindex.php同上または
functions.phpでnoindex
functions.phpで出力
または何もしない
カテゴリーページindex.php同上または
functions.phpでnoindex
functions.phpで出力
または何もしない
検索ページ未定noindex
お問い合わせページ未定noindex

ブログページは新着順の記事一覧、カテゴリーページは各カテゴリーの記事一覧になりますので、現時点では noindex にすべきかどうか判断できていません。ですので canonical タグを functions.php で制御できるようにしておこうということです。

03canonical タグの出力

ホームページと投稿ページはデフォルトで canonical タグが出力されますので、wp_head アクションフックを使わずに index.php に直書きすることにします。

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<?php wp_head(); ?>
<link rel="canonical" href="<?php echo esc_url(get_imz_canonical_url()); ?>" />
</head>
(略)

get_imz_canonical_url() でページの url を取得します。

function get_imz_canonical_url(){
	if ( is_category() ) {
		$canonical = get_category_link( get_query_var('cat') );
	}else if(is_home()){
		$canonical = get_page_link(get_option('page_for_posts'));					
	}
	return $canonical;
}

04ショートリンク shortlink 削除

デフォルトでは投稿 ID のクエリ付き url がショートリンクとして挿入されています。必要ありませんので削除しておきます。functions.php に次のコードを書いておきます。

remove_action('wp_head', 'wp_shortlink_wp_head');

次は「JSON-LD による構造化データ出力」です。