WordPressで固定ページにカテゴリーを追加する方法

固定ページ(page)には、投稿(post)と違って標準でカテゴリーやタグを設定する機能がありません。

会社概要や採用情報といった複数の固定ページを分類したい、カテゴリーアーカイブに固定ページも混ぜて表示したい、といった時は追加で設定する必要があります。

なぜ固定ページには標準でカテゴリーがないのか

WordPressの設計では、投稿(post)と固定ページ(page)は最初から役割が分けられています。

投稿は時系列で追加されていくブログ記事のような「動的なコンテンツ」であり、カテゴリーやタグといったタクソノミーで横断的に整理することが前提になっています。一方、固定ページは会社概要やお問い合わせのように更新頼度が低い「静的なコンテンツ」で、時系列に依存しない代わりに、親子関係(ページ階層)やメニューで構造を作ることを前提に設計されています。

固定ページはそもそも投稿のような分類軸で整理される想定になっていない、というのが標準でカテゴリーが用意されていない理由です。

とはいえ実際の運用では、固定ページの数が増えるにつれて分類したいケースが出てきます。たとえば、サービス紹介ページが何十ページもあって業種別・料金プラン別にグルーピングしたい場合、FAQページ群をカテゴリーごとに絞り込み表示したい場合、社内資料や規約類のようなドキュメント的な固定ページをナレッジベースのように整理したい場合などです。

こうした「階層構造」だと管理しづらいケースでは、投稿と同じような横断的な分類(カテゴリー・タグ)を持ち込んだ方が管理しやすくなります。

以降で紹介する方法は、いずれも「固定ページ本来の設計にはない分類機能を、後から補う」ための手段です。

親子関係だけで完結できないか検討する

広告

カテゴリー(タクソノミー)を導入する前に、固定ページ本来の階層機能(親ページ・子ページ)だけで要件を満たせないかを一度検討する価値があります。カテゴリーはもともと投稿向けの機能を後から流用するものであり、実装コストや将来のメンテナンスコストが伴うためです。

次のようなケースでは、親子関係だけで十分なことが多いです。

広告
  • 分類の軸が1つだけで、階層も2~3階層以内に収まる
  • ページ数がそれほど多くなく、URLも /親ページ/子ページ/ の形で自然に表現できる
  • パンくずリストやサブメニューの自動生成だけで、必要なナビゲーションが賄える

逆に、次のようなケースでは階層構造だけでは表現しきれず、カテゴリーが必要になります。

  • 1つのページを複数で分類したい(例:業種別 × 料金プラン別)
  • 違う親ページの下にあるページ同士でも、同じ分類ならカテゴリーアーカイブのように一覧にまとめて表示したい
  • 分類自体が将来的に動的に増減・変更される可能性が高い

まずは固定ページの階層で表現できないかを検討し、それでも表現しきれない多次元的な分類が必要な場合にのみ、以降で紹介するカテゴリー追加の方法を検討するとよいでしょう。

register_taxonomy_for_object_type で標準のカテゴリーを流用する

もっとも手軽なのが、投稿で使われている標準の category タクソノミーを、固定ページでも使えるようにする方法です。テーマの functions.php(または子テーマ、あるいはコードスニペット用プラグイン)に以下を追加します。

PHP
add_action( 'init', 'add_categories_for_pages' );
function add_categories_for_pages() {
  register_taxonomy_for_object_type( 'category', 'page' );
}

register_taxonomy_for_object_type() は、既に登録済みのタクソノミーを別の投稿タイプにも紐付ける関数です。これを init フックで実行するだけで、固定ページの編集画面にカテゴリーの選択欄が表示されるようになります。

無名関数(クロージャ)を使えば、さらに短く1つの add_action にまとめることも可能です。

PHP
add_action( 'init', function () {
  register_taxonomy_for_object_type( 'category', 'page' );
} );

「管理画面でカテゴリーを設定・管理できればよく、フロント側のカテゴリーアーカイブに固定ページを表示する必要はない」という場合は、このコードだけで完結します。

次に紹介する pre_get_posts の処理は、あくまで「カテゴリーアーカイブに固定ページも一覧表示したい」場合にのみ必要です。表示させなくてよければ不要ですのでとばしてください。

カテゴリーアーカイブに固定ページも表示させる

