WordPressのアーカイブをカテゴリを指定して表示する方法
2016.07.19
WordPressでコーポレートサイトを作っていると、任意カテゴリ以下の記事のみの
アーカイブリンクを表示したくなります。
アーカイブリンクというのは、wp_get_archivs() で表示される、年毎、もしくは月事のリンクです。
例えば以下のような感じでカテゴリ分けをした場合、「ブログ」以下のアーカイブを表示したくなるとおもいます。
- ブログ
- 社長日記
- スタッフ日記
- お知らせ
実は表示に関しては、何年何月の任意のカテゴリーの一覧を表示、というのは公式にサポートされているようで、例えば 2016年7月の カテゴリーID 5の一覧を表示したい場合、
http://example.com/?m=201607&cat=5
等と指定するとその通りに表示れます。パーマリンクを表示するようにしている場合には、
http://example.com/2016/07/?cat=5
となります。 カテゴリの部分がID番号なのが気になりますが、これはこれで良いとして
サイドバーに各月もしくは年のリンクを表示したいですよね。
以前はこんな時は、
WordPress plugin Archives for a category
というプラグインをつかっていました。ただしこのプラグインですが、もうメンテナンスしてないので、使わない方がよいとこのページの冒頭に注意があります。ほかの解決方法として、post_typeで分けるという手もあります。上記の場合にはブログは通常の投稿(post)タイプにして、別途 ニュースをpost_typeとして定義すれば解決します。
今回は年度毎と月事を合わせた、以下のような変則的な表示をしたいので、ちょっと自作する事にしました。
- 20016年
- 5月(1)
- 6月(2)
- 20015年
- 7月(5)
以下をfunctions.phpに入れて、 wp_archive_year_month_by_category(カテゴリーID); でサイドバーのテンプレートで呼び出せばOKです。
function wp_archive_year_month_by_category($cat_id) {
global $wpdb;
$colums_ids_arr = get_term_children($cat_id, 'category');
$colums_ids_arr[] = $cat_id;
$column_terms = implode( ',', $colums_ids_arr);
$results_arr2 = $wpdb->get_results("SELECT DISTINCT ID
FROM $wpdb->posts INNER JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE post_status = 'publish' and post_date <= now()
AND post_type = 'post' AND ( wp_term_relationships.term_taxonomy_id IN ($column_terms))
ORDER BY post_date DESC");
$pids = implode( ',', array_map( function($post) { return intval($post->ID); },
$results_arr2));
$year_prev = null;
$months = $wpdb->get_results("SELECT DISTINCT MONTH( post_date ) AS month ,
YEAR( post_date ) AS year,
COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'publish' and post_date <= now()
AND post_type = 'post' AND ( wp_posts.ID IN ($pids) )
GROUP BY month , year
ORDER BY post_date DESC");
foreach($months as $month) :
$year_current = $month->year;
if ($year_current != $year_prev){
if ($year_prev != null){?>
</ul>
<?php } ?>
<li><span><?php echo $month->year; ?>年</span>
<ul>
<?php } ?>
<li>
<a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>?cat=<?php echo $cat_id; ?>">
<?php echo date("n", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>月(<?php echo $month->post_count; ?>)
</a>
</li>
<?php $year_prev = $year_current;
endforeach; ?>
</li>
<?php
}