Real Blog

レジェンド鈴木が日々感じたことを哲学するブログ。書評、エッセイ、ポエムも書いてます。

WordPressのタクソノミーについて

WordPressにはタクソノミーというものがあります。
WordPressをよく使っている人なら耳にしたことがあるのではないでしょうか?

タクソノミーって聞きなれない言葉ですよね。
タクソノミーとは

情報を分類ごとに整理することを意味しているようです。
WordPressでいうと投稿のカテゴリーやタグのことですね。

今回はWordPressのタクソノミーとは何か、どのように使えるかを説明していきたいと思います。

ソースコードやDBの構成はバージョン3.6.1を対象としています。

タクソノミーの仕組み

上記で言ったようにWordPressでいうタクソノミーとは投稿のカテゴリーやタグ付などで、投稿を整理することですが、
自分で分類を追加して色々な情報を整理することができます。

まず実際にタクソノミー情報が登録されているDBを見てみましょう。

テーブルterm_taxonomy
wp-taxonomy.jpg

taxonomyの列をみると、post_tag, attachment_tag, category などがありますね。
categoryが投稿カテゴリ、post_tagがタグで、attachment_tagが自分で追加したタクソノミーで、画像にタグ付けをできるようにしたものです。

他にterm_idというのがありますが、termというものは各カテゴリやタグ名のことで、例えば写真を投稿するシステムでしたら「風景」や「自然」といった分類名のことです。

上記のテーブルのほかに「term_relationships」というテーブルがあり、このテーブルでtermと投稿結び付けられています。

DBに関しては上記だけで、他の細かい設定はphpのコードで行っています。
DBは最低限で、大部分をコードで指定するというのは一見不思議なような感じがしますが、 これによってカスタマイズやプラグインの作成が容易になっているといえると思います。

タクソノミーの登録

タクソノミーの登録はregister taxonomyという関数で行います。
詳しくはこちら。

既存のカテゴリーやタグもwp-includes/taxonomy.php の 44行目付近の下記のコードで行われています。

register_taxonomy( 'category', 'post', array(
	'hierarchical' => true,
	'query_var' => 'category_name',
	'rewrite' => $rewrite['category'],
	'public' => true,
	'show_ui' => true,
	'show_admin_column' => true,
	'_builtin' => true,
) );

register_taxonomy( 'post_tag', 'post', array(
 	'hierarchical' => false,
	'query_var' => 'tag',
	'rewrite' => $rewrite['post_tag'],
	'public' => true,
	'show_ui' => true,
	'show_admin_column' => true,
	'_builtin' => true,
) );

hierarchicalというパラメータがtrueならカテゴリタイプ、falseならタグたいぷのタクソノミーが登録できます。
このように既存のカテゴリーやタグも特別なものではなく、自分で追加できるタクソノミーと同じようなものと言えると思います。

例えばget_categoriesなどのカテゴリー専用の関数も下記のコードのように、'taxonomy' => 'category' と指定して、get_terms を呼び出しています。
function get_categories( $args = '' ) {
	$defaults = array( 'taxonomy' => 'category' );
	$args = wp_parse_args( $args, $defaults );

	$taxonomy = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args );

	// Back compat
	if ( isset($args['type']) && 'link' == $args['type'] ) {
		_deprecated_argument( __FUNCTION__, '3.0', '' );
		$taxonomy = $args['taxonomy'] = 'link_category';
	}

	$categories = (array) get_terms( $taxonomy, $args );

	foreach ( array_keys( $categories ) as $k )
		_make_cat_compat( $categories[$k] );

	return $categories;
}

テンプレート

クエリーにタクソノミーが指定されていた場合は taxonomy.php
さらに taxonomy-{taxonomy名}.php で各タクソノミーに応じたテンプレが作成できます。