WordPress Logo WordPress カスタム投稿タイプとカスタム分類(タクソノミー)

カスタム投稿タイプとカスタム分類の設定方法(register_post_type、register_taxonomy)やカスタム投稿タイプとカスタム分類の一覧ページ(アーカイブ)の表示方法などに関する覚え書きです。

更新日:2019年07月10日

作成日:2019年05月16日

カスタム投稿タイプとは

カスタム投稿タイプを使うと独自の投稿タイプを追加することができ、既存の「投稿記事(post)」や「固定ページ(page)」とは別にコンテンツを管理することができるようになります。

追加(登録)したカスタム投稿タイプごとにそれぞれのテンプレートファイルを使うことができるので管理がしやすくなります。

また、カスタム投稿タイプごとに「固定ページ」のようにページに親子関係を付けたり、「投稿記事」のように時系列で並べたりすることができます(いずれかを選択)。

カテゴリーやタグを利用することもできます(カテゴリーやタグの追加)。

更にカスタムタクソノミーという機能を使えば、カスタム投稿タイプの記事をカテゴリー形式またはタグ形式で分類することもできます。

カスタム投稿タイプを追加するには、init アクションフックを使って register_post_type() で独自の投稿タイプとその動作を定義(登録)します。

以下は rental というカスタム投稿タイプを登録する例です。

管理画面のメニューに表示される名前はパラメータの label で、編集画面で使用する項目(機能)は「supports」で指定しています。

//functions.php
function create_my_post_types() {  //init アクションフックに登録する関数
  //rental というカスタム投稿タイプを登録
  register_post_type(
    'rental',//投稿タイプ名(識別子:半角英数字の小文字)
    array(
      'label' => 'レンタル',  //カスタム投稿タイプの名前(管理画面のメニューに表示される)
      'labels' => array(  //管理画面に表示されるラベルの文字を指定
        'add_new' => '新規レンタル追加',
        'edit_item' => 'レンタルの編集',
        'view_item' => 'レンタルを表示',
        'search_items' => 'レンタルを検索',
        'not_found' => 'レンタルは見つかりませんでした。',
        'not_found_in_trash' => 'ゴミ箱にレンタルはありませんでした。',
      ),
      'public' => true,  // 管理画面に表示しサイト上にも表示する
      'description' => 'カスタム投稿タイプ「レンタル」の説明文です。',  //説明文
      'hierarchicla' => false,  //コンテンツを階層構造にするかどうか
      'has_archive' => true,  //trueにすると投稿した記事の一覧ページを作成することができる
      'show_in_rest' => true,  //新エディタ Gutenberg を有効化(REST API を有効化)
      'supports' => array(  //記事編集画面に表示する項目を配列で指定することができる
        'title',  //タイトル
        'editor',  //本文の編集機能
        'thumbnail',  //アイキャッチ画像(add_theme_support('post-thumbnails')が必要)
        'excerpt',  //抜粋
        'custom-fields', //カスタムフィールド
        'revisions'  //リビジョンを保存
      ),
      'menu_position' => 5, //「投稿」の下に追加
      'taxonomies' => array('rental_cat', 'rental_tag')  //使用するタクソノミー
    )
  );
}
//init アクションフックで登録
add_action('init', 'create_my_post_types'); 

上記を functions.php に記述すると、以下のように新しい投稿タイプ「レンタル」が管理画面のメニューの表示されます。以下は「レンタル」の「新規作成」画面です。

新規登録されたカスタム投稿タイプ「レンタル」管理画面のスクリーンショット

左側のメニューにラベルの「add_new」で指定した「新規レンタル追加」などが表示され、編集画面のオプションでは「supports」で指定した「アイキャッチ画像」や「抜粋」などが表示されています。

カスタム投稿タイプの追加

カスタム投稿タイプを追加するには、functions.php で register_post_type() を使ってカスタム投稿タイプを登録(定義)します。

register_post_type() は init アクションの中から呼び出す必要があります。

init アクションの中で register_post_type() を複数記述して複数のカスタム投稿タイプを登録することができます。また、カスタムタクソノミーも同じアクションの中で登録します。

以下の create_my_post_types() は init アクションに登録する関数の名前ですが、任意の関数名を付けることができます。この関数が WordPress の初期化(init)の際に実行され register_post_type() や register_taxonomy() によりカスタム投稿タイプやカスタムタクソノミーが追加されます。

function create_my_post_types(){ //init アクションフックに登録する関数

  register_post_type(カスタム投稿タイプ名, パラメータの配列);
  register_taxonomy(カスタム分類名, カスタム投稿タイプ名, パラメータの配列);

  ・・・複数のカスタム投稿タイプ、カスタムタクソノミーを追加可能・・・
   
}
add_action('init', create_my_post_types); //init アクションに上記で定義した関数を登録

「ページが見つかりません」と言う表示になる場合

追加したカスタム投稿タイプのページに初めてアクセスする際に「ページが見つかりません」と言う表示になる場合は、管理画面のメインナビゲーションメニューの「設定」→「パーマリンク設定」で「変更を保存」をクリックしてルールを再保存します(設定を変更する必要はありません)。

予約されている投稿タイプ

以下の投稿タイプはすでに WordPress で使われているため同じ名前を使用することはできません。

  • post
  • page
  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset
  • oembed_cache
  • user_request
  • wp_block
  • action
  • author
  • order
  • theme

また、WordPress の予約語も使うと問題が発生します。

register_post_type

カスタム投稿タイプを作成する関数です。

register_post_type( $post_type, $args )

パラメータ
  • $post_type(文字列):(必須) 登録したいカスタム投稿タイプの名前。
    • 半角英数字の小文字で指定(空白は使えません)。最大 20 文字。
    • ここで指定した文字列がこのカスタム投稿タイプのスラッグになります
  • $args(配列):(オプション) 引数の配列。下記参照。
戻り値
登録された投稿タイプのオブジェクト、またはエラーオブジェクト
利用可能箇所
通常は functions.php

以下は register_post_type() の書式の例です。改行を使って見易いように記述できます。

register_post_type(
  'カスタム投稿タイプ名', //第1パラメータ $post_type
   array( //第2パラメータの配列 $args
     '引数' => '値', 
     '引数' => '値', 
     ・・・
  )
);

//または以下のようにも記述できます。
register_post_type( 'カスタム投稿タイプ名', 
   array( 
     '引数' => '値', 
     '引数' => '値', 
     ・・・
  )
);

//または引数を変数 $args に代入して以下のように記述することもできます。
$args = array(  //引数の配列
  '引数' => '値', 
  '引数' => '値',
  ・・・
);
register_post_type( 'カスタム投稿タイプ名', $args);

第1パラメータ: $post_type(文字列)(必須)

$post_type には登録したいカスタム投稿タイプの名前を指定します。この文字列がこのカスタム投稿タイプのスラッグになるため、半角英数字の小文字で指定します。空白は使えず最大で20文字です。

また、ここで指定した文字列は、第2パラメータの引数 label の初期値としても使用されます。

第2パラメータ: $args(配列)(オプション)

第2パラメータの $args は配列で指定します。多数の引数がありますが、全てはオプションです。

但し、例えば public の初期値は false なのでそのままではそのカスタム投稿タイプは表示されません。

