WordPressのカスタム投稿タイプとカスタムタクソノミーまとめ

WordPressのカスタム投稿タイプやカスタムタクソノミーについて、登録から表示、テーマ作成に利用する取得系の色々な関数にいたるまで、徹底的に説明してます。

WordPressのカスタム投稿タイプとカスタムタクソノミーまとめ

作成日
2018/06/14
更新日
2018年6月14日

WordPressには「投稿」や「カテゴリー」といったデフォルトの投稿タイプや分類方法(タクソノミー)がありますが、functions.phpでの指定やプラグインを利用することでオリジナルの投稿タイプとタクソノミーを登録することができます。それが「カスタム投稿タイプ」と「カスタムタクソノミー」です。私は最初、日本語で躓いたりしたので、その辺も踏まえつつ、「カスタム投稿タイプ」や「カスタムタクソノミー」について、登録から表示、色々な関数を説明します。

目次

「投稿タイプ」「タクソノミー」、「ターム」とは?

WordPressでは、「投稿タイプ(post_type)」や「タクソノミー(taxonomy)」、「ターム(term)」など、カスタマイズしようとすると聞きなれない言葉が出てきます。私はこの辺のWordPress特有の言い回しに最初戸惑ってしましたので、まずはその説明からしようと思います。

「投稿タイプ」とはその名の通り、投稿する形式のこと

WordPressのデフォルトの投稿タイプは、記事を投稿するための「投稿(post)」、ページを表示するための「固定ページ(page)」などが存在します。この2つは「投稿タイプ」が異なる訳ですが、それぞれ違うタイプにするには理由があります。
一般的なブログサイトの記事一覧ページを想像してみてください。普通は新しい記事が上に表示されて、時系列順に表示されますね。
では、プロフィールページを作りたいと思って、記事にプロフィールを書いて投稿したらどうなるでしょう。記事は時系列順に表示されるので、新しい記事を書けばプロフィールを書いた記事はどんどん後ろの方に行ってしまいます。古い記事は流れてもいいですが、プロフィールはいつでも見られるようにしておきたいですね。そのため、時系列順に表示される「投稿」とは別に、ページ用の投稿タイプ、つまり「固定ページ」が必要になるわけです。他にもWordPressのデフォルトの投稿タイプに、画像などのファイル用の投稿タイプ「添付ファイル(attachment)」や、自動保存用に記録するための投稿タイプ「リビジョン(revision)」などがあります。
今回の「カスタム投稿タイプ」とは、これらのデフォルトの投稿タイプとは別に、新しく自分で作った投稿タイプのことを示します。言ってしまえば、「投稿」や「固定ページ」で事足りるのであれば、わざわざ「カスタム投稿タイプ」を作る必要はありません。しかし、投稿とは表示形式を変えたい場合など、新しい投稿タイプを作った方が便利な場合も多々あります。

「タクソノミー」は投稿を分類する方法のこと

WordPressでは「カテゴリー」や「タグ」があり、「投稿」を自由に分類できます。この「カテゴリー」や「タグ」は、デフォルトで登録されている「タクソノミー」になります。つまり、投稿を分類する方法として「カテゴリー」という名のタクソノミーがあるわけです。ちょっとややこしいかもしれませんが。
では、「車」という投稿タイプをつくったとしましょう。車には「色」や「ブランド」、「車種」など、色々な情報がありますね。デフォルトの「カテゴリー」を利用して分類してもいいですが、カテゴリーの数がとんでもないことになり管理が大変そうです。そんな時、カテゴリの他に、「色別」という分類方法や、「ブランド別」、「車種別」などの分類方法があれば管理がしやすくなると思いませんか?
この「投稿を分類する方法」のことを「タクソノミー」といい、オリジナルで登録する分類方法のことを「カスタムタクソノミー(カスタム分類)」といいます。

「ターム」とは分類のこと

カスタムタクソノミーを実装していくと「ターム」というこれまた聞きなれない言葉が出てきます。「投稿」をカテゴリーで、「日常について」や「犬の話」などと分けていたとします。このカテゴリーに登録された「日常について」などが「ターム(term)」となります。つまりタームは、タクソノミーに登録する分類のことです。
WordPressのデフォルトではカテゴリーに「未分類」とありますね。これはつまり、「カテゴリー」という名の「タクソノミー」に、「未分類」という名の「ターム」が登録されていることになります。
上記のタクソノミーの車で説明するなら、「色別」に登録した「赤」や「青」、「ブランド別」で登録した「トヨタ」や「マツダ」がタームにあたります。

「カスタム投稿タイプ」の登録方法

カスタム投稿タイプはプラグインによって簡単に登録できますが、ここでは「functions.php」に記述して登録する方法を説明します。

