はじめに

WordPressは「日付」「カテゴリー」「タグ」「著者」ごとに多彩なアーカイブページを自動生成します。
これらのページはサイト全体の構造を整理し、ユーザーの回遊性を高める重要な役割を担っています。

しかしながら、SEOの観点では以下のような課題が生じやすいため注意が必要です。

  • 重複コンテンツの発生
    同一の投稿リストが複数のURL(ページネーションや日付単位など)に分散し、検索エンジンによる評価が分散・低下してしまうこと。
  • 薄いコンテンツページの増加
    投稿数が少ないアーカイブページは内容が薄く評価が下がりやすく、サイト全体のSEOパフォーマンスを低下させるリスクがあります。

これらの課題を防ぐためには、適切なcanonicalタグの設定と必要に応じたnoindex制御が不可欠です。

本記事では、代表的な4種類のアーカイブページを対象に、ページネーション対応のcanonicalタグ出力と薄いページへのnoindex制御を、設計思想に沿って具体的なコード例と共に丁寧に解説します。


1. なぜアーカイブページのSEO対策が重要か?

重複コンテンツのリスク

WordPressのページネーション機能により、同じ投稿リストが異なる複数のURLで表示されることがあります。
これにより、Googleから重複コンテンツと判断され、評価が分散・低下してしまう可能性があります。

薄いコンテンツの問題

投稿数が少ないアーカイブページはコンテンツが薄くなりがちで、検索エンジンからの評価が下がりやすいです。
特に、投稿が極端に少ない日別アーカイブや最終ページは注意が必要です。


2. 対策の全体方針

  • WordPressの wp_head フックを利用し、該当するアーカイブページの条件に応じて動的にcanonicalタグとnoindexメタタグを出力します。
  • ページネーションのページ番号を含めた正規URLを指定し、重複コンテンツによる評価の分散を軽減します。
  • 投稿数が規定値以下、もしくは最終ページで投稿が極端に少ない場合はnoindexを付与し、薄いコンテンツが検索結果に表示されるのを防ぎます。

このようにして、ユーザー体験の向上とSEO評価の最適化を両立させます。


3. アーカイブ別SEO対策と実装例

WordPressが自動生成する代表的なアーカイブページ(日付・カテゴリー・タグ・著者)に対して、以下のポリシーに基づきSEO制御を実装します。

共通設計方針(全アーカイブ共通)

  • functions.php またはカスタムプラグインに設置可能
  • wp_head アクションフックでメタタグを動的出力
  • ページネーション対応の canonical タグを正規URLとして明示
  • 投稿数や最終ページの条件に応じて noindex,follow を付与

3-1. 日付アーカイブ(年・月・日)

ポイント

  • 正確なアーカイブURL取得
  • ページネーション対応のcanonicalタグ出力
  • 投稿数に応じてnoindex付与(例:日別1件以下、月別3件未満、最終ページ1件以下)
add_action('wp_head', 'custom_seo_tags_date_only', 1);

function custom_seo_tags_date_only() {
if (is_year() || is_month() || is_day()) {
output_canonical_for_date_archive();
}
output_noindex_for_date_or_paged();
}

function output_canonical_for_date_archive() {
if (is_year()) {
$base_url = get_year_link(get_query_var('year'));
} elseif (is_month()) {
$base_url = get_month_link(get_query_var('year'), get_query_var('monthnum'));
} elseif (is_day()) {
$base_url = get_day_link(get_query_var('year'), get_query_var('monthnum'), get_query_var('day'));
} else {
return;
}

if (is_paged()) {
$paged = max(1, get_query_var('paged'));
$canonical_url = ($paged > 1) ? trailingslashit($base_url) . 'page/' . $paged . '/' : $base_url;
} else {
$canonical_url = $base_url;
}

echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}

function output_noindex_for_date_or_paged() {
global $wp_query;

if (is_day() && $wp_query->found_posts <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
} elseif (is_month() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
} elseif (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;

if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}

if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}

3-2. カテゴリーアーカイブ

ポイント

  • カテゴリーURLを正確に取得
  • ページネーションに対応したcanonicalタグ出力
  • 投稿3件未満および最終ページ1件以下でnoindex
add_action('wp_head', 'custom_seo_tags_category_archive', 1);

function custom_seo_tags_category_archive() {
if (is_category()) {
output_canonical_for_category_archive();
output_noindex_for_category_or_paged();
}
}

function output_canonical_for_category_archive() {
$base_url = get_category_link(get_queried_object_id());

if (is_paged()) {
$paged = max(1, get_query_var('paged'));
$canonical_url = ($paged > 1) ? trailingslashit($base_url) . 'page/' . $paged . '/' : $base_url;
} else {
$canonical_url = $base_url;
}

echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}

function output_noindex_for_category_or_paged() {
global $wp_query;

if (is_category() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
} elseif (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;

if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}

if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}

3-3. タグアーカイブ

ポイント

  • タグURLを正確に取得
  • ページネーション対応のcanonicalタグを出力
  • 投稿3件未満や最終ページ投稿1件以下でnoindex設定
add_action('wp_head', 'custom_seo_tags_tag_archive', 1);

function custom_seo_tags_tag_archive() {
if (is_tag()) {
output_canonical_for_tag_archive();
output_noindex_for_tag_or_paged();
}
}

function output_canonical_for_tag_archive() {
$base_url = get_tag_link(get_queried_object_id());

if (is_paged()) {
$paged = max(1, get_query_var('paged'));
$canonical_url = ($paged > 1) ? trailingslashit($base_url) . 'page/' . $paged . '/' : $base_url;
} else {
$canonical_url = $base_url;
}

echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}

function output_noindex_for_tag_or_paged() {
global $wp_query;

if (is_tag() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
} elseif (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;

if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}

if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}

3-4. 著者アーカイブ

ポイント

  • 著者ページURLの正確な取得
  • ページネーション対応のcanonicalタグ出力
  • 投稿3件未満および最終ページ1件以下でnoindex設定
add_action('wp_head', 'custom_seo_tags_author_archive', 1);

function custom_seo_tags_author_archive() {
if (is_author()) {
output_canonical_for_author_archive();
output_noindex_for_author_or_paged();
}
}

function output_canonical_for_author_archive() {
$base_url = get_author_posts_url(get_query_var('author'));

if (is_paged()) {
$paged = max(1, get_query_var('paged'));
$canonical_url = ($paged > 1) ? trailingslashit($base_url) . 'page/' . $paged . '/' : $base_url;
} else {
$canonical_url = $base_url;
}

echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}

function output_noindex_for_author_or_paged() {
global $wp_query;

if (is_author() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
return;
}

if (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;

if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}

if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}

4-1. まとめ

WordPressの代表的なアーカイブページ「日付」「カテゴリー」「タグ」「著者」に対し、
ページネーション対応の正規canonicalタグを動的に出力し、重複コンテンツの評価分散を防止します。
また、投稿数に応じてnoindexを設定し、薄いコンテンツの検索結果表示を回避。

この設計に基づいた実装は、functions.phpやカスタムプラグインに追加するだけで簡単に導入可能です。
SEOリスクの軽減と、読者に信頼されるブログ構造の実現に役立ちます。


4-2. 今後の運用とお問い合わせ

SEO対策はブログの信頼性を高め、長期的な成果を支える重要な要素です。
運用に関してご不明点やご相談があれば、お問い合わせフォーム よりお気軽にご連絡ください。
専門スタッフが最適なサポートを提供いたします。