public
このカスタム投稿タイプを公開するかどうかを指定しますが、初期値は false なので公開したり管理画面で編集するには true にする必要があります。
label
管理画面のメニュー、カスタム投稿一覧ページのタイトルに表示されるカスタム投稿タイプの名前を指定します。日本語で指定することができます。省略すると、第1パラメータ: $post_type の値が適用されます。
labels
管理画面に表示されるラベルの文字列を指定することができます。省略すると 'hierarchical'=>true を指定した投稿タイプでは、投稿(post)のラベルが適用され、'hierarchical'=>false を指定した投稿タイプでは固定ページ(page)のラベルが適用されます。どのようなラベルが表示されるかはカスタム投稿タイプのアーカイブページで get_queried_object() の結果を var_dump() すると確認できます。
hierarchical
固定ページのような親子関係(階層)を持たせるには true を指定します。投稿記事のように時系列に従ってコンテンツを管理し、親子関係を持たせない場合は false を指定します。初期値は false です。
supports
編集/新規作成のページに表示する項目(機能)を指定します。初期値はタイトルと本文入力欄(編集画面)のみです。
has_archive
記事の一覧ページを生成するかどうかを真偽値で指定します。初期値は false で生成しません。
show_in_rest
この投稿タイプで REST API を有効にするかどうか。有効(true)にすると編集画面が新しいエディタの Gutenberg になります。

以下は 第2パラメータ $args の引数です。全てのリストは日本語版 CodeXCode Reference に記載されています。

第2パラメータ $args の引数(一部抜粋)
引数 説明 初期値
label 文字列 カスタム投稿タイプの名前を指定。管理画面のメニュー、カスタム投稿一覧ページのタイトルに表示される。日本語使用可能。 $post_type
(第1パラメータの値 = スラッグ)
labels 配列 管理画面に表示されるラベルを連想配列で指定。「新規追加」、「新規投稿を追加」、「投稿の編集」などのデフォルトのラベルを変更する場合に指定。
  • name:投稿タイプの一般名。省略時は「label」の値。
  • singular_name:カスタム投稿タイプ名の単数形(英語の場合)
  • menu_name:メニューに表示するラベル。この値を指定すると name の値を上書きする。
  • add_new_item:新規作成ページの左上に表示されるタイトル(デフォルト:「新規投稿を追加」)
  • add_new:メニュー(画面の左)の「新規」の位置に表示するラベル(デフォルト:「新規追加」)
  • new_item:一覧ページの右上にある新規作成ボタンのラベル(デフォルト:「新規投稿」)(現在は表示されていない?)
  • edit_item:編集ページの左上にあるタイトル(デフォルト:「投稿を編集」)
  • view_item:編集ページの「○○を表示」ボタンのラベル(デフォルト:「投稿を表示」)
  • search_items:一覧ページの検索ボタンのラベル(デフォルト:「投稿を検索」)
  • not_found:カスタム投稿を追加していない状態で、カスタム投稿一覧ページを開いたときに表示されるメッセージ
  • not_found_in_trash :カスタム投稿をゴミ箱に入れていない状態で、カスタム投稿のゴミ箱ページを開いたときに表示されるメッセージ
  • 階層なし投稿タイプ:投稿(post)の labels
  • 階層あり投稿タイプ:固定ページ(page)の labels
description 文字列 カスタム投稿タイプの概要(説明) なし
public 真偽値 公開するかどうか。公開する場合は true、そうでない(管理画面及びユーザーも使えない)場合は false。「true」と指定した場合、以下のようにオプションが継承される。
  • 'show_ui' =>true,
  • 'public_queryable' => true,
  • 'exclude_from_search' =>false,
  • 'show_in_nav_menus' =>true
false
show_ui 真偽値 管理画面にこのカスタム投稿タイプのページを表示するかどうか。「false」を指定すると、管理画面上で操作はできなくなる。 public に指定した値
hierarchical 真偽値 カスタム投稿に固定ページのような親子関係(階層)を持たせるには「true」を指定。投稿記事と同様に時系列に従ってコンテンツを管理し、親子関係を持たせない場合は「false」を指定。 false
supports 配列|
真偽値
編集/新規作成のページに表示する項目(機能)を、文字列の配列で指定。例:supports=>array('title', 'editor', 'excerpt')とすると、タイトル、本文、抜粋が表示される。 false を指定するとデフォルトの動作(title と editor)を止めることができる。
  • title:タイトル
  • editor:本文(とその編集機能)
  • authro:作成者
  • thumbnail:アイキャッチ画像
  • excerpt:抜粋
  • comments:コメント一覧
  • trackbacks:トラックバック送信
  • custom-fields:カスタムフィールド
  • revisions:リビジョン
  • page-attributes :ページ属性(hierarchical を true に設定している場合で編集ページに親を選択するボックスを表示するためには含める)
  • post-formats:投稿フォーマット
title と editor
menu_position 整数 カスタム投稿のメニューを追加する位置を整数で指定。5刻みで値を増やすと、追加位置は1つずつ下がる。
  • 5 : 投稿の下
  • 10 : メディアの下
  • 15 : リンクの下
  • 20 : 固定ページの下
  • 25 : コメントの下
  • 60 : 最初の区切りの下
null : コメントの下
menu_icon 文字列 カスタム投稿のメニューに表示するアイコンの URL を指定。例:'menu_icon' => get_template_directory_uri() . 'images/my-custom-icon.png' デフォルトの「投稿」のアイコン
rewrite 真偽値
|配列
この投稿タイプのパーマリンクのリライト方法を指定。リライト(自動 URL 書き換え)を避けるには false を指定する。rewrite(引数) を参照 true
has_archive 真偽値 記事の一覧ページ(アーカイブページ)を有効にする(生成する)かどうかを真偽値で指定。「true」にすると投稿した記事の一覧ページを生成する。 false
public_queryable 真偽値 parse_request() の一部として post_type のクエリが実行可能かどうか。 public の値
exclude_from_search 真偽値 検索対象にこのカスタム投稿タイプを除外するかどうか。「true」で除外、「false」で含める public の値
query_var 真偽値
|文字列
この投稿に使用する query_var キーの名前または真偽値。true とした場合、http://サイトのURL/ ?投稿タイプ名=記事のスラッグ/ で表示される。 true
$post_typeの値
show_in_nav_menus 真偽値 ナビゲーションメニューでこの投稿タイプが選択可能かどうか。 public の値
show_in_menu 真偽値|文字列 管理画面メニューにこの投稿タイプを表示するかどうか(表示するには show_ui が true でなければならない)。true を指定すると管理画面のトップレベルのメニューとして表示。false を指定すると管理画面のメニューに表示しない。メニューの文字列を指定するとそのサブメニューに配置。 show_ui の値
taxonomies 配列 この投稿タイプで使用するタクソノミー(category や post_tag、カスタムタクソノミーなどの文字列の配列)を指定して関連付けをします。タクソノミーは別途 register_taxonomy() で登録する必要があります。ここに指定しなくてもタクソノミーは機能しますが、指定しないと get_queried_object() で取得したオブジェクトのプロパティの値に表示されません。(register_taxonomy_for_object_type() で別途関連付けも可能) なし
capability_type 文字列|配列 閲覧/編集/削除の権限を構築するための文字列(投稿タイプ名:post または page)を指定 "post"
capabilities 配列 この投稿タイプの権限を配列で指定。 capability_type を使って構築される権限。
show_in_rest 真偽値 この投稿タイプで REST API を有効にする(REST API で情報を取得できるようにする)かどうか。有効(true)にすると編集画面が新しいエディタの Gutenberg になります。指定しないか false を指定すると旧エディタで表示されます。 false
rewrite(引数)

true の場合、個々のページには以下の URL でアクセスできます。$post_type は第1パラメータで指定した値(カスタム投稿タイプ名)です。

  http://サイトのアドレス/$post_typ/個々のカスタム投稿のスラッグ/

'rewrite' => array('slug' => '文字列') と指定すると以下の URL でアクセスできます。

  http://サイトのアドレス/文字列/個々のカスタム投稿のスラッグ/

'slug' のデフォルトの値は第1パラメータ $post_type の値になります。

  • これらの設定は「パーマリンク設定」に依存すると思われます。
  • rewrite を変更した場合は、カスタム投稿タイプが正しいパーマリンク構造を表示するために、管理画面のメインナビゲーションメニューの「設定」→「パーマリンク設定」で「変更を保存」をクリックしてルールを再保存します(設定を変更する必要はありません)。