上記だけでは、カテゴリーを固定ページに設定できるようにはなりますが、カテゴリーアーカイブページ(/category/xxx/)を開いても固定ページは一覧に出てきません。カテゴリーアーカイブに投稿と固定ページを両方表示させたい場合は、pre_get_posts フックでクエリの post_type を書き換えます。

PHP
add_action( 'pre_get_posts', 'merge_page_categories_at_category_archive' );
function merge_page_categories_at_category_archive( $query ) {
  if ( $query->is_category && $query->is_main_query() ) {
    $query->set( 'post_type', array( 'post', 'page' ) );
  }
}

is_main_query() を必ず条件に含めるのがポイントです。これがないと、サイドバーのウィジェットや関連記事表示など、メインクエリ以外のカテゴリー関連クエリまで巻き込んで意図しない挙動を起こすことがあります。

この方法を使う際の注意点

ブロックエディタでカテゴリーパネルが出ない

register_taxonomy_for_object_type を実行しても、環境によってはGutenbergの右サイドバーにカテゴリーパネルがすぐに反映されないケースが報告されています。表示されない場合は「設定 → パーマリンク」を開いて保存し直す(リライトルールを再生成する)と直ることが多いです。

投稿とカテゴリーを共有する

この方法は投稿用のカテゴリー体系をそのまま固定ページに流用します。固定ページ専用の分類を作りたい場合はこの方法では実現できず、独自タクソノミーが必要になります。

全固定ページがカテゴリー選択の対象になる

会社概要ページのような分類が不要なページにも、デフォルトで「未分類」が付く点は把握しておく必要があります。

固定ページ自体のURL構造は変わらない

カテゴリーアーカイブの一覧に表示されるようになるだけで、固定ページ自身のパーマリンクは /ページスラッグ/ のまま変わりません。

カテゴリーアーカイブに固定ページを混ぜるとSEO面の考慮が増える

固定ページが /category/xxx/ の一覧に入るようになるため、SEOプラグイン(Yoast SEOやRank Mathなど)のXMLサイトマップ設定次第で、意図せず固定ページが投稿と重複した文脈で検索エンジンに認識される可能性があります。導入後はサイトマップやnoindex設定を一度見直しておくと安心です。

nav_menu_item を post_type 配列に含める例もある

サンプルコードには array('post', 'page', 'nav_menu_item') としているものもありますが、is_main_query() の条件がある以上、通常のナビゲーションメニュー描画に影響することは基本的にありません。念のための保険として付けられていることが多く、必須ではありません。

固定ページ専用の独自タクソノミーを作成する

投稿のカテゴリーとは分離して、固定ページ専用の分類軸を持ちたい場合は、新しいタクソノミーを作成して page に紐付けます。

PHP
add_action( 'init', 'register_page_category_taxonomy' );
function register_page_category_taxonomy() {
  register_taxonomy( 'page_category', 'page', array(
    'label'             => 'ページカテゴリー',
    'hierarchical'      => true,
    'show_ui'           => true,
    'show_admin_column' => true,
    'show_in_rest'      => true, // ブロックエディタ・REST APIで使うために必須
    'rewrite'           => array( 'slug' => 'page-category' ),
  ) );
}

投稿のカテゴリー体系を汚さず、固定ページだけの分類を作れるのが利点です。ブロックエディタで確実に表示させたい場合は show_in_rest => true を明示しておくのが安全です。

プラグインを使う

コードを書かずに済ませたい場合は、以下のようなプラグインがあります。

固定ページだけのカテゴリー・タグを増やしたいならPage Categorizerが手軽です。投稿の分類とは別に管理でき、カテゴリー/タグアーカイブにもページが自動的に並びます。

逆に投稿と同じカテゴリーをそのまま使いたいだけならPage Category and Tagの方が近く、「標準カテゴリーの流用」をノーコードでやっているようなものです。

もっと自由に組み立てたいならPodsAdvanced Custom Fields (ACF)も選択肢に入ります。
Podsはカスタム投稿タイプやタクソノミーを管理画面上で組み立てられるため、専用タクソノミーをノーコードで作りたいときに向いています。
ACFは本来カスタムフィールド用のプラグインですが、無料版でもタクソノミーの登録ができるので、フィールドとまとめて管理したい人には便利です。

広告

カテゴリー : WordPress