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

2016/7/05

Shinichiro Sakamoto

広告

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)とする。

  1. public とりあえずデフォルトのまま
  2. show_ui 必ず true にする
  3. has_archive ここを true にするとカスタム投稿のアーカイブページが作られる
  4. exclude_from_search ここを true にするとサイト(管理画面ではなく、クライアントが閲覧するあなたのサイト)の検索ボックスからカスタム投稿が検索に引っかからなくなる
  5. supports とりあえず array( 'title', 'editor' ) にする

重要ポイントは 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

register_post_type

register_post_type

register_post_type

register_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' => ''
);

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

  • public は必ず true
  • show_ui も必ず true
  • hierarchical も必ず true

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

register_taxonomy の引数

  • 第一引数 カスタム投稿カテゴリーの固有名(自由に決められる。上のコードはあくまでも例。ただしカスタム投稿+カテゴリーという名前が妥当)
  • 第二引数 カスタム投稿の固有名(本であれば book、動物であれば animal)
  • 第三引数 args

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

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

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

コードを見ればわかるように、カテゴリーと基本的に同じ形だが、最後の hierarchical だけが false になっている。hierarchical=false は「この args はカスタム投稿タグに関する定義ですよ」という意味。

終わりに(2018年3月追記)

この記事を書いたのが2016年で、今こうして2018年に追記していますが、カスタム投稿は正直使わないほうがいいと思います。管理がとにかく煩雑で「これ、WordPressじゃなくてもいいよね」と考えてしまうときも。

もうWordPressで難しいことをするならTech Boostみたいなプログラミングスクールに行ってさくっと Ruby on Rails を勉強したほうが早いと思います…。一ヶ月で中規模クラスのものが開発できるようにはなるでしょう。

デザインも含めてだったらプログラミングのオンラインスクールのCodeCampですか。プログラミングは独学とサポートありでは習得時間に雲泥の差が出てくるので、今はプログラミングスクールの時代ですね。

カスタム投稿みたいなプログラミングをかじっているとWordPressマニアになるだけです。正直、時間のおおいなる無駄遣いです。本家PHPはもちろん、世の中のプログラミングの流行にもついていけなくなります。

カスタム投稿は、WordPressマニアになってそこで埋没してしまうか、Pythonなどのいろいろな言語に触れて規模の大きい複雑なシステムを開発できるチャンスをつかむかという分岐点です。実際、私はWordPressからいろいろのりかえて、PythonのDjangoに移りました。全然できることが違いますよ。開発速度も。


Warning: Invalid argument supplied for foreach() in /home/irohakasa/irohabook.com/public_html/wp-content/themes/child/single.php on line 125

広告

広告