アーカイブページへcanonicalタグを出力するコード例

公開日:2025(令和7)年9月3日/最終更新日:

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

canonicalタグは、平たく言えば「このページの正しいURLはこれですよ!」と明示するためのHTMLタグで、出力しておくことで検索エンジンに正しいURLを伝える効果があるということは、このページにたどり着いた方はご存じですね。

ただ、WordPressでは標準で投稿・固定ページ・公開しているカスタム投稿タイプの個別ページでcanonicalタグの出力はされますが、以下のようなページでは出力されないため、特に複数に渡るアーカイブページではそれぞれのページの正確なURLを明示されていないことから、複数に渡るページが重複ページと判断され、検索エンジンの評価に影響が出ることがあります。

そこで今回はWordPressが自動で生成する以下のアーカイブページ(一覧ページ)に対して、複数ページが存在する場合も考慮してcanonicalタグを出力するためのコード例を紹介します。

  • 投稿の一覧(ブログ一覧)
  • カテゴリーに紐づく投稿の一覧(カテゴリーアーカイブ)
  • タグに紐づく投稿の一覧(タグアーカイブ)
  • カスタムタクソノミーに紐づく投稿の一覧(タクソノミーアーカイブ)
  • 投稿者の投稿一覧(投稿者アーカイブ)
  • 日付に基づく投稿一覧(日付アーカイブ)
  • 検索に合致する投稿一覧(検索結果ページ)

アーカイブなどのcanonicalタグを出力するコード

コードを追加する前に、以下の手順で確認をしながら進めることをおすすめします。

WordPress標準のcanonicalタグ出力機能が動作しているかを確認する

本ページのコードを追加する前に、通常の投稿や固定ページの個別ページできちんと出力されるかを確認します。

本ページで紹介するコードではその部分には一切触れていませんので、出力されない場合は他のコードやプラグイン、テーマなどで制御されている可能性がありますから確認し出力するように訂正するか、独自に出力するコードを追加する必要があります(本ページではその部分はWordPress標準のタグ出力が有効である前提ですので、その部分のコードは紹介していません)。

アーカイブページでcanonicalタグが出力されていないことを確認する

テーマやプラグインの機能によって、既に冒頭で紹介したようなアーカイブページ(一覧ページ)でcanonicalタグが出力されているかどうかを確認します(確認手順は個別ページと同じです)。

もしも既に出力されている場合、本ページのコードを追加すると重複して出力されることになりますので、どちらの機能を優先するかを判断してください。

WordPressで標準出力されないページでのcanonicalタグ出力を行うコードを追加する

上記の2点を確認いただいた上で、冒頭で紹介したような条件でよければ、以下を有効化しているテーマのfunctions.phpへ追加するだけで機能します。

コードを使用する前に、ここをクリックして注意事項をご確認ください

本ページで掲載しているコードは、以下に了承した上で使用ください

  • コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
  • コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
  • コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
  • コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
  • 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
  • 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
