カスタム投稿タイプとカスタムタクソノミーの作成

WordPressでいろいろなコンテンツの表示ができますが、投稿についてはデフォルトで用意されている投稿タイプがあります。通常よく使われるのは、固定ページや投稿ページかと思います。ほとんどの場合、デフォルトで用意されている投稿タイプを使用するだけで事足りますが、デフォルトで用意されているものとは区別をしたい場合があります。例えば他と構成の違った記事を作成する場合に固定ページや投稿ページと分けて記事を書けるようにするとか、何かに特化した記事だけまとめて書いて表示方法やデザインも独自にするために区別するなどあると思います。そんな時は新しい投稿タイプを作れば思い通りにできます。それがカスタム投稿タイプの作成です。
ここでは簡潔にカスタム投稿タイプの作成方法をまとめます。

カスタム投稿タイプ作成

function.phpに’init’へのアクションフックで以下の関数を使用して作成します。

<?php register_post_type( $post_type, $args ); ?>

第1引数に投稿タイプ名を指定します。最大20文字で、大文字や空白文字は禁止されています。第2引数に各種パラメータの配列を設定します。
基本形は以下のようになります。

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'book',
      array(
      'labels' => array(
        'name' => __( 'Books' ),
        'singular_name' => __( 'Book' )
        ),
      'public' => true,
      'has_archive' => true,
      )
    );
}

主に使用される第2引数のパラメータは以下です。これら以外にも多くのパラメータがあります。詳細はWordPress Codex日本語版を参照してください。

$labels = array(
  'name'          => _x( 'Books', 'post type general name', 'tschild' ), //投稿タイプの一般名、通常は複数形。省略すると $post_type_object->label と同じ値になる。
  'singular_name' => _x( 'Book', 'post type singular name', 'tschild' ), //この投稿タイプのオブジェクト 1 個の名前(単数形)。デフォルトは 'name' の値。
  'menu_name'     => _x( 'Books', 'admin menu', 'tschild' ), //メニュー名のテキスト。メニュー項目の名前を決める文字列です。デフォルトは 'name' の値。
  'name_admin_bar' => _x( 'Book', 'add new on admin bar', 'tschild' ), //管理バーの「新規追加」ドロップダウンに入れる名前。デフォルトは、'singular_name' があればその値になり、無ければ 'name' の値になる。
  'add_new'       => _x( 'Add New', 'book', 'tschild' ), //「新規追加」のテキスト。デフォルトは階層あり/なしどちらの投稿タイプも "Add New"。
  'add_new_item'  => __( 'Add New Book', 'tschild' ), //「新規〜を追加」のテキスト。デフォルトは "Add New Post" または "Add New Page"。
  'new_item'      => __( 'New Book', 'tschild' ), //「新規〜」のテキスト。デフォルトは階層なしなら "New Post"、階層あり投稿タイプなら "New Page"。
  'edit_item'     => __( 'Edit Book', 'tschild' ), //「〜を編集」のテキスト。管理画面で、このラベルはカスタム投稿の編集パネルのメインヘッダーに表示されます。デフォルトは階層なしなら "Edit Post"、階層あり投稿タイプなら "Edit Page"。
  'view_item'     => __( 'View Book', 'tschild' ), //「〜を表示」のテキスト。デフォルトは "View Post" または "View Page"。
  'all_items'     => __( 'All Books', 'tschild' ), //メニューの「すべての〜」に使うテキスト。デフォルトは 'name' の値。
  'search_items'  => __( 'Search Books', 'tschild' ), //「〜を検索」のテキスト。デフォルトは "Search Posts" または "Search Pages"。
  'parent_item_colon' => __( 'Parent Books:', 'tschild' ), //「親〜:」のテキスト。階層あり投稿タイプのときのみ使われる。デフォルトは "Parent Page"。
  'not_found'     => __( 'No books found.', 'tschild' ), //「〜が見つかりませんでした」のテキスト。デフォルトは "No posts found" または "No pages found"。
  'not_found_in_trash' => __( 'No books found in Trash.', 'tschild' ) //「ゴミ箱内に〜が見つかりませんでした」のテキスト。デフォルトは "No posts found in Trash" または "No pages found in Trash"。
);
$args = array(
  'labels'        => $labels,
  'public'        => true, //投稿タイプをパブリックにするかどうか。true の場合、管理画面とフロントエンド(ユーザー)の両方から利用可能。
  'has_archive'   => true, //この投稿タイプのアーカイブを有効にする。デフォルトでは、アーカイブのスラッグとして $post_type が使われる。
  'menu_position' => 5, //この投稿タイプが表示されるメニューの位置。表示するには show_in_menu が true でなければならない。5 - 投稿の下, 10 - メディアの下, 15 - リンクの下, 20 - 固定ページの下, 25 - コメントの下, 60 - 最初の区切りの下(コメントの下に区切りがある), 65 - プラグインの下, 70 - ユーザーの下, 75 - ツールの下, 80 - 設定の下, 100 - 二つ目の区切りの下(設定の下に区切りがある), 初期値: null - デフォルトは「コメントの下」
  'rewrite'       => array('slug' => 'book'), //この投稿タイプのパーマリンクのリライト方法を変更する。リライトを避けるには false を指定する。'slug' => 文字列 パーマリンク構造のスラッグを変更。デフォルトは $post_type の値。
  'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ) //カスタム投稿タイプの編集画面で使用する項目。'title' (タイトル), 'editor' (内容の編集), 'thumbnail' (アイキャッチ画像。現在のテーマが post-thumbnails をサポートしていること), 'excerpt' (抜粋), 'custom-fields' (カスタムフィールド), 'revisions' (リビジョンを保存する)
);

