カスタム投稿タイプの月別アーカイブを出したい時に、自分が設定したパーマリンク設定通りのURLで出す方法

カスタム投稿タイプにはいつも悩んでしまうのですが、下記のような条件でサイドバーに月別アーカイブを出したい時のやり方です。

  • カスタム投稿タイプreportというのを登録している
  • パーマリンクは、/report/%post_id%にしている
  • 2012年6月のreport記事一覧は、/report/date/2012/06としたい


functions.phpに、下記を書きます。

function my_custom_post_type_archive_where( $where, $args ){  
    $post_type  = isset( $args['post_type'] ) ? $args['post_type'] : 'post';
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;
}
add_filter( 'getarchives_where', 'my_custom_post_type_archive_where', 10, 2 );

そして、表示させたいところに、下記を書きます。

<?php $args = array(
    'post_type' => 'report',
    'type' => 'monthly',
    'echo' => 0
);
$list = wp_get_archives($args);
echo "<ul>$list</ul>";
?>

$argsに渡せるものは、コデックスのwp_get_archivesを参考にすると、取得するアーカイブ数(limit)、リストの形式(format)、投稿数表示の有無(show_post_count)などがあるようです。

また、typeにはyearly、monthly (初期値)、daily、weekly、postbypostが指定できます。

ちょっとだけ研究

functions.phpに追加したフィルターですが、
wp_get_archives()の定義の中に、

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

という行がありまして、これのWHERE文の部分を、下記と置き換えておるようでした。

$where = "WHERE post_type = '$post_type' AND post_status = 'publish'";

なるほどー。。

参考リンクとお世話になった方々

上記コードの出どころ。
Custom Post Type Archives by Year & Month? | WordPress Answer

@hissyNCさん、ありがとうございましたm(__)m
@wokamotoさん、今後ともよろしくお願いしますm(__)m

↓ プラグインを作る方々への本、書きました。 ↓

“カスタム投稿タイプの月別アーカイブを出したい時に、自分が設定したパーマリンク設定通りのURLで出す方法” への 3 件のフィードバック

  1. はじめまして、同じことをしようとしておりまして、上記のコードを試して見たところアーカイブリンクは
    /report/date/2012/08
    ではなく
    /2012/08/
    のようになりました。

    また、リンク先のページが404となるのですが、こちらは何を用意すれば良いでしょうか。

  2. こんにちは。

    通常の投稿のパーマリンクは、/report/%post_id%にしていますか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です