/*** WordPressが標準で出力しないページでcanonicalタグを出力する ***/
/* 標準では単一ページ(投稿・カスタム投稿タイプ)、固定ページは自動出力 */
function pwcn_output_canonical_archives() {
	global $paged;
	$canonical_url = '';

	// ブログ一覧ページ
	if ( is_home() ) {
		$canonical_url = home_url();
	} 
	// カテゴリーアーカイブ
	elseif ( is_category() ) {
		$term = get_queried_object();
		$canonical_url = get_category_link( $term->term_id );
	} 
	// タグアーカイブ
	elseif ( is_tag() ) {
		$term = get_queried_object();
		$canonical_url = get_tag_link( $term->term_id );
	}
	// カスタムタクソノミーアーカイブ
	elseif ( is_tax() ) {
		$term = get_queried_object();
		$canonical_url = get_term_link( $term->term_id, $term->taxonomy );
	}
	// 投稿者アーカイブ
	elseif ( is_author() ) {
		$author_id = get_queried_object_id();
		$canonical_url = get_author_posts_url( $author_id );
	}
	// 日付アーカイブ
	elseif ( is_date() ) {
		if ( is_day() ) {
			$canonical_url = get_day_link( get_the_time('Y'), get_the_time('m'), get_the_time('d') );
		} elseif ( is_month() ) {
			$canonical_url = get_month_link( get_the_time('Y'), get_the_time('m') );
		} elseif ( is_year() ) {
			$canonical_url = get_year_link( get_the_time('Y') );
		}
	}
	// 検索結果ページ
	elseif ( is_search() ) {
		$canonical_url = get_search_link();
	}

	// ページネーション対応
	if ( $canonical_url && $paged > 1 ) {
		$canonical_url = trailingslashit( $canonical_url ) . 'page/' . $paged . '/';
	}

	// canonicalタグを出力
	if ( $canonical_url ) {
		echo '<link rel="canonical" href="' . esc_url( $canonical_url ) . '">' . "\n";
	}
}
add_action( 'wp_head', 'pwcn_output_canonical_archives' );

パーマリンク設定で「カテゴリーベース」や「タグベース」の指定を異なるものにしている場合や、WordPress標準でないスラグ構造を何等かの形で指定しているサイトでは正常に動作しない可能性がありますのでご注意ください。

コード追加後は確認を必ず行いましょう

コード追加してハイ終わり..ではなく、きちんとcanonicalタグが出力されているかを必ず確認してください。また、2重に出力されているページがないかも確認してください(確認は各自の仕事ですよ)。

もう一度書いておきますが、本ページのコードを追加すると以下のページでcanonicalタグが出力されます。

  • 投稿の一覧(ブログ一覧)
  • カテゴリーに紐づく投稿の一覧(カテゴリーアーカイブ)
  • タグに紐づく投稿の一覧(タグアーカイブ)
  • カスタムタクソノミーに紐づく投稿の一覧(タクソノミーアーカイブ)
  • 投稿者の投稿一覧(投稿者アーカイブ)
  • 日付に基づく投稿一覧(日付アーカイブ)
  • 検索に合致する投稿一覧(検索結果ページ)

私の知る限りではこれ以外に一覧(アーカイブ)ページは存在しないと把握しているので、それ以外のものがあるようでしたら、コードをよく読んで条件を追加してくださいね。

それぞれのアーカイブページでコード中のどの部分が適用されているかを確認する方法

本ページで紹介したコードでは、それぞれのアーカイブに合ったWordPress組み込み関数を使ってURLを取得しています。

例としてカテゴリーの場合は以下の部分がひと塊になります。

	// カテゴリーアーカイブ
	elseif ( is_category() ) {
		$term = get_queried_object();
		$canonical_url = get_category_link( $term->term_id );
	} 

この部分の先頭行にすべて「//」を付ければそのアーカイブに対してcanonicalタグを出力する機能が無効になるので、出力したくないアーカイブでは無効化することもできますし、一時的に無効にして、確実に機能が有効/無効になるかの確認もできます。

ページ送り(複数ページ)のそれぞれのページに出力する仕組み

このコードでは、それぞれの条件で適切なURLを取得した後に、以下の部分でページ番号を取得してスラグ(URLの一部)を付け足すことで、すべてのページの正しいURLを取得するようにしています。

	// ページネーション対応
	if ( $canonical_url && $paged > 1 ) {
		$canonical_url = trailingslashit( $canonical_url ) . 'page/' . $paged . '/';
	}

コードでは2ページ目以降について、標準のページスラグである「/page/ページ番号/」をそれぞれのアーカイブ名スラグの後ろに付けるようにして、本来のURLと同一になるようにしていますが、何かの設定でそうした形態でない場合には、以下のコードを編集する必要がありますからご注意ください。

, , , , , , , , , , , , , , , , , , , , , , ,
Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)
スペーサーブロックをレスポンシブ対応にする方法(プラグインなし)