WordPressのカテゴリ、タグ、ターム、タクソノミーの違いとテンプレートタグ関数一覧

WordPress

WordPressの投稿にはカテゴリってありますよね? カテゴリ以外にも同じような役割をするものに、タグ、ターム(タクソノミー)というのがあります。

これって内部的には同じで、最初から用意されてるか自分で作ったものか?くらいの違いしかありません。

なのに、すべてが同じよう使えるようにテンプレート関数が揃ってるわけではなくて、カテゴリ用の関数はあるのにタグ用の関数がなかったりします。

無い場合は諦めて他の関数を組み合わせる必要があったりして実はややこしいんです。使い方や引数も違ってるものもあったり。

索引的に使える、カテゴリ、タグ、ターム(タクソノミー)を取得したり表示したりするWordPressのテンプレートタグ関数を一覧にしました。

カテゴリがいろいろな関数が揃ってて一番使いやすい。

カテゴリ、タグ、ターム、タクソノミー(カスタム分類)の違い

カテゴリとタグはWordPressに初めから用意されているので分かりますよね。この2つの違いは、カテゴリは親子階層にできて、タグは出来ません。それ以外は基本的には同じです。

初期状態では投稿(ブログ記事)にしかカテゴリとタグは設定できませんが、functions.phpに

register_taxonomy_for_object_type();

を書けば固定ページでも使うことが出来ます。

もう一つ、WordPressには同じような役割でユーザーが自由に設定できるカスタム分類があります。カスタムタクソノミーとも言われますが、日本語か英語かの違いだけで同じです。

一般的には、カスタム投稿とセットで説明されるのでカスタム投稿専用っぽいんですが、そんなことはなくて普通の初期状態にある投稿や固定ページでも使うことが出来ます。

つまり、初期のカテゴリ以外に別のカテゴリやタグを用意できます。

例えばホテル情報サイトを作ったとして、初期投稿にホテル情報を、初期カテゴリを地域(東京、大阪など)に使って、初期タグを特徴(ファミリー向け、カップル向け、全館禁煙など)に使うとします。

もう一つ、別の軸でホテルの種類(高級ホテル、リゾートホテル、ビジネスホテルなど)も分類したい場合とかに、カスタムタクソノミーを使えば別のカテゴリ的なものを作ることが出来ます。

詳しい説明は、WordPress Codex 日本語版のカスタム分類に載ってます。

タームとタクソノミー名について

タームは、そのタクソノミーに登録されている項目の名前です。普通、カテゴリ名やタグ名って呼んでるもののタクソノミー版です。

さっきの例だと、「高級ホテル」「リゾートホテル」など実際に分類する時の名称になります。

それらを分類してる「ホテルの種類」がタクソノミー名です。カテゴリ、タグ、そのものの事です。

見たほうが分かり安いですね。ホテル情報サイトは持ってないので違う例ですが、

カスタムタクソノミーとターム
カスタムタクソノミーとタームの例

登録する時は、

$labels = array(
    "name" => "種類",
    );

$args = array(
    "labels" => $labels,
    "public" => true,
    "show_ui" => true,
    "hierarchical" => true,
    "show_admin_column" => true,
    "description" => '一覧・価格比較',
    "rewrite" => array( "slug" => "class", "with_front" => false ),
);
register_taxonomy( "product_class", "product", $args );

こんな感じです。

さっき、「ホテルの種類」がタクソノミー名って説明したんですが、ホントは違います。日本語は使えませんので、「ホテルの種類」というのはタクソノミーのラベルになります。

このソースの例だと、「product_class」がシステム的に内部で使うタクソノミー名、「種類」が実際にユーザーなどがサイトで見る時の表示名(ラベル)になります。

この「product_class」というカスタムタクソノミーに「競泳水着」「高速水着」などのタームを登録してます。

カテゴリとタグも、タームやタクソノミー系関数で取得できます

ちょっと言い方がおかしいかもしれませんが、カテゴリとタグはタクソノミーの一部です。

最初から用意されているカスタムタクソノミーで、親子階層にできる(hierarchical = true)のがカテゴリ、親子階層にできない(hierarchical = false)のがタグという感じです。

タクソノミー名ももちろんあります、カテゴリが「category」、タグが「post_tag」というタクソノミー名になってます。

なので、タームやタクソノミー系の関数でタクソノミー名を指定するところ(一般的に引数$taxonomyとなってる)に「’category’」や「’post_tag’」とすればカテゴリやタグの情報も取得できます。

テンプレートタグ関数一覧

