【改正2版】カスタム投稿タイプの表示用のページを作る-WordPress備忘録-(※情報古いです)

【改正2版】カスタム投稿タイプの表示用のページを作る-WordPress備忘録-(※情報古いです)

2010年12月12日

#2013.03.25追記
この記事を公開してから2年以上が経ちました。今後このページに記載しているquery_postsを使った実装方法は非推奨になっていく流れです。
また、現在のバージョン(3.1以降だったかな?)では、わざわざ表示用の固定ページを作らなくても、'has_archive' => trueを1行追加しておけば、勝手にアーカイブページが生成されます。
たとえばパーマリンク設定が /archives/%postname%/だったら、http://example.com/archive/goods で勝手に一覧してくれてるはずです。
適宜最新のCodexなどを参照してください。


前回のエントリー「カスタム投稿タイプの表示用のページを作る-WordPress備忘録-」で書いたコードだと、実は投稿数が増えた時のページ送りのためのリンクが出ないんです・・・。

ページ送りが出ないと困るよね…
ページ送りが出ないと困るよね…

ページ送りを出すためのテンプレートタグで、’posts_nav_link’ってのがあるんですが、これも機能しなくて…
そこで、いろいろ調べたりフォーラムとか活用しながらコードの見直しを図りました。

やりたいことは前回と同じ。

  1. WordPress3.xで、ブログ用途じゃなくて企業紹介のサイトを作ってる
  2. 「施工実績」とか「製品一覧」とか、そういうページを作っておいて、お客さん側で今後情報追加していく予定
  3. 他の固定ページと同じナビゲーションに混ぜたい。
  4. でも、「投稿」は別の用途で使っているので、投稿の中には混ぜたくない

以下、流れです。

1.functions.phpに、カスタム投稿タイプ用のコードを追加

前回よりコメントを増やして分かりやすくしました。

<?php // カスタム投稿タイプの設定
$args = array(
  'label' => '施工実績',  	//カスタム投稿タイプの表示名(ダッシュボードのボタン)
  'labels' => array(
	//「新規投稿を追加」の代わりに表示させる、新規投稿画面の左上に表示される言葉
    'add_new_item' => '新しい施工実績の追加',
	//「新規投稿」の代わりに表示させる、ダッシュボードのボタン下の言葉
    'add_new' => '施工実績を追加',
	//「投稿を表示」の代わりに表示される、記事編集画面の上に表示されるボタンの言葉
    'view_item' => 'この施工実績のページを確認',
    //「投稿を検索」の代わりに表示させる、記事一覧画面の右上検索BOX横に表示されるボタンの言葉
    'search_items' => '施工実績を検索',
  ),
 
 //これをtrueにしないとダッシュボードに表示されない
  'show_ui' => true,
 
 //この2つをtrueにしておくとカスタム投稿の個別ページのパーマリンクがちゃんと動く。詳しいことは聞かないで
  'publicly_queryable' => true,
  'query_var' => true,
 
 //投稿権限を与える
  'capability_type' => 'post',
 
 //true:カスタム投稿に親子関係を付けられる(「ページ」のような感じ
 //false:カスタム投稿に親子関係を付けない(「投稿」のような感じ)
  'hierarchical' => false,
 
  //このカスタム投稿のボタンをダッシュボード上からの何番目に表示させるか。なんだか5刻みっぽい。
  //0-3:「ダッシュボード」の下 4-9:「投稿」の下 10-14:「メディア」の下 15-19:「リンク」の下 …以下は自分で確かめて!
  'menu_position' => 5,
 
  //このカスタム投稿の編集ページで表示させる項目
  //title/タイトル editor/本文 author/作成者 thumbnail/アイキャッチ画像 excerpt/抜粋 comments/コメント
  //trackbacks/トラックバック custom-fields/カスタムフィールド revisions/リビジョン page-attributes/属性
  'supports' => array('title','editor','thumbnail','comments','excerpt')
);
 
// 'construction'・・・このカスタム投稿タイプのスラッグ。お好きな名前(英数字)に変更を。
register_post_type('construction', $args);

※ 2011.04.06追記
‘singular_name’ => ” の記述は削除しました。「単数形」の指定をする項目なのですが、日本語では必要ないので。

