2026年10月14日

2026年10月14日

WordPressのタクソノミーページをSEO最適化する方法

はじめに

WordPressのカテゴリーページやタグページは投稿が少なかったり重複コンテンツになりやすく、適切にSEO設定しないとインデックス肥大化やカニバリゼーションの原因になります。タームごとのメタ情報・noindex制御・canonical URL・サイトマップ設定を組み合わせることでタクソノミーページのSEO価値を最大化できます。

症状・原因

  • カテゴリーページのtitleとdescriptionがすべて同じになっており、重複コンテンツとみなされている
  • 投稿が1件しかないタグページがインデックスされて薄いコンテンツとしてペナルティを受けている
  • ページネーションされたアーカイブページにcanonical URLが正しく設定されていない

解決手順

ステップ1:タームメタでタクソノミーごとのtitle・descriptionを設定する

各カテゴリー・タグに固有のSEOメタ情報を管理画面から設定できるようにします。

<?php
// functions.php に追加 ─ タームメタフィールドの追加

// カテゴリー・タグ編集画面にSEOフィールドを追加する
add_action( 'category_add_form_fields', 'add_taxonomy_seo_fields' );
add_action( 'category_edit_form_fields', 'add_taxonomy_seo_fields_edit' );
add_action( 'post_tag_add_form_fields', 'add_taxonomy_seo_fields' );
add_action( 'post_tag_edit_form_fields', 'add_taxonomy_seo_fields_edit' );

function add_taxonomy_seo_fields( $taxonomy ) {
    wp_nonce_field( 'save_term_seo', 'term_seo_nonce' );
    ?>
    <div class="form-field">
        <label for="term_seo_title">SEOタイトル</label>
        <input type="text" id="term_seo_title" name="term_seo_title" maxlength="60">
        <p>60文字以内で入力してください。空欄の場合はデフォルトタイトルが使用されます。</p>
    </div>
    <div class="form-field">
        <label for="term_seo_description">メタディスクリプション</label>
        <textarea id="term_seo_description" name="term_seo_description" rows="3" maxlength="120"></textarea>
        <p>120文字以内。検索結果に表示される説明文です。</p>
    </div>
    <?php
}

// タームの保存時にSEOメタを保存する
add_action( 'created_term', 'save_taxonomy_seo_meta', 10, 3 );
add_action( 'edited_term', 'save_taxonomy_seo_meta', 10, 3 );

function save_taxonomy_seo_meta( $term_id, $tt_id, $taxonomy ) {
    if ( ! isset( $_POST['term_seo_nonce'] ) || ! wp_verify_nonce( $_POST['term_seo_nonce'], 'save_term_seo' ) ) {
        return;
    }

    // SEOタイトルをサニタイズして保存する
    $seo_title = sanitize_text_field( $_POST['term_seo_title'] ?? '' );
    update_term_meta( $term_id, '_seo_title', $seo_title );

    // メタディスクリプションをサニタイズして保存する
    $seo_desc = sanitize_textarea_field( $_POST['term_seo_description'] ?? '' );
    update_term_meta( $term_id, '_seo_description', $seo_desc );
}

// タクソノミーアーカイブのtitleをカスタマイズする
add_filter( 'document_title_parts', function( $title ) {
    if ( is_tax() || is_category() || is_tag() ) {
        $term      = get_queried_object();
        $seo_title = get_term_meta( $term->term_id, '_seo_title', true );

        if ( ! empty( $seo_title ) ) {
            $title['title'] = $seo_title; // カスタムSEOタイトルで上書きする
        }
    }
    return $title;
} );

ステップ2:pre_get_postsでタクソノミーアーカイブのクエリを最適化する

タクソノミーアーカイブの投稿順序・投稿タイプ・除外カテゴリーを制御します。

<?php
// functions.php に追加 ─ タクソノミーアーカイブのクエリ最適化

add_action( 'pre_get_posts', function( $query ) {
    // メインクエリかつタクソノミーアーカイブページのみ処理する
    if ( ! $query->is_main_query() || ! ( $query->is_tax() || $query->is_category() ) ) {
        return;
    }

    // 管理画面では何もしない
    if ( is_admin() ) {
        return;
    }

    // 1ページあたりの表示件数を設定する
    $query->set( 'posts_per_page', 12 );

    // 投稿日の新しい順に並べる
    $query->set( 'orderby', 'date' );
    $query->set( 'order', 'DESC' );

    // 特定カテゴリー(未分類など)を除外する
    $excluded_cats = [ get_option( 'default_category' ) ]; // 未分類カテゴリーのIDを取得
    $query->set( 'category__not_in', $excluded_cats );

    // 公開済みの投稿のみを表示する
    $query->set( 'post_status', 'publish' );
} );

ステップ3:投稿数が少ないタクソノミーページにnoindexを設定する

薄いコンテンツのタクソノミーページをGoogleにインデックスさせないよう設定します。

<?php
// functions.php に追加 ─ 薄いタクソノミーページのnoindex制御

