月別アーカイブ表示に年区切りを入れる。

wp_get_archives();で表示される
・2010年3月
・2009年6月
というのを

2010年

・3月

2009年

・6月

みたいな表示にする。

2010年3月等と表示される日本語環境のみ、March 2010とか表示される英語環境だと要修正。

<h3>ARCHIVES</h3>
<div class="navi-archives">
<?php 
//1. 年を抽出して配列に格納
$archives_year = strip_tags(wp_get_archives('type=yearly&show_count=0&format=custom&echo=0')); //wp_get_archivesに対してタグを除去して年数のみ抽出。
$archives_year_array = split("\n",$archives_year); //年数ごとに配列$archives_year_arrayに格納
array_pop($archives_year_array);//配列内の最後に空の配列ができてるので削除。
//$archives_year_array = array_merge(array_diff($archives_year_array, array(""))); で空の配列削除してもOKだった。

//2. アーカイブ一覧を取得して配列に格納
$archives = wp_get_archives('type=monthly&show_post_count=1&use_desc_for_title=0&echo=0'); //月別アーカイブを取得。
$archives_array = split("\n",$archives); //同様に改行ごとに配列に格納。

foreach ($archives_year_array as $year_value){ //1で抽出した年数分繰り返し
	echo "<h4>".ltrim($year_value)."</h4>\n"; //<h4>で年を表示
	echo "<ul>\n";
	
	foreach ( $archives_array as $archives_value) { //月別アーカイブ数分繰り返し
		
		if ( intval(strip_tags($archives_value)) == intval($year_value) ) { //1で取得した年と、2の各月別アーカイブの文字列を比較
			echo  str_replace(intval($year_value)."","",ltrim($archives_value))."\n";//2の月別アーカイブの各行のhtmlからYYYY年部分を除去して表示。
			array_shift($archives_array); //表示した配列を削除。なんとなくこのほうが次のforeachまわるとき処理早くなるかなと思って。
		}
		
	}
	echo "</ul>\n";	
}

?>
</div>

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です