これで、

カスタム投稿タイプを追加
増えた!

2.カスタム投稿タイプを一覧表示させるページのテンプレートを作成

#2014.04.27追記
冒頭に記載した通り、もうページテンプレートを作る必要はありません。

「施工実績」ページ用の、ページテンプレートを作ります。
ページテンプレートなので、名前は何でもOKです。(indexとかarchieveとか、予約されてる名前じゃなければ)

私は、construction.phpというページテンプレートを作りました。

中身はこんな感じ。(classは自分が普段使ってるやつに置き換えてね)

<?php /* Template Name: 施工実績 */ ?>
<?php get_header(); ?>
<div id="main">
<h1 class="pagetitle"></h1>
<!-- 投稿ここから -->
<div class="post">
<?php $paged = get_query_var('paged'); ?>
<?php query_posts( array( //これで'construction'というカスタム投稿タイプの記事のループを呼び出してる。数字は、1ページに表示させる投稿の数。
 'post_type' => 'construction',
 'posts_per_page' => 5,
 'paged' => $paged
)); ?>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<h2 class="posttitle"></h2>
<?php the_excerpt(); //投稿の抜粋だけ取り出してる。全文を表示させたい時はいつもどおり'the_content();'を使う。 ?></div>
<!-- /.post -->
<?php endwhile; endif; ?>
<!-- /投稿ここまで -->
 
<?php // ページ送りリンクを表示(「前の○件へ」の数字は自分で設定した数字に変えることを忘れずに!)<br ?> posts_nav_link('|', '<< 前の5件へ', '次の5件へ >>'); ?></div>
<!-- /#main -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
<!-- construction.php end -->

ポイントとしては、通常ループ用のコード

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

の上に

<?php $paged = get_query_var('paged'); ?>
<?php query_posts( array( //これで'construction'というカスタム投稿タイプの記事のループを呼び出してる。数字は、1ページに表示させる投稿の数。 
	'post_type' => 'construction',
	'posts_per_page' => 5,
	'paged' => $paged
)); ?>

を追記していること。

現在のページ数を

$paged = get_query_var('paged');

で取得しています。

で、カスタム投稿タイプの表示ループの外に、ページ送り用のリンクを出力するテンプレートタグ

<?php posts_nav_link(); ?>

を置けばOK!

ちゃんとページリンクが出ました!
ちゃんとページリンクが出ました!

あとは前回と同じです。

3.「施工実績」という名前のページを作る

普通に固定ページの機能で、「施工実績」という名前のページを追加します。
ページ内容は空白でOK。入れたかったら何か入れてもOK。

「公開」ボタンを押す前に「ページ属性」のテンプレート選択欄で、さっき作った「施工実績」テンプレートを選びます。

さっき作った「施工実績」テンプレートを選ぶのですよ!
さっき作った「施工実績」テンプレートを選ぶのですよ!

で、公開。
これで、「施工実績」ページにアクセスすると、「施工実績」のカスタム投稿に入れられた記事一覧が出てるはず。

4.カスタム投稿タイプ専用のsingle.phpを作る(オプション)

3.まででおしまいでもいいんだけど、大体、通常の「投稿」で表示させる記事と、カスタム投稿で表示させる記事のsingleページが同じで良いなんてことはなかったりします。
特に、お客さんからの受注で作ってる場合は。

で、「施工実績」専用のsingle.phpを作っておいて、その中に「お問い合わせはこちら!電話番号052-…..」とかいう記述を埋め込んでおけば、どの施工ページを見てもお問い合わせ先がバッチリ書いてある、というような使い方が出来るわけです。
(今やってる案件では、プラグインじゃないお問い合わせフォームをsingle-***.phpに埋め込んだりしてます)

やり方としては、

デフォルトのsingle.phpをコピーして、single-construction.phpと名前を変える

で、single-construction.phpの、

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

<?php endif;>

間以外(ループ外)に、固定で表示させたい内容を記述すればおっけーです。

ハイできあがり。

このサンプルコードの配布もしています。

カスタム投稿タイプを練習する為のWordPress子テーマを配布!”mypace custom plus”のご紹介」エントリーにて、フリーテーマとして配布しています。よろしければご自由にダウンロードして活用してください!!

以上です。