Chapter10 カスタム投稿タイプとカスタムタクソノミー

概要と目標 オリジナルの投稿タイプと、
オリジナルの分類を作ろう。

ブログとは別に、オリジナルの投稿タイプを作れる、カスタム投稿タイプや、
オリジナルの分類を作るカスタムタクソノミーの作成方法を学習しよう。

今回のゴール

RERUN

カスタム投稿タイプオリジナルの投稿タイプ。

カスタム投稿とは、投稿とは別にオリジナルの投稿タイプを作れる仕組み。
プラグインを使って作る方法もあるが、今回は「functions.php」を使って、
works」という制作実績を投稿する、カスタム投稿タイプを作成しよう。

カスタム投稿タイプを作成してみよう。

カスタム投稿タイプを作成するには、プラグインを使う方法もあるが、
functions.phpで、register_post_type()という関数を使って作成し、「init」というアクションでフックさせる。

register_post_type(レジスター ポスト タイプ)関数 ・・・ 投稿タイプを作成または変更する関数
register_post_type(投稿タイプ名, 投稿タイプの設定の配列)
                              省略可

引数の詳細はWordPress Codex 日本語版を参照

主な投稿タイプの設定
設定名 説明 初期値
label 投稿タイプを翻訳するための複数形の名前 投稿タイプ名
labels 管理画面などに表示されるラベルの配列
  • 'name' - 投稿タイプの名前
    (初期値: 投稿タイプ名)
  • 'singular_name' - この投稿タイプの1投稿の名前
    (初期値: 'name' の値)
  • 'menu_name' - メニューのテキスト
    (初期値: 'name' の値)
  • 'name_admin_bar' - 管理バーの「新規追加」の名前
    (初期値: 'singular_name' なければ 'name'の値)
  • 'all_items' - 一覧表示のメニューに使うテキスト
    (初期値: 'name' の値)
  • 'add_new' - 「新規追加」のテキスト
    (日本語時の初期値: '新規追加')
  • 'add_new_item' - 「新規○○を追加」のテキスト
    (日本語時の初期値: '新規投稿を追加' または '新規ページを追加')
  • 'edit_item' - 「〜を編集」のテキスト
    (日本語時の初期値: '投稿の編集' または 'ページの編集')
  • 'new_item' - 「新規〜」のテキスト
    (日本語時の初期値: '新規投稿' または '新規ページ')
  • 'view_item' - 管理バーの「〜を表示」のテキスト
    (日本語時の初期値: '投稿を表示' または 'ページを表示')
  • 'search_items' - 「〜を検索」のテキスト
    (日本語時の初期値: '投稿を検索' または 'ページを検索')
  • 'not_found' - 「〜が見つかりませんでした」のテキスト
    (日本語時の初期値: '投稿が見つかりませんでした' または 'ページが見つかりませんでした')
  • 'not_found_in_trash' - 「ゴミ箱内に〜が見つかりませんでした」のテキスト
    (日本語時の初期値: 'ゴミ箱内に投稿が見つかりませんでした' または 'ゴミ箱内にページが見つかりませんでした')
  • 'parent_item_colon' - 「親〜:」のテキスト
    (日本語時の初期値: '親ページ')
'label' の値が 'name' へセットされる
description 投稿タイプの簡単な説明
public 投稿タイプを公開するかどうか
true:公開 / false:公開しない)
false
exclude_from_search 検索結果から除外するか
true:除外 / false:除外しない)
public の反対
publicly_queryable post_type クエリが実行可能(投稿の一覧表示など) かどうか
true:可能 / false:不可能)
public の値
show_ui 投稿を管理する画面にデフォルトのUIを利用するかどうか
true:使う / false:使わない)
public の値
show_in_nav_menus ナビゲーションメニューでこの投稿タイプが選択可能かどうか
true:可能 / false:不可能)
public の値
show_in_menu 管理画面にこの投稿タイプを表示するかどうか
表示する場合 show_uitrue でなければならない
true:表示 / false:表示しない)
show_ui の値
show_in_admin_bar この投稿タイプを WordPress の管理バーから使えるようにするかどうか
true:使える / false:使えない)
show_in_menu の値
menu_position この投稿タイプが表示されるメニューの位置
表示するには show_in_menutrue でなければならない。
  • 5 - 投稿の下
  • 10 - メディアの下
  • 15 - リンクの下
  • 20 - 固定ページの下
  • 25 - コメントの下
  • 60 - 最初の区切りの下(コメントの下に区切りがある)
  • 65 - プラグインの下
  • 70 - ユーザーの下
  • 75 - ツールの下
  • 80 - 設定の下
  • 100 - 二つ目の区切りの下(設定の下に区切りがある)
コメントの下
menu_icon このメニューで使用するアイコンの URL、または Dashicons のアイコンの名前。 投稿アイコン
capability_type 投稿の権限
  • post
  • page