投稿ページ(single.php)などで利用するテンプレートタグ関数

カテゴリの一覧表示・取得

<?php the_category(); ?>
<?php the_category( $separator, $parents, $post_id ); ?>

記事のカテゴリをリンク付きで表示する。<ul>でマークアップされて表示されます。ループ外でも使えます。

<?php get_the_category_list( $separator, $parents, $post_id ); ?>

記事のカテゴリをリンク付きで取得する。

タグの一覧表示・取得

<?php the_tags(); ?>
<?php the_tags( $before, $sep, $after ); ?>

記事のタグをリンク付きで表示する。初期状態で、最初に「Tag:」とついて、コンマ区切りで一覧化される。ループ外では使えません。

<?php $tag_list = get_the_tag_list( $before, $sep, $after ); ?>

記事のタグをリンク付きで取得する

タームの一覧表示・取得

<?php the_terms( $id, $taxonomy, $before, $sep, $after ); ?>
<?php the_terms( $post->ID, 'category', 'カテゴリー: ', ' / ' ); ?>

記事のタームをリンク付きで表示する。初期状態はコンマ区切りで表示されます。ループ内でも投稿IDを渡すのが必須です。

<?php get_the_term_list( $id, $taxonomy, $before, $sep, $after ) ?>

記事のタームをリンク付きで取得する。

所属するカテゴリ、タグ、タームをまとめて表示・取得

<?php the_taxonomies( $args ); ?>

投稿に関連付けたカテゴリ、タグ、タームをリンク有りの状態で表示。

使い方は、関数リファレンス/the taxonomies – WordPress Codex 日本語版を。

<?php get_the_taxonomies( $post, $args ); ?>

投稿に関連付けたカテゴリ、タグ、タームをリンク有りの状態で取得。

使い方は、関数リファレンス/get the taxonomies – WordPress Codex 日本語版を。

カテゴリ情報を取得

<?php get_the_category(); ?>
<?php get_the_category( $post_id); ?>

記事が属するカテゴリ情報を配列で取得します。ループ外OK。カテゴリーのオブジェクトの配列が取得出来ますので、foreachで回せばいろいろ細工できます。

タグ情報を取得

<?php get_the_tags(); ?>
<?php get_the_tags( $post_id); ?>

記事が属するタグ情報を配列で取得します。ループ外OK。タグのオブジェクトの配列が取得出来ますので、foreachで回せばいろいろ細工できます。

ターム情報を取得

<?php get_the_terms( $post_id, $taxonomy ); ?>

記事が属するターム情報を配列で取得します。ループ内でも投稿IDが必須です。タームのオブジェクトの配列が取得出来ますので、foreachで回せばいろいろ細工できます。

<?php wp_get_post_terms( $post_id, $taxonomy, $args ); ?>

さらに詳しい指定が可能なバージョン。$args を指定すれば、たとえばタームの順番を変えたりフィルタしたり出来ます。

使い方は、関数リファレンス/wp get post terms – WordPress Codex 日本語版を。

カテゴリの所属判定

<?php if(has_category( $category )): ?>
<?php if(has_category( $category, $post )): ?>
<?php if(in_category( $category )): ?>
<?php if(in_category( $category, $_post )): ?>

記事がそのカテゴリに所属しているか? 親カテゴリを含めた所属判定はしません。指定されたカテゴリに対してのみ判断されます。

$category は、カテゴリID(数字)、スラッグ、名前など何でもOK。配列にすれば複数チェックできますので、親チェックもしたい場合は配列に。

ループ外でも使えます。その場合、投稿IDまたは投稿オブジェクトを渡してください。

タグの所属判定

<?php if(has_tag()): ?>
<?php if(has_tag( $tag, $post )): ?>

記事がそのタグに所属しているか? 引数すべて省略の場合は、なんでも良いのでタグに所属してるか?

$tagは、何でもOK、配列可能。ループ外もOKです。

タームの所属判定

<?php if(has_term( '', $taxonomy )): ?>
<?php if(has_term( $term, $taxonomy, $post )): ?>

記事がそのタームに所属しているか?

$taxonomyは省略出来ません。$term省略の場合、何でも良いのでそのタクソノミーに所属してるかどうか?

$termはタームID(数字)、スラッグ、名前など何でもOK。配列も可能です。$taxonomyは、文字列でタクソノミー名を。

カテゴリ・タグ・タクソノミー・タームページ(archive.phpなど)で使うテンプレートタグ関数

カテゴリ名、タグ名、ターム名を表示・取得

