カスタム投稿タイプ(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