カスタム投稿タイプのアーカイブウェイジェットは、標準では用意されていません。もし、必要ならプラグインを使えば簡単に導入できるだろうと思っていました。
カスタム投稿タイプのアーカイブウェイジェットが必要な場面が今までなかったので、探したことが無かったのですが、確かに、『custom-post-type-widgets』という有名なプラグインがあります。
しかし、このプラグインは有名プラグイン『Custom post type permalinks』と相性が悪く、2つのプラグインを同時に有効にするとカスタム投稿タイプの月別アーカイブウィジェットのパーマリンクがおかしくなります。検索すると大量にトラブル事例が出てきますが、まともな解決策は見つかりません。

方法①:プラグインの相性問題を解決する
もともと、Wordpressには カスタム投稿の日付パーマリンクが無いのですが、 『Custom post type permalinks』 と 『 custom-post-type-widgets 』 でそれぞれの独自実装している部分が競合しているそうな。

解決策は、特になし。
方法②:標準のアーカイブウィジェットを拡張する方が簡単
パーマリンク回りは、トラブルが起きると根が深く、トラブルが起きると絶望的な気分になります。たかがアーカイブウィジェットでなんでこんなに苦労するのかと、嫌になりました。
そもそも『Custom post type permalinks』を導入するとカスタム投稿の日付アーカイブを出力できるようになります。出力できるようになるだけで、ウィジェットが追加されるわけではありません。
標準のアーカイブウィジェットをフックして使う方法はないのか?と考え始めました。
そうなると話が早く、以下のような有用なコードが見つかりました。
特定の投稿タイプを表示している時だけ、アーカイブウィジェットの動作を変更しています。このコードだとblogという投稿タイプの時だけ、blogのアーカイブを表示するように切り替えています。
<?php
/**
* ウィジェット「アーカイブ」にフィルター
* require Custom Post Type Permalinks
*/
add_filter( 'widget_archives_args', 'my_widget_archives_args', 10, 1);
add_filter( 'widget_archives_dropdown_args', 'my_widget_archives_args', 10, 1);
function my_widget_archives_args( $args ){
if ( ! is_admin() ) {
if ( 'blog' == get_post_type() ) {
$args['post_type'] = 'blog';
}
}
return $args;
}
参考:https://gist.github.com/gatespace/7147747
方法③:ショートコードを作るのも実は簡単
アーカイブウィジェットと全く同じ動きになるショートコードを作るのはとても簡単です。
アーカイブウィジェットでもwp_get_archivesを使っているので、パラメータのpost_typeを変えてあげれば同じ動きになります。
<?php
add_shortcode('archive_news',function(){
ob_start();
?>
<ul>
<?php wp_get_archives('type=monthly&show_post_count=1&post_type=news'); ?>
</ul>
<?php
return ob_get_clean();
});
まとめ
自分で何回か同じことをしていても、時間が経つと忘れてしまいます。
内容的には簡単なのですが、検索してもすぐに出てこないので、メモしておこうと思いました。