ぱんぶろ

パンジーの「いいね!」ブログ

初心者でも分かる!WordPressのカスタム投稿タイプの導入方法

      2016/04/14  

medium_8755184025photo credit: JD Hancock via photopin cc

「投稿」と「固定」に続く第三の投稿タイプである「カスタム投稿タイプ」

今回は、その導入方法を紹介します。
なお、プラグインは利用せずfunctions.phpの修正のみで行っていきます。

スポンサード リンク

カスタム投稿タイプを導入の目的

導入前になぜカスタム投稿タイプを導入する必要があるのか考えてみましょう。
通常の投稿や固定でできるのであれば、わざわざ手間をかかてカスタム投稿タイプを導入する必要はありませんからね。

カスタム投稿タイプを導入する目的は、大きくは以下の2点です。

  • 運用時のユーザビリティを高めることができる。
  • 1つの投稿に対して複数のカテゴリーを管理できる。

もう少し具体的に見ていきましょう。

運用時のユーザビリティ

WordPressはブログなど自分用に管理している人も多いと思いますが、一方で会社や個人などにブログシステムとして納品するケースもあります。
予算などの関係もあるでしょうが、基本的にはできるだけ運用しやすい設計で納品してあげることが大切です。

例えば納品先がイベント会社だったとして、
投稿の新規追加でイベント情報をh2タグなどで作成させるよりも、

イベント情報に特化したカスタム投稿タイプを用意して、イベント名や日時、会場など作ってあげた方が直感的に操作できて運用の手間が軽くなりますよね。

カスタム投稿タイプは、専用の投稿ページを作ってあげるイメージです。
もう少し具体的に言うと、時系列でフォーマット化できる情報ですね。

例にも挙げた、イベント情報であったり、入荷した商品情報などが当てはまると思います。
カスタム投稿タイプを扱えるということは、それだけ提案する幅が広がるということでもあります。

複数のカテゴリー

投稿にはカテゴリーとタグが設定できました。
カスタム投稿タイプでも同じようにカテゴリーやタグが設定できます。

しかし、通常の投稿と異なるのは、複数作れるという点。
そして呼び名も異なり、カテゴリーもタグもひとまとめに「タクソノミー」と呼ばれます。
(タクソノミーをカテゴリーのように扱うか、タグのように扱うかは、作成時に決めます。)

タグだけだと、数が増えてきたときに管理が大変です。どれが何の役割をしているのかが一目で分かりにくいところがあります。
一方で、タクソノミーとして大枠のくくりを分けて設定できるようにすると管理が楽です。

カスタム投稿タイプで作成するとタクソノミーをいくつでも作れるので管理したい分類があるだけ分けることができます。

カスタム投稿タイプを導入する方法

前置きが長くなりましたが、カスタム投稿タイプを導入する方法を紹介します。

カスタム投稿タイプを導入するには、functions.phpに追記していきます。
今回は例として、「書籍情報」を扱うカスタム投稿タイプを作ってきたいと思います。

add_action('init', 'register_post_type_and_taxonomy');
function register_post_type_and_taxonomy() {
 register_post_type( // カスタム投稿タイプを定義するための関数
 'books', // カスタム投稿タイプ名
 array(
 'labels' => array(
 'name' => '書籍情報', //ダッシュボードに表示される名前
 'add_new_item' => '書籍を追加', // 新規追加画面に表示される名前
 'edit_item' => '書籍の編集', // 編集画面に表示される名前
 ),
 'public' => true, // ダッシュボードに表示するか否か
 'hierarchical' => false, // 階層型にするか否か
 'has_archive' => true, // アーカイブを持つか否か
 'supports' => array( // カスタム投稿ページに表示される項目
 'title', // タイトル
 'editor', // 本文
 'custom-fields', // カスタムフィールド
 'thumbnail', // アイキャッチ画像
 ),
 'menu_position' => 5, // ダッシュボードで投稿の下に表示
 )
 );
 register_taxonomy(
 'books-genre', // タクソノミー名
 'books', // カスタム投稿タイプ名
 array(
 'labels' => array(
 'name' => 'ジャンル',
 'add_new_item' => 'ジャンルを追加',
 'edit_item' => 'ジャンルの編集',
 ),
 'hierarchical' => true,
 )
 );
 register_taxonomy(
 'books-author',
 'books',
 array(
 'labels' => array(
 'name' => '著者',
 'add_new_item' => '著者を追加',
 'edit_item' => '著者の編集',
 ),
 'hierarchical' => false,
 )
 );
 register_taxonomy(
 'books-publisher',
 'books',
 array(
 'labels' => array(
 'name' => '出版社',
 'add_new_item' => '出版社を追加',
 'edit_item' => '出版社の編集',
 ),
 'hierarchical' => false,
 )
 );
}