<?php single_cat_title( $prefix, $display ); ?>
<?php single_tag_title( $prefix, $display ); ?>
<?php single_term_title( $prefix, $display ); ?>

初期状態でecho不要で表示します。displayをfalseにすれば、取得可能。IDは不要です。

基本的には、titleタグかh1で使う為の関数です。

カテゴリ、タグ、タームの説明を表示・取得

<?php echo category_description( $category_id ); ?>
<?php echo tag_description( $tag_id ); ?>
<?php echo term_description( $term_id, $taxonomy ) ?>

説明表示系はechoが必要。ID、taxonomyは省略可能です。省略すれば、現在のページの情報を表示します。

ページの条件判定

<?php if(is_category($category)): ?>
<?php if(is_tag($tag)): ?>
<?php if(is_tax( $taxonomy, $term ): ?>

今表示してるのが、指定されたカテゴリページ(タグページ、タームページ)かを判定します。

引数すべて省略可能。省略すれば、カテゴリか、タグか、タームか、という大きな範囲で判定します。

$category、$tag、$term は、ID、名前、スラッグなどなんでもOK。配列も可能です。

カテゴリID、タグID、タームIDの取得

IDが必要な関数のために、アーカイブ系ページで各種IDを取得する方法です。

カテゴリIDは、グローバル変数 $cat に。タグIDは、グローバル変数 $tag_id に入ってます。

タームページでタームIDを取得するには細工が必要です。グローバル変数 $term にスラッグが入ってるので、

<?php
$term_obj = get_term_by("slug", $term, $taxonomy);
$term_id = $term_obj -> term_id;
?>

な感じでタームIDを取得してください。

ID取得を共通化する

カテゴリ、タグ、ターム、それぞれでID取得方法が違うのでarchive.phpを使って同じ処理をしようとするとちょっと面倒です。

なので、

if ( is_tax() || is_tag() || is_category() ) {
    $term = get_queried_object();
    $taxonomy = $term->taxonomy;
    $term_id = $term->term_id;
}

こんな感じで最初にIDとタクソノミーを取得しておく方が便利かもしれません。

カテゴリ情報系のテンプレートタグ関数

カテゴリ情報を取得する

<?php get_category( $category, $output, $filter ) ?>

カテゴリIDから取得します。 $categoryは、カテゴリIDです。

<?php get_category_by_slug( $slug ); ?>

カテゴリのスラッグから取得します。

<?php get_category_by_path( $category_path, $full_match, $output ) ?>

カテゴリのURLから取得します。

カテゴリID、カテゴリ名、カテゴリURLの取得

<?php get_the_category_by_ID( $cat_ID ); ?>
<?php get_cat_name( $cat_id ) ?>

カテゴリIDからカテゴリ名を取得

<?php get_category_link( $category_id ); ?>

カテゴリIDからカテゴリURLを取得

<?php get_cat_ID( $cat_name ) ?>

カテゴリ名からカテゴリIDを収得

親カテゴリ情報を取得

<?php get_category_parents( $id, $link, $separator, $nicename, $visited ); ?>

カテゴリIDから親カテゴリ情報を収得できます。先祖も含めてすべての親データが配列で帰ってきます。

タグ情報系のテンプレートタグ関数

タグ情報を取得する

<?php get_tag( $tag, $output, $filter ) ?>

$tagは、タグID。

タグのURLを取得

<?php get_tag_link($tag_id); ?>

ターム情報系のテンプレートタグ関数

ターム情報を取得する

<?php get_term( $term, $taxonomy, $output, $filter ) ?>

タームIDから取得します。$termは、タームIDです。

<?php get_term_by( $field, $value, $taxonomy, $output, $filter ); ?>

タームの名前やスラッグから取得します。

$field は、’id’, ‘slug’, ‘name’, ‘term_taxonomy_id'(タクソノミーID)で、$valueに対応するものを入れれば取得可能です。

タームのURLを取得

<?php get_term_link( $term, $taxonomy ); ?>

$termは、タームIDです。

子タームのID一覧を取得

<?php get_term_children( $term, $taxonomy ) ?>

$termは、タームID。そのタームの子タームの一覧のIDが配列で帰ってきます。IDなので、さらにforeachでget_termを回して情報を取得してください。

タクソノミー情報のテンプレートタグ関数

<?php get_taxonomy( $taxonomy ) ?>

あまり使わないと思いますが、タクソノミーの情報を取得できます。

親・先祖の情報を取得(共通)

<?php get_ancestors( $object_id, $object_type ); ?>

カテゴリ、タグ、ターム共通で、先祖を含めた親の情報を配列で取得できます。これ、結構便利です。

ちなみに、固定ページの親情報も取得できます。

一覧、全データ取得の関数

カテゴリなどを手軽に一覧で表示したい時に使う関数や、カテゴリ情報等をすべて取得したい時に使う関数です。

主にウィジェット(サイドバー)やトップページ、独自の記事一覧ページを作る時によく使います。引数が長いので詳細はCodexの公式ヘルプを。

カテゴリ一覧

<?php wp_list_categories( $args ); ?>

カテゴリの一覧を良い感じ表示してくれます。引数指定すれば、カテゴリ以外(タグやターム)の表示も可能です。

テンプレートタグ/wp list categories – WordPress Codex 日本語版

<?php $categories = get_categories( $args ); ?>

すべてや条件指定でカテゴリ情報を配列で取得できます。

関数リファレンス/get categories – WordPress Codex 日本語版

タグ一覧

<?php wp_tag_cloud( $args ); ?>

タグの一覧を表示します。タグの場合はタグクラウド形式(所属する記事数に応じて文字サイズが変わる)になります。引数指定すれば、タグ以外(カテゴリやターム)の表示も可能です。

テンプレートタグ/wp tag cloud – WordPress Codex 日本語版

<?php $cloud = wp_generate_tag_cloud( $tags, $args ); ?>

タグクラウド形式のHTMLを取得できます。

テンプレートタグ/wp generate tag cloud – WordPress Codex 日本語版

<?php $tags_array = get_tags( $args ); ?>

すべてや条件指定でタグ情報を配列で取得できます。

関数リファレンス/get tags – WordPress Codex 日本語版

ターム一覧

<?php $terms = get_terms( $taxonomies, $args ); ?>

すべてや条件指定でターム情報を配列で取得できます。$taxonomies には配列が使えるので、複数のタクソノミーのタームをまとめて取得もできます。

ターム一覧の表示関数はありません。表示したい場合は、wp_list_categories() や wp_tag_cloud() で引数に表示したいタクソノミーを指定してください。

オブジェクト配列のフィールド

get_category()、get_tag()、get_term() などで帰ってくるカテゴリ情報、タグ情報、ターム情報はオブジェクトになってます。また、get_categories() などで複数入ってる場合はそれぞれのオブジェクトが配列になってます。

それぞれの中身がどうなってるのか?です。

カテゴリオブジェクト

ソースはget_the_category()の説明ページに載ってます。

  • term_id (整数) カテゴリー ID
  • name (文字列) カテゴリー名
  • slug (文字列) カテゴリーのスラッグ
  • term_group (整数) カテゴリーのグループ
  • term_taxonomy_id (整数) カテゴリーのタクソノミー ID
  • taxonomy (文字列) タクソノミー名 ‘category’
  • description (文字列) カテゴリーの説明
  • parent (整数) 親カテゴリーの ID
  • count (整数) カテゴリーに登録されている投稿の数
  • object_id (整数) オブジェクト ID
  • cat_ID (整数) カテゴリー ID (term_id にも同じ値が入る)
  • category_count (整数) カテゴリーに登録されている投稿の数(count にも同じ値が入る)
  • category_description (文字列) カテゴリーの説明(description にも同じ値が入る)
  • cat_name (文字列) カテゴリー名(name にも同じ値が入る)
  • category_nicename (文字列) カテゴリースラッグ名 – カテゴリー名から生成されたスラッグ(slug にも同じ値が入る)
  • category_parent (整数) 親カテゴリーの ID – 親がなければ 0 が入る(parent にも同じ値が入る)

タグオブジェクト

ソースはget_tags()の説明ページに載ってます。

  • term_id (整数) タグの ID
  • name (文字列) タグ名
  • slug (文字列) タグのスラッグ
  • description (文字列) タグの説明
  • count (整数) タグが付けられた投稿の数

タームオブジェクト

ソースはwp_get_post_terms()の説明ページに載ってます。

  • term_id (整数) タームの ID
  • name (文字列) タームの名前
  • slug (文字列) ターム名から生成されたスラッグ
  • term_group (整数) 親タームのターム ID (’parent’ としても格納される)
  • term_taxonomy_id (整数) タームが属するタクソノミーの ID
  • taxonomy (文字列) タームが属するタクソノミーの名前
  • description (文字列) タクソノミーの説明
  • parent (整数) 親タームのターム ID (’term_group’ としても格納される)
  • count (整数) このタームが使われている回数

1 COMMENT

コメントを残す

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