【備忘録】WordPressのカスタム投稿タイプについてまとめ

posted on 17 Jun, 2012 - 13:17:10 -

このブログを制作するにあたって、WorksのページとBlogのページで2種類更新が必要なコンテンツがあったので、カスタム投稿タイプなるものを試してみようということに。なかなかに面倒くさかったのとわかりにくかったので、備忘録がてら自分のやったことをまとめます。WordPressのバージョンは3.1以降。
ほぼ自分用のメモなので長い上に細かい上に見難い。興味ない人はスルー安定

もくじ

  1. そもそもカスタム投稿タイプって何よ
  2. いざ導入しよう
  3. カスタム分類を追加する
  4. カスタム分類をカスタム投稿タイプの投稿一覧に表示させる
  5. おい、サイトに表示察せるにはどーするんだYo
  6. おわりに
  7. あわせて読もう参考リンク

そもそもカスタム投稿タイプって何よ

簡単に言うと「もう一つのブログ」。メインの投稿の他に投稿する機能がほしい!という時に使用。このサイトではBlogをWordPressのデフォルトの投稿で運用しつつ、もうひとつの投稿としてポートフォリオというカスタム投稿タイプを設定。Worksに追加があればBlogと同じ要領で追加していくことができる。

メリット

  1. ブログとカスタム投稿タイプでそれぞれ別のカテゴリーとタグを運用できる
  2. 記事の混在を避けて管理がしやすい
  3. ブログを初期化してもカスタム投稿タイプが消えない。プラグインから設定すると、プラグイン初期化されれば作ったカスタム投稿タイプが消滅する

デメリット

  1. めんどくさい
  2. 慣れてないとわかりづらい
  3. めんどくさい

※あくまで主観

いざ導入しよう

カスタム投稿タイプを導入する方法は、プラグインを利用する。またはfunction.phpに直接書き込むの2通りありますが、当サイトではfunction.phpに直接書き込んでいます。
function.php内に以下のコードをコピペするとカスタム投稿タイプが追加される。

/* カスタム投稿タイプ */
new relative_URI();function works_custom_post_type() {
$labels = array(
'name' => 'ポートフォリオ',
'singular_name' => 'works',
'add_new_item' => 'ポートフォリオを追加',
'add_new' => '新規追加',
'new_item' => '新規ポートフォリオ',
'view_item' => 'ポートフォリオを表示',
'not_found' => '見つかりませんでした',
'not_found_in_trash' => 'ゴミ箱にポートフォリオはありません。',
'search_items' => 'ポートフォリオをさがす',
);
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true,
'query_var' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title','editor','thumbnail'),
'has_archive' => true,
'show_in_nav_menus' => true
);
register_post_type('works', $args);

各種自分用にカスタマイズするにはこちら参考に編集すると良い。基本的ですが「”」は消しちゃダメ

name
カスタム投稿タイプの名前。ダッシュボードのサイドバーに表示される。「ポートフォリオ」部分を適宣変更する。

singular_name
カスタム投稿タイプの名前。どこに表示されるってわけじゃないけどサイト上でカスタム投稿タイプを呼び出すために使った。「works」部分を変更する。

supports
記事を書く画面で何を表示するか。title、editorは何もしなくてもついてくるのでこれだけの場合は行ごと消しても大丈夫。当サイトではアイキャッチ(サムネイル)を挿入するために’tummbnail’を追加しています。
後に紹介するカスタム分類に関してはそちらの方で表示する命令を入れるのでここで記述する必要はない。

とりあえずこれぐらい。他の部分に関しては「ポートフォリオ」と書いてある部分を適宣変えていけば問題ない。その他の部分はテンプレに近いので変える必要はなさそう。

カスタム分類を追加する

カスタム分類とは、カスタム投稿タイプのタグとカテゴリーのこと。これもfunction.phpに直接記述する。
記述箇所は先ほどコピペしたコードの

