WordPress のカスタム投稿タイプとカスタムタクソノミーを functions.php でつくる(2016年最新版)

WordPress のカスタム投稿タイプとカスタムタクソノミーは、プラグインでつくることも functions.php でつくることもできる。プラグインを使ってカスタム投稿をたくさん書いてしまうと

に、今まで書いた記事がすべて消えて、表示されなくなるというリスクがある。プラグインからカスタム投稿を定義すると、意外にもそのカスタム投稿自体を簡単に削除できてしまう。カスタム投稿が増えて「そろそろあれを削除しようか」となったとき、なにも考えずにぼーっとしていると、消したくないカスタム投稿を丸ごと消してしまうという恐ろしい状況が出てくる。

長い目で考えると結局、カスタム投稿はプラグインでなく自力で functions.php を追加するべきだと考えられる。

結論


// 求人投稿
function recruit_custom_post_type() {

    // ラベル
    $labels = array(
        'name' => _x( '求人name', 'post type general name' ),
        'singular_name' => _x( '求人singular_name', 'post type singular name' ),
        'menu_name' => __( '求人menu_name' ),
        'all_items' => __( '求人一覧all_items' ),
        'add_new' => _x( '新規追加add_new', 'recruit' ),
        'add_new_item' => __( '新規求人の追加add_new_item' ),
        'edit_item' => __( '求人の編集edit_item' ),
        'new_item' => __( '新規求人new_item' ),
        'view_item' => __( '求人を表示view_item' ),
        'search_items' => __( '求人を検索' ),
        'not_found' => __( '求人はありません' ),
        'not_found_in_trash' => __( 'ゴミ箱に求人はありません' ),
        'parent_item_colon' => ''
    );

    // 定義
    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'menu_position' => 5,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'has_archive' => true,
        'exclude_from_search' => false,
        'supports' => array( 'title', 'editor' )
    );

    // 登録
    register_post_type( 'recruit', $args );

    // カスタムタクソノミー
    // カテゴリー
    $args = array(
        'label' => '地域',
        'public' => true,
        'show_ui' => true,
        'hierarchical' => true
    );

    // 登録
    register_taxonomy( 'recruit_category', 'recruit', $args );

    // タグ
    $args = array(
        'label' => '職種',
        'public' => true,
        'show_ui' => true,
        'hierarchical' => false
    );

    // 登録
    register_taxonomy( 'recruit_tag', 'recruit', $args );

}

// 実行
add_action( 'init', 'recruit_custom_post_type' );

基本的な書き方

最低限必要になるコードは以下のとおり。


function recruit_custom_post_type() {

    // ラベル
    $labels = array(
        'name' => _x( '求人name', 'post type general name' ),
        'parent_item_colon' => ''
    );

    // 定義
    $args = array(
        'labels' => $labels,
        'public' => true,
        'show_ui' => true,
        'rewrite' => true,
        'has_archive' => true,
        'exclude_from_search' => false,
        'supports' => array( 'title', 'editor' )
    );

    // 登録
    register_post_type( 'recruit', $args );
}

// 実行
add_action( 'init', 'recruit_custom_post_type' );

このコードは必ず子テーマの functions.php に書く。子テーマのフォルダに空っぽの functions.php を用意し


<?php

// ここに書きたいコードを書く
// 上の<?phpと下の?>は全角になっているので、コピーしないように…

?>

を書いて、phpと最後の?の間に追加したいコード(ここではカスタム投稿タイプ作成のコード)を書く(直上のコードは都合上全角になっているので半角にしてください)。

基本的な書き方の説明

function recruit_custom_post_type()

「カスタム投稿タイプを定義するよ」という関数。必ず

aaa_custom_post_type()

というふうにする。作りたいカスタム投稿タイプが本(book)であれば book_custom_post_type となる。カスタム投稿タイプが動物(animal)であれば animal_custom_post_type となる。日本語を関数名にすることはできない。

ラベル

ラベルは、管理画面(ダッシュボード、いつも記事を投稿している灰色の画面)でのカスタム投稿タイプの名前になる。下記参考。

parent_item_colon は上のコードのように、矢印の先は空白にする。

定義