など
post
hierarchical この投稿タイプが階層を持つ(固定ページのようにする) かどうか
true にする場合は、次の 'supports' で、'page-attributes' を含めなければ、親を選択できない。
true:階層を持つ / false:階層を持たない)
false
supports 投稿タイプでサポートされる機能の配列
  • 'title' - タイトル
  • 'editor' - 内容の編集
  • 'author' - 作成者
  • 'thumbnail' - アイキャッチ画像 (現在のテーマが post-thumbnails をサポートしていること)
  • 'excerpt' - 抜粋
  • 'trackbacks' - トラックバック送信
  • 'custom-fields' - カスタムフィールド
  • 'comments' - コメントの他、編集画面にコメント数のバルーンを表示する
  • 'revisions' - リビジョンを保存する
  • 'page-attributes' - メニューの順序(「親〜」オプションを表示するために hierarchicaltrue であること
  • 'post-formats' - 投稿のフォーマットを追加
'title''editor'
taxonomies この投稿タイプで使用する、登録されたタクソノミーcategorypost_tag など)の配列
タクソノミー(カスタム分類)register_taxonomy() で登録する必要がある
なし
has_archive この投稿タイプのアーカイブを有効にするかどうか
(デフォルトのスラッグ名は ポストタイプ名)
true:有効 / false無効
false
rewrite この投稿タイプのパーマリンクのリライト方法を変更する配列
  • 'slug' => パーマリンク構造のスラッグ
    (デフォルトは $post_type の値)
  • 'with_front'=> 真偽値 パーマリンク構造を手前につけるかどうか
    (例:パーマリンク構造が /blog/ である場合、false ならリンクは /news/true なら /blog/news/ になる。初期値は true
  • 'feeds' => 真偽値 この投稿タイプについてフィードのパーマリンク構造を作成するかどうか
    (初期値は has_archive 値)
  • 'pages' => 真偽値 パーマリンク構造をページ送りに対応させるかどうか
    (初期値は true 値)
  • 'ep_mask' => 定数 バージョン 3.4 以降 この投稿タイプに endpoint マスクを割り当てる
投稿タイプ名
show_in_rest Gutenbergを有効化するかどうか
true にする場合は、次の 'supports' で、'editor' を含めなければ表示されない
true:有効 / false:無効)
false
register_post_type()のサンプル
function my_theme_post_type_init() {
  $labels = [
    'name'               => 'ニュース', // 投稿タイプの名前 (初期値: 投稿タイプ名)
    'singular_name'      => 'ニュース', // この投稿タイプの1投稿の名前 (初期値: 'name' の値)
    'menu_name'          => 'ニュース', // メニューのテキスト (初期値: 'name' の値)
    'name_admin_bar'     => 'ニュース', // 管理バーの「新規追加」の名前 初期値: 'singular_name' なければ 'name'の値
    'all_items'          => 'ニュース一覧', // 一覧表示のメニューに使うテキスト (初期値: 'name' の値)
    'add_new'            => 'ニュースを追加', // 「新規追加」のテキスト (日本語時の初期値: '新規追加')
    'add_new_item'       => '新規ニュースを追加', // 「新規○○を追加」のテキスト (日本語時の初期値: '新規投稿を追加' または '新規ページを追加')
    'edit_item'          => 'ニュースを編集', // 「〜を編集」のテキスト(日本語時の初期値: '投稿の編集' または 'ページの編集')
    'new_item'           => '新規ニュース', // 「新規〜」のテキスト (日本語時の初期値: '新規投稿' または '新規ページ')
    'view_item'          => 'ニュースを表示', // 管理バーの「〜を表示」のテキスト (日本語時の初期値: '投稿を表示' または 'ページを表示')
    'search_items'       => 'ニュースを検索', // 「〜を検索」のテキスト (日本語時の初期値: '投稿を検索' または 'ページを検索')
    'not_found'          => 'ニュースが見つかりませんでした', // 「〜が見つかりませんでした」のテキスト (日本語時の初期値: '投稿が見つかりませんでした' または 'ページが見つかりませんでした')
    'not_found_in_trash' => 'ゴミ箱内にニュースが見つかりませんでした', // 「ゴミ箱内に〜が見つかりませんでした」のテキスト (日本語時の初期値: 'ゴミ箱内に投稿が見つかりませんでした' または 'ゴミ箱内にページが見つかりませんでした')
    'parent_item_colon'  => '親のニュース', // 「親〜:」のテキスト (日本語時の初期値: '親ページ')
  ];

  $args = [
    'labels'              => $labels,
    'discription'         => 'ニュースの投稿', // 投稿タイプの簡単な説明 (初期値: 空)
    'public'              => true, // 投稿タイプを公開するかどうか (初期値: false)
    'exclude_from_search' => false, // 検索結果から除外するか (初期値: public の反対)
    'publicly_queryable'  => true, // post_type クエリが実行可能(投稿の一覧表示など) かどうか (初期値: public の値)
    'show_ui'             => true, // 投稿を管理する画面にデフォルトのUIを利用するかどうか (初期値: public の値)
    'show_in_nav_menus'   => true, // ナビゲーションメニューでこの投稿タイプが選択可能かどうか (初期値: public の値)
    'show_in_menu'        => true, // 管理画面にこの投稿タイプを表示するかどうか (初期値: public の値)
    'show_in_admin_bar'   => true, // この投稿タイプを WordPress の管理バーから使えるようにするかどうか (初期値: public の値)
    'menu_position'       => 5,// この投稿タイプが表示されるメニューの位置 (初期値: コメントの下)
    'menu_icon'           => 'dashicons-admin-customizer',// このメニューで使用するアイコンの URL、または Dashicons のアイコンの名前 (初期値: 投稿アイコン)
    'capability_type'     => 'post',// 投稿の権限 (初期値: post)
    'hierarchical'        => false, // この投稿タイプが階層を持つ(固定ページのようにする) かどうか (初期値: false)
    'supports'            => [ // 投稿タイプでサポートされる機能の配列 (初期値: 'title'と'editor')
      'title', // タイトル
      'editor', // 内容の編集
      'author', // 作成者
      'thumbnail', // アイキャッチ画像
      'excerpt', // 抜粋
      'trackbacks', // トラックバック送信
      'custom-fields', // カスタムフィールド
      'comments', // コメント
      'revisions', // リビジョン
      'page-attributes', // メニューの順序
      'post-formats', // 投稿フォーマット
    ],
    'taxonomies'          => [ // 投稿タイプで使用する、登録されたタクソノミー (初期値: なし)
      'category', // カテゴリー
      'post_tag', // タグ
    ],
    'has_archive'         => true, // アーカイブを有効にするかどうか (初期値: false)
    'rewrite'             => [ // パーマリンク設定 (初期値: true(ポストタイプ名をスラッグに使う))
      'slug'       => 'information', // スラッグ名の変更
      'with_front' => false, //  パーマリンク構造を手前につけるかどうか
    ],
    'show_in_rest' => true, // Gutenbergを有効化するかどうか (初期値: false)
  ];
  register_post_type('news',$args);
}
add_action('init', 'my_theme_post_type_init');
  1. 「dummy」 › 「functions.php」をテキストエディタで開く
  2. 下記を参考に「制作実績」のカスタム投稿タイプを作成する