カスタム投稿タイプ登録の記述

WordPressにはカスタム投稿タイプを登録するために「register_post_type()」という関数が用意されています。それを利用して、以下をfunction.phpに記述します。
ここでは、「車(car)」というカスタム投稿タイプを追加してみましょう。

register_post_typeの説明

上記の記述を詳しく説明していきます。大まかな流れでは「add_custom_post_car()」という関数を作成し、「WordPressの読み込みが完了した時(init)」に実行するように「add_action」に関数名を入れています。

function add_custom_post_car(){...}
まずは登録するための関数を書きます。関数名は任意ですが、最後の add_action('init', 'add_custom_post_car')の第二引数と同じである必要があります。
$car_labels = array(..);
ここは管理画面などで利用される、カスタム投稿タイプのラベル用の設定を配列に格納しています。「name」と「singular_name」の違いについては、単数か複数形かで表示が違う時のためのものです。日本語では同じでいいですが、英語の場合'name' => 'Cars', 'singular_name' => 'Car'となります。
$car_args = array(..);
ここでは登録するカスタム投稿タイプの設定を配列に格納しています。注意点は説明しますが、それぞれの詳しい説明は以下をみてください。
関数リファレンス/register post type – WordPress Codex 日本語版
labels
ここはラベルの設定を配列で入れます。今回はラベル用の配列を代入している「$car_labels」を指定しています。
public
投稿を表示する時は「true」、投稿を公開しないときは「false」。これはカスタム投稿タイプをデータとして利用したいときなど、プラグインなどが「false」にして登録されていることがあります。公開ページがないので、編集画面にはパーマンリンクが表示されなかったりします。
description
投稿タイプを説明する文章になります。普通はサイト上にも管理画面でも表示されませんが、私の場合、カスタム投稿タイプのアーカイブページのdescriptionとして、この値を使っていたりします。
rewrite
「rewrite」は、パーマリンクの変更についてを指定します。デフォルトは「true」になっており、投稿タイプのスラッグが利用されます。その他、配列を指定して細かく設定することができます。
ここであえてデフォルトではなくarray( 'with_front' => false )を入れているのは、URLの設定を変更するためです。WordPressでは「投稿」のパーマリンク設定にて、「https://sampale.com/news/(タイトル)/」の「news」ように、URLの前に任意の文字を入れることができます。デフォルトのままだと、「https://sampale.com/news/car/xxxxx/」というパーマリンクになってしまうからです。もちろんそれでいいのなら設定をデフォルトから変える必要はありませんが、カスタム投稿タイプが投稿とは全く関係ない場合、「https://sampale.com/car/(タイトル)/」の方が自然だと思うので今回は「with_front」だけ変更しています。
supports
「supports」は、そのカスタム投稿タイプがサポートする入力欄になります。サムネイル画像を利用したい場合は「thumbnail」を配列に含める必要がありますが、テーマ自体が「add_theme_support()」でサムネイル画像の登録をサポートしている必要があります。カスタム投稿タイプに対してAdvanced Custom Fieldのようなカスタムフィールドを弄るプラグインを利用する場合があると思いますが、ACFはカスタムフィールドを利用しているので、「custom-fields」を配列に含める必要があります。
taxonomies
「taxonomies」は、登録するカスタム投稿タイプと結びつけるタクソノミーを配列で指定します。デフォルトにある「カテゴリー」を利用したいときは、「’category’」を含めます。今回は後述する「’color’」タクソノミーと「’brand’」タクソノミーを指定しています。
register_post_type('car', $car_args);
「register_post_type()」によってWordPressにカスタム投稿タイプを指定します。第一引数がカスタム投稿タイプのスラッグとなり、URLなどで利用されたりするので分かりやすい方がいいと思います。

カスタム投稿タイプの注意点

以上でカスタム投稿タイプの登録が完了です。カスタム投稿タイプの登録はパーマリンクや結びつきに関わる追加設定になるため注意して扱う必要があります。

  • 「taxonomy」でデフォルトにある「categoy」を指定した場合、register_post_type('car', $car_args);のあとに、register_taxonomy_for_object_type('category', 'car');を実行して結び付ける必要があります。
  • 今回のように'rewrite' =>array( 'with_front' => false )とパーマリンク設定を変更した場合、管理画面には出たけどページが表示されないなどといった現象が起こります。変更した場合は、一度パーマリンク設定をフレッシュする必要があるためです。「管理画面」>「設定」>「パーマリンク設定」にいき、何も変更は加えないでもいいので、「変更を保存」を押すと、パーマリンク設定が更新されるので、表示されるようになります。

「カスタムタクソノミー」の登録方法