以下、あなたが作りたいカスタム投稿タイプを動物(animal)とする。

重要ポイントは rewrite で、ここを true にするとカスタム投稿のパーマリンク(URL)が

yourdomain.com/animal/human/ yourdomain.com/animal/rabbit/ yourdomain.com/animal/monkey/

のように

ドメイン/カスタム投稿タイプ/各記事URL/

となる。なおカスタム投稿と別にパーマリンク設定において語尾のスラッシュをとっている場合、自動的にカスタム投稿のパーマリンクも語尾のスラッシュがとれる。つまり

yourdomain.com/animal/human yourdomain.com/animal/rabbit yourdomain.com/animal/monkey

のようになる。

実行

関数 function recruit_custom_post_type() を定義したら

add_action( 'init', 'recruit_custom_post_type' )

を書いて、定義した関数を実際に実行する。

ラベル表示

register_post_type-1

register_post_type-2

register_post_type-3

register_post_type-4

register_post_type-5


    $labels = array(
        'name' => _x( '求人name', 'post type general name' ),
        'singular_name' => _x( '求人singular_name', 'post type singular name' ),
        'menu_name' => __( '求人menu_name' ),
        'all_items' => __( '求人一覧all_items' ),
        'add_new' => _x( '新規追加add_new', 'recruit' ),
        'add_new_item' => __( '新規求人の追加add_new_item' ),
        'edit_item' => __( '求人の編集edit_item' ),
        'new_item' => __( '新規求人new_item' ),
        'view_item' => __( '求人を表示view_item' ),
        'search_items' => __( '求人を検索' ),
        'not_found' => __( '求人はありません' ),
        'not_found_in_trash' => __( 'ゴミ箱に求人はありません' ),
        'parent_item_colon' => ''
    );

name

カスタム投稿の固有スラッグ(本というカスタム投稿ならbook、動物というカスタム投稿ならanimalなど)。上の画像にあるように、記事一覧を表示したときのタイトルになる。「すべて」の上、[新規追加…]の左の管理画面タイトル。

singular_name

カスタム投稿の固有スラッグ(本というカスタム投稿ならbook、動物というカスタム投稿ならanimalなど)の単数形。基本的にnameと同じにする。上の例のように変な日本語をつけない。

menu_name

管理画面の黒い左サイドバーに表示されるカスタム投稿の名前。上の画像にあるように左サイドバーの投稿の下に「求人menu_name」とある。

all_items

管理画面の黒い左サイドバーに表示されるカスタム投稿の一覧を示す名前。

add_new

管理画面の記事一覧画面の上のほうにある[新規追加]ボタンに表示される名前。

add_new_item

管理画面の新規投稿画面のタイトル。

edit_item

管理画面の記事編集画面のタイトル。

new_item, view_item

申し訳ありません。まだよくわかっていません…。

search_items, not_found, not_found_in_trash

それぞれ管理画面の記事検索のボタン、記事がないお知らせ、ゴミ箱に該当する記事がないことを示す。

カスタムタクソノミー

カスタムタクソノミーはカスタム投稿のカテゴリーとタグのこと。普通の投稿にカテゴリーとタグがあるように、カスタム投稿にもカテゴリーとタグをつくることができる。

カスタム投稿のカテゴリーをつくる


    $args = array(
        'label' => '地域',
        'public' => true,
        'show_ui' => true,
        'hierarchical' => true
    );

    register_taxonomy( 'recruit_category', 'recruit', $args );

args という変数で、つくりたいカスタム投稿のカテゴリーを定義する。ラベルはなんでもかまわない。ただし

にする。hierarchical=true は「この args はカスタム投稿カテゴリーに関する定義ですよ」という意味。

register_taxonomy はカテゴリーを実際に生成している。

register_taxonomy の引数

カスタム投稿のタグをつくる


    $args = array(
        'label' => '職種',
        'public' => true,
        'show_ui' => true,
        'hierarchical' => false
    );

    register_taxonomy( 'recruit_tag', 'recruit', $args );

コードを見ればわかるように、カテゴリーと基本的に同じ形だが、最後の hierarchical だけが false になっている。

hierarchical=false は「この args はカスタム投稿タグに関する定義ですよ」という意味。