dummy/functions.php
/*======================================
  カスタム投稿タイプ
======================================*/
function dummy_post_type_init() {
  $labels = [
    'name'      => '制作実績',
    'all_items' => '制作実績一覧',
  ];

  $args = [
    'labels'        => $labels,
    'discription'   => '制作実績の紹介',
    'public'        => true,
    'menu_position' => 5,
    'menu_icon'     => 'dashicons-desktop',
    'supports'      => [
      'title',
      'editor',
      'thumbnail',
      'custom-fields',
    ],
    'has_archive'   => true,
    'query_var'     => true,
    'show_in_rest'  => true,
  ];
  register_post_type('works',$args);
}
add_action('init', 'dummy_post_type_init');
  1. 上書き保存
  2. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  3. 「制作実績」のカスタム投稿タイプが追加されているかを確認
ブラウザでの表示例

制作実績を投稿してみよう。

  1. 「制作実績」 › 「新規追加」をクリック
  2. 下記を参考に記事を作成
    項目 内容
    タイトル Dummy Coding Factory
    内容
      架空のWebサイト制作の会社、Dummy Coding Factory様のWebサイトを制作させて頂きました
    
      サイトのコンセプト
    
      ちょっと昔のホームページをイメージして作りました。
      でも、ここにはHTML + CSSで間違えやすそうなポイントがいくつも隠れています。
    
      ターゲットユーザー
      このサイトのターゲットユーザーは、HTMLとCSSを習得したばかりの方をターゲットにしました。
    
    アイキャッチ画像 「material」フォルダ内の「dummy-coding-factory.png」
    パーマリンク 「dummy-coding-factory」
  3. 記事を公開
  4. サイトにアクセス
    http://localhost/wp-lesson/
  5. 記事が表示されているを確認
ブラウザでの表示例

RERUN

記事が表示されない場合
カスタム投稿を作成した時、「このページは見つかりません」となり、表示されないことがある。
この場合は、管理画面「設定」の「パーマリンク設定」からから、何も変更せず「更新」ボタンを押すことで改善することが多い

カスタム投稿タイプのテンプレートカスタムカスタム投稿タイプだって、
テンプレートを作りたい。

カスタム投稿タイプの個別ページは、現在「single.php」で出力している。
もし、カスタム投稿タイプ用の個別ページテンプレートを作りたい場合は、
single-投稿タイプ名.php」というファイルを作ればよい。

カスタム投稿タイプのテンプレートを作ってみよう

  1. 「wordpress-lessons」 › 「dummy-html」フォルダ内にある、「single-works.html」を「dummy」内にコピー
  2. 「single-works.html」を「single-works.php」に名前を変更する
  3. 「dummy」 › 「single-works.php」をテキストエディタで開く
  4. 共通ヘッダーと、共通フッターを読み込む
dummy/single-works.php
<?php get_header(); ?>

  <main class="l-main -single">
    <div class="l-contents -themeWhite">
      <div class="p-article">
    </div>
    <!-- /.l-contents -->
  </main>

<?php get_footer(); ?>

答えを見る

  1. メインループを記述
dummy/single-works.php
<?php get_header(); ?>

  <?php while ( have_posts() ) : the_post(); ?>
  <main class="l-main -single">
    <div class="l-contents -themeWhite">
      <div class="p-article">
    </div>
    <!-- /.l-contents -->
  </main>

  <?php endwhile; ?>
<?php get_footer(); ?>

答えを見る

  1. タイトル」、「アイキャッチ画像」、「作成日」、「投稿内容」をテンプレートタグに置き換える
dummy/single-works.php
<div class="l-container -slim">
  <header class="p-article__header">
    <h1 class="p-article__title -detail -center"><?php the_title(); ?></h1>

    <?php if ( has_post_thumbnail()) : ?>
    <figure class="p-article__eyecatch">
      <?php the_post_thumbnail(); ?>
    </figure>
    <?php endif; ?>

    <dl class="p-article__metaList">
      <dt>作成日</dt>
      <dd>
        <time datetime="<?php the_time( DATE_W3C ); ?>" class="p-article__time">
          <?php the_time( get_option( 'date_format' ) ); ?>
        </time>
      </dd>
      <dt>作品のタイプ</dt>
      <dd>
        <ul class="post-categories -inList">
          <li><a href="#">作品タイプ名</a></li>
          <li><a href="#">作品タイプ名</a></li>
        </ul>
      </dd>
      <dt>作業内容</dt>
      <dd>
        <ul class="post-categories -inList">
          <li><a href="#">作業名</a></li>
          <li><a href="#">作業名</a></li>
        </ul>
      </dd>
    </dl>
  </header>
  <section class="p-article__body">
    <?php the_content(); ?>
  </section>
</div>
<!-- /.l-container -->

答えを見る

  1. 上書き保存
  2. サイトにアクセス
    http://localhost/wp-lesson/
  3. カスタム投稿タイプ用のテンプレートで表示されているかを確認
ブラウザでの表示例

RERUN


