【WordPress】カテゴリーの月別アーカイブリストをサイドバーに表示する
条件は、
- サイドバーに月別アーカイブリストを表示させたい。
- 現在メイン領域に表示されている記事または一覧の属するカテゴリーに限定した月別アーカイブリストであること。
というもの。
よくある全記事の月別アーカイブリストを出力するにはwp_get_archives()
でOKだけど、カテゴリーを判別して表示を絞らないといけない。
大体は上記の記事を参考にして、 あとは表示ページからカテゴリーを判別してスラッグを取得するために、
- カテゴリアーカイブページの場合
- 個別記事ページの場合
- その他(カテゴリを絞った月別アーカイブページ)の場合
と3つの条件分岐をしています。
上記記事内では、出力するリストのリンクのところを
<a href="<?php echo esc_url( home_url( $year_month.'/?cat_slug='.$cat_slug ) ) ?>">
としていますが、私のサイトではうまくいかず、
<a href="<?php echo esc_url( home_url( 'date/'.$year_month.'/?cat_slug='.$cat_slug ) ) ?>">
として'date/'.
をつけるとOKでした。
パーマリンク設定の違いかな? 私のサイトでは/%category%/%post_id%.htmlとしています。
【sidebar.php】
<section> <h3>アーカイブ</h3> <?php if(is_category()): //カテゴリアーカイブページの場合 $category = get_queried_object(); $cat_slug = $category->slug; $args = array( 'category_name' => $cat_slug, 'posts_per_page' => -1 ); $archive_query = new WP_Query( $args ); while ( $archive_query->have_posts() ) { $archive_query->the_post(); $archive_list[ get_the_time( 'Y/n', $post->ID ) ][] = $post->post_title; } wp_reset_postdata(); ?> <?php if( $archive_list ) : ?> <ul> <?php foreach( $archive_list as $year_month => $archive ) : $year_month_arr = explode( '/', $year_month ); ?> <li> <a href="<?php echo esc_url( home_url( 'date/'.$year_month.'/?cat_slug='.$cat_slug ) ) ?>"> <?php echo $year_month_arr[0].'年'.$year_month_arr[1].'月' ?> (<?php echo count( $archive ) ?>)</a></li> <?php endforeach; ?> </ul> <?php endif; ?> <?php elseif(is_single()): //個別記事ページの場合 $category = get_the_category( $post->ID ); $cat_slug = $category[0]->slug; $args = array( 'category_name' => $cat_slug, 'posts_per_page' => -1 ); $archive_query = new WP_Query( $args ); while ( $archive_query->have_posts() ) { $archive_query->the_post(); $archive_list[ get_the_time( 'Y/n', $post->ID ) ][] = $post->post_title; } wp_reset_postdata(); ?> <?php if( $archive_list ) : ?> <ul> <?php foreach( $archive_list as $year_month => $archive ) : $year_month_arr = explode( '/', $year_month ); ?> <li> <a href="<?php echo esc_url( home_url( 'date/'.$year_month.'/?cat_slug='.$cat_slug ) ) ?>"> <?php echo $year_month_arr[0].'年'.$year_month_arr[1].'月' ?> (<?php echo count( $archive ) ?>)</a></li> <?php endforeach; ?> </ul> <?php endif; ?> <?php else: //その他(カテゴリを絞った月別アーカイブページ)の場合 $cat_slug = $_GET['cat_slug']; $args = array( 'category_name' => $cat_slug, 'posts_per_page' => -1 ); $archive_query = new WP_Query( $args ); while ( $archive_query->have_posts() ) { $archive_query->the_post(); $archive_list[ get_the_time( 'Y/n', $post->ID ) ][] = $post->post_title; } wp_reset_postdata(); ?> <?php if( $archive_list ) : ?> <ul> <?php foreach( $archive_list as $year_month => $archive ) : $year_month_arr = explode( '/', $year_month ); ?> <li> <a href="<?php echo esc_url( home_url( 'date/'.$year_month.'/?cat_slug='.$cat_slug ) ) ?>"> <?php echo $year_month_arr[0].'年'.$year_month_arr[1].'月' ?> (<?php echo count( $archive ) ?>)</a></li> <?php endforeach; ?> </ul> <?php endif; ?> <?php endif; ?> </section>
スラッグを取得する$cat_slugまでが違うだけで後の出力の部分は同じなので、なんかもっとすっきり書けないのかなぁ。
でも一応これでできました。
アーカイブリストのリンクをクリックした先のページはdate.phpで作成します。内容は参考サイトと同じです。
【date.php】
<?php //$category_nameがなければ引き渡した情報を格納します。 if( !$category_name ) { $category_name = $_GET['cat_slug']; } //記事の取得条件 $article_args = array( 'category_name' => $category_name, 'posts_per_page' => 5, 'paged' => $paged ); //年月の情報を持っていれば取得条件に追加します。 if( get_query_var('year') || get_query_var('monthnum') ) { $archive_args = array( 'year' => get_query_var('year'), 'monthnum' => get_query_var('monthnum'), ); $article_args = array_merge( $article_args, $archive_args ); } $article_query = new WP_Query( $article_args ); if( $article_query ) : ?> <?php while ( $article_query->have_posts() ) : $article_query->the_post(); ?> ループの中身 <?php endwhile; endif; ?>
これでできました^^
素晴らしいです!早速使ってみたところうまく動作しました。ありがとうございます!
ただ、
・日付アーカイブへでパラメータなしのURLアクセスしたとき、
・タグアーカイブにあくせすしたとき
に
Undefined index: cat_slug のエラーが出てしまいます。
非表示すれば実用上は問題ないですが、できればこのエラーも発生しないようにできないものでしょうか?