カスタム投稿タイプ アーカイブページ : WordPress


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

カスタム投稿タイプ用の$wp_queryオブジェクトの取得

カスタム投稿タイプのアーカイブをページに表示する方法についの分かりやすい解説がある。本記事はその記事を適宜引用する。
» 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を試してみるがうまくいかなかった。後ほど検証。

コメント

Trackbacks

  1. […] https://findxfine.com/programming/wp/995552090.html […]

    ピンバックbyhttps://findxfine.com/programming/wp/995552090.html | 大塚智子 — 2014-11-04 @ 5:52 PM


  1. Thanks a good deal

    コメント by Georgetta Cokel — 2012-10-10 @ 9:02 PM

  2. この記事のおかげで解決しました!
    ほんとうにありがとうございます!

    コメント by 匿名 — 2013-08-09 @ 1:54 PM

  3. こめんとありがとうございます。
    お役に立ててとても嬉しいです。

    コメント by findxfine — 2013-08-09 @ 4:10 PM

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。