カスタム投稿タイプのアーカイブページアーカイブページだって、
通常の投稿と分けたい。

カスタム投稿タイプのアーカイブページは、とくにスラッグ名をしていない場合は、
サイトURLの後ろにスラッグ名を指定すると表示される。
その際のテンプレートは、「archive.php」が使われる。
もし、投稿タイプ専用のアーカイブページテンプレートを作成する場合は、
archive-投稿タイプ名.php」というファイルを作る。

メニューにカスタム投稿タイプの
アーカイブページへのリンクを追加しよう。

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. カスタムメニューから、「制作実績」のカスタム投稿タイプアーカイブを追加する
    (メニュー名: 「works」)
ブラウザでの表示例
  1. アーカイブページにアクセス
    http://localhost/wp-lesson/works/
  2. カスタム投稿タイプアーカイブページが表示されていることを確認
ブラウザでの表示例

RERUN


カスタム投稿タイプアーカイブページ用の
テンプレートを作成しよう。

基本的には「archive.php」と同じテンプレートタグで作成できるが、
カスタム投稿タイプ名は、「post_type_archive_title()」という関数を使うと表示できる。

post_type_archive_title(ポスト タイプ アーカイブ タイトル)関数 ・・・ 検索クエリを表示する関数
post_type_archive_title(タイトルの前に表示する文字, 表示するかどうか)
                                          省略可

引数の詳細はWordPress Codex 日本語版を参照

  1. 「wordpress-lessons」 › 「dummy-html」フォルダ内にある、
    「archive-works.html」を「dummy」内にコピー
  2. 「archive-works.html」を「archive-works.php」に名前を変更する
  3. 「dummy」 › 「archive-works.php」をテキストエディタで開く
  4. 共通ヘッダーと、共通フッターを読み込む
dummy/archive-works.php
<?php get_header(); ?>

  <main class="l-main -single">
    <header class="p-hero">
      <h1 class="p-hero__title">投稿タイプのタイトル</h1>
    </header>
    </section>
    <!-- /.l-contents -->
  </main>

<?php get_footer(); ?>

答えを見る

  1. 投稿があるかをチェックし、投稿があれば、メインループ
    投稿がなければ、「投稿がありません」と表示される処理を記述
dummy/archive-works.php
<section class="l-contents">
  <div class="l-container">

  <?php if ( have_posts() ) :?>

    <div class="c-grid -gutter">

      <?php while( have_posts() ) : the_post(); ?>
      <article class="c-grid__item -tab4Of12 -lap3Of12">
        <a href="" class="c-card p-project">
          <div class="c-card__body">
            <h2 class="p-project__title">制作実績のタイトル</h2>
            <p class="p-project__text">
              制作実績の抜粋文
            </p>
            <!-- /.p-project__text -->
          </div>
          <!-- /.c-card__body -->
          <figure class="c-card__thumbnail">
            <img src="assets/images/no-picture_single.png" alt="">
          </figure>
          <!-- /.c-card__thumbnail -->
        </a>
      </article>
      <?php endwhile; ?>

    </div>
    <!-- /.c-grid -->

    <nav class="navigation pagination" role="navigation">
      <h2 class="screen-reader-text">投稿ナビゲーション</h2>
      <div class="nav-links">
        <a class="prev page-numbers" href="#"><span class="screen-reader-text">前へ</span></a>
        <span aria-current="page" class="page-numbers current">1</span>
        <a class="page-numbers" href="#">2</a>
        <a class="next page-numbers" href="#"><span class="screen-reader-text">次へ</span></a>
      </div>
    </nav>

    <?php else : ?>

      <p>投稿がありません。</p>

    <?php endif; ?>
  </div>
  <!-- /.l-container -->
</section>
<!-- /.l-contents -->

答えを見る

  1. ページのタイトル部分を「post_type_archive_title()」に置き換える
dummy/archive-works.php
<header class="p-hero">
  <h1 class="p-hero__title"><?php post_type_archive_title(); ?></h1>
</header>
  1. タイトル」、「抜粋文」、「パーマリンク」、「アイキャッチ画像 (設定されていなければ「no-picture_single.png」)」をテンプレートタグに置き換える
dummy/archive-works.php
<article class="c-grid__item -tab4Of12 -lap3Of12">
  <a href="<?php the_permalink(); ?>" class="c-card p-project">
    <div class="c-card__body">
      <h2 class="p-project__title"><?php the_title(); ?></h2>
      <p class="p-project__text">
        <?php the_excerpt(); ?>
      </p>
      <!-- /.p-project__text -->
    </div>
    <!-- /.c-card__body -->
    <figure class="c-card__thumbnail">
    <?php if ( has_post_thumbnail() ) : ?>
      <?php the_post_thumbnail() ?>
    <?php else : ?>
      <img src="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png" srcset="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png, <?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single@2x.png 2x" alt="アイキャッチ画像はありません">
    <?php endif; ?>
    </figure>
    <!-- /.c-card__thumbnail -->
  </a>
</article>

答えを見る

  1. ページナビゲーション」をテンプレートタグに置き換える
dummy/archive-works.php
</div>
<!-- /.c-grid -->

  <?php
    // ページネーション
    $args = [
      'prev_text' => '<span class="screen-reader-text">前へ</span>',
      'next_text' => '<span class="screen-reader-text">次へ</span>'
    ];
    the_posts_pagination( $args );
  ?>

<?php else : ?>

  <p>投稿がありません。</p>

<?php endif; ?>

答えを見る

  1. 上書き保存
  2. 制作実績のアーカイブページにアクセス
    http://localhost/wp-lesson/works/
  3. カスタム投稿タイプのアーカイブページ用のテンプレートで表示されているかを確認
ブラウザでの表示例

