CATEGORY

改造する

Release | Updated |

functions.phpでカスタム投稿とカスタムタクソノミーを作成する方法

この記事の概要

この記事でできること

  • カスタム投稿タイプの追加
  • カスタム投稿タイプへのカスタムタクソノミー(カテゴリー、category)の追加
  • カスタム投稿タイプへのカスタムタクソノミー(タグ、post_tag)の追加

この記事で利用するもの

  • functions.php

※別の方法として、WordPressのプラグイン「Custom Post Type UI」を使った方法もあります。functions.phpへ書き込むことなくカスタム投稿を作成することが可能ですが、こちらの方法は割愛します。

カスタム投稿タイプの基礎知識

※カスタム投稿タイプについて既にご存知の方は、このセクションを飛ばして大丈夫です。

カスタム投稿タイプとは

「カスタム投稿タイプ」とは、自らで新たに作成することができる「投稿」のことを指します。

機能としては、WordPressのデフォルト機能としてある「投稿」と同じです。この”投稿”は1つしか作成できませんが、”カスタム投稿”はいくつでも作成が可能です。

例えば、「”ブログ”としてWordPressの”投稿”を利用して更新をしている」といった場合。
新たに”カスタム投稿”を作成することによって、ブログの”投稿”とは別のジャンル(ニュースやサービスの紹介など)として分けて投稿することが可能となります。

項目利用する投稿
ブログの記事を書く項目投稿(WordPressのデフォルト機能)
ニュースを書く項目カスタム投稿(新たに作成)
サービスを書く項目カスタム投稿(新たに作成)

ちなみに、言い方としては単純に「カスタム投稿」という場合が多く、検索する時も「WordPress カスタム投稿」で検索可能です。

カスタムタクソノミーとは

「カスタムタクソノミー」とは、自分で新たに作成した分類のことです。

「タクソノミー」とは、「カテゴリー」や「タグ」などと、ひとつの記事をより詳細に分類したものです(「カスタム分類」と言うこともあります)。
「タクソノミー」を直訳すると「分類」という意味で、概念としては「カテゴリー」も「タグ」も「タクソノミー」になります。

「カテゴリー」と「タグ」の違い

簡単に言うと、階層があるかどうかの違いです。
カテゴリーには階層(親子関係)が存在しますが、タグには階層(親子関係)が存在しません。

「カテゴリー」については、記事をざっと分類したものというイメージです。
さらに「タグ」については、「カテゴリー」をより詳しく分類したものというイメージです。

カスタム投稿 > カテゴリー > タグ」といった感じです。

例えば、「料理」のジャンルの中でも、「和風」なのか「洋風」なのか、カテゴリーとして分類したい場合。また、「和食」の中でも、「出汁」や「煮物」などとより深く分類するイメージです。

カスタム投稿を追加する方法のコード全体

まずは今回ご紹介するコードの全体像から。

カスタム投稿についてある程度ご存知の方は、下記コードをコピペするだけでカスタム投稿の追加・カスタマイズができると思います。

今回ご紹介するコードを記述することで、下記の追加処理を実行しています。

  • 新たなカスタム投稿タイプを追加
  • 「カテゴリー」として新たなカスタムタクソノミーを追加
  • 「タグ」として新たなカスタムタクソノミーを追加
/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );

function create_post_type() {

  register_post_type(
    'news',
    array(
      'label' => 'ニュース',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        'title',
        'editor',
        'thumbnail',
        'revisions'
      ),
    )
  );

  register_taxonomy(
    'news-cat',
    'news',
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

  register_taxonomy(
    'news-tag',
    'news',
    array(
      'label' => 'タグ',
      'hierarchical' => false,
      'public' => true,
    )
  );

}

上記コードの記述によって、下記画像のように投稿の下に「ニュース」という項目が新たに追加されます。
また、ニュース内のサブメニューにも「ニュースカテゴリー」や「ニュースタグ」といった項目も追加されます。

管理画面サイドメニュー

以下、詳しく解説していきます!

【解説1】カスタム投稿を新たに追加する方法

まずは、カスタム投稿(カスタム投稿タイプ)を新たに追加する方法です。

下記コードをコピーしfunctions.phpに貼り付けることで、新たなカスタム投稿が作成されます。

