プラグインは知らないので、コードを書いてみました。
1.「functions.php」に次のコードを追加します。(※文字コードはUTF-8です。)
function get_category_monthentry($id, $cat) { global $wpdb; $sql = "SELECT YEAR( post_date ) AS `year` , MONTH( post_date ) AS `month` , COUNT( ID ) AS posts FROM $wpdb->posts JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id WHERE $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->term_relationships.term_taxonomy_id =".$id. " GROUP BY YEAR( post_date ) , MONTH( post_date ) ORDER BY post_date DESC"; $gresults = $wpdb->get_results($sql); $list_query = new WP_Query( 'cat='.$id.'&nopaging=true' ); if($list_query->have_posts()) : ; $list = "<li id=\"entry-list\" class=\"widget-container\">\n"; $list .= "<h3 class=\"widget-title\">" . $cat . "の年月別エントリー</h3>\n"; $list .= "<ul>\n"; $cnt =0; $out = 0; $n = 0; while ($list_query->have_posts()) : $list_query->the_post(); $i = $gresults[$cnt]->posts; if($out == $n) { $list .= "<li>" . $gresults[$cnt]->year . "年" . $gresults[$cnt]->month . "月\n<ul>\n"; } $list .= "<li><a href=\"" . get_permalink() . "\">" . the_title('','',false) . "</a></li>"; $out++; if($out == $n + $i) { $n += $i; $cnt++; $list .= "</ul>\n</li>\n"; } endwhile; $list .= "</ul>\n</li>\n"; echo $list; endif; }
2.「sidebar.php」の任意の箇所に次のコードを追加します。(※少し余分な記述があったので修正)
<?php if ( is_single() ) : ?> <?php $now_cat = get_the_category(); get_category_monthentry($now_cat[0]->cat_ID, $now_cat[0]->cat_name); ?> <?php elseif ( is_category() ) : ?> <?php $now_cat = get_query_var('cat'); $id = get_category($now_cat); get_category_monthentry($id->cat_ID, $id->cat_name); ?> <?php endif; ?>
※標準テーマの「TwentyTen」の場合、上記のコードを以下の部分以降の任意の箇所に追加します。【コード訂正済み】
<div id="primary" class="widget-area" role="complementary"> <ul class="xoxo"> <?php /* When we call the dynamic_sidebar() function, it'll spit out * the widgets for that widget area. If it instead returns false, * then the sidebar simply doesn't exist, so we'll hard-code in * some default sidebar stuff just in case. */ if ( ! dynamic_sidebar( 'primary-widget-area' ) ) : ?> <!-- これ以降に先ほどのコードを追加 -->
※現在表示されているアーカイブが必要ない場合は、次の箇所を削除します。(※これも標準テーマの「TwentyTen」です。)
<li id="archives" class="widget-container"> <h3 class="widget-title"><?php _e( 'Archives', 'twentyten' ); ?></h3> <ul> <?php wp_get_archives( 'type=monthly' ); ?> </ul> </li>
※※※管理画面の「外観」→「ウィジェット」で、表示するウィジェットを設定している場合で、
1.現在表示されているアーカイブが必要ない場合は、管理画面のウィジェットで削除してください。
【※※※ 訂正済み ※※※】
2.次のようにコードを追加する箇所を変更した上で、各ウィジェットの表示順を管理画面のウィジェットで変更してください。(※年月別のカテゴリー内記事リストよりも上に表示したいウィジェットを「ウィジェットエリア1」に、下に表示したいウィジェットを「ウィジェットエリア2」に設定します。)
<?php endif; // end primary widget area ?> <!-- ※※※ ここから追加 ※※※ --> <?php if ( is_single() ) : ?> <?php $now_cat = get_the_category(); get_category_monthentry($now_cat[0]->cat_ID, $now_cat[0]->cat_name); ?> <?php elseif ( is_category() ) : ?> <?php $now_cat = get_query_var('cat'); $id = get_category($now_cat); get_category_monthentry($id->cat_ID, $id->cat_name); ?> <?php endif; ?> <!-- ※※※ ここまで ※※※ --> </ul> </div><!-- #primary .widget-area -->
※ウィジェットの表示に合わせる為に、オリジナルのエリアを作成して、その中に表示するようにしています。(「#originalarea」への指定をstyle.cssに追加してください。)オリジナルのエリアを作成せずに、既存のプライマリーエリア(「ウィジェットエリア1」の下)に追加する様に変更したので、以下のスタイルシートの追加は必要ありません。
#originalarea { float: right; overflow: hidden; width: 220px; }
※他のテーマを使用していて、「TwentyTen」とは著しく異なるため分からないという時には、「sidebar.php」の内容を以下のようにスーパーpre記法を使用して教えてください。
>||
ここに「sidebar.php」のコードを記述します。
||<