RERUN


抜粋文の調整抜粋文はデフォルトでは 110 文字だし、
[...]もなんかちょっと・・・。

the_excerpt()」は、デフォルトでは、110文字表示される。
(WP Multibyte Patchを有効化した場合)
また、その文字数以上ある場合は、「[...]」として省略される。
これらを変更する場合は、「functions.php」で、「excerpt_length」フィルターや、「excerpt_more」を使用することで変更できる。

抜粋文の調整を調整してみよう。

  1. 「dummy」 › 「functions.php」をテキストエディタで開く
  2. 下記を参考に、excerpt_lengthや、excerpt_moreを使って、抜粋文を調整する
dummy/functions.php
/*======================================
  抜粋文を調整
======================================*/
/*
  文字数の変更
----------------------------------- */
function dummy_excerpt_length( $length ) {
  return 32;
}
add_filter( 'excerpt_length', 'dummy_excerpt_length', 999 );

/*
  省略時の文字変更
----------------------------------- */
function dummy_excerpt_more($more) {
  return '...';
}
add_filter('excerpt_more', 'dummy_excerpt_more');
  1. 上書き保存
  2. 制作実績のアーカイブページにアクセス
    http://localhost/wp-lesson/works/
  3. 抜粋文の文字数や省略時の文字が変更されているかを確認
ブラウザでの表示例

RERUN


カスタムタクソノミーオリジナルの分類だって作れちゃう。

タクソノミーとは、「カテゴリ」や「タグ」のような投稿を分類する仕組みのこと。
カスタムタクソノミーを作る場合は、「functions.php」にregister_taxonomy()という関数で作成し、
register_post_type()と同様で、init のアクションでフックさせる。
なお、作ったタクソノミーをカスタム投稿タイプに使う際は、register_post_type() の設定の 'taxonomies' に 登録したタクソノミー名を追加しておくこと。
ちなみに、タクソノミーに登録される、各カテゴリー名や各タグ名のことを「ターム」という。

register_taxonomy(レジスター タクソノミー)関数 ・・・ 検索クエリを表示する関数
register_taxonomy(タクソノミー名, 関連付ける投稿タイプ名, タクソノミーの設定の配列)
                                                           省略可

引数の詳細はWordPress Codex 日本語版を参照

主なタクソノミーの設定
設定名 説明 初期値
label タクソノミーを翻訳するための複数形の名前 タクソノミー名
labels 管理画面などに表示されるラベルの配列
  • 'name' - タクソノミーの名前
    (初期値: タクソノミー名)
  • 'singular_name' - このタクソノミーの1投稿の名前
    (初期値: 'name' の値)
  • 'menu_name' - メニューのテキスト
    (初期値: 'name' の値)
  • 'all_items' - 「すべての〜」のテキスト
    (初期値: 'すべてのカテゴリー' または 'すべてのタグ')
  • 'edit_item' - 「〜を編集」のテキスト
    (日本語時の初期値: 'カテゴリを編集' または 'タグを編集')
  • 'view_item' - 「〜を表示」のテキスト
    (日本語時の初期値: 'カテゴリーを表示' または 'タグを表示')
  • 'update_item' - 「〜を更新」のテキスト
    (日本語時の初期値: 'カテゴリーを更新' または 'タグを更新')
  • 'add_new_item' - 「新しい〜を追加」のテキスト
    (日本語時の初期値: '新しいカテゴリーを追加' または '新しいタグを追加')
  • 'new_item_name' - 「新しい〜の名前」のテキスト
    (日本語時の初期値: '新しいカテゴリーの名前' または '新しいタグの名前')
  • 'parent_item' - 「親〜」のテキスト

    (階層があるタクソノミーのみ)(日本語時の初期値: '親カテゴリー')
  • 'parent_item_colon' - 「親〜:」のテキスト

    (階層があるタクソノミーのみ)(日本語時の初期値: '親カテゴリー:')
  • 'search_items' - 「〜を検索」のテキスト
    (日本語時の初期値: 'カテゴリーを検索' または 'タグを検索')
  • 'popular_items' - 「人気の〜」のテキスト
    (階層がないタクソノミーのみ)
    (日本語時の初期値: '人気のカテゴリ' または '人気のタグ')
  • 'separate_items_with_commas' - 「タグをコンマで区切ってください」のテキスト
    (階層がないタクソノミーのみ)
    (日本語時の初期値: 'タグをコンマで区切ってください')
  • 'not_found' - 「〜が見つかりませんでした」のテキスト
    (日本語時の初期値: 'カテゴリーが見つかりませんでした' または 'タグが見つかりませんでした')
'label' の値が 'name' へセットされる
description タクソノミーの簡単な説明
public タクソノミーを公開するかどうか
true:公開 / false:公開しない)
true
show_ui タクソノミーを管理する画面にデフォルトのUIを利用するかどうか
true:使う / false:使わない)
public の値
show_in_nav_menus ナビゲーションメニューでこのタクソノミーが選択可能かどうか
true:可能 / false:不可能)
public の値
show_tagcloud タグクラウドのウィジェットがこのタクソノミーを使うかどうか
true:使う / false:使わない)
show_ui の値
show_in_quick_edit 直接編集画面で、カスタム分類を表示するかどうか
true:表示 / false:表示しない)
show_ui の値
meta_box_cb メタボックスを表示するためのコールバック関数
(投稿画面でのターム追加のメタボックス)
null
show_admin_column 関連付けられた投稿タイプのテーブルにタクソノミーのカラムを自動生成するかどうか
true:する / false:しない)
false
hierarchical このタクソノミーが階層を持つ(カテゴリーのようにする) かどうか
true:階層を持つ / false:階層を持たない)
false
capabilities タクソノミーの権限
  • manage_terms
  • edit_terms
  • delete_terms
  • assign_terms
