カテゴリ・タグの重複対策|SEOを強くする正しい分類ルール

WordPressサイトを運営していると、「RSSやタグ、カテゴリ、アーカイブページが検索結果に表示されてほしくない」と思うことがあります。特に、ページ分割やソート機能によって生成されるURLにクエリパラメータが付くと、Googleから「重複コンテンツ」とみなされる可能性があります。この記事では、初心者から開発者向けまで、重複ページを正しく扱う方法を解説します。

1 なぜ重複ページを避けるのか?

RSS、タグ、カテゴリページは本文が少なく、同じ内容のページが複数存在する場合があります。Googleはこうしたページを「価値の低いページ」と判断し、SEO評価に影響することがあります。

2 対象となるURLの例

  • クエリパラメータ付きページ:https://example.com/category/tips?order=ASC
  • RSSフィード:https://example.com/category/tips/feed
  • ページ分割:https://example.com/category/tips/page/2

3 初心者向け対策

3.1 1. metaタグで noindex を設定する

(Lightningテーマ)ファイル名:header.php
保存先:wp-content/themes/child-theme/g2/header.php

(汎用テーマ、Cocoonテーマ)ファイル名:header.php
保存先:wp-content/themes/child-theme/header.php

ページの <head> 内に noindex を追加すると、Googleにインデックスさせないことができます。

<meta name="robots" content="noindex, nofollow">

3.2 ディレクトリ構造

  • child-theme/
    • g2/
      • header.php←Lightningテーマ
    • archive.php
    • category.php
    • functions.php
    • footer.php
    • header.php←汎用テーマ、Cocoonテーマ
    • style.css
    • js/
      • loading.js

3.3 2. functions.php で自動追加する場合


//---------------------------------------------
// RSS・タグ・カテゴリページをインデックスさせない
//---------------------------------------------
function add_noindex_for_feeds_tags_categories() {
    if (is_feed() || is_tag() || is_category()) {
        echo '<meta name="robots" content="noindex, nofollow">' . "\n";
    }
}
add_action('wp_head', 'add_noindex_for_feeds_tags_categories');
  

ポイント: is_feed() → RSS、is_tag() → タグ、is_category() → カテゴリページに適用されます。

3.4 3. SEOプラグインを利用する場合

  • Yoast SEO:カテゴリ・タグページで「検索で表示させない」にチェック
  • Rank Math:投稿タイプごとに noindex 設定可能

3.5 4. robots.txt でクロールを補助的に制御

ファイル名:robots.txt
保存先:wp-content/themes/child-theme/robots.txt


User-agent: *
Disallow: /category/
Disallow: /tag/
Disallow: /feed/
  

注意:既にクロール済みのURLは robots.txt だけでは完全にインデックスを防げません。meta noindex と併用するのが確実です。

3.2 ディレクトリ構造

  • child-theme/
    • archive.php
    • category.php
    • functions.php
    • footer.php
    • header.php
    • style.css
    • robots.txt

4 中級者向け対策

4.1 canonicalで正規ページを指定する

タグやカテゴリページに canonical を設定して、検索エンジンに「このページは他のページが代表です」と伝える方法です。

(Lightningテーマ)ファイル名:header.php
保存先:wp-content/themes/child-theme/g2/header.php

(汎用テーマ、Cocoonテーマ)ファイル名:header.php
保存先:wp-content/themes/child-theme/header.php

<link rel="canonical" href="https://example.com/">

3.2 ディレクトリ構造

  • child-theme/
    • g2/
      • header.php←Lightningテーマ
    • archive.php
    • category.php
    • functions.php
    • footer.php
    • header.php←汎用テーマ、Cocoonテーマ
    • style.css
    • js/
      • loading.js

5 開発者向け対策

複数の条件(クエリパラメータ、RSS、ページ分割)をまとめて処理したい場合は、functions.php に共通関数を作ると便利です。


//-------------------------------------------
// カテゴリ・タグ・アーカイブの重複ページ対策
//-------------------------------------------
function custom_handle_duplicate_pages($mode = 'canonical') {

    // クエリパラメータ ?order
    if ((is_category() || is_tag() || is_archive()) && isset($_GET['order'])) {
        if ($mode === 'canonical') {
            $canonical = get_queried_object()->term_id
                        ? get_term_link(get_queried_object())
                        : get_permalink();
            echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
        } elseif ($mode === 'noindex') {
            echo '<meta name="robots" content="noindex, follow">' . "\n";
        }
    }

    // RSSフィード (/feed)
    if (is_feed()) {
        if ($mode === 'canonical') {
            $canonical = get_post_type_archive_link(get_post_type()) ?: home_url();
            echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
        } elseif ($mode === 'noindex') {
            echo '<meta name="robots" content="noindex, follow">' . "\n";
        }
    }

    // ページ分割 (/page/2 など)
    if (is_paged()) {
        if ($mode === 'canonical') {
            $canonical = get_queried_object()->term_id
                        ? get_term_link(get_queried_object())
                        : get_permalink();
            echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
        } elseif ($mode === 'noindex') {
            echo '<meta name="robots" content="noindex, follow">' . "\n";
        }
    }
}

// head にフックして実行
add_action('wp_head', function() {
    // サイト方針に応じて 'canonical' か 'noindex' を選択
    custom_handle_duplicate_pages('canonical');
});
  

6 ポイントまとめ

  • 初心者は meta noindex や SEOプラグインの設定で簡単に対応可能
  • canonical を設定して代表ページを明示することも有効
  • 開発者は functions.php に共通関数を作り、自動で canonical または noindex を出力可能
  • robots.txt は補助的に使うと良い
  • どちらか一方を選ぶ:canonical か noindex を統一する

これらの方法を組み合わせることで、RSSやタグ、カテゴリページの重複コンテンツを防ぎ、サイト全体のSEO評価を向上させることができます。