add_action( 'wp_head', function() {
    if ( ! ( is_tax() || is_category() || is_tag() ) ) {
        return;
    }

    $term               = get_queried_object();
    $min_posts_to_index = 5; // 5件未満の場合はnoindexにする

    // ターム内の投稿数を確認する
    $post_count = $term->count ?? 0;

    if ( $post_count < $min_posts_to_index ) {
        // 投稿数が少ない場合はnoindexタグを出力する
        echo '<meta name="robots" content="noindex, follow">' . "\n";
        return;
    }

    // タームに手動でnoindexが設定されている場合も対応する
    $manual_noindex = get_term_meta( $term->term_id, '_noindex', true );
    if ( $manual_noindex ) {
        echo '<meta name="robots" content="noindex, follow">' . "\n";
    }
}, 1 ); // 優先度1で他のSEOプラグインより先に実行する

ステップ4:ページネーションされたタクソノミーアーカイブにcanonical URLを設定する

アーカイブの2ページ目以降にcanonical URLを正しく設定して重複コンテンツを防ぎます。

<?php
// functions.php に追加 ─ タクソノミーアーカイブのcanonical URL

add_action( 'wp_head', function() {
    if ( ! ( is_tax() || is_category() || is_tag() || is_archive() ) ) {
        return;
    }

    global $wp_query;

    $current_page = max( 1, get_query_var( 'paged' ) );
    $term         = get_queried_object();

    if ( ! $term ) {
        return;
    }

    // ページネーションに対応したタームURLを生成する
    if ( is_category() ) {
        $term_url = get_category_link( $term->term_id );
    } elseif ( is_tag() ) {
        $term_url = get_tag_link( $term->term_id );
    } else {
        $term_url = get_term_link( $term );
    }

    if ( is_wp_error( $term_url ) ) {
        return;
    }

    // 2ページ目以降は /page/N/ を付加する
    if ( $current_page > 1 ) {
        $canonical_url = trailingslashit( $term_url ) . 'page/' . $current_page . '/';
    } else {
        $canonical_url = trailingslashit( $term_url ); // 1ページ目はページ番号なし
    }

    // canonical タグを出力する
    printf( '<link rel="canonical" href="%s">' . "\n", esc_url( $canonical_url ) );
}, 5 );

ステップ5:タクソノミーのサイトマップ最適化(空ターム除外・優先度設定)

XMLサイトマップからコンテンツの薄いタームを除外し、SEO価値を高めます。

<?php
// functions.php に追加 ─ タクソノミーサイトマップの最適化

// WordPress 5.5+ のコアサイトマップでターム除外を制御する
add_filter( 'wp_sitemaps_taxonomies_query_args', function( $args, $taxonomy ) {
    // 投稿数が3件未満のタームはサイトマップから除外する
    $args['count']   = true; // 件数を合わせて取得する
    $args['min_count'] = 3;   // この件数以上のタームのみ含める

    return $args;
}, 10, 2 );

// サイトマップのURL一覧からnoindex対象タームを除外するフィルター
add_filter( 'wp_sitemaps_taxonomies_entry', function( $entry, $term ) {
    // noindex設定があるタームをサイトマップから除外する
    $noindex = get_term_meta( $term->term_id, '_noindex', true );
    if ( $noindex ) {
        return false; // falseを返すとエントリーがサイトマップから除外される
    }

    // 重要なターム(投稿数が多いもの)には高い優先度を設定する
    if ( $term->count >= 50 ) {
        $entry['priority'] = 0.8; // 高優先度
    } elseif ( $term->count >= 10 ) {
        $entry['priority'] = 0.5; // 中優先度
    } else {
        $entry['priority'] = 0.3; // 低優先度
    }

    // 最終更新日をサイトマップに追加する(関連する最新投稿の日付)
    $latest_post = get_posts( [
        'numberposts'    => 1,
        'category'       => $term->term_id,
        'orderby'        => 'date',
        'order'          => 'DESC',
        'fields'         => 'ids',
        'post_status'    => 'publish',
    ] );

    if ( ! empty( $latest_post ) ) {
        $entry['lastmod'] = get_post_modified_time( 'c', true, $latest_post[0] );
    }

    return $entry;
}, 10, 2 );

注意事項

  • Yoast SEO・RankMath との共存: 上記のcanonical・robots出力コードはSEOプラグインと競合する可能性がある。SEOプラグイン使用時はプラグインのAPIを優先すること
  • noindexの過剰適用: 主要なカテゴリーページを誤ってnoindexにするとインデックスが大幅に減少する。設定前に必ずSearch Consoleで現在のインデックス状況を確認すること
  • インターナルリンク: タクソノミーページのSEO価値を高めるには、各投稿から関連カテゴリーへのリンクと、カテゴリーページ自体の良質なイントロテキストが重要

まとめ

タクソノミーページのSEO最適化はタームメタによる固有タイトル・description設定、投稿数に基づくnoindex制御、canonical URL設定、サイトマップ最適化の4段階で体系的に実施することが重要です。関連記事:WordPressのRSSフィードを最適化してコンテンツ配信を強化する方法

お気軽にご相談ください

お見積りへ お問い合わせへ
▲