【WordPress】投稿タイトルの先頭に自動でカテゴリ名を追加する方法

【WordPress】投稿タイトルの先頭に自動でカテゴリ名を追加する方法 WordPress

WordPressでは、投稿タイトルにカテゴリ名を含めることで、読者に記事の内容を分かりやすく伝えたり、SEO対策としてキーワードを補強することができます。本記事では、投稿タイトルの先頭にカテゴリ名を自動的に追加する方法を紹介します。

スポンサーリンク

カテゴリ名をタイトルの先頭に追加する目的

カテゴリ名をタイトルに含めることには、以下のようなメリットがあります。

  • 一覧ページや検索結果で記事の分類が一目で分かる
  • SNSや外部サイトでシェアされた際に内容が伝わりやすい
  • 特定カテゴリの記事を強調して表示したいときに便利

WordPressのテーマやプラグインを変更しても動作するよう、フィルターを使って実装します。

タイトルにカテゴリ名を追加するコード

テーマの functions.php に以下のコードを追加します。

functions.php:タイトルへのカテゴリ名自動追加
function add_category_to_post_title($title, $id = null) {
  if (is_admin() || is_feed()) {
    return $title;
  }

  // メインクエリのループ内で表示中の投稿タイトルにのみ適用する
  // (サイドバーウィジェット等の他のタイトル表示には影響させない)
  if (!in_the_loop() || !is_main_query()) {
    return $title;
  }

  if (is_singular('post') || is_home() || is_archive() || is_search()) {
    $post = get_post($id);
    if (!$post || $post->post_type !== 'post') {
      return $title;
    }

    $categories = get_the_category($post->ID);
    if (!empty($categories)) {
      $category_name = esc_html($categories[0]->name);
      // すでにカテゴリ名が含まれている場合は追加しない
      if (strpos($title, $category_name) !== 0) {
        $title = '【' . $category_name . '】' . $title;
      }
    }
  }

  return $title;
}
add_filter('the_title', 'add_category_to_post_title', 10, 2);

このコードは、投稿が「投稿タイプ=post」であり、かつメインクエリのループ内で表示されている場合に、その最初のカテゴリ名を取得してタイトルの前に追加します。

is_singular()等の条件だけでは適用範囲が広すぎる
is_archive()is_search()は、それぞれのRSS/Atomフィード(カテゴリアーカイブのフィードや検索結果のフィードなど)でもis_feed()と同時にtrueになります。is_feed()を除外しないと、フィードで配信されるタイトルにまで「【カテゴリ名】」が付いてしまいます。またthe_titleフィルターは、今まさにメインクエリで表示中の投稿だけでなく、サイドバーウィジェット(最新の投稿・人気記事など)で表示される他の投稿タイトルにも呼ばれるため、in_the_loop()is_main_query()で絞り込まないと、意図せずウィジェット側のタイトルにまでカテゴリ名が付与されてしまいます。
$categories[0]は「名前順で先頭」のカテゴリ
get_the_category()が返す配列は、投稿に紐づく複数カテゴリを名前順(アルファベット/50音順)に並べたものです。$categories[0]は「投稿作成時に最初に選択したカテゴリ」ではなく、名前順で先頭に来るカテゴリである点に注意してください。Yoast SEOなどの「プライマリカテゴリ」機能で設定した特定のカテゴリを優先したい場合は、そのプラグインが保存するpostmetaを別途参照する実装が必要です。

注意点と補足

この処理は、フロントエンドのメインループ内でのみ有効にする設計となっており、管理画面やウィジェット、フィードではタイトルを変更しません。さらに、既にカテゴリ名が含まれている場合は、二重で追加されないように判定しています。

よくある質問(FAQ)

Q記事タイトルの先頭にカテゴリー名を自動追加するには?
Athe_titleフィルターでis_admin()・is_feed()を除外し、さらにin_the_loop()・is_main_query()でメインループ内の表示にのみ絞り込んだうえで、get_the_category()で取得したカテゴリー名をタイトルに結合して返します。表示のみに適用してDB保存値は変えません。
QSEOメタタイトルにもカテゴリー名を含めるには?
ASEOプラグイン(Yoast)のwpseo_titleフィルター、またはwp_title・document_title_partsフィルターでタイトルをカスタマイズします。サイト名の組み合わせも考慮して設定します。
Qbreadcrumb(パンくずリスト)にも同じカテゴリー情報を使うには?
Aget_the_category()で取得したカテゴリー情報をパンくず生成コードと共有します。関数化して複数箇所から呼び出すことでDRYな実装になります。

まとめ

カテゴリ名を投稿タイトルの先頭に自動追加することで、ユーザーにも検索エンジンにも優しい記事表示が可能になります。テーマに依存せずフィルターで処理するため、サイトの保守性も高く保つことができます。

ただし、the_titleフィルターはフィードやウィジェットなど想定外の箇所にも呼ばれるため、is_feed()・in_the_loop()・is_main_query()で適用範囲を正しく絞り込むことが重要です。用途に応じて、カテゴリスラッグを使ったり、複数カテゴリの処理に拡張することも可能です。