なし
rewrite パーマリンクのリライト方法を変更する配列
  • 'slug' => パーマリンク構造のスラッグ
    (デフォルトは $post_type の値)
  • 'with_front'=> 真偽値 パーマリンク構造を手前につけるかどうか
  • 'hierarchical'=> 階層化した URL を使用可能にするかどうか
    true / false[初期値])
  • 'ep_mask' => endpointマスクを割り当てる
true
sort タクソノミーのタームがオブジェクトへ付けられた順序を記憶するかどうか
true:する / false:しない)
なし
show_in_rest Gutenbergを有効化するかどうか
true:有効 / false:無効)
なし
register_taxonomy()のサンプル
function my_taxonomies_init() {
  $labels = [
    'name'                       => 'ジャンル', // タクソノミーの名前 (初期値: タクソノミー名)
    'singular_name'              => 'ジャンル', // このタクソノミーの1投稿の名前 (初期値: 'name' の値)
    'menu_name'                  => 'ジャンル', // メニューのテキスト (初期値: 'name' の値)
    'all_items'                  => '全てのジャンル', // 「すべての〜」のテキスト
    'edit_item'                  => 'ジャンルを編集', // 「〜を編集」のテキスト
    'view_item'                  => 'ジャンルを表示', // 「〜を表示」のテキスト
    'update_item'                => 'ジャンルを更新', // 「〜を更新」のテキスト
    'add_new_item'               => '新しいジャンルを追加', // 「新しい〜を追加」のテキスト
    'new_item_name'              => '新しいジャンルの名前', // 「新しい〜の名前」のテキスト
    'parent_item'                => '親のジャンル', // 「親〜」のテキスト
    'parent_item_colon'          => '親のジャンル:', // 「親〜:」のテキスト
    'search_items'               => 'ジャンルを検索', // 「〜を検索」のテキスト
    'popular_items'              => '人気のジャンル', // 「人気の〜」のテキスト
    'separate_items_with_commas' => 'ジャンルをコンマで区切ってください', // 「〜をコンマで区切ってください」のテキスト
    'not_found'                  => 'ジャンルが見つかりませんでした', // 「〜が見つかりませんでした」のテキスト
  ];

  $args = [
    'labels'              => $labels,
    'discription'         => 'ジャンルの分類', // タクソノミーの簡単な説明 (初期値: 空)
    'public'              => true, // タクソノミーを公開するかどうか (初期値: true)
    'show_ui'             => true, // タクソノミーを管理する画面にデフォルトのUIを利用するかどうか (初期値: public の値)
    'show_in_nav_menus'   => true, // ナタクソノミーを管理する画面にデフォルトのUIを利用するかどうか(初期値: public の値)
    'show_tagcloud'       => true, // タグクラウドのウィジェットがこのタクソノミーを使うかどうか (初期値: show_ui の値)
    'show_in_quick_edit'  => true, // 直接編集画面で、カスタム分類を表示するかどうか (初期値: show_ui の値)
    'meta_box_cb'         => null,// メタボックスを表示するためのコールバック関数 (初期値: null)
    'show_admin_column'   => true,// 関連付けられた投稿タイプのテーブルにタクソノミーのカラムを自動生成するかどうか (初期値: false)
    'hierarchical'        => false, // このタクソノミーが階層を持つ(カテゴリーのようにする) かどうか (初期値: false)
    'capabilities'        => [ // タクソノミーの権限(初期値: なし)
      'manage_terms',
    ],
    'rewrite'             => [ // パーマリンク設定 (初期値: true)
      'slug'       => 'genre', // スラッグ名の変更
      'with_front' => false, //  パーマリンク構造を手前につけるかどうか
    ],
    'sort' => false, // タクソノミーのタームがオブジェクトへ付けられた順序を記憶するかどうか (初期値: false)
    'show_in_rest' => true // Gutenbergを有効化するかどうか (初期値: false)
  ];
  register_taxonomy('genre', 'works', $args);
}
add_action('init', 'my_taxonomies_init');

カスタムタクソノミーを作ってみよう。

  1. 「dummy」 › 「functions.php」をテキストエディタで開く
  2. 下記を参考に、「作品のタイプ」というカスタムタクソノミーを作成する
dummy/functions.php
/*======================================
  カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
  /*
    カスタム投稿タイプ(制作実績)
  ----------------------------------- */
  $labels = [
    'name'      => '制作実績',
    'all_items' => '制作実績一覧',
  ];

  $args = [
    'labels'        => $labels,
    'discription'   => '制作実績の紹介',
    'public'        => true,
    'menu_position' => 5,
    'menu_icon'     => 'dashicons-desktop',
    'supports'      => [
      'title',
      'editor',
      'thumbnail',
      'custom-fields',
    ],
    'has_archive'   => true,
    'query_var'     => true,
    'show_in_rest'  => true,
  ];
  register_post_type('works',$args);

  /*
    カスタムタクソノミー(作品のタイプ)
  ----------------------------------- */
  $labels = [
    'name'         => '作品のタイプ',
    'add_new_item' => '新しい作品のタイプを追加',
  ];

  $args = [
    'labels'            => $labels,
    'discription'       => '作品の種類を分類するタクソノミー',
    'show_admin_column' => true,
    'hierarchical'      => true,
    'show_in_rest'      => true
  ];
  register_taxonomy('work_type', 'works', $args);
}

add_action('init', 'dummy_post_type_init');
  1. register_post_type()taxonomies に、
    作成した「work_type」カスタムタクソノミーを設定する