register_post_type(‘works’, $args);
ココに記述する
}

/* カスタムタクソノミー register_post_type('works', $args);の下に追加する*/
$args = array(
'label' => 'クライアント',
'public' => true,
'show_ui' => true,
'hierarchical' => true,
);
register_taxonomy('client_cat', 'works', $args);

labelは表示されるカスタム分類名。クライアント部分を変更すれば自由に名前が変えられる。

hierarchicalは、階層表示をするか否か。親子関係を組ませる場合trueにする。
おそろしく噛み砕くと、カテゴリーとして表示するかタグで表示するか。trueでカテゴリーとして表示し、falseでタグとして表示する。

最後の
register_taxonomy(‘client_cat’, ‘works’, $args);
は、ダッシュボードに表示させる関数。最初の引数’client_cat’はカスタム分類名のスラッグ。適宣変更してあげてください。日本語は使っちゃダメ。
2つ目の引数’works’はこのカスタム分類をどこに表示するかを指定する。先程カスタム投稿タイプで作った’singular_name’ の値を入力する。

カスタム分類をカスタム投稿タイプの投稿一覧に表示させる

カスタム分類は、設定すると投稿画面やそれぞれのタクソノミー画面で見たり編集できるようになりますが、記事一覧の画面で確認することができません。
記事一覧に表示させるにはまたしてもfunction.phpに記述する必要がある。

今回の記述箇所は今までコピペしたコードの下。中かっこ閉じるが一番下のはずなのでその下から。

}
ここに記述する

//管理画面記事一覧にカスタムタクソノミーの表示追加
add_action('init', 'works_custom_post_type');
function manage_posts_columns($columns) {
$columns['fcategory1'] = "クライアント";
return $columns;
}
function add_column($column_name, $post_id){
//カテゴリー取得
if( 'fcategory1' == $column_name ) {
$fcategory = get_the_term_list($post_id, 'client_cat');
}
//該当カテゴリーがない場合「なし」を表示
if ( isset($fcategory) && $fcategory ) {
echo $fcategory;
} else {
echo __('None');
}
}
add_filter('manage_edit-works_columns', 'manage_posts_columns');
add_action('manage_posts_custom_column',  'add_column', 10, 2);

$columns[‘fcategory1’]は、表示させたいカスタム分類の名前。

$fcategory = get_the_term_list($post_id, ‘client_cat’);
のclient_cat部分を自分で設定したカテゴリ分類のregister_taxonomyの最初の引数を入力すればOK。

複数設定したい

