WordPress カスタム投稿タイプの使い方とその力

目次

1. カスタム投稿タイプとは?

WordPressには、更新コンテンツを一覧管理できる項目として、「投稿」と「固定ページ」の2つが用意されています。
ただのブログならば十分ですが、WordPressをCSMとしてWebサイトを構築しようと思うと不十分です。
なぜなら、一般的なWebサイトには、ブログの他に、ニュースやフォトギャラリー、FAQなど、様々は更新コンテンツが考えられ、投稿タイプも様々だからです。
初期状態でも、カテゴリーで投稿タイプを分けて管理することはできますが、やはり投稿タイプが異なる記事はそれぞれ一覧管理できた方が便利です。

それを実現するのが、「カスタム投稿タイプ」という機能です。
WordPress 3.0 から導入された「カスタム投稿タイプ」を使えば、自由に投稿タイプを追加できるようになります。
例えば、「更新履歴」という投稿タイプを追加すると、管理画面のサイドメニューに「更新履歴」専用の投稿メニューが設置されます。

投稿タイプ – WordPress Codex

2. カスタム投稿タイプの導入(プラグインを使う方法)

プラグイン: Custom Post Type UI

このプラグインを使うと、簡単にカスタム投稿タイプを追加することが出来ます。
※後に説明する 3. 直接コードを書く方法 の方がおすすめです。

インストールして有効化

プラグイン: Custom Post Type UI をインストールして有効化すると、管理画面のサイドメニューに「Custom Post Types」というメニューが追加されます。

使い方

管理画面 > Custom Post Types > Add New

今回は、左側半分だけを使います。右側の「カスタム分類作成」は使いません。

投稿タイプ: カスタム投稿タイプの名前。日本語はダメです。(ex. news)
ラベル: カスタム投稿タイプのラベル。管理画面のサイドメニューのところに表示されるラベルです。(ex. 更新履歴)
単数形のラベル: カスタム投稿タイプの名前の単数形。日本語では単数形と複数形を区別することはないので関係ありません。
説明: なにか書いておきたければどうぞ。

必要事項を記入して「Create Custom Post Type」ボタンを押せば、カスタム投稿タイプが追加されます。

オプション設定

「Advanced Label Options · Advanced Options」から、オプション設定をすることができます。

特筆すべきは、以下の2項目です。

メニューの位置: 管理画面のサイドメニューでの表示位置を決める変数です。

5: 「投稿」の下
10: 「メディア」の下
20: 「ページ」の下
null: 一番下

一般的には「5」になるかと思います。

サポート: 投稿画面に表示する項目を限定することができます。

不要な項目のチェックは外しておくといいでしょう。

3. カスタム投稿タイプの導入(直接コードを書く)

テーマディレクトリの functions.php に、以下のコードを記述することで、カスタム投稿タイプを導入することができます。

add_action('init', 'my_custom_post_type');

function my_custom_post_type() {
	$labels = array(
		'name' => _x('更新履歴', 'post type general name'),
		'singular_name' => _x('更新履歴', 'post type singular name'),
		'add_new' => _x('新しい更新履歴を追加', 'book'),
		'add_new_item' => __('新しい更新履歴を追加'),
		'edit_item' => __('更新履歴を編集'),
		'new_item' => __('新しい更新履歴'),
		'view_item' => __('更新履歴を編集'),
		'search_items' => __('更新履歴を探す'),
		'not_found' => __('更新履歴はありません'),
		'not_found_in_trash' => __('ゴミ箱に更新履歴はありません'), 
		'parent_item_colon' => ''
	);
	$args = array(
		'labels' => $labels,
		'public' => true,
		'publicly_queryable' => true,
		'show_ui' => true, 
		'query_var' => true,
		'rewrite' => true,
		'capability_type' => 'post',
		'hierarchical' => false,
		'menu_position' => 5,
		'supports' => array('title','editor')
	); 
	register_post_type('news',$args);
}

変数等については、こちらを参考にしてみてください→ register_post_type

4. カスタム投稿タイプを表示する

通常のループ処理に、「特定のカスタム投稿タイプ」という条件を追加します。
最後に生成したループをリセットするのを忘れないようにしましょう。

<?php if (have_posts()) : query_posts('post_type=news'); ?>
	<?php while (have_posts()) : the_post(); ?>
	<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
	<div class="entry"><?php the_content(); ?></div>
	<?php endwhile;>
<?php else : ?>
	Not Found.
<?php endif; ?>
<?php wp_reset_query(); ?>

※ちなみに

WordPressでループを生成する関数には、get postsquery_posts()WP_query() などがあります。

それぞれの違いについては、こちらの記事で解説しています→WordPressのループの仕組みを深く知る query_posts() と get_posts() の違い

以上、「カスタム投稿タイプ」を使うことで、ブログや固定ページだけではなく、ニュースやフォトギャラリー、FAQなど、様々は投稿タイプを別々に管理、投稿できたり、最適な方法で自由に表示させることが出来るようになります。

5. カスタム投稿タイプとカスタムフィールドを組み合わせる

このカスタム投稿タイプと、前回解説したカスタムフィールドを組み合わせると、いよいよWordPressをCMSとしてWebサイトを構築できそうな気配がしてきます。

サンプルとして、トップページの記事一覧の上に、更新履歴を5件表示させるようにしてみましょう。

まず、「news」という投稿タイプ専用のカスタムフィールドテンプレートを作成します。

「カスタムポストタイプ (カンマ区切り):」の欄に「news」と入力します。
こうすることによって、このカスタムフィールドテンプレートは、「news(更新履歴)」の投稿欄でのみ使用可能になります。

テンプレートの設定は以下のようにします。

[date]
type = text
size = 35
date = true
dateFormat = yyyy/mm/dd
label = 日付

[message]
type = textarea
rows = 4
cols = 40
htmlEditor = true
label = 内容

更新履歴の投稿画面はこうなりました。

※カスタムフィールドテンプレートの項目のみで、「タイトル」「本文」の入力が必要ない場合、カスタム投稿タイプを生成するコードの supports の値を以下のように設定します。

'supports' => array(null)

index.php に、以下のコードを追加して、更新履歴を表示してみましょう。

<?php if (have_posts()) : query_posts('post_type=news'); ?>
	<?php while (have_posts()) : the_post(); ?>
	<h2><a href="<?php the_permalink() ?>"><?php echo get_post_meta($post->ID, 'date', true); ?></a></h2>
	<div class="entry"><?php echo get_post_meta($post->ID, 'message', true); ?></div>
	<?php endwhile; ?>
<?php else : ?>
	Not Found.
<?php endif; ?>
<?php wp_reset_query(); ?>

いかがでしょうか?

WordPressは、もはやただのブログツールではないのです。
カスタム投稿タイプとカスタムフィールドを組み合わて応用すれば、CMSとして本格的なWebサイトの構築も可能なのです。