dummy/functions.php
/*======================================
  カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
  /*
    カスタム投稿タイプ(制作実績)
  ----------------------------------- */
  $labels = [
    'name'      => '制作実績',
    'all_items' => '制作実績一覧',
  ];

  $args = [
    'labels'        => $labels,
    'discription'   => '制作実績の紹介',
    'public'        => true,
    'menu_position' => 5,
    'menu_icon'     => 'dashicons-desktop',
    'supports'      => [
      'title',
      'editor',
      'thumbnail',
      'custom-fields',
    ],
    'has_archive'   => true,
    'query_var'     => true,
    'show_in_rest'  => true,
    'taxonomies'    => [
      'work_type',
    ],
  ];
  register_post_type('works',$args);

  /*
    カスタムタクソノミー(作品のタイプ)
  ----------------------------------- */
  $labels = [
    'name'         => '作品のタイプ',
    'add_new_item' => '新しい作品のタイプを追加',
  ];

  $args = [
    'labels'            => $labels,
    'discription'       => '作品の種類を分類するタクソノミー',
    'show_admin_column' => true,
    'hierarchical'      => true,
    'show_in_rest'      => true
  ];
  register_taxonomy('work_type', 'works', $args);
}

add_action('init', 'dummy_post_type_init');
  1. 上書き保存

制作実績にカスタムタクソノミーを設定してみよう

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. 「作品のタイプ」を追加する
    設定内容
    名前 スラッグ
    Webサイト web-site
ブラウザでの表示例
  1. 「制作実績一覧」 › 「Dummy Coding Factory」に移動
  2. 「作品のタイプ」から「Webサイト」を選択
  3. 「更新」をクリック
ブラウザでの表示例

タクソノミーの出力カスタムタクソノミーを、
表示してみよう。

作成したカスタムタクソノミーは、the_category()the_tags() などでは表示できない。
投稿に紐づくタームを取得するには、get_the_terms()を使って、
タクソノミーの情報を配列 (オブジェクト)で取得してループで表示する。

get_the_terms(ゲット ザ タームズ)関数 ・・・ 投稿に割り当てられたタクソノミーのターム(カスタム分類の項目)を取得する関数
get_the_terms(投稿ID, タクソノミー名)

戻り値: 成功するとタームのオブジェクトの配列を返す
        投稿にタームが付いていなければ false
        無効なタクソノミーが指定されると WP_Error オブジェクトを返す

引数の詳細はWordPress Codex 日本語版を参照

投稿に紐づくタームを取得してみよう。

  1. 「dummy」 › 「single-works.php」をテキストエディタで開く
  2. 下記を参考に、制作実績に紐づいている「作品のタイプ」のタームを取得する
dummy/single-works.php
<dt>作品のタイプ</dt>
<dd>
  <?php
    $terms = get_the_terms($post->ID, 'work_type');
    echo '<pre>';
    print_r($terms);
    echo '</pre>';
  ?>
  <ul class="post-categories -inList">
    <li><a href="#">作品タイプ名</a></li>
    <li><a href="#">作品タイプ名</a></li>
  </ul>
</dd>
  1. 上書き保存
  2. 制作実績の投稿ページにアクセス
    http://localhost/wp-lesson/works/
  3. 「$terms」の中身を確認
    (「term_taxonomy_id」の数字が違っても問題ない)
ブラウザでの表示例

RERUN


投稿に紐づくタームを表示してみよう。

タームが取得できいることが確認できたら、その配列を foreach文を使ってループすればよい。
タームのアーカイブページへのURLは、get_term_link()で取得できる。

get_term_link(ゲット ザ タームズ)関数 ・・・ 投稿に割り当てられたタクソノミーのターム(カスタム分類の項目)を取得する関数
get_term_link(タームのオブジェクト, タクソノミー名)

戻り値: 成功するとタームのアーカイブページへのパーマリンク
        タームが存在しなければ WP_Error オブジェクトを返す

引数の詳細はWordPress Codex 日本語版を参照

  1. 「dummy」 › 「single-works.php」をテキストエディタで開く
  2. print_r()の部分をコメントまたは、削除する
  3. if文で、タームが存在しているかと、
    is_wp_error()(true:エラーあり / false:エラーなし)を使ってWP_Error が出ていないかを確認
dummy/single-works.php
<dt>作品のタイプ</dt>
<dd>
  <?php
    $terms = get_the_terms($post->ID, 'work_type');
    // echo '<pre>';
    // print_r($terms);
    // echo '</pre>';
  ?>
  <?php if( $terms && !is_wp_error($terms) ) :  ?>
    <ul class="post-categories -inList">
      <li><a href="#">作品タイプ名</a></li>
      <li><a href="#">作品タイプ名</a></li>
    </ul>
  <?php endif; ?>
</dd>
  1. foreach文で、タームがある限り、リストを生成する
dummy/single-works.php
<dt>作品のタイプ</dt>
<dd>
  <?php
    $terms = get_the_terms($post->ID, 'work_type');
    // echo '<pre>';
    // print_r($terms);
    // echo '</pre>';
  ?>
  <?php if( $terms && !is_wp_error($terms) ) :  ?>
    <ul class="post-categories -inList">
    <?php foreach($terms as $term) : ?>
      <li><a href="#">作品タイプ名</a></li>
    <?php endforeach; ?>
    </ul>
  <?php endif; ?>
</dd>
  1. カテゴリ名とテームのアーカイブページへのリンクを記述
dummy/single-works.php
<dt>作品のタイプ</dt>
<dd>
  <?php
    $terms = get_the_terms($post->ID, 'work_type');
    // echo '<pre>';
    // print_r($terms);
    // echo '</pre>';
  ?>
  <?php if( $terms && !is_wp_error($terms) ) :  ?>
    <ul class="post-categories -inList">
    <?php foreach($terms as $term) : ?>
      <li><a href="<?php echo esc_url( get_term_link($term, $term->taxonomy) ); ?>"><?php echo esc_html($term->name); ?></a></li>
    <?php endforeach; ?>
    </ul>
  <?php endif; ?>
