<?php
/**
 * 特定のカテゴリに関連する各種ページにnoindexを設定する
 * 
 * @param int|array $category_ids 対象のカテゴリID(単一の数値または配列)
 * @return void
 */
function set_category_noindex($category_ids) {
  //配列でない場合は配列に変換
  if (!is_array($category_ids)) {
    $category_ids = array($category_ids);
  }

  //フックの追加
  add_action('wp_head', function () use ($category_ids) {
    $should_noindex = false;

    //カテゴリーアーカイブページの判定
    if (is_category($category_ids)) {
      $should_noindex = true;
    }

    //投稿ページ、固定ページ、カスタム投稿タイプの判定
    elseif (is_singular()) {
      //投稿ページの場合
      if (is_single() && has_category($category_ids)) {
        $should_noindex = true;
      }
      //カスタム投稿タイプの場合
      elseif (is_singular(array('your_custom_post_type'))) { //カスタム投稿タイプ名を指定
        $terms = wp_get_post_terms(get_the_ID(), 'category');
        foreach ($terms as $term) {
          if (in_array($term->term_id, $category_ids)) {
            $should_noindex = true;
            break;
          }
        }
      }
    }

    //タグ・年月日アーカイブページで、指定カテゴリの投稿を含む場合
    elseif (is_archive() && !is_category()) {
      global $wp_query;
      foreach ($wp_query->posts as $post) {
        if (has_category($category_ids, $post)) {
          $should_noindex = true;
          break;
        }
      }
    }

    //noindexの出力
    if ($should_noindex) {
      echo '<meta name="robots" content="noindex" />';
    }
  });
}

//noindexにしたいカテゴリIDを定義
$noindex_categories = array(1, 2, 3, 9);

//関数を実行
set_category_noindex($noindex_categories);

このコードの特徴と使い方について説明します:

  1. 機能

    • 特定のカテゴリに属する以下のページにnoindexを設定します:
      • カテゴリアーカイブページ
      • 投稿ページ
      • カスタム投稿タイプページ
      • タグ・日付アーカイブページ(指定カテゴリの投稿を含む場合)
  2. 使い方

    • 単一のカテゴリの場合:set_category_noindex(123);
    • 複数のカテゴリの場合:set_category_noindex(array(123, 456, 789));
  3. カスタマイズ

    • カスタム投稿タイプの場合は、your_custom_post_typeの部分を実際のカスタム投稿タイプ名に変更してください。
    • 複数のカスタム投稿タイプがある場合は、配列で指定できます:array('post_type1', 'post_type2')
  4. 注意点

    • カテゴリIDは数値で指定する必要があります(スラッグではありません)
    • functions.phpに追加して使用してください
    • パフォーマンスに考慮して、必要最小限の判定のみを行うように設計されています