Nullyのぶろぐ

仙台で働くエンジニアの日記

カスタム投稿タイプ(カスタムポスト)の独自カテゴリと独自タグを使えるようにする

以前ZendFramework勉強会でご一緒させていただいた、co_hey_japanさんにWordPressのカスタムポスト(カスタム投稿タイプ)でご紹介頂いたので、フォローアップエントリをば。

フォローアップになればいいなぁ...。

なにそれ?

このカスタムポストという機能は3.0系からあたらに強化されたWordPressの機能で、投稿種別を拡張し、ユーザーの利用利便性を向上するための機能です。

具体的に何かというと、co_hey_japanさんの紹介記事でもあるように、サイトオリジナルな投稿種別をもつことが出来ます。

カテゴリやタグは?

もちろん持てます!

register_taxonomy関数を利用することで、指定したカスタムポストのカテゴリ及びタグを保存することが可能になります。

今回はすでに「sample」という名前でカスタムポストが設定されているとします。

コードは以下のようになります。

カテゴリを追加する場合

$args = array(

'label' => 'サンプルカテゴリ', // メニューラベル

'labels' => array(

'name' => 'サンプルカテゴリ',

'singular_name' => 'サンプルカテゴリ',

'search_items' => 'サンプルカテゴリを検索',

'popular_items' => 'よく使われているサンプルカテゴリ',

'all_items' => 'すべてのサンプルカテゴリ',

'parent_item' => '親のサンプルカテゴリ',

'edit_item' => 'サンプルカテゴリの編集',

'update_item' => '更新',

'add_new_item' => '新規サンプルカテゴリを追加',

'new_item_name' => '新しいサンプルカテゴリ',

),

'public' => true,

'show_ui' => true,

'hierarchical' => true,

);

// add a category.

register_taxonomy('sample_category', 'sample', $args);

タグを追加する場合

$args = array(

'label' => 'サンプルタグ',

'labels' => array(

'name' => 'サンプルタグ',

'singular_name' => 'サンプルタグ',

'search_items' => 'サンプルタグを検索',

'popular_items' => 'よく使われているサンプルタグ',

'all_items' => 'すべてのサンプルタグ',

'parent_item' => '親のサンプルタグ',

'edit_item' => 'サンプルタグの編集',

'update_item' => '更新',

'add_new_item' => '新規サンプルタグを追加',

'new_item_name' => '新しいサンプルタグ',

),

'public' => true,

'show_ui' => true,

'hierarchical' => false,

);

// add a tag.

register_taxonomy('sample_tag', 'sample', $args);

ひえらるきかる?(hierarchical)

hierarchicalは階層を保持するか保持しないかの設定です。

タグとカテゴリの大雑把な違いは階層を持つか持たないかなので、カテゴリであれば階層を保持するので「"hierarchical" => true」、タグであれば階層を保持しないので「"hierarchical" => false」を指定してあげます。

これでカテゴリとタグをカスタムポスト単位で設定することが出来ます。

カスタムポスト別に指定したカテゴリとタグを使う

本題はここから!

通常であれば、the_category関数the_tags関数を実行すれば、投稿に指定されたカテゴリやタグが取得出来ますが、ここは一筋縄ではいきません。

なぜかというと、登録しているタクソノミ(分類)が全く別のものなので、the_category関数やthe_tags関数は使えなくなります。

じゃぁどうする?

ぱっと思いつくのだと、the_category関数などと同じような挙動をする関数をつくるくらいしか思いつきませんでした...。

以下に参考になるかわからないコードを。

 

function the_custom_post_category_list($post_type, $id = null) {

global $post;

$id = (int)$id;

if(!$id)

$id = $post->ID;

$taxonomy = $post_type. "_category"; // 適宜変更

if(!taxonomy_exists($taxonomy))

return new WP_Error("invalid_taxonomy", "エラーメッセージ");

$categories = wp_get_object_terms($id);

if(!empty($categories)) {

usort($categories, "_usort_terms_by_name"); // カテゴリ名でソート

}

else {

$categories = array();

}

foreach ( (array) array_keys( $categories ) as $key ) {

_make_cat_compat( $categories[$key] );

}

return $categories;

}

このような感じで指定したカスタムポストのカテゴリを取得するようにします。

後はHTML側で表示をするように書き換えてあげるなり、呼び出し元をさらに追加して、the_custom_post_categoryのような関数を追加し、直接表示してくれるようにしてみるのもありかと思います。

カテゴリも同じような関数で取得できますが、「適宜変更」と書いてある場所は指定したタクソノミに合う形の修正が必要になります。

カスタムポストを表示するためには?

co_hey_japanさんの記事で紹介されているwpxtreme.jpさんの記事で紹介されているquery_posts関数を利用します。

$posts = query_psots("post_type=sample");

これで完了です。

後はforeachなどで配列を展開し、setup_postdata関数を利用して、the_title()関数などを利用できるようにしてもOKです。

最後に

カスタムポスト専用のカテゴリやタグを持たせようとすると結構な量のコードを書かなくてはなりませんので、初期段階で練りこんでおくことが重要です。(結構苦しみました)

もしやるなれば、xpextreme.jpさんでも紹介されているような形でデータを保持させてあげると表示する際の手間もある程度省けると思います。

それとco_hey_japanさん、ご紹介ありがとうございます!