</dd>
  1. 上書き保存
  2. 制作実績の投稿ページにアクセス
    http://localhost/wp-lesson/works/
  3. 作品タイプが表示されているかを確認
ブラウザでの表示例

RERUN

カスタムタクソノミーの
アーカイブページ用テンプレート
カスタムタクソノミーのアーカイブぺージは、現在「archive.php」が使われている。
もしカスタムタクソノミー用のテンプレートを作成する場合は、「taxonomy.php」というファイルを作れば適用される。 なお、タクソノミーのアーカイブページのタイトルは、single_term_title()というテンプレートタグで表示できる。 したがって、今回の場合だと「arhive-works.php」をコピーし、名前を「taxonomy.php」に変更、h1要素を、single_term_title()に変更すればいい感じになる。

練習問題 今回の理解度をチェック。

完成例を参考にコンテンツのテンプレート化をしたり、
カスタムタクソノミーを作成して下さい。

完成イメージ

RERUN

  1. 項目 内容
    テンプレートパーツの範囲 「archive-works.php」の article要素
    テンプレートパーツのファイル名 「content-works」
    テンプレートパーツのファイルの保存場所 「template-parts」フォルダ内
  2. 項目 設定値
    タクソノミー名 work_contents
    管理画面に表示するタクソノミーの名前 作業内容
    ターム登録画面の見出し 新しい作業内容を追加
    タクソノミーの説明 作業内容を分類するタクソノミー
    ターム一覧画面のテーブルに表示するかどうか する
    Gutenbergで有効化するかどうか する
    • デザイン
    • コーディング
  3. 項目 設定値
    該当ファイル 「single-works.php」
    表示場所 文字列「作業内容」の下にある、リストを置き換える
解答例
dummy/template-parts/content-works.php
<article class="c-grid__item -tab4Of12 -lap3Of12">
  <a href="<?php the_permalink(); ?>" class="c-card p-project">
    <div class="c-card__body">
      <h2 class="p-project__title"><?php the_title(); ?></h2>
      <p class="p-project__text">
        <?php the_excerpt(); ?>
      </p>
      <!-- /.p-project__text -->
    </div>
    <!-- /.c-card__body -->
    <figure class="c-card__thumbnail">
    <?php if ( has_post_thumbnail() ) : ?>
      <?php the_post_thumbnail() ?>
    <?php else : ?>
      <img src="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png" srcset="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png, <?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single@2x.png 2x" alt="アイキャッチ画像はありません">
    <?php endif; ?>
    </figure>
    <!-- /.c-card__thumbnail -->
  </a>
</article>
dummy/archive-works.php
<div class="c-grid -gutter">

  <?php while( have_posts() ) : the_post(); ?>

    <?php get_template_part('template-parts/content', 'works'); ?>

  <?php endwhile; ?>

</div>
<!-- /.c-grid -->
dummy/functions.php
/*======================================
  カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
  /*
    カスタム投稿タイプ(制作実績)
  ----------------------------------- */
  $labels = [
    'name'      => '制作実績',
    'all_items' => '制作実績一覧',
  ];

  $args = [
    'labels'        => $labels,
    'discription'   => '制作実績の紹介',
    'public'        => true,
    'menu_position' => 5,
    'menu_icon'     => 'dashicons-desktop',
    'supports'      => [
      'title',
      'editor',
      'thumbnail',
      'custom-fields',
    ],
    'has_archive'   => true,
    'query_var'     => true,
    'show_in_rest'  => true,
    'taxonomies'    => [
      'work_type',
      'work_contents',
    ],
  ];
  register_post_type('works',$args);

  /*
    カスタムタクソノミー(作品のタイプ)
  ----------------------------------- */
  $labels = [
    'name'         => '作品のタイプ',
    'add_new_item' => '新しい作品のタイプを追加',
  ];

  $args = [
    'labels'            => $labels,
    'discription'       => '作品の種類を分類するタクソノミー',
    'show_admin_column' => true,
    'hierarchical'      => true,
    'show_in_rest'      => true
  ];
  register_taxonomy('work_type', 'works', $args);

  /*
    カスタムタクソノミー(作業)
  ----------------------------------- */
  $labels = [
    'name'         => '作業内容',
    'add_new_item' => '新しい作業内容を追加',
  ];

  $args = [
    'labels'            => $labels,
    'discription'       => '作業内容を分類するタクソノミー',
    'show_admin_column' => true,
    'show_in_rest'      => true
  ];
  register_taxonomy('work_contents', 'works', $args);
}

add_action('init', 'dummy_post_type_init');
dummy/single-works.php
<dt>作業内容</dt>
<dd>
<?php $terms = get_the_terms($post->ID, 'work_contents'); ?>
<?php if( $terms && !is_wp_error($terms)) :  ?>
  <ul class="post-categories -inList">
  <?php foreach($terms as $term) :  ?>
    <li><a href="<?php echo esc_url( get_term_link($term, $term->taxonomy) ); ?>"><?php echo esc_html($term->name); ?></a></li>
  <?php endforeach; ?>
  </ul>
<?php endif; ?>
</dd>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめオリジナルの投稿タイプや、
オリジナルの分類もつくれちゃう。

カスタム投稿タイプを使えば、更新頻度が高いものを管理画面から投稿できるようにできる。
また、カスタムタクソノミーを使って、投稿を自由に分類できる。

  • カスタム投稿タイプは、register_post_type()で作成する
  • カスタムタクソノミーは、register_taxonomy()で作成する