/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( // カスタム投稿タイプの追加関数
    'news', //カスタム投稿タイプ名(半角英数字の小文字)
    array( //オプション(以下)
      'label' => 'ニュース', // 管理画面上の表示(日本語でもOK)
      'public' => true, // 管理画面に表示するかどうかの指定
      'has_archive' => true, // 投稿した記事の一覧ページを作成する
      'menu_position' => 5, // 管理画面メニューの表示位置(投稿の下に追加)
      'supports' => array( // サポートする機能(以下)
        'title',  // タイトル
        'editor', // エディター
        'thumbnail', // アイキャッチ画像
        'revisions' // リビジョンの保存
      ),
    )
  );
}

以降でより詳しい解説をしていきます。

カスタム投稿タイプの追加をする処理の呼び出し

下記の記述によって、function create_post_type()内の処理を呼び出しています。

add_action( 'init', 'create_post_type' );
function create_post_type() {
  // 処理内容
}

1行目にあるcreate_post_typeと、2行目にあるcreate_post_typeが同じ文字列であれば、「// 処理内容」の処理を呼び出すことが可能です。
※どんな名前でも問題ないですが、この記事では一般的に付ける名前で紹介します。

続いて、下記の記述によってカスタム投稿タイプの追加をしています。

register_post_type(
  'news',
)

register_post_typeは、”カスタム投稿タイプ”を追加するためのWordPressで用意されている関数です。
今回の場合、「news」というカスタム投稿タイプ名で追加しています。

なお、この文字は、下記のように記事のURLにもなります

カスタム投稿記事のURL
https://wordpress-web.com/news/

使える文字は、「小文字のアルファベット」、及び、「記号」のみです。
「スペース」は使えないので、単語の区切りにはハイフン(-)を使ってください。

注意点としては、投稿をいくつかしたあとの変更はできるだけ避けましょう。URLが変更されてしまいます。

ここまでをまとめると、下記の記述で新たにカスタム投稿を追加する処理ということになります。

add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( // カスタム投稿タイプの追加関数
    'news', // カスタム投稿タイプ名
  )
}

オプション(パラメータ)の指定

下記の記述で、カスタム投稿のオプション(パラメータ)を指定できます。

array( )の中に、利用したいオプション名の指定や記述することで、カスタム投稿をより詳細にカスタマイズすることが可能です。

array(
  'label' => 'ニュース',
  'public' => true,
  'has_archive' => true,
  'menu_position' => 5,
  'supports' => array(
    'title',
    'editor',
    'thumbnail',
    'revisions'
  ),
)

各項目の解説

  • label
    管理画面上で表示されるカスタム投稿タイプの名前の設定。
    日本語でOKです。わかりやすい単語で設定してください。
  • public
    このカスタム投稿タイプを管理画面上に表示するかどうかの設定。
    初期値は”false”となっており、管理画面のメニュー表示が非表示となり投稿ができなくなるので、”true”にします。
  • has_archive
    このカスタム投稿タイプのアーカイブページ(一覧ページ)を作成したい場合の設定。
    なお、パーマリンク設定がデフォルトの場合は、この設定をせずともアーカイブページを表示できます。あらかじめ記述しておいて問題ないです。
  • menu_position
    管理画面左にあるメニューのどの位置に表示するかどうかの設定。
    「5」と指定すると、デフォルトである「投稿」の下に表示されます。「メディア」の下に置きたい場合は「10」、「固定ページ」の下に置きたい場合は「20」に設定してください。
  • supports
    編集画面で使用できる項目の設定。
    使用しない項目や、表示したくない項目は記述しなくてOKです。
    • title(タイトル)
    • editor(エディタ)
    • thumbnail(アイキャッチ画像)
      なお、別途でthumbnail(アイキャッチ画像)が有効化されている必要があります。
      下記の米印としてあるコードをfunctions.phpに記述することで、有効化されます。
    • revisions(リビジョンの保存)
    • 2回以上記事を保存・更新した後から表示されます。
      こちらを有効化していない場合、記事公開後のプレビュー機能が動作しなくなります。
    • author (作成者)
    • excerpt (抜粋)
    • trackbacks (トラックバック送信)
    • custom-fields (カスタムフィールド)
    • comments (コメントの他、編集画面にコメント数のバルーンを表示する)
    • page-attributes (メニューの順序。「親〜」オプションを表示するために hierarchical が true であること)
    • post-formats (投稿のフォーマットを追加)