カスタム分類を複数設定する場合は,
$columns[‘fcategory1’] = ‘クライアント’;
の下に同じように
$columns[‘fcategory2’] = ‘カスタム分類名’
を追加し、
if( ‘fcategory1’ == $column_name ) {
$fcategory = get_the_term_list($post_id, ‘client_cat’);
の下に
if( ‘fcategory2’ == $column_name ) {
$fcategory = get_the_term_list($post_id, ‘xxxxxxx’);
を追加するxxxxxxxの部分はカスタム分類のスラッグ名を入れる。

サンプル。ハイライトされている箇所が追加した箇所

//管理画面記事一覧にカスタムタクソノミーの表示追加
add_action('init', 'works_custom_post_type');
function manage_posts_columns($columns) {
$columns['fcategory1'] = "クライアント";     //ここにカスタム分類の名前を入れる1
$columns['fcategory2'] = "担当";            //ここにカスタム分類の名前を入れる2
$columns['fcategory3'] = "画像の有無";      //ここにカスタム分類の名前を入れる3
return $columns;
}
function add_column($column_name, $post_id){
//カテゴリー名取得
if( 'fcategory1' == $column_name ) {
$fcategory = get_the_term_list($post_id, 'client_cat');
}
if( 'fcategory2' == $column_name ) {
$fcategory = get_the_term_list($post_id, 'works_cat');
}
if( 'fcategory3' == $column_name ) {
$fcategory = get_the_term_list($post_id, 'imageon');
}
//該当カテゴリーがない場合「なし」を表示
if ( isset($fcategory) && $fcategory ) {
echo $fcategory;
} else {
echo __('None');
}
}
add_filter('manage_edit-works_columns', 'manage_posts_columns');
add_action('manage_posts_custom_column',  'add_column', 10, 2);

ここまで滞りなく設定出来ればおそらく快適なカスタム投稿タイプライフ(意味不明 が待っている。

おい、サイトに表示させるにはどーするんだYo

カスタム投稿タイプを設定したら、記事を表示させるためのテンプレートを制作する。
必要なのは

  1. archives-◯◯◯◯.php 記事一覧ページ
  2. single-◯◯◯◯.php  記事のページ
  3. taxonomy.php      カスタム分類に属する記事一覧のページ

の3つ。◯◯◯◯にはカスタム投稿タイプを作る時に設定した’singular_name’ の値が入る。
名前さえ間違えなければWordPressが勝手に判断してテンプレートを適用するようになっている。頭いい

実は各ページ自体は通常のブログのループが記述されているテンプレートを複製しリネームするだけで解決するが、それではリンク先がわからないためナビゲーションに追加することができない。カスタムメニューにもプラグインを入れない限りリンクの候補として上がることはないし、ましてやトップページをカスタム投稿タイプの記事一覧の固定ページにしている当サイトにいたっては、固定ページにカスタム投稿タイプの記事一覧を表示しなければならない。
よってここでは、固定ページにカスタム投稿タイプの記事一覧を表示する。という目標で解説する。

てっとりばやくカスタム投稿の記事一覧の固定ページを作るには、通常のブログのループが記述されているテンプレートを複製し上記のようにarchives-◯◯◯◯.phpとリネームした後、まず一番てっぺんに

<?php
/*
Template Name: 固定ページの名前を入れる
*/
?>

をコピペして固定ページのテンプレートを定義した後、ループ開始の前に

<?php $paged = get_query_var('paged');
query_posts($query_string . "&orderby=date&post_type=works&posts_per_page=24"); ?>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
 //WordPressのループ内容
<?php endwhile; endif; ?>

上のコードのハイライト部分をコピペして、post_type=worksの部分をカスタム投稿タイプを作る時に設定した’singular_name’ の値をいれれば大概解決する。
orderby=dateは日付順に整列。
posts_per_page=24は1ページ辺りに何件記事を表示するか。この場合24件。数字を変えれば数が変わる。

本当はもっと短くて済むけど、ページ番号を表示するプラグインのWP-PageNaviを導入するとページの移動ができなくなるエラーがある。ネット上にいろんな解決方法があったけども、自分のサイトでエラーを吐かなかったのはこの方法だけだった。

2.のsingle-◯◯◯◯.phpと3.のtaxonomy.phpは、通常メインのナビゲーションから直接リンクすることはありえない(記事一覧から該当記事にリンクする)ので、それぞれsingle.phpとまたもや通常のブログのループが表示されているテンプレート(たぶんindex.phpがほとんど)を複製してリネームするだけで自動的に終了する。
当サイトの場合BlogとWorksで記事一覧の表示の仕方、記事本体のページでデザインが異なるため、それぞれ1から制作している。

おわりに

以上が今回サイトを作るにあたって一番の鬼門だったカスタム投稿タイプのまとめ。全然まとまってないね。制作中いろんなブログやフォーラムを回ってやっとこさ思い通りに表示できるようになった。
少しでも参考になれば幸いであります。

あわせて読もう参考リンク

ぶっちゃけサブカテゴリー作って分類したほうが手っ取り早くね?

はい。

一応ブログを運営する側からしたらカスタム投稿で専用の投稿欄があったほうがなんとなくスマートだよね。


    ©2012 Re:Q Reserved