参考 : 関数リファレンス/register post type - WordPress Codex 日本語版

書籍情報というカスタム投稿タイプを作成して、ジャンルのカテゴリーと著者のタグ、出版社のタグを追加しています。
カテゴリーかタグの選択はhierarchicaltrueにすればカテゴリータイプ、falseにすればタグタイプとなります。

WordPressの管理画面を更新すると、投稿の下に「書籍情報」と「タクソノミー」が追加されているのが分かります。
custom

カスタム投稿タイプの表示

では、カスタム投稿タイプができたら表示させましょう。
新たなテンプレートを2つ作っていきます。

  • single.php
  • archive.php

これらは既に存在すると思います。
ただし、このテンプレートのままだとカスタム投稿タイプには対応できていません。

そこで、single.phpとarchive.phpを拡張してカスタム投稿タイプ用のテンプレートを作っていきます。

今回の書籍情報を例にすると、具体的には、single-books.phpとarchive-books.phpという名前のテンプレートを作っていくことになります。
テンプレートのルールとして、カスタム投稿タイプ用のテンプレートがあれば優先的に読み込まれるようになっているのです。

single-[カスタム投稿タイプ名].phpのテンプレートを作っていく

お使いのテンプレートがあると思うので、ここではメインの部分だけの記載にとどめます。
single.phpをコピーして変更したい箇所だけ修正してsingle-[カスタム投稿タイプ名].phpで保存すると良いでしょう。

<?php while ( have_posts() ) : the_post(); ?>

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h1><?php the_title(); ?></h1>
<div>
<table>
<tr><td>ジャンル</td><td><?php echo get_the_term_list($post->ID, 'books-genre', '', '、' , ''); ?></td></tr>
<tr><td>著者</td><td><?php echo get_the_term_list($post->ID, 'books-author', '', '、' , ''); ?></td></tr>
<tr><td>出版社</td><td><?php echo get_the_term_list($post->ID, 'books-publisher', '', '、' , ''); ?></td></tr>
</table>
</div>
<?php the_content(); ?>
</article><!-- #post-## -->

<?php endwhile; ?>

以下のような表示になるはずです。
このようにスタイルや文言などを加えてオリジナルの投稿ページを作ることができます。

custom2

カスタム投稿タイプの一覧を表示する方法

続いて、カスタム投稿タイプの一覧表示方法を見ていきましょう。

前提条件

まず一覧表示させるための前提条件ですが、
functions.phpで作成したカスタム投稿タイプの属性で'has_archive' => trueとする必要があります。

デフォルトではfalseですので、アーカイブ(一覧情報)が作成されることはありません。

archive-[カスタム投稿タイプ名].phpのテンプレートを作っていく

single.phpの時と同じく、archive.phpをコピーして変更したい箇所だけ修正してarchive-[カスタム投稿タイプ名].phpで保存すると良いでしょう。

コードを見てもらうと分かりますが、一覧表示のループ内容はいつもの書き方と変わりません。
その変わりに、functions.phpで一覧への表示内容を設定しています。

<?php while ( have_posts() ) : the_post(); ?>
<h3><?php the_title(); ?></h3>
<div><?php the_content(); ?></div>
<?php endwhile; ?>

functions.phpへ以下のように追記します。
これはループする内容を書き換えている処理になります。カスタム投稿タイプ「books」の場合だけ一覧で表示させるループの中身を「books」にしているイメージです。

「books」や「2」は好きな値に変更してください。

function set_query_sample( $query ) {
	if ( is_post_type_archive( 'books' ) ) {  // カスタム投稿タイプ「books」の場合
		$query->set( 'post_type', array( 'books' )); // カスタム投稿タイプ「books」のを設定
		$query->set( 'posts_per_page', 2 );  // 表示件数を指定
		return;
	}
}
add_action( 'pre_get_posts', 'set_query_sample');

カスタム投稿タイプ一覧へのリンク

カスタム投稿タイプ一覧へのリンク取得関数を紹介します。

トップページや、サイドメニューに追加してカスタム投稿一覧へ飛ばしてあげましょう。

<a href="<?php echo get_post_type_archive_link( '[カスタム投稿タイプ名]' ); ?>">カスタム投稿タイプ名</a>

まとめ

カスタム投稿タイプの導入と表示方法でした!