WordPressの月別アーカイブをコンパクトに出力する

wp_get_archives() 関数だとずらっと並んでしまう月別アーカイブを、1年1行ずつコンパクトに出力する方法のメモです。便利なプラグインもあるので自力でやることでもないのですが、せっかくなので書き残しておきます。
こんな形に
<ul><?php wp_get_archives('show_post_count=1'); ?></ul>
よくある形でこのように書くと、
左図のように下にながーくなってしまうのですが、これを右図のような形に実装してみます。
先日までこのプラグインを使わせてもらっていたのですが、別目的で作った関数を使って実装できることに気づいたので、もったいないと思って自分で書くことにしました。
プラグインを導入したときの記事です。
でも、月を英字にもできるし、シンプルでわかりやすいプラグインです。別に自力で書く必要もないので、PHP苦手だったら無理せずとも、上記のプラグイン、お勧めです。
実装
目指すHTML
こういう形のHTMLを出力するためのPHPを書きます。
<div id="ArchivesArea"> <dl> <dt><a href="http://sample.com/2016/" title="15件の投稿">2016</a>:</dt> <dd><a href="http://sample.com/2016/01/" title="2件の投稿">01</a></dd> <dd>02</dd> <dd><a href="http://sample.com/2016/03/" title="1件の投稿">03</a></dd> <dd>04</dd> <dd><a href="http://sample.com/2016/05/" title="1件の投稿">05</a></dd> <dd><a href="http://sample.com/2016/06/" title="2件の投稿">06</a></dd> <dd><a href="http://sample.com/2016/07/" title="2件の投稿">07</a></dd> <dd><a href="http://sample.com/2016/08/" title="3件の投稿">08</a></dd> <dd><a href="http://sample.com/2016/09/" title="4件の投稿">09</a></dd> <dd>10</dd> <dd>11</dd> <dd>12</dd> <dt><a href="http://sample.com/2015/" title="4件の投稿">2015</a>:</dt> <dd>01</dd> <dd>02</dd> <dd>03</dd> <dd>04</dd> <dd>05</dd> <dd>06</dd> <dd><a href="http://sample.com/2015/07/" title="1件の投稿">07</a></dd> <dd><a href="http://sample.com/2015/08/" title="1件の投稿">08</a></dd> <dd>09</dd> <dd>10</dd> <dd><a href="http://sample.com/2015/11/" title="1件の投稿">11</a></dd> <dd><a href="http://sample.com/2015/12/" title="1件の投稿">12</a></dd> <!-- 一番古い投稿年まで続く --> </dl> </div><!-- /#ArchivesArea -->
定義リストにしてみました。現在の年から一番古い投稿の年まで、年月アーカイブにリンクさせます。投稿がないところはただのテキストです。
functions.php
それではここから実際に書くコード。functions.phpでは、こちらの記事に書いたのと同じものを使います。
指定した年の投稿数、指定した年月の投稿数、それと一番古い記事の投稿年を取得する関数です。
任意のテンプレートファイル
上の関数を使って、アーカイブリストを出したい場所に以下を書きます。
<div id="ArchivesArea">
<dl>
<?php
$flg = true; //年の切替フラグ
$acv_str = ""; //出力文字列
$year = idate('Y'); //本日の年
$month = 1; //1月
$oldest_year = get_oldest_year(); //一番古い投稿日の年
while ( $year >= $oldest_year ) { //一番古い投稿年を指定年が下回るまでループ
//年見出し出力
if ( $flg == true ){ //年切替フラグが立っていたら
$year_archives_num = get_year_archives_num( $year ); //指定年の投稿数を取得
if ( $year_archives_num > 0 ) { //投稿があったらアーカイブリンクを生成
$acv_str .= "\t".'<dt><a href="'.home_url('/').$year.'/" title="'.$year_archives_num.'件の投稿">'.$year."</a>:</dt>\n";
} else { //指定月の投稿がなかったら文字列だけ
$acv_str .= "\t<dt>".$year.":</dt>\n";
}
$flg = false; //年見出しが出現したら年切替フラグを倒しておく
}
//月アーカイブ出力
if ( $flg == false ){ //年切替フラグが倒れていたら
$month_archives_num = get_month_archives_num( $year, $month ); //指定年月の投稿数を取得
if ( $month_archives_num > 0 ) { //指定月の投稿があったらアーカイブリンクを生成
$acv_str .= "\t\t".'<dd><a href="'.home_url('/').$year.'/'.str_pad($month, 2, 0, STR_PAD_LEFT).'/" title="'.$month_archives_num.'件の投稿">'.str_pad($month, 2, 0, STR_PAD_LEFT)."</a></dd>\n";
} else { //指定月の投稿がなかったら文字列だけ
$acv_str .= "\t\t<dd>".str_pad($month, 2, 0, STR_PAD_LEFT)."</dd>\n";
}
$month++; //1月進む
if ( $month > 12 ){ //13月になってしまったら
$year--; //1年前へ
$month = 1; //1月へ
$flg = true; //年切替フラグを立てる
}
}
}
echo $acv_str; //出力
?>
</dl>
</div><!-- /#ArchivesArea -->
14, 16行が年、24, 26行が月を生成しているところです。月を数値じゃなくてJanとかにすることもやろうと思えばできますが…。もしリクエストがあるようならやりますのでコメントくださいw
CSS
#ArchivesArea dt, #ArchivesArea dd{
float: left;
}
#ArchivesArea dt{
clear: both;
font-weight: bold;
}
#ArchivesArea dd{
margin-left: 4px;
}
1年で1行になるように並べます。あとはお好みで。以上ですー!





コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。