次にカスタムタクソノミーの登録方法を説明します。
「色別(color)」というカスタムタクソノミーを追加してみます。

「カスタムタクソノミー」登録の記述

カスタム投稿タイプのようにfunctions.phpに記載する方法になります。こちらも「add_custom_type_color」という関数を定義し、add_actionのinitの時に実行する流れです。

register_taxonomyの説明

register_taxonomy()はカスタム投稿タイプより短いですね。詳しい説明は以下より確認できます。
target=”_blank”>関数リファレンス/register taxonomy – WordPress Codex 日本語版

function add_custom_type_color(){...}
こちらも登録するための関数を書きます。関数名は任意ですが、最後の add_action('init', 'add_custom_type_color')の第二引数と同じである必要があります。
hierarchical
カテゴリーのように、階層化するる場合は「true」、タグのように階層化しない場合は「false」を指定します。

カスタム投稿タイプの表示で読み込まれるテンプレート

カスタム投稿タイプの登録が終わると次は表示する流れになります。表示を投稿と切り分けたい場合、読み込まれるテンプレートを把握することは大事です。WordPressでは読み込むテンプレートを決定する時、探す順番にはルールがあります。

カスタム投稿タイプ一覧を表示する際に読み込まれるテーマ

基本的には投稿と同じようにarchiveから探していきますが、カスタム投稿タイプのスラッグを用いたテンプレートを先に探します。
ここではスラッグ名を「car」とした場合になります。

  1. 1) archive-car.php
  2. 2) archive.php
  3. 3) paged.php(2ページ名以降の場合のみ)
  4. 4) index.php

カスタム投稿タイプのシングルを表示する際に読み込まれるテーマ

シングルページの場合も、アーカイブページと同じようにカスタム投稿タイプのスラッグが入ります。

  1. 1) single-car.php
  2. 2) single.php
  3. 3) singular.php
  4. 4) index.php

カスタムタクソノミーの表示で読み込まれるテンプレート

カスタムタクソノミーの表示の際に読み込まれるテンプレートは基本的に一覧ページとなるわけですが、タームのスラッグも指定できるため、タームを登録する時は半角英字で登録し、ハイフンなどは使わないようにします。
ここでは「color」というカスタムタクソノミーに「red」というタームが登録されているとします。

  1. 1) taxonomy-color-red.php
  2. 2) taxonomy-color.php
  3. 2) taxonomy.php
  4. 2) archive.php
  5. 3) paged.php(2ページ名以降の場合のみ)
  6. 4) index.php

カスタム投稿タイプの取得する関数

カスタム投稿タイプの情報や、現在の投稿はどの投稿タイプかなど、色々と関数を知っておくとテーマ作成の時に便利です。

登録されている投稿タイプを取得する
$post_types = get_post_types();
投稿タイプの設定を(オブジェクトとして)取得する
投稿タイプアーカイブで、現在のカスタム投稿タイプを取得する
$post_type = get_query_var( 'post_type' );
返り値は、取得できた場合は投稿タイプのスラッグ(文字列)、できなかった場合は第二引数(デフォルトは空文字)
シングルページで投稿タイプを取得する
$post_type = get_post_type();
指定した投稿の投稿タイプを取得する
$post_type = get_post_type( $post );

カスタムタクソノミーの取得する関数

カスタムタクソノミーもまた、タクソノミー名を取得したい場合など、色々と取得するためにごちゃごちゃと関数があります。

全てのタクソノミーを(オブジェクトとして)取得する
$taxonomies = get_taxonomies(array(), 'objects');
特定のタクソノミーの設定情報を(オブジェクトとして)取得する
$taxonomy = get_taxonomy('color');
タームIDとタクソノミーを指定してタームの情報を取得する
$term = get_term( $term_id, 'color');
タクソノミーを指定してターム一覧を取得する
$terms = get_terms( $taxonomies, $args );
特定のタームのリンクを取得する
$term_link = get_term_link( $term );
特定のタームのメタ情報を取得する
$term_meta = get_term_meta( $term_id );
タクソノミーページでタクソノミー名を取得する
$taxonomy_name = get_query_var( 'taxonomy' );
タクソノミーページでターム情報を取得する
$term_id = get_queried_object();
投稿のタームを取得する
$terms = get_the_terms($post_id, 'color');
タクソノミーが存在するか判別する
if(taxonomy_exists('color')){ ... }
タームが存在するか判別する
if(term_exists('red')){ ... }
タクソノミーページか判別する
if(is_tax()){ ... }
特定のタクソノミーページか判別する
if(is_tax('color')){ ... }
特定のタームのタクソノミーページか判別する
if(is_tax('color', 'red')){ ... }

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Category

Archive