固定ページにカスタム投稿タイプのアーカイブを表示する
wordpressのカスタム投稿タイプを利用してみました。
カスタム投稿タイプでは「投稿」と同じ機能を追加できます。

基本的な導入方法については、下記がとてもよくまとまっていたので、参考にしました。
- Web Design RECIPE – WordPressをカスタマイズするなら絶対覚えておきたい条件分岐やカスタム投稿タイプなどいろいろ
- Odysseygate.com – カスタム投稿タイプ(Custom Post Type)の導入と使い方 [WordPress 3.0]
難しそうだと思い込んでいたのですが、導入自体は思った以上に簡単にできました。
しかし、一般的には、カスタム投稿タイプは、カスタムタクソノミーと組み合わせて使うことになっているのか、
「カスタムタクソノミー」のアーカイブを表示する下記のようなURLは用意されてますが、
http://example.com/タクソノミー名/スラッグ名/
「カスタム投稿タイプ」に投稿した全ての記事一覧を表示するためのURLがないようです。
「カスタム投稿タイプ」のアーカイブを表示するためには、現在のところ、「固定ページ」を作成して、個別のテンプレートでカスタム投稿タイプの一覧を呼び出して表示させる方法しかないようです。
アーカイブページを作成する際に、多少つまずいたので注意点等メモしておきます。
カスタム投稿タイプのアーカイブページを作成する
参考サイト
- Odysseygate.com – 特定のページにカスタム投稿タイプを表示する[WordPress 3.0]
- ちいさな創々 – WordPressのカスタム投稿タイプの一覧ページでページ送りを利用する
例として、下記のような「カスタム投稿タイプ」と「固定ページ」を作成してアーカイブを作成します。
カスタム投稿タイプ 投稿タイプ名 shops(ラベル:店舗)
固定ページ タイトル:店舗 スラッグ名:shops
1. Custom Post Type UI プラグインをインストール
※functions.phpを利用する方法もありますが、今回は参考サイトと同様にプラグインを使いました。
2.パーマリンク設定
パーマリンクを設定する場合は、あらかじめ「カスタム投稿タイプ」を作成する前に設定しておきます。
3. カスタム投稿タイプを作成
プラグインを有効にすると、メニューに「Custom Post Type」が現れるので、「Add New」をクリックして、「カスタム投稿タイプ」を作成します。
「Advanced Options」をクリックして、オプションを表示しておきます。

設定は目的にあわせて入力してかまいませんが、重要なのが、「投稿タイプ名」と「カスタムリライトスラッグ」です。
投稿タイプ名:shops、カスタムリライトスラッグ:shopのように、複数形と単数系にしておく必要があります。

3.個別記事テンプレートを作成
テンプレートは投稿と同様に、single.phpを参照しますが、専用のテンプレートにした場合は、single-投稿タイプ名.phpを作成します。
ここでは、single-shops.phpとなります。
4.固定ページ「店舗(shops)」を作成
このページのテンプレートに、カスタム投稿タイプ「shops」のアーカイブを作成します。
記述例 page-shop.php
<?php
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query('post_type=shops' . '&paged=' . $paged . '&posts_per_page=10');
?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<article>
<header>
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<time datetime="<?php the_time('c'); ?>" pubdate="pubdate"><?php the_time('Y.m.d'); ?></time>
</header>
<?php the_content(); ?>
</article>
<?php endwhile; ?>
<nav class="pagenav">
<span><?php previous_posts_link(); ?></span>
<span><?php next_posts_link(); ?></span>
</nav>
<?php $wp_query = null; $wp_query = $temp; ?>
※Codex等にあるように、ループ名に$loop等を使うと、ページ送りができなくなるので、$wp_queryを使う必要があるようです。
5.記事を投稿して、表示を確認します。
「カスタム投稿タイプ」に記事を投稿すると、パーマリンク設定がデフォルトの場合、個別の記事URLは
http://example.com/?shops=スラッグ名
ですが、パーマリンク設定をしている場合、記事URLは
http://example.com/shop/スラッグ名
となります。ここで、URLが「shops」と複数形ではなく、「shop」と単数系になっていることに注意が必要です。
パーマリンク設定をしている場合、「投稿タイプ名」に複数形、「カスタムリライトスラッグ」に単数系を指定しておかないと、個別記事を表示する際Not Foundになってしまいます。
また、カスタム投稿タイプ作成後にパーマリンク設定を変更した場合もNot Foundになるので、変更した場合はプラグインで再度カスタム投稿タイプを更新する必要がありました。
その他
ある案件で、設定>表示設定で、投稿ページを固定ページに割り振っていた時、どうしてもページ送りがうまく行かなかったのですが、その原因が、カスタム投稿タイプのカスタムリライトスラッグと固定ページのスラッグ名を同じにしていたせいでした。
・・たぶん誰もこんな間違いはしないと思うのですが、私はこんなことにはまってしまいました。
今回はじめてカスタム投稿タイプを使ってみましたが、思ったより簡単で一度使い方に慣れてしまえば、かなり思い通りの管理画面になりますね。
カスタムフィールドと併用して使えば、クライアントへの説明の手間が大分省けそうです。

参考にさせていただきました!
- – - – - – - – - – - – - – - – - – -
ある案件で、設定>表示設定で、投稿ページを固定ページに割り振っていた時、どうしてもページ送りがうまく行かなかったのですが、その原因が、カスタム投稿タイプのカスタムリライトスラッグと固定ページのスラッグ名を同じにしていたせいでした。
- – - – - – - – - – - – - – - – - – -
↑まさに、これでハマっていました。
ありがとうございましたm(_ _)m
わたしだけかと思っていましたが、お役に立ててよかったです(^^)
まさにまさに、カスタム投稿ページの記事一覧のページを作ろうとして四苦八苦してました。おかげさまでできました~~o(≧∇≦o)(o≧∇≦)o!!!
すごく助かりました。
どうもありがとうございました
最初の導入は少しだけコツがいりますね。無事にできたみたいで良かったです。わーい^^
ピンバック: カスタムフィールド使用いろいろまとめ – : 静岡 SOHO Web designer 生活