作成すると編集画面にカスタム投稿タイプが追加されます。

カスタムタクソノミーの作成

カスタム投稿タイプを作成すると多くの場合カスタムタクソノミーも作成するかと思います。カスタム投稿タイプと同じく’init’のアクションフック内に以下の関数を使って作成します。

<?php register_taxonomy( $taxonomy, $object_type, $args ); ?>

第1引数にタクソノミーの名前を指定します。最大32文字で、英小文字とアンダースコアのみ設定できます。第2引数に投稿タイプを指定します。WordPress標準の投稿タイプかカスタム投稿タイプを設定します。第3引数に各種パラメータの配列を設定します。
主に使用される第3引数のパラメータは以下です。これら以外にも多くのパラメータがあります。詳細はWordPress Codex日本語版を参照してください。

$labels = array(
  'name'          => _x( 'Genres', 'taxonomy general name', 'tschild' ), //タクソノミーの一般的な名前(普通は複数形)。
  'singular_name' => _x( 'Genre', 'taxonomy singular name', 'tschild' ), //タクソノミーのオブジェクト 1 個の名前(単数形)。
  'search_items'  => __( 'Search Genres', 'tschild' ), //「項目を検索」の文字列。
  'all_items'     => __( 'All Genres', 'tschild' ), //「すべての項目」の文字列。
  'edit_item'     => __( 'Edit Genre', 'tschild' ), //「項目を編集」の文字列。
  'update_item'   => __( 'Update Genre', 'tschild' ), //「項目を更新」の文字列。
  'add_new_item'  => __( 'Add New Genre', 'tschild' ), //「新しい項目を追加」の文字列。
  'new_item_name' => __( 'New Genre Name', 'tschild' ), //「新しい項目の名前」の文字列。
  'menu_name'     => __( 'Genre', 'tschild' ), //メニュー名の文字列。無指定の場合、デフォルトで name のラベルが入ります。
);

$args = array(
  'hierarchical' => false, //true ならカテゴリーのような階層あり(子を持つ)タクソノミー、false ならタグのような階層化しないタクソノミー。
  'labels'       => $labels,
);

また、register_taxonomy()関数でタクソノミーを作成したら、すぐにregister_taxonomy_for_object_type()関数で投稿タイプと紐付けを行ってください。この2つの関数はペアで宣言してください。
作成したカスタム投稿タイプでもカテゴリーやタグを使用する場合は、register_taxonomy_for_object_type()関数で使用できるようにしてください。

まとめ

上記のカスタム投稿タイプとカスタムタクソノミーの作成をまとめると以下になります。

