functions.phpからカスタム投稿タイプを作成する

functions.phpからカスタム投稿タイプを作成するのアイキャッチ画像

新しくカスタム投稿タイプを作る

カスタム投稿タイプはタクソノミーやらタームやら聞き慣れない名称なのがややこしいポイントです。普通の投稿のカテゴリーがタクソノミーでカテゴリー名がタームでって慣れるまで混乱しちゃいます。

新しい投稿タイプを作る

以下、projectsという投稿タイプを作る例です。functions.phpに記述します。僕的にややこしくならないように普通の投稿との関係を表にしてみました。※カテゴリスラッグは管理画面から作成。

投稿タイプ通常の投稿カスタム投稿タイプ
スラッグpostprojects
カテゴリcategoryprojectscat(タクソノミ)
カテゴリスラッグdaypublished(ターム)
<?php
register_post_type(
    'projects', //投稿タイプ名
    array(
        'label'=> 'プロジェクト', //ラベル名
        'labels' => array(
            'menu_name' => 'プロジェクト' //管理画面のメニュー名
            ),
        'description'=> 'ディスクリプション',
        'public' => true, //公開状態
        'query_var' => true, // スラッグでURLをリクエストできる
        'hierarchical' => false, //固定ページのように親ページを指定するならtrue
        'rewrite' => array('slug' => 'projects'), //スラッグ名
        'has_archive' => true, //パーマリンクがデフォルト以外、アーカイブページを表示する場合はtrue
        'supports' => array(
            'title',
            'editor',
            'custom-fields',
            'thumbnail',
            'page-attributes',
            'excerpt'
        )
    )
);
?>

作成した投稿タイプにカテゴリーのようにタクソノミを使う場合

上記で作成したprojects投稿タイプにカテゴリーのように扱うタクソノミを追加した場合。ラベル名をカテゴリーとかにしちゃうと、並び替え系のプラグインの識別が、通常の投稿とわかりにくいので、プロジェクトカテゴリーとしています。そのままだと長いので、管理画面上はカテゴリーに設定しています。

<?php
register_taxonomy(
    'projectscat', //タクソノミ名
    'projects', //タクソノミを使う投稿タイプ名
    array(
        'rewrite' => array('slug' => 'projects'), //投稿タイプのスラッグ
        'label' => 'プロジェクトカテゴリー', //ラベル名
        'labels' => array(
            'menu_name' => 'カテゴリー' //管理画面のメニュー名
        ),
        'public' => true, //公開状態
        'hierarchical' => true, //カテゴリのように扱う場合はtrue
        'has_archive' => true,
        'query_var' => true,
        'show_admin_column' => true, //投稿タイプのテーブルにタクソノミーのカラムを生成
    )
);
?>

作成した投稿タイプにタグのようにタクソノミを使う場合

上記で作成したprojects投稿タイプにタグのように扱うタクソノミを追加した場合

<?php
register_taxonomy(
    'projectstag', //タクソノミ名
    'projects', //タクソノミを使う投稿タイプ名
    array(
        'rewrite' => array('slug' => 'projects-tag'), //投稿タイプのスラッグ
        'label' => 'プロジェクトタグ', //ラベル名
        'labels' => array(
            'menu_name' => 'タグ' //管理画面のメニュー名
        ),
        'public' => true, //公開状態
        'hierarchical' => false, //タグのように扱う場合はfalse
        'has_archive' => true,
        'query_var' => true,
        'show_admin_column' => true, //投稿タイプのテーブルにタクソノミーのカラムを生成
    )
);
?>

カテゴリー的に使うタームとタグ的に使うタームを共存させる場合の注意点

カテゴリー的に使うタームとタグ的に使うタームを共存させる場合は 'rewrite' => array('slug' => 'projects-tag')がかぶらないように設定してください。かぶっても機能するは、するのですが、変な挙動になったりします。