【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; ?>

これでできました^^

コメントをどうぞ!

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。承認制のため、反映まで時間がかかることがあります。

CAPTCHA