スタッフブログ
2017.2.20
【WordPress】wp_get_archivesを使わずに特定カテゴリーの年月アーカイブリストを表示したい
こんにちは。ウェブクリエイターの中井です。
WordPressで年月のアーカイブリストを出力するときはwp_get_archives()が便利ですが、
特定カテゴリーに限定することが難しい印象だったため関数を使わずに出力する方法を模索してみました。
年月アーカイブリストの情報取得
まずは年月アーカイブリストの情報を取得します。
<?php
$cat_slug = '取得したいカテゴリー';
$args = array(
'category_name' => $cat_slug,
'posts_per_page' => -1
);
//ここからはget_posts()でも
$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();
?>
この工程で$archive_listに記事情報がすべて入っているはずです。
年月アーカイブリストの出力
取得した情報をループさせてリストを出力します。
<?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( $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; ?>
出力されるソース例はこちら
<ul>
<li><a href="http://www.example.com/2017/1/?cat_slug=●●●●●">2017年1月 [1]</a></li>
<li><a href="http://www.example.com/2016/12/?cat_slug=●●●●●">2016年12月 [2]</a></li>
<li><a href="http://www.example.com/2016/11/?cat_slug=●●●●●">2016年11月 [2]</a></li>
</ul>
リンク先のアーカイブページへ
前工程で出力したリンクにはすべて?cat_slug=という感じでクエリを渡すようにしています。
これをアーカイブページに利用することでカテゴリーの絞り込みを実現させています。
アーカイブページにあたるテンプレートには下記を記述します。
<?php
/*====================================================
記事一覧
=====================================================*/
//$category_nameがなければ引き渡した情報を格納します。
if( !$category_name ) {
$category_name = $_GET['cat_slug'];
}
//記事の取得条件
$article_args = array(
'category_name' => $category_name,
'posts_per_page' => 10,
'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 ?>
<?php endif; ?>
ここはpre_get_postsで指定してもいいですね。
これで特定カテゴリーの指定年月のアーカイブリストの出力は完成です。
まとめ
サクッとコードを足せばいい実装方法ではないですが、月別の記事情報がシンプルに取得できるのでけっこう気に入っています。
いずれプラグイン化して簡単に実装できるようにしたいですね。