hierarchical の設定

register_post_type() の第2パラメータの hierarchical に指定する値により、追加するカスタム投稿タイプは大きく分けると以下の2つになります。

  • 固定ページのように親子関係(階層)を持つカスタム投稿タイプ
  • 投稿記事のように時系列に従ってコンテンツを管理し、親子関係を持たないカスタム投稿タイプ

言い換えると、追加するカスタム投稿タイプに固定ページのように親子関係(階層)を持たせるには hierarchical を true に指定し、時系列に従ってコンテンツを管理する場合は hierarchical を false に指定(または初期値が false なので何も指定しない)する必要があります。

以下は階層を持つカスタム投稿タイプ(hierarchical_true)と階層を持たないカスタム投稿タイプ(hierarchical_false)を登録(追加)する例です。

//init アクションフックに指定する関数
function create_my_post_types() {
  
  //階層(親子関係)を持つカスタム投稿タイプ
  register_post_type( 'hierarchical_true', //投稿タイプ名(第1パラメータ)
    array(  //第2パラメータの配列
      'label' => '階層あり',  //カスタム投稿タイプのラベル(管理画面のメニューに表示される)
      'public' => true,  // 管理画面に表示しサイト上にも表示する
      'hierarchical' => true,  //★固定ページのように階層構造(親子関係)を持たせる
      'has_archive' => true,  //trueにすると投稿した記事の一覧ページを作成することができる
      'show_in_rest' => true,  //Gutenberg(REST API)を有効化
      'menu_position' => 5, //「投稿」の下に追加
      'supports' => array(  //記事編集画面に表示する項目を配列で指定
        'title',  //タイトル
        'editor',  //本文の編集機能
        'thumbnail',  //アイキャッチ画像
        'excerpt',  //抜粋
        'custom-fields', //カスタムフィールド
        'revisions',  //リビジョンを保存
        'page-attributes' //★ページ属性(親を選択するドロップダウン)を表示
      ) 
    )
  );
  
  //階層(親子関係)を持たないカスタム投稿タイプ(時系列で管理)
  register_post_type( 'hierarchical_false',  //投稿タイプ名(第1パラメータ)
    array(  //第2パラメータの配列
      'label' => '階層なし',  //カスタム投稿タイプのラベル(管理画面のメニューに表示される)
      'public' => true,  // 管理画面に表示しサイト上にも表示する
      'hierarchical' => false,  //★投稿のように時系列に従ってコンテンツを管理
      'has_archive' => true,  //trueにすると投稿した記事の一覧ページを作成することができる
      'show_in_rest' => true,  //Gutenberg(REST API)を有効化
      'menu_position' => 5, //「投稿」の下に追加
      'rewrite' => array('slug' => 'NoHierarchical'), //★URL を変更
      'supports' => array(  //記事編集画面に表示する項目を配列で指定することができる
        'title',  //タイトル
        'editor',  //本文の編集機能
        'thumbnail',  //アイキャッチ画像
        'excerpt',  //抜粋
        'custom-fields', //カスタムフィールド
        'revisions'  //リビジョンを保存
      ) 
    )
  );
}
//init アクションフックで登録
add_action('init', 'create_my_post_types');

上記を functions.php に記述すると label で指定した「階層あり」と「階層なし」と言うカスタム投稿タイプが追加されます。

以下は「階層あり」を選択した状態のページの一覧のスクリーンショットです。テスト用のページを1つ作成してあります。

label で名前は「階層あり」に指定してありますが、labels を使って詳細なラベルの設定はしていないので、この場合「固定ページ」で使われるラベルが適用されています(右上「固定ページを検索」)。

「階層あり」と「階層なし」と言うカスタム投稿タイプを追加した管理画面

以下は「階層あり」に最初に作成したページのスクリーンショットです。引数 supports の page-attributes を指定しているので右下に「ページ属性」が表示されていますが、まだ他のページが作成されていないため「親を選択するドロップダウン」は表示されていません。

「階層あり」と言うカスタム投稿タイプのページの編集画面

以下は「階層あり」の新規作成画面です。すでにテスト用のページが存在するので「ページ属性」に「親を選択するドロップダウン」が表示されています。

「階層あり」と言うカスタム投稿タイプの新規作成画面

「階層あり」で作成したページの URL はドメインが example.com の場合、以下のようになります。

http://example.com/hierarchical_true/ページスラッグ/

hierarchical_true は register_post_type() の第1パラメータの値です。

以下は「階層なし」を選択した状態のページの一覧のスクリーンショットです。テスト用のページを1つ作成してあります。

label で名前は「階層なし」に指定してありますが、labels を使って詳細なラベルの設定はしていないので、この場合「投稿ページ」で使われるラベルが適用されています(右上「投稿を検索」)。

「階層なし」と言うカスタム投稿タイプのページの編集画面

「階層なし」で作成したページの URL は register_post_type() の引数 rewrite で 'rewrite' => array('slug' => 'NoHierarchical') と指定しているので以下のようになります。

http://example.com/NoHierarchical/ページスラッグ/

カテゴリーやタグの追加

必要であれば、カスタム投稿タイプに通常のカテゴリーやタグを追加することもできます。

register_post_type() でカスタム投稿タイプを登録する際に、第2パラメータ $args の引数 taxonomies で指定して追加することができます。

以下は register_post_type() で rental と言うカスタム投稿タイプを登録する際に、引数 taxonomies に 'category' と 'post_tag' を指定してカテゴリーとタグを追加する例です(30行目)。

引数 taxonomies に 'category' と 'post_tag' を指定すると編集画面にカテゴリーとタグの項目が追加されます。

