カスタム投稿タイプ(Custom Post Type)はアーカイブを利用できない(WP 3.0.4)[1]。
カスタム投稿タイプでアーカイブを利用する方法を考える。
追記 2011.08.15 WP3.1以降はアーカイブが利用可能になった。
register_post_typeの引数に’has_archive’ => trueを追加する。テンプレートファイル名はarchive-カスタム投稿名.phpとする。
» WordPressのカスタム投稿(ポスト)タイプを作成するまでの手順リスト – かちびと.net
has_archiveをtrueにしたあと[パーマリンクの設定] > [変更を保存]を毎回忘れるのでメモ。
カスタム投稿タイプをcpt_exampleとする。
www.example/wordpress/?post_type=cpt_example へアクセスすれば
archive.php・archive-cpt_example.phpやcategory.phpを表示するのではと思ったが表示できなかった。
調べてみるとカスタム投稿タイプのアーカイブを表示する方法は色々とあることが分かった。
本記事はアーカイブ用に専用のページ(page)を用意する。そのページにカスタム投稿タイプのアーカイブを表示する方法を掲載する。
最初にアーカイブを表示するページ(例:cpt_example.php)のコードを掲載する[2]。後半で重要な部分をまとめる。
<?php /* Template Name: cpt_example */ ?>
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$myQuery = new WP_Query();
$param = array( //パラメータ。
'paged' => $paged,
'posts_per_page' => '5',
'post_type' => 'cpt_example',
'post_status' => 'publish',
'orderby' => 'date', // datet 日付順, ID 投稿ID順
'order' => 'DESC'
);
$myQuery->query($param);
?>
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
<?php endwhile;endif; ?>
<div id="pageNate">
<?php
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
$paginate_format = '';
$paginate_base = add_query_arg('paged', '%#%');
} else {
$paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
user_trailingslashit('page/%#%/', 'paged');;
$paginate_base .= '%_%';
}
echo paginate_links( array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $myQuery->max_num_pages,
'mid_size' => 5,
'current' => ($paged ? $paged : 1),
));
?>
</div>
カスタム投稿タイプのアーカイブをページに表示する方法についの分かりやすい解説がある。本記事はその記事を適宜引用する。
» WordPress3.0のカスタム投稿タイプを、実案件を想定して実践してみる | カテゴリー: WordPress | 作業メモ
カスタム投稿タイプ(Custom Post Type)をcpt_exampleとして説明する。固定ページ(page)でWordPressが自動的に作成するデフォルトの$wp_queryオブジェクトは固定ページ(page)用のオブジェクトである。
カスタム投稿タイプcpt_exampleのアーカイブを表示するページで必要なオブジェクはデフォルトの固定ページ用オブジェクトはではなくカスタム投稿タイプ(cpt_example)用のオブジェクトになる。
そこでカスタム投稿タイプの投稿情報をセットするために$wp_queryオブジェクトを新たに生成し、queryメソッドでカスタム投稿タイプの情報を取得する。
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; //現在のページ番号取得
$myQuery = new WP_Query(); // WP_Queryオブジェクト生成
$param = array( //パラメータ。
'paged' => $paged, //常に現在のページ番号を渡す
'posts_per_page' => '20', //(整数)- 1ページに表示する記事数。-1 ならすべての投稿を取得。
'post_type' => 'news', //カスタム投稿タイプのみを指定。
'post_status' => 'publish', //取得するステータスを指定:publish(公開済み)
'orderby' => 'ID',
'order' => 'DESC' //降順。大きい値から小さい値の順。
);
$myQuery->query($param); // クエリにパラメータを渡す
?>
引用の'post_type' => 'news',の部分でカスタム投稿タイプを指定している。
カスタム投稿タイプがcpt_exampleの場合 'post_type' => 'cpt_example'となる。
$myQuery->queryへ渡せるパラメータはquery_postsと同じである。
カスタム投稿タイプ用のループをセットする。
ループの中ではテンプレートタグはカスタム投稿タイプの$wp_queryオブジェクトの値を参照する。
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
<?php endwhile;endif; ?>
ページナビゲーションは下記の記事に掲載されているコードを利用した。
>Yuriko.Net » WP-PageNavi を使わずにナビゲーション表示
<div id="pageNate">
<?php
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
$paginate_format = '';
$paginate_base = add_query_arg('paged', '%#%');
} else {
$paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
user_trailingslashit('page/%#%/', 'paged');;
$paginate_base .= '%_%';
}
echo paginate_links( array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $myQuery->max_num_pages,
'mid_size' => 5,
'current' => ($paged ? $paged : 1),
));
?>
</div>
1. カテゴリーの代わりにカスタムタクソノミー(Custom Taxonomy)を使い分類をする。
2. cpt_example.phpのページへの適用はページを作成するときに新規追加画面のテンプレート項目でcpt_example.phpを選択する。
1. register_post_typの引数で’has_archive’=>trueを試してみるがうまくいかなかった。後ほど検証。
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。
Thanks a good deal
コメント by Georgetta Cokel — 2012-10-10 @ 9:02 PM
この記事のおかげで解決しました!
ほんとうにありがとうございます!
コメント by 匿名 — 2013-08-09 @ 1:54 PM
こめんとありがとうございます。
お役に立ててとても嬉しいです。
コメント by findxfine — 2013-08-09 @ 4:10 PM