thumbnail(アイキャッチ画像)を有効化する方法
追加場所は、今回ご紹介しているコードの外側になります。

/* ---------- カスタム投稿タイプの追加 ---------- */
add_action( 'init', 'create_post_type' ); function create_post_type() { }

/* ---------- thumbnailの有効化---------- */
add_theme_support('post-thumbnails');

他にもたくさんのオプション(パラメータ)が存在します。
より詳しく知りたい方は、下記のWordPress Codex 日本語版にて!

複数のカスタム投稿タイプを新たに追加したい場合

「ニュース」や「サービス紹介」などと、複数のカスタム投稿タイプを追加したい場合は、下記のように記述します。
※「サポートする機能」など、一部省略しています。

/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );

function create_post_type() {

  register_post_type(
    'news', //カスタム投稿タイプ名
    array( //オプション
      'label' => 'ニュース',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

  register_post_type(
    'service', //カスタム投稿タイプ名
    array( //オプション
      'label' => 'サービス紹介',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

}

【解説2】カテゴリーとしてカスタムタクソノミーを新たに追加する方法

下記コードを「functions.php」に追記します。

/* ---------- カスタムタクソノミー(カテゴリー)の追加 ---------- */
add_action('init', 'custom_taxonomy_cat');
function custom_taxonomy_cat(){
  register_taxonomy( // カスタムタクソノミーの追加関数
    'news-cat', // カテゴリーの名前(半角英数字の小文字)
    'news',     // カテゴリーを追加したいカスタム投稿タイプ名
    array(      // オプション(以下
      'label' => 'ニュースカテゴリー', // 表示名称
      'public' => true, // 管理画面に表示するかどうかの指定
      'hierarchical' => false, // 階層を持たせるかどうか
    )
  );
}

以降、詳しく見ていきます。

カテゴリー用のカスタムタクソノミーを追加する処理の呼び出し

下記の記述によって、add_custom_taxonomy_cat( )内の内容を呼び出しています。

add_action('init', 'add_custom_taxonomy_cat');
function add_custom_taxonomy_cat(){
  // 処理内容
}

下記の記述によって、カスタムタクソノミーの登録をしています。

register_taxonomy( // カスタムタクソノミーの追加関数
  'news-cat', // カテゴリーの名前(英字)
  'news', // カテゴリーを追加したいカスタム投稿タイプ名
)

1行目にあるregister_taxonomyは、「カスタムタクソノミー」を追加するためのWordPressで用意されている関数です。

今回の場合、「news-cat」というカテゴリー名(2行目)で、「news」として作成したカスタム投稿タイプに追加(3行目)しています。

なお、使える文字は、小文字のアルファベットと記号のみです。
単語の区切りにはハイフン( – )、もしくはアンダーバー( _ )を使ってください。スペースは使えません。

カテゴリー用のオプション(パラメータ)の指定

下記の記述で、カテゴリーのオプション(パラメータ)を指定できます。

array( // オプション(以下
  'label' => 'ニュースのカテゴリー', // 表示名
  'public' => true, // 管理画面に表示するかどうかの指定
  'hierarchical' => true, // 階層を持たせるかどうか
)

各項目の解説

  • label
    管理画面上で表示されるカテゴリー名の設定。
    日本語でOKです。管理上、わかりやすい単語で設定してください。
  • public
    このカテゴリーを管理画面上に表示するかどうかの設定。
    初期値は”false”となっており、管理画面のメニュー表示が非表示となり投稿ができなくなるので、”true”にします。
  • hierarchical
    階層構造を持つかどうかの設定。
    “true”だと「カテゴリー」のように。”false”だと「タグ」のような振る舞いになります。

他にもたくさんのオプション(パラメータ)が存在します。
より詳しく知りたい方は、下記のWordPress Codex 日本語版にて!

複数のカスタムタクソノミー(カテゴリー)を追加したい場合

複数のカスタムタクソノミー(カテゴリー)を追加したい場合、下記の様に記述します。

なお、カスタムタクソノミー(カテゴリー)は、元となる「カスタム投稿タイプ」の追加登録があってこそ追加ができるものです。
実用性も兼ねて、カスタム投稿タイプの追加も兼ね合わせたコードになります。

/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );

function create_post_type() {

  // 「ニュース」のカスタム投稿追加
  register_post_type(
    'news', //カスタム投稿タイプ名
    array(
      'label' => 'ニュース',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

  // 「ニュース」のカスタム投稿にカテゴリーを追加
  register_taxonomy(
    'news-cat',
    'news', // カテゴリーを追加したいカスタム投稿タイプ名
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

  // 「サービス」のカスタム投稿追加
  register_post_type(
    'service',  //カスタム投稿タイプ名
    array(
      'label' => 'サービス',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

  // 「サービス」のカスタム投稿にカテゴリーを追加
  register_taxonomy(
    'service-cat',
    'service', // カテゴリーを追加したいカスタム投稿タイプ名
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

}

【解説3】タグとしてカスタムタクソノミーを新たに追加する方法

タグとしてカスタムタクソノミーを追加したい場合、下記のコードを「functions.php」に追記します。

/* ---------- カスタムタクソノミー(タグ)の追加 ---------- */
add_action('init', 'custom_taxonomy_tag');
function custom_taxonomy_tag(){
  register_taxonomy(
    'news-tag', // タグの名前(半角英数字の小文字)
    'news',     // タグを追加したいカスタム投稿タイプ
    array(      // オプション(以下)
      'label' => 'タグ', // 表示名
      'hierarchical' => false, // 階層を持たせるかどうか
      'public' => true, // このタクソノミーを利用する場合かどうか
      'update_count_callback' => '_update_post_term_count',
    )
  );
}

タグ用のカスタムタクソノミーを追加する処理の呼び出し

下記の記述によって、add_custom_taxonomy_cat( )内の内容を呼び出しています。

add_action('init', 'custom_taxonomy_tag');
function custom_taxonomy_tag(){
  // 処理内容
}

下記の記述によって、カスタムタクソノミーの登録をしています。

register_taxonomy(
  'news-tag',
  'news',
)

1行目のregister_taxonomyは、「カスタムタクソノミー」を追加するためのWordPressで用意されている関数です。
今回の場合、「news-tag」というタグ名(2行目)で、newsのカスタム投稿タイプに追加(3行目)しています。

なお、使える文字は、小文字のアルファベットと記号のみです。
単語の区切りにはハイフン( – )、もしくはアンダーバー( _ )を使ってください。スペースは使えません。

タグ用のオプション(パラメータ)の指定

下記の記述で、タグのオプションを指定できます。

array(
  'label' => 'ニュースタグ',
  'hierarchical' => false,
  'public' => true,
  'update_count_callback' => '_update_post_term_count',
)

各項目の解説

  • label
    管理画面上で表示されるタグ名の設定。
    日本語でOKです。わかりやすい単語で設定してください。
  • hierarchical
    階層構造を持つかどうかの設定。
    trueだと「カテゴリー」のように、falseだと「タグ」のような振る舞いになります。
  • public
    このタグを管理画面上に表示するかどうかの設定。
    初期値は”false”となっており、管理画面のメニュー表示が非表示となり投稿ができなくなるので、”true”にします。
  • update_count_callback
    カスタムタクソノミーをタグのように使いたい場合は、オプションの 'update_count_callback' => '_update_post_term_count' を必ず追加します。
    こちら、関数リファレンス/register taxonomy – WordPress Codex 日本語版 (osdn.jp)にて詳しく記載されていますが、「記述しない場合は非常に面倒なことになります」の文言もあり、通常は記載しておきます。

複数のカスタムタクソノミー(タグ)を追加したい場合

複数のカスタムタクソノミー(タグ)を追加したい場合、下記の様に記述します。

なお、カスタムタクソノミー(タグ)は、カスタムタクソノミー(カテゴリー)と同様に、元となる「カスタム投稿タイプ」の追加登録があってこそ追加ができるものです。
実用性も兼ねて、カスタム投稿タイプの追加カスタムタクソノミー(カテゴリー)の追加も兼ね合わせたコードになります。

/* ---------- カスタム投稿タイプを追加 ---------- */
add_action( 'init', 'create_post_type' );

function create_post_type() {

  // 「ニュース」のカスタム投稿追加
  register_post_type(
    'news', //カスタム投稿タイプ名
    array(
      'label' => 'ニュース',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

  // 「ニュース」のカスタム投稿にカテゴリーを追加
  register_taxonomy(
    'news-cat',
    'news', // カテゴリーを追加したいカスタム投稿タイプ名
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

  // 「ニュース」のカスタム投稿にタグを追加
  register_taxonomy( // カスタムタクソノミーの追加関数
    'news-tag', // タグの名前(半角英数字の小文字)
    'news', // タグを追加したいカスタム投稿タイプ名
    array( // オプション(以下
      'label' => 'ニュースタグ', // 表示名称
      'public' => true, // 管理画面に表示するかどうかの指定
      'hierarchical' => false, // 階層を持たせるかどうか
    )
  );

  // 「サービス」のカスタム投稿追加
  register_post_type(
    'service',  //カスタム投稿タイプ名
    array(
      'label' => 'サービス',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        // サポートする機能を記述
      ),
    )
  );

  // 「サービス」のカスタム投稿にカテゴリーを追加
  register_taxonomy(
    'service-cat',
    'service', // カテゴリーを追加したいカスタム投稿タイプ名
    array(
      'hierarchical' => true,
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー',
      'singular_label' => 'カテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );

  // 「サービス」のカスタム投稿にタグを追加
  register_taxonomy( // カスタムタクソノミーの追加関数
    'service-tag', // タグの名前(半角英数字の小文字)
    'service', // タグを追加したいカスタム投稿タイプ名
    array( // オプション(以下
      'label' => 'ニュースタグ', // 表示名称
      'public' => true, // 管理画面に表示するかどうかの指定
      'hierarchical' => false, // 階層を持たせるかどうか
    )
  );

}

カスタム投稿の追加における注意点

使ってはいけない単語が存在する

WordPressには、「すでにWordPress内で使われてる文字」や「予約語として登録されている単語」というものが存在しています。

これらの文字列(単語)は、予期せぬバグの原因にもなるので、同じものは使用しないようにしましょう。

参考 : 関数リファレンス/register taxonomy – WordPress Codex 日本語版 (osdn.jp)

※今回ご紹介してるコードのように「xxx-cat」などであれば問題ないですが、「cat」のみは予約後になっています。

  • attachment
  • attachment_id
  • author
  • author_name
  • calendar
  • cat
  • category
  • category__and
  • category__in
  • category__not_in
  • category_name
  • comments_per_page
  • comments_popup
  • custom
  • customize_messenger_channel
  • customized
  • cpage
  • day
  • debug
  • embed
  • error
  • exact
  • feed
  • hour
  • link_category
  • m
  • minute
  • monthnum
  • more
  • name
  • nav_menu
  • nonce
  • nopaging
  • offset
  • order
  • orderby
  • p
  • page
  • page_id
  • paged
  • pagename
  • pb
  • perm
  • post
  • post__in
  • post__not_in
  • post_format
  • post_mime_type
  • post_status
  • post_tag
  • post_type
  • posts
  • posts_per_archive_page
  • posts_per_page
  • preview
  • robots
  • s
  • search
  • second
  • sentence
  • showposts
  • static
  • subpost
  • subpost_id
  • tag
  • tag__and
  • tag__in
  • tag__not_in
  • tag_id
  • tag_slug__and
  • tag_slug__in
  • taxonomy
  • tb
  • term
  • terms
  • theme
  • title
  • type
  • w
  • withcomments
  • withoutcomments
  • year

まとめと次に見たい記事

WordPressにおけるカスタム投稿タイプの追加やその利用方法をマスターすることで、WordPress構築の幅がぐんと伸びます。
ぜひどんどん活用して、使いやすいWordPress運用をしてみてください!

なお、カスタム投稿の作成ができたあとは「フロントに表示させる」必要があります。

よろしければ下記の記事を参考にしてみてください!

投稿の内容を投稿以外のページで表示する

「投稿」や「カスタム投稿」で作成した記事をいろんなページで表示させる方法については下記で解説しています。

WP_Queryを使ったサブループの方法です。

カスタム投稿のカテゴリーごとに記事を取得して表示する

カスタム投稿で自作したタクソノミー(カスタムタクソノミー)内から条件にあった記事だけ取得する方法については下記で解説しています。

より詳しい取得&表示をする場合、「投稿」と「カスタム投稿」では記述方法が異なりますので、参考にしてみてください!

この記事の参考 / 引用元

こちらの記事もいかかですか?

  1. HOME
  2. functions.phpでカスタム投稿とカスタムタクソノミーを作成する方法