function create_my_post_types() {
//rental というカスタム投稿タイプを登録
register_post_type(
  'rental',//投稿タイプ名(識別子:半角英数字の小文字)
  array(
    'label' => 'レンタル',  //カスタム投稿タイプの名前(管理画面のメニューに表示される)
    'labels' => array(  //管理画面に表示されるラベルの文字を指定
      'add_new' => '新規レンタル追加',
      'edit_item' => 'レンタルの編集',
      'view_item' => 'レンタルを表示',
      'search_items' => 'レンタルを検索',
      'not_found' => 'レンタルは見つかりませんでした。',
      'not_found_in_trash' => 'ゴミ箱にレンタルはありませんでした。'
    ),
    'public' => true,  // 管理画面及びサイト上に公開
    'description' => 'カスタム投稿タイプ「レンタル」の説明文です。',  //説明文
    'hierarchicla' => false,  //コンテンツを階層構造にするかどうか
    'has_archive' => true,  //trueにすると投稿した記事の一覧ページを作成することができる
    'show_in_rest' => true,  //Gutenberg を有効化
    'supports' => array(  //記事編集画面に表示する項目を配列で指定することができる
      'title',  //タイトル
      'editor',  //本文の編集機能
      'thumbnail',  //アイキャッチ画像
      'excerpt',  //抜粋
      'custom-fields', //カスタムフィールド
      'revisions'  //リビジョンを保存
    ),
    'menu_position' => 5, //「投稿」の下に追加
    //使用するタクソノミーを指定(カテゴリー/category やタグ/post_tag も追加可能)
    'taxonomies' => array('rental_cat', 'rental_tag', 'category', 'post_tag')
  )
);

上記の指定で編集画面に項目が追加されカテゴリーやタグを指定することはできるようになりますが、アーカイブページで表示されるようにするには以下を別途記述する必要があります。

pre_get_posts フックを使ってカテゴリーアーカイブページの場合とタグアーカイブページの場合の投稿タイプに、カテゴリーとタグを追加したカスタム投稿タイプを追加します。

//カテゴリーアーカイブにカスタム投稿タイプ rental を含める(表示させる)
function add_my_post_category_archive( $query ) {
  if (! is_admin() && $query->is_main_query() && $query->is_category()) {
    $query->set( 'post_type', array('post','rental'));
  }
}
add_action( 'pre_get_posts', 'add_my_post_category_archive' );

//タグアーカイブにカスタム投稿タイプ rental を含める(表示させる)
function add_my_post_tag_archive( $query ) {
  if (! is_admin() && $query->is_main_query() && $query->is_tag()) {
    $query->set( 'post_type', array('post','rental'));
  }
}
add_action( 'pre_get_posts', 'add_my_post_tag_archive' );

カスタム投稿タイプの表示

カスタム投稿タイプのテンプレート階層

カスタム投稿タイプの個別ページを出力する際は、以下のテンプレート階層に沿ってテンプレートが選択されます。

  1. single-カスタム投稿タイプ名.php
  2. single.php
  3. singular.php
  4. index.php

「rental」というカスタム投稿タイプを登録した場合、個々のカスタム投稿タイプのページを出力する際は以下の順にテンプレートが検索されます。

  1. single-rental.php
  2. single.php
  3. singular.php
  4. index.php

カスタム投稿タイプの個別ページのテンプレートでは通常の投稿や固定ページのようにループを使ってタイトルや本文を出力することができます。

この例では、single-rental.php と言うファイルをテーマフォルダの中に作成しました。

<!-- single-rental.php のループの例 -->
<section>
  <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
      <h3><?php the_title(); ?></h3><!-- タイトルを表示 -->
      <?php the_content(); ?><!-- 本文を表示 -->
    <?php endwhile; ?>
  <?php endif; ?>
</section>

個々のカスタム投稿タイプの URL

個々のカスタム投稿タイプのページには以下の URL でアクセスできます。(rewrite 参照)

http://サイトのアドレス/カスタム投稿タイプ名/個々のカスタム投稿のスラッグ/

カスタム投稿タイプ名の取得

カスタム投稿タイプのループ内で、投稿タイプ名を取得するには get_post_type() を使用します。

以下はカスタム投稿タイプのループ内で、投稿タイプをクラス属性の値として出力する例です。

<p class="<?php echo esc_attr(get_post_type()); ?>">・・・</p>

カスタム投稿タイプの情報やオブジェクトの取得

カスタム投稿タイプの情報やオブジェクトの取得するには、get_post_type_object() get_post_types() を使うことができます。

カスタム投稿タイプ関連項目ページ

ページの判定(is_singular)

特定のカスタム投稿タイプのページを出力しているかどうかを判定するには is_singular() のパラメータにカスタム投稿タイプ名を指定して判定することができます。

以下が is_singular() 書式です。

<?php is_singular( '$post_types' ) ?>

is_singular() はパラメータを指定しなければ以下のいずれかが真である場合に true を返します。

パラメータ $post_types(文字列|配列)
投稿タイプ(page、post、attachment、revision、nav_menu、カスタム投稿タイプ名)を指定。複数ある場合は配列で指定。(オプション)
戻り値 (真偽値)
指定したタイプの投稿を出力している場合は true、していなければ false

以下はカスタム投稿タイプ book の個別ページで true になります。

<?php if ( is_singular( 'book' ) ): ?>
//カスタム投稿タイプ book の個別ページでの処理

複数のカスタム投稿タイプを判定するには、パラメータにカスタム投稿タイプ名の配列を渡します。

以下はカスタム投稿タイプの名前が audio または video の個別ページの場合に true を返します。

<?php if( is_singular( array( 'audio', 'video' ) ): ?>

カスタム投稿タイプの一覧を表示

カスタム投稿タイプのアーカイブ(一覧)ページのテンプレート階層

カスタム投稿タイプのアーカイブページ(一覧ページ)を出力する際は、以下のテンプレート階層に沿ってテンプレートが選択されます。

  1. archive-{post_type}.php(優先度の最も高いテンプレート)
  2. archive.php(汎用アーカイブテンプレート)
  3. index.php(全てのページの汎用テンプレート)
アーカイブページを使って表示

カスタム投稿タイプのアーカイブページは archive-{post_type}.php というテンプレートで扱うことができます。{post_type} はカスタム投稿タイプ名で、register_post_type() の第1パラメータで指定した値になります。

例えばカスタム投稿タイプ名が rental の場合は archive-rental.php と言うテンプレートファイルを作成します。

また、カスタム投稿タイプの一覧ページを表示するためには、カスタム投稿タイプを登録する際に register_post_type() の第2パラメータの引数で、'has_archive' => true を指定する必要があります。

カスタム投稿タイプのアーカイブページのテンプレートでは、通常のアーカイブページと同じようにデフォルトのループでカスタム投稿タイプを取得することができます。

以下はカスタム投稿タイプ rental のテンプレート archive-rental.php でのループ部分の記述例です。

<div id="main">
  <h2>レンタル一覧ページ (archive-rental.php)</h2>
  <!-- その他表示したい内容を記述 -->
  <section>
  <!-- ループで一覧を表示 -->
  <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
    <div <?php post_class(); ?>>
      <!-- タイトルにリンクを付けて表示 -->
      <h3><a href="<?php the_permalink(); ?>" ><?php the_title(); ?></a></h3>
      <!-- 抜粋を表示 -->
      <?php the_excerpt(); ?>
    </div>
    <?php endwhile; ?>
  <?php endif; ?>
  </section>
</div> <!-- end of #main -->

カスタム投稿タイプのアーカイブページへのリンク

以下は get_post_type_archive_link() を使って rental と言う名前のカスタム投稿タイプのアーカイブページへのリンクを出力する例です。

<a href="<?php echo get_post_type_archive_link( 'rental' ); ?>">Rental</a>
ナビゲーションメニュー

ナビゲーションメニュー(カスタムメニュー)を使っている場合に、カスタム投稿タイプのアーカイブページのメニュー項目を追加するには以下のようにします。

管理画面の「概観」→「メニュー」を選択して編集するメニューを選択します。

「メニュー項目を追加」の下にカスタム投稿タイプの名前(ラベル名)が表示されているので展開して「すべて表示」のタブを選択すると一番上にアーカイブページの項目があるのでチェックを入れて「メニューに追加」をクリックします。

右側に追加した項目が表示されるので最後に「メニューを保存」をクリックして設定を保存します。

カスタムメニューにカスタム投稿タイプのアーカイブページのリンクを追加する画面

例えばカスタム投稿タイプ名が rental でラベル名が「レンタル」の場合、ナビゲーションメニューに追加された「レンタル」をクリックすると、アーカイブページのテンプレートが使われて一覧ページが表示されます。

その際にメニュー項目の li 要素には current-menu-item などのクラスが追加されるので、例えば現在表示されているページのリンクにアンダーラインを付けるには以下のように CSS を指定します。

nav li.current-menu-item a {
  text-decoration: underline;
}

関連項目:ナビゲーションメニュー/メニュー項目の ID やクラス

個別ページが表示された際に、親のメニューの li 要素にクラスを付加

個別ページが表示される際に、ナビゲーションメニューのカスタム投稿タイプのメニュー項目(上記の例の場合は「レンタル」)の li 要素には「current_page_parent」と言うクラスが付きません。

以下は「current_page_parent」というクラスを独自に追加する方法です。

  1. ナビゲーションメニューのメニュー項目に CSS class (オプション)を設定
  2. 個別ページのクラス名を利用して jQuery でクラス「current_page_parent」を追加

追加したメニュー項目に CSS class (オプション)を設定します。この例では「rental_menu」というクラスを指定します。

カスタムメニューの設定画面

個別ページで出力されるその個別ページを識別できるクラスを利用します。個別ページを出力するテンプレートに独自のクラスを指定しても良いですが、この例では body_class() で出力されるクラスを利用します。

body_class() はカスタム投稿タイプの個別ページでは「single-カスタム投稿タイプ」と言うクラスを body 要素のクラスに追加します。

カスタム投稿タイプが rental の場合は、single-rental と言うクラスが追加されるので、そのクラスを利用して jQuery でクラス「current_page_parent」を追加します。

以下が jQuery の記述です。そのページに single-rental と言うクラスが付いている要素があればメニュー項目(nav li.rental_menu)に「current_page_parent」を追加します。

<script>
jQuery(function($){
  if($('.single-rental').length > 0) {
    $('nav li.rental_menu').addClass('current_page_parent');
  }
});
</script> 
固定ページを使って表示

カスタム投稿タイプの一覧を固定ページを使って表示することもできます。

但し、この方法の場合はカスタム投稿タイプの各投稿の情報はデフォルトのループでは取得できないので、サブループを使用する必要があります。

また固定ページの場合は、アーカイブページとは異なりそのページの入力画面があるので管理画面からその部分は編集が可能になります(入力画面の内容を表示するにはメインループで出力する必要があります)。但し、誤ってこの固定ページを削除してしまうと何も表示されなくなる可能性があります。

固定ページのテンプレート階層は以下のようになっています(一番上が優先度が高い)。

  1. カスタムページテンプレート
  2. page-slug.php
  3. page-id.php
  4. page.php(固定ページの汎用テンプレート)
  5. index.php

この場合、カスタムページテンプレートか page-slug.php を使いますが、この例ではカスタムページテンプレートを使ってテンプレートを作成します。

カスタムページテンプレートは特定の「固定ページ」の生成に利用できるテンプレートで、任意のファイル名をつけて作成することができます。

この例ではテーマフォルダの中に、rental.php というファイルを作成します。

カスタムページテンプレートではファイルの先頭に以下のようにテンプレート名を指定します。(この名前は、「固定ページ」の編集画面の「ページ属性」テンプレートのプルダウンに表示されます)

  • ファイル名とテンプレート名が同一である必要はありません
  • 「Template Name」と「:」の間にスペースが入っていると認識されません
<?php
/*
Template Name: テンプレート名(日本語可)
*/
?>

任意のタイトルを付けた固定ページを作成して、編集画面の「ページ属性」のプルダウンでファイルに記述したテンプレート名を選択します。

また、必要に応じてパーマリンク(URL スラッグ)を指定します(スラッグはファイル名と一致している必要はありません)。

「固定ページ」の編集画面

固定ページを利用する場合、カスタム投稿タイプの各投稿の情報はデフォルトのループでは取得できないのでサブループを使用する必要がありますが、この例では WP_Query を使って一覧を取得しています。

以下がカスタムページテンプレート(rental.php)の記述例です。

<?php
/*
Template Name: レンタル
*/
?>
<?php get_header(); ?>
<div id="main">
  <section>
    <!-- 固定ページに記述した内容を表示 -->
    <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
    <div <?php post_class(); ?>>
      <h3 class="clear">
        <?php the_title(); ?>
      </h3>
      <!-- 固定ページに記述したタイトルを表示 -->
      <?php the_content(); ?>
      <!-- 固定ページに記述した本文を表示 -->
    </div>
    <?php endwhile; ?>
    <?php endif; ?>
  </section>
  <section>
    <!-- カスタム投稿タイプの一覧を表示 -->
    <?php
    // 取得する投稿の条件を指定
    $args = array(
      'post_type' => 'rental',
      'posts_per_page' => '3',
    );
    // WP_Query オブジェクト(クエリオブジェクト)の生成
    $my_query = new WP_Query( $args );
    ?>
    <?php if ( $my_query->have_posts() ) : ?>
      <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>
      <!-- get_post_type() でカスタム投稿タイプのスラッグをクラスとして出力 -->
      <div class="<?php echo esc_attr(get_post_type()); ?>">
        <!-- タイトルにリンクを付けて表示 -->
        <h3><a href="<?php the_permalink(); ?>" ><?php the_title(); ?></a></h3>
        <!-- 抜粋を表示 -->
        <?php the_excerpt(); ?>
      </div>
      <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); //グローバル変数 $post をリセット(※必須) ?>
  </section>
</div> <!-- end of #main -->
<?php
get_sidebar();
get_footer();
ナビゲーションメニュー

ナビゲーションメニュー(カスタムメニュー)を使っている場合に、固定ページのメニュー項目を追加するには以下のようにします。

管理画面の「概観」→「メニュー」を選択して編集するメニューを選択します。

「メニュー項目を追加」の下に固定ページが表示されているので展開して作成した固定ページの項目にチェックを入れて「メニューに追加」をクリックします。

右側に追加した項目が表示されるので最後に「メニューを保存」をクリックして設定を保存します。

カスタムメニューに固定ページのリンクを追加する画面

例えば「レンタル一覧ページ」と言う固定ページを追加した場合、ナビゲーションメニューに追加された「レンタル一覧ページ」をクリックすると、作成した固定ページのテンプレートが使われて一覧ページが表示されます。

その際にメニュー項目の li 要素には current-menu-itemcurrent_page_item などのクラスが追加されるので、それらを使ってスタイルを指定することができます。

カスタムタクソノミーの登録

タクソノミー(taxonomy)は「分類」を意味します。WordPress ではデフォルトで「カテゴリー」と「タグ」の2つの分類(タクソノミー)があります。

デフォルトのカテゴリーとタグとは別にユーザーが独自に登録した分類を カスタムタクソノミー(カスタム分類) と呼びます。

カスタムタクソノミーは、カスタム投稿タイプに分類を追加できるだけでなく、既存の投稿/固定ページにも分類を追加することができます(登録時に分類対象の投稿タイプを指定します)。

カスタムタクソノミーを追加するには、functions.php で register_taxonomy() を使ってカスタムタクソノミーを登録します。

register_taxonomy() は init アクションの中から呼び出す必要があり、init アクションの中では register_taxonomy() を複数記述して複数のカスタムタクソノミーを登録することができます。

カスタムタクソノミーには、カテゴリーのように階層のある分類とタグのように階層がない分類があり、階層を作るかどうかは、登録時に「hierarchical」で指定します。

以下は init アクションの中でカスタム投稿タイプとカテゴリー形式とタグ形式の2つのカスタムタクソノミーを登録する例です。

function create_my_post_types() {
  //rental というカスタム投稿タイプを登録
  register_post_type(
    'rental',//投稿タイプ名(識別子:半角英数字の小文字)
    array(
      'label' => 'レンタル',  //カスタム投稿タイプの名前(管理画面のメニューに表示される)
      'labels' => array(  //管理画面に表示されるラベルの文字を指定
        'add_new' => '新規レンタル追加',
        'edit_item' => 'レンタルの編集',
        'view_item' => 'レンタルを表示',
        'search_items' => 'レンタルを検索',
        'not_found' => 'レンタルは見つかりませんでした。',
        'not_found_in_trash' => 'ゴミ箱にレンタルはありませんでした。'
      ),
      'public' => true,  // 管理画面及びサイト上に公開
      'description' => 'カスタム投稿タイプ「レンタル」の説明文です。',  //説明文
      'hierarchicla' => false,  //コンテンツを階層構造にするかどうか
      'has_archive' => true,  //trueにすると投稿した記事の一覧ページを作成することができる
      'show_in_rest' => true,  //Gutenberg を有効化
      'supports' => array(  //記事編集画面に表示する項目を配列で指定することができる
        'title',  //タイトル
        'editor',  //本文の編集機能
        'thumbnail',  //アイキャッチ画像
        'excerpt',  //抜粋
        'custom-fields', //カスタムフィールド
        'revisions'  //リビジョンを保存
      ),
      'menu_position' => 5, //「投稿」の下に追加
      'taxonomies' => array('rental_cat', 'rental_tag')  //使用するタクソノミー
    )
  );
  
  //カスタムタクソノミー(レンタルカテゴリー:カテゴリー形式)の登録
  register_taxonomy(
    'rental_cat',   //カスタムタクソノミー名
    'rental',   //このタクソノミーが使われる投稿タイプ
    array(
      'label' => 'レンタルカテゴリー',  //カスタムタクソノミーのラベル
      'labels' => array(
        'popular_items' => 'よく使うレンタルカテゴリー',
        'edit_item' =>'レンタルカテゴリーを編集',
        'add_new_item' => '新規レンタルカテゴリーを追加',
        'search_items' => 'レンタルカテゴリーを検索'
      ),
      'public' => true,  // 管理画面及びサイト上に公開
      'description' => 'レンタルカテゴリーの説明文です。',  //説明文
      'hierarchical' => true,  //カテゴリー形式
      'show_in_rest' => true  //Gutenberg で表示
    )
  );
  
  //カスタムタクソノミー(レンタルタグ:タグ形式)の登録
  register_taxonomy(
    'rental_tag',   //カスタムタクソノミー名
    'rental',  //このタクソノミーが使われる投稿タイプ
    array(
      'label' => 'レンタルタグ', //カスタムタクソノミーのラベル
      'labels' => array(
        'popular_items' => 'よく使うレンタルタグ',
        'edit_item' =>'レンタルタグを編集',
        'add_new_item' => '新規レンタルタグを追加',
        'search_items' => 'レンタルタグを検索'
      ),
      'public' => true,  // 管理画面及びサイト上に公開
      'description' => 'レンタルタグの説明文です。',  //説明文
      'hierarchical' => false, //タグ形式
      'update_count_callback' => '_update_post_term_count', 
      'show_in_rest' => true //Gutenberg で表示
    )
  );
  
}
//init アクションフックで登録
add_action('init', 'create_my_post_types');  

上記を記述すると、以下のように「レンタルカテゴリー」と「レンタルタグ」と言うカスタムタクソノミーが追加されます。

カスタムタクソノミー追加後の新規作成画面

以下は追加した「レンタルカテゴリー」の管理画面です。

「新規レンタルカテゴリーの追加」や「レンタルカテゴリーの検索」のように labels で指定したラベルで表示されています。

この例の場合、labels の not_found(カスタムタクソノミーが存在しない場合に一覧ページで表示されるラベル)を指定していないので、デフォルトの「カテゴリーが見つかりませんでした。」が表示されています。

カスタムタクソノミー「レンタルカテゴリー」の管理画面

以下は追加した「レンタルタグ」の管理画面です。

この場合も labels の not_found を指定していないので、デフォルトの「タグが見つかりませんでした。」が表示されています。

実際にどんなラベルが設定されているかは get_taxonomy() でタクソノミーのオブジェクトを取得して var_dump() で確認することができます。

カスタムタクソノミー「レンタルタグ」の管理画面

register_taxonomy

register_taxonomy( $taxonomy, $object_type, $args )

パラメータ
  • $taxonomy(文字列):(必須) カスタムタクソノミーの名前。半角英数字の小文字で32文字以下
  • $object_type(配列|文字列):(必須) 登録するカスタムタクソノミーを使用する投稿タイプの文字列(またはその配列)を指定。
    • 投稿:post
    • 固定ページ:page
    • カスタム投稿タイプ:register_post_typeで登録したカスタム投稿タイプ名
  • $args(配列|文字列):(オプション) 引数の配列 。以下参照。
戻り値
登録に失敗した場合はエラーオブジェクト
利用可能箇所
通常は functions.php

以下は register_taxonomy() の書式の例です。改行を使って見易いように記述できます。

register_taxonomy(
  'カスタムタクソノミー名',   //第1パラメータ $taxonomy
  '投稿タイプ',   //第2パラメータ $object_type
  array( //第3パラメータの配列 $args
    '引数' => '値', 
    '引数' => '値',
    ・・・
  )
);

//または以下のようにも記述できます。
register_taxonomy( 'カスタムタクソノミー名', '投稿タイプ', 
  array(
    '引数' => '値', 
    '引数' => '値',
    ・・・
  )
);

//または引数を変数 $args に代入して以下のように記述することもできます。
$args = array(  //引数の配列
  '引数' => '値', 
  '引数' => '値',
  ・・・
);
register_taxonomy( 'カスタムタクソノミー名', '投稿タイプ', $args);

以下は register_taxonomy() の登録例です。実際の登録では register_post_type() 同様、 init アクションの中から呼び出す必要があります。

register_taxonomy(
  'rental_cat',   //カスタムタクソノミー名
  'rental',   //このタクソノミーが使われる投稿タイプ
  array(
    'label' => 'レンタルカテゴリー',  //カスタムタクソノミーのラベル
    'labels' => array(
      'popular_items' => 'よく使うレンタルカテゴリー',
      'edit_item' =>'レンタルカテゴリーを編集',
      'add_new_item' => '新規レンタルカテゴリーを追加',
      'search_items' => 'レンタルカテゴリーを検索'
    ),
    'public' => true,  // 管理画面及びサイト上に公開
    'description' => 'レンタルカテゴリーの説明文です。',  //説明文
    'hierarchical' => true,  //カテゴリー形式
    'show_in_rest' => true  //Gutenberg で表示
  )
);

第1パラメータ(カスタムタクソノミー名:必須)

  • 登録したいカスタムタクソノミー名(スラッグ)を任意の半角英数字で指定(大文字やスペースは不可、32文字以内)。
  • この値は WordPress の内部処理やカテゴリーページなどの URL に使用されます。

カスタムタクソノミー名(スラッグ)は内部処理で使用されるため、「分類対象の投稿タイプ名」を利用して一定のルールで名前を付けると管理しやすくなると思います。

例えばカテゴリータイプの場合は「カスタム投稿タイプ名_cat」、タグタイプの場合は「カスタム投稿タイプ名_tag」と付けておけば、$postcat = get_post_type() .'_cat' や $posttag= get_post_type(). '_tag' のようにして使えます。

第2パラメータ(投稿タイプ名:必須)

  • カスタムタクソノミーとして分類したい投稿のタイプ名(スラッグ)を指定。
  • WordPress 標準の「投稿」を分類する場合は、タイプ名を「post」を指定。「固定ページ」を分類するならタイプ名を「page」を指定。
  • 「カスタム投稿タイプ」を分類する場合は、該当する投稿タイプ名(register_post_type() で登録した投稿タイプ名)を指定。

第3パラメータ($args オプション)

各種のパラメータを格納した配列で指定します。

以下は 第3パラメータ $args の引数です。全てのリストは日本語版 CodeXCode Reference に記載されています。

第3パラメータ $args の引数(一部抜粋)
引数 説明 初期値
label 文字列 カスタム分類の名前(ラベル)を指定。その値が管理画面に分類名としてメニューやタイトルに表示される。日本語使用可能。 カテゴリー(階層あり)
タグ(階層なし)
labels 配列 タクソノミーに付けるラベルの配列。
  • name:カスタム分類の名前(複数形)。(デフォルト:label の値)
  • singular_name:カスタム分類の名前(単数形)。(デフォルト:name の値)
  • search_items:カスタム分類一覧ページの検索ボタンのラベル(デフォルト:カテゴリーを検索/タグを検索)
  • popular_items:「よく使われる○○」のラベル(○○に該当する部分を指定)。階層のない分類のみに使用される(デフォルト:よく使われるタグ)
  • all_items :「すべての○○」のラベル
  • parent_item:「親○○」のラベル。階層のある分類のみに使用される(デフォルト:親のカテゴリー)
  • edit_item:カスタム分類の編集ページの左上に表示されるタイトル(デフォルト:カテゴリーの編集/タグの編集)
  • add_new_item:カスタム分類の新規作成ボタンに表示されるラベル(デフォルト:新規カテゴリーを追加/新規タグを追加)
  • choose_from_most_used:「よく使われている○○から選択」のラベル(階層のない分類のみ)
  • separate_items_with_commas :「○○が複数ある場合は、コンマで区切ってください」のラベル(階層のない分類のみ)
  • not_found:カスタムタクソノミーが存在しない場合に一覧ページで表示されるラベル
階層のないタクソノミーにはタグのラベルが、階層化したタクソノミーにはカテゴリーのラベルが使われ、name に label の値が、singular_name に name の値が入る。
public 真偽値 このタクソノミーを公開するかどうか。公開する場合は true true
show_ui 真偽値 管理画面にこのカスタム分類を表示する場合は true public の値
description 文字列 このタクソノミーの概要(説明) なし
hierarchical 真偽値 カテゴリーのような親子関係(階層)を持たせるには true を指定。タグと同様に親子関係を持たせない場合は false を指定。 false
rewrite 真偽値
|配列
このタクソノミーのパーマリンクのリライト方法を指定。リライト(自動 URL 書き換え)を避けるには false を指定する。rewrite(引数) を参照 true
capabilities 配列 このタクソノミー(分類)に関する権限の配列。指定しなければ、投稿と同じユーザーの権限が適用される。
  • manage_terms:分類のメニューの表示
  • edit_terms:分類の編集(追加)
  • delete_terms:分類の削除
  • assing_terms:分類を投稿へ付ける
上記4種類の子パラメータで権限を指定。
なし
show_in_rest 真偽値 このタクソノミーで REST API を有効にするかどうか。有効(true)にすると新しいエディタの Gutenberg でタクソノミーが表示されます。 false
update_count_callback 文字列 関連付けられた $object_type の個数が更新された時に呼び出される関数の名前を指定。update_count_callback 参照 なし

設定項目の確認

実際に設定されている内容は get_taxonomy() を使ってそのタクソノミーのオブジェクトを取得して var_dump() で確認することができます。

rewrite(引数)

true の場合、個々のページには以下の URL でアクセスできます。以下の「カスタム分類名」は第1パラメータで指定した値です。

  http://サイトのアドレス/カスタム分類名/個々のカスタム分類のスラッグ /

'rewrite' => array('slug' => '文字列') と指定すると以下の URL でアクセスできます。

  http://サイトのアドレス/文字列/個々のカスタム分類のスラッグ/

  • これらの設定は「パーマリンク設定」に依存すると思われます。
  • rewrite を変更した場合は、カスタム投稿タイプが正しいパーマリンク構造を表示するために、管理画面のメインナビゲーションメニューの「設定」→「パーマリンク設定」で「変更を保存」をクリックしてルールを再保存します(設定を変更する必要はありません)。
update_count_callback
日本語版 CodeX には以下のような記述があります。
参考:カスタム分類をタグのように使いたい場合は、オプションの 'update_count_callback' => '_update_post_term_count' を必ず追加します。そうしないと、一度に入力したコンマ区切りの複数の項目が、別々の値ではなく一つの値として保存されてしまいます。これは get_the_term_list や他のターム表示用関数を使うとき、非常に面倒なことになります。

但し、Code Reference の User Contributed Notes には「version 4.6.1 以降ではカスタムタクソノミーに単に階層なしとすればタグのように振舞う」と言うような記述も見受けられます。

version 5.1.1 で試してみると、タグの入力欄にカンマ区切りで入力すると、それぞれがタグとして認識されるようですが、それ以上のことはまだ試していません。

予約語

カスタムタクソノミーの名前を付ける際に以下の WordPress の予約語を使うと問題が発生します。また、カスタム投稿タイプ名で使った名前も使うと問題が発生します。

  • attachment
  • attachment_id
  • author
  • author_name
  • calendar
  • cat
  • category
  • category__and
  • category__in
  • category__not_in
  • category_name
  • comments_per_page
  • comments_popup
  • custom
  • customize_messenger_channel
  • customized
  • cpage
  • day
  • debug
  • embed
  • error
  • exact
  • feed
  • hour
  • link_category
  • m
  • minute
  • monthnum
  • more
  • name
  • nav_menu
  • nonce
  • nopaging
  • offset
  • order
  • orderby
  • p
  • page
  • page_id
  • paged
  • pagename
  • pb
  • perm
  • post
  • post__in
  • post__not_in
  • post_format
  • post_mime_type
  • post_status
  • post_tag
  • post_type
  • posts
  • posts_per_archive_page
  • posts_per_page
  • preview
  • robots
  • s
  • search
  • second
  • sentence
  • showposts
  • static
  • subpost
  • subpost_id
  • tag
  • tag__and
  • tag__in
  • tag__not_in
  • tag_id
  • tag_slug__and
  • tag_slug__in
  • taxonomy
  • tb
  • term
  • terms
  • theme
  • title
  • type
  • w
  • withcomments
  • withoutcomments
  • year
投稿や固定ページに追加

カスタムタクソノミーは、標準で用意されている投稿や固定ページにも追加することができます。

投稿にカスタムタクソノミーを追加するには、「カスタムタクソノミーを利用する投稿タイプ」を「post」と指定します。

以下のように記述すると「投稿」のメニューにカテゴリーとは別に「音楽カテゴリー」というカスタムタクソノミーが追加されます。

function add_my_post_custom_tax() {
  register_taxonomy(
    'music_cat', //カスタムタクソノミー名
    'post', //投稿に追加する場合
    array(
      'label' => '音楽カテゴリー',
      'hierarchical' => true, //カテゴリーのような親子関係(階層)を持たせる
      'show_in_rest' => true  //Gutenberg(新しいエディタ)で表示
    )
  );
}
add_action('init', 'add_my_post_custom_tax');  

追加したタクソノミーのページに初めてアクセスする際に「ページが見つかりません」と言う表示になる場合は、管理画面のメインナビゲーションメニューの「設定」→「パーマリンク設定」で「変更を保存」をクリックしてルールを再保存します(設定を変更する必要はありません)。

以下は上記を記述して「音楽カテゴリー」というカスタムタクソノミーを追加した場合の新規投稿の編集画面です。

投稿に「音楽カテゴリー」というカスタムタクソノミーを追加した際の管理画面

上記のカスタムタクソノミーに「jazz」と言うスラッグのターム(カテゴリー)を作成して、その一覧にアクセスする URL は「http://example.com/music_cat/jazz/」のようになります。

追加したタクソノミーのアーカイブ(一覧)ページは、taxonomy-カスタム分類名-ターム名.php や taxonomy-カスタム分類名.php と言うテンプレートで表示することができます。

この例の場合、カスタム分類名を「music_cat」としているので taxonomy-music_cat.php や上記の例のターム「jazz」のみを表示するには taxonomy-music_cat-jazz.php と言うテンプレートを作成します。

カスタムタクソノミーのアーカイブを表示

カスタムタクソノミーのアーカイブページを出力する際は、以下のテンプレート階層に沿って、テンプレートが選ばれます(カスタムタクソノミーは長いので、以下ではカスタム分類としています)。

  1. taxonomy-カスタム分類名-ターム名.php
  2. taxonomy-カスタム分類名.php
  3. taxonomy.php
  4. archive.php
  5. index.php
  • カスタム分類名:register_taxonomy() で第1パラメータ(カスタム分類名)に指定した文字列
  • ターム名:個々の分類項目のスラッグ(以下の管理画面の画像を参照)

Codex 日本語版:タクソノミーテンプレート

例えば、「rental_cat」と言う名前のカスタム分類を作成した場合、その一覧は taxonomy-rental_cat.php と言うテンプレートで表示することができます。

「rental_cat」と言う名前のカスタム分類の中で「small」と言う項目(ターム)を作成した場合、その項目の一覧は taxonomy-rental_cat-small.php と言うテンプレートで表示することができます。

また、taxonomy.php と言うテンプレートを使えば他の名前のカスタム分類の一覧も表示することができます。その場合、カスタム分類ごとに表示を変えるには is_tax() でどのカスタム分類に属するかを判定するなどが必要になります。

archive.php を使うとカスタム分類の他にカテゴリーやタグ、日付、作成者の一覧も扱うことになります。

以下は register_taxonomy() で第1パラメータ(カスタム分類名)に「rental_cat」、第2パラメータの引数「label」に「レンタルカテゴリー」を指定して作成したカスタム分類の管理画面です。このカスタム分類は「レンタル」と言うカスタム投稿タイプに設定しています。

カスタム分類「レンタルカテゴリー」の管理画面

taxonomy.php

taxonomy.php や taxonomy-カスタム分類名.php などのカスタム分類のアーカイブページのテンプレートでは、通常のアーカイブページと同じようにデフォルトのループでカスタム分類の投稿を取得して一覧表示することができます。

タームオブジェクトの取得

カスタム分類のアーカイブページのテンプレートでは、get_queried_object() で現在表示しているページのタームオブジェクトを取得することができます。

get_queried_object() は現在表示しているページの情報(オブジェクト)を取得する関数です。

get_queried_object() はタクソノミーのアーカイブページではタームブジェクト(get_term などで取得できるブジェクト)を取得できます。

取得したタームオブジェクトのプロパティを使えばタームのタイトルなどを出力することができます。

以下は taxonomy.php などのカスタム分類のテンプレートで、取得したタームオブジェクトのプロパティを変数に代入する例です。

<?php
// タームオブジェクトを取得
$term_obj = get_queried_object(); 
// タームのスラッグ
$term_slug =  $term_obj->slug; 
// タームのタイトル
$term_name = $term_obj->name; 
// タームの説明(HTML が含まれる可能性あり)
$term_description = $term_obj->description; 
?>

変数 $term と $taxonomy

また、taxonomy.php や taxonomy-カスタム分類名.php などのテンプレートでは、表示中のタームのスラッグが $term に、そのタームの属するタクソノミー名が $taxonomy に格納されています。

以下は register_taxonomy() で第1パラメータ(カスタム分類名)に「rental_cat」と指定して追加したカスタム分類を一覧表示するテンプレートの記述例です。

<!-- taxonomy-rental_cat.php -->
<?php get_header(); ?>
<div id="main">
  <?php $term_info = get_term_by('slug', $term, $taxonomy); ?>
  <!-- カスタム分類のターム名を表示 -->
  <h2>レンタルカテゴリー:<?php echo $term_info->name; ?></h2>
  <section>
    <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
    <div <?php post_class(); ?>>
      <h3 class="clear">
        <?php the_title(); ?>
      </h3>
      <!-- 投稿に付けられたカスタム分類のリンクを表示 -->
      <?php echo get_the_term_list($post->ID, 'rental_cat', 'cat: '); ?>
      <?php the_excerpt(); ?>
    </div>
    <?php endwhile; ?>
    <?php endif; ?>
  </section>
</div> <!-- end of #main -->
<?php
get_sidebar();
get_footer();

4行目では get_term_by() でタームオブジェクトを取得して6行目でそのプロパティからターム名を出力しています。

以下は register_taxonomy() で第1パラメータ(カスタム分類名)に「rental_cat」と指定して追加したカスタム分類に作成した「small」と言う項目(ターム)を一覧表示するテンプレートの記述例です。

<!-- taxonomy-rental_cat-small.php -->
<?php get_header(); ?>
<div id="main">
  <!-- カスタム分類で作成したタームを出力 -->
  <h2><?php single_term_title('レンタルカテゴリー:' ); ?></h2>
  <section>
    <?php if(have_posts()) : ?>
    <?php while(have_posts()) : the_post(); ?>
    <div <?php post_class(); ?>>
      <h3><?php the_title(); ?></h3>
      <!-- 投稿に付けられたカスタム分類のリンクを表示 -->
      <?php echo get_the_term_list($post->ID, 'rental_cat', 'レンタルカテゴリー: ', ' / '); ?>
      <?php the_excerpt(); ?>
    </div>
    <?php endwhile; ?>
    <?php endif; ?>
  </section>
</div> <!-- end of #main -->
<?php
get_sidebar();
get_footer();

5行目の single_term_title() はカスタムタクソノミーで作成した項目名(ターム)を表示するテンプレートタグです。上記の場合 h2 要素で出力される文字列は「レンタルカテゴリー:小型」になります。

single_term_title

カスタムタクソノミーで作成した項目名(ターム)を出力(または取得)します。通常はタクソノミーアーカイブページで使用します。

single_term_title( $prefix, $display )

パラメータ
  • $prefix(文字列):(オプション) タイトルの前に出力するテキスト
  • $display(真偽値):(オプション) タイトルをするかどうか。初期値:true(出力する)。
戻り値
$display に false を指定した場合は、タイトルの文字列

以下はカスタム分類のアーカイブページで現在のページのターム(カスタム分類の項目)を h2 要素に出力する例です。タームの前に「レンタルカテゴリー:」と言う文字列を付けて表示しています。

<h2><?php single_term_title('レンタルカテゴリー:' ); ?></h2>

以下は現在のページのタームを変数に取得する例です。

<?php $term_name = single_term_title( '' , false ); ?>

以下は single_term_title() のソースです。

get_queried_object() で現在表示しているページのタームオブジェクトを取得してそのプロパティ name を取得しています。タームの種類(カテゴリー、タグ、カスタム分類)に応じてそれぞれのフィルタを適用しています。

function single_term_title( $prefix = '', $display = true ) {
  $term = get_queried_object();  //現在表示しているページのタームオブジェクトを取得

  if ( ! $term ) {
    return;
  }

    if ( is_category() ) { //カテゴリー
    /**
     * Filters the category archive page title.
     * @since 2.0.10
     * @param string $term_name Category name for archive being displayed.
     */
    $term_name = apply_filters( 'single_cat_title', $term->name );
  } elseif ( is_tag() ) { //タグ
    /**
     * Filters the tag archive page title.
     * @since 2.3.0
     * @param string $term_name Tag name for archive being displayed.
     */
    $term_name = apply_filters( 'single_tag_title', $term->name );
  } elseif ( is_tax() ) { //カスタム分類
    /**
     * Filters the custom taxonomy archive page title.
     * @since 3.1.0
     * @param string $term_name Term name for archive being displayed.
     */
    $term_name = apply_filters( 'single_term_title', $term->name );
  } else {
    return;
  }

  if ( empty( $term_name ) ) {
    return;
  }

  if ( $display ) {
    echo $prefix . $term_name;
  } else {
    return $prefix . $term_name;
  }
}

ナビゲーションメニュー

ナビゲーションメニュー(カスタムメニュー)を使っている場合に、カスタム分類のアーカイブページのメニュー項目を追加するには以下のようにします。

管理画面の「概観」→「メニュー」を選択して編集するメニューを選択します。

「メニュー項目を追加」の下にカスタム分類の名前(ラベル名)が表示されているので展開するとカスタム分類で作成した項目(ターム)があるのでチェックを入れて「メニューに追加」をクリックします。

右側に追加した項目が表示されるので最後に「メニューを保存」をクリックして設定を保存します。

カスタムメニューにカスタム分類で作成した項目を追加する画面

例えば「小型」と言う項目(ターム)を追加した場合、ナビゲーションメニューに追加された「小型」をクリックすると、作成したカスタム分類のアーカイブのテンプレートが使われて一覧ページが表示されます。

その際にメニュー項目の li 要素には current-menu-item などのクラスが追加されるので、それらを使ってスタイルを指定することができます。

また、カスタム分類のアーカイブの場合、表示されたカスタム投稿タイプの個別ページのリンクをクリックして表示した際には、メニュー項目に current-menu-parentcurrent-カスタム投稿タイプ名-parent などのクラスが付与されます。