/**
* カスタム投稿タイプ作成
*/
function create_post_type() {
  $labels = array(
    'name'           => _x( 'Books', 'post type general name', 'tschild' ), //投稿タイプの一般名、通常は複数形。省略すると $post_type_object->label と同じ値になる。
    'singular_name'  => _x( 'Book', 'post type singular name', 'tschild' ), //この投稿タイプのオブジェクト 1 個の名前(単数形)。デフォルトは 'name' の値。
    'menu_name'      => _x( 'Books', 'admin menu', 'tschild' ), //メニュー名のテキスト。メニュー項目の名前を決める文字列です。デフォルトは 'name' の値。
    'name_admin_bar' => _x( 'Book', 'add new on admin bar', 'tschild' ), //管理バーの「新規追加」ドロップダウンに入れる名前。デフォルトは、'singular_name' があればその値になり、無ければ 'name' の値になる。
    'add_new'        => _x( 'Add New', 'book', 'tschild' ), //「新規追加」のテキスト。デフォルトは階層あり/なしどちらの投稿タイプも "Add New"。
    'add_new_item'   => __( 'Add New Book', 'tschild' ), //「新規〜を追加」のテキスト。デフォルトは "Add New Post" または "Add New Page"。
    'new_item'       => __( 'New Book', 'tschild' ), //「新規〜」のテキスト。デフォルトは階層なしなら "New Post"、階層あり投稿タイプなら "New Page"。
    'edit_item'      => __( 'Edit Book', 'tschild' ), //「〜を編集」のテキスト。管理画面で、このラベルはカスタム投稿の編集パネルのメインヘッダーに表示されます。デフォルトは階層なしなら "Edit Post"、階層あり投稿タイプなら "Edit Page"。
    'view_item'      => __( 'View Book', 'tschild' ), //「〜を表示」のテキスト。デフォルトは "View Post" または "View Page"。
    'all_items'      => __( 'All Books', 'tschild' ), //メニューの「すべての〜」に使うテキスト。デフォルトは 'name' の値。
    'search_items'   => __( 'Search Books', 'tschild' ), //「〜を検索」のテキスト。デフォルトは "Search Posts" または "Search Pages"。
    'parent_item_colon' => __( 'Parent Books:', 'tschild' ), //「親〜:」のテキスト。階層あり投稿タイプのときのみ使われる。デフォルトは "Parent Page"。
    'not_found'      => __( 'No books found.', 'tschild' ), //「〜が見つかりませんでした」のテキスト。デフォルトは "No posts found" または "No pages found"。
    'not_found_in_trash' => __( 'No books found in Trash.', 'tschild' ) //「ゴミ箱内に〜が見つかりませんでした」のテキスト。デフォルトは "No posts found in Trash" または "No pages found in Trash"。
  );
  $args = array(
    'labels'        => $labels,
    'public'        => true, //投稿タイプをパブリックにするかどうか。true の場合、管理画面とフロントエンド(ユーザー)の両方から利用可能。
    'has_archive'   => true, //この投稿タイプのアーカイブを有効にする。デフォルトでは、アーカイブのスラッグとして $post_type が使われる。
    'menu_position' => 5, //この投稿タイプが表示されるメニューの位置。表示するには show_in_menu が true でなければならない。5 - 投稿の下, 10 - メディアの下, 15 - リンクの下, 20 - 固定ページの下, 25 - コメントの下, 60 - 最初の区切りの下(コメントの下に区切りがある), 65 - プラグインの下, 70 - ユーザーの下, 75 - ツールの下, 80 - 設定の下, 100 - 二つ目の区切りの下(設定の下に区切りがある), 初期値: null - デフォルトは「コメントの下」
    'rewrite'       => array('slug' => 'book'), //この投稿タイプのパーマリンクのリライト方法を変更する。リライトを避けるには false を指定する。'slug' => 文字列 パーマリンク構造のスラッグを変更。デフォルトは $post_type の値。
    'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ) //カスタム投稿タイプの編集画面で使用する項目。'title' (タイトル), 'editor' (内容の編集), 'thumbnail' (アイキャッチ画像。現在のテーマが post-thumbnails をサポートしていること), 'excerpt' (抜粋), 'custom-fields' (カスタムフィールド), 'revisions' (リビジョンを保存する)
  );

  register_post_type( 'book', $args );

  // カスタム分類を新たに追加(Genre)
  $labels = array(
    'name'          => _x( 'Genres', 'taxonomy general name', 'tschild' ), //タクソノミーの一般的な名前(普通は複数形)。
    'singular_name' => _x( 'Genre', 'taxonomy singular name', 'tschild' ), //タクソノミーのオブジェクト 1 個の名前(単数形)。
    'search_items'  => __( 'Search Genres', 'tschild' ), //「項目を検索」の文字列。
    'all_items'     => __( 'All Genres', 'tschild' ), //「すべての項目」の文字列。
    'edit_item'     => __( 'Edit Genre', 'tschild' ), //「項目を編集」の文字列。
    'update_item'   => __( 'Update Genre', 'tschild' ), //「項目を更新」の文字列。
    'add_new_item'  => __( 'Add New Genre', 'tschild' ), //「新しい項目を追加」の文字列。
    'new_item_name' => __( 'New Genre Name', 'tschild' ), //「新しい項目の名前」の文字列。
    'menu_name'     => __( 'Genre', 'tschild' ), //メニュー名の文字列。無指定の場合、デフォルトで name のラベルが入ります。
  );

  $args = array(
    'hierarchical' => false, //true ならカテゴリーのような階層あり(子を持つ)タクソノミー、false ならタグのような階層化しないタクソノミー。
    'labels'       => $labels,
  );

  register_taxonomy( 'genre', array( 'book' ), $args );
  register_taxonomy_for_object_type( 'genre', 'book' );
  register_taxonomy_for_object_type( 'category', 'book' );
  register_taxonomy_for_object_type( 'post_tag', 'book' );

}
add_action( 'init', 'create_post_type' );