ブログ系のサイトとかである月別アーカイブページ
記事の分量やデザインのタイプによって表示方法は色々あるので、特にコーディングからのWordPress案件とかで違うパターンをリストで持っておけば何かと便利なので、まとめておきます。
自分がよく使うのはカウント(記事数)部分を<span>で囲み、数字部分だけ個別にレイアウトできるようにアーカイブリストを表示させます。
<ul class="archive_list"> <?php $string = wp_get_archives(array( 'show_post_count' => 1, 'echo' => 0 )); echo preg_replace('/<\/a> (\([0-9]*\))/', ' <span class="count">$1</span></a>', $string); ?> </ul>
【抽出されるHTML】
<ul class="archive_list"> <li><a href=''>2018年11月 <span class="count">(1)</span></a></li> <li><a href=''>2018年10月 <span class="count">(14)</span></a></li> <li><a href=''>2018年9月 <span class="count">(1)</span></a></li> </ul>
wp_get_archivesはデフォルトが月別リストになるので、年月リストを出したい場合は、単純にtypeを「yearly」にするだけ
<ul class="archive_list"> <?php $string = wp_get_archives(array( 'show_post_count' => 1, 'type' => yearly, 'echo' => 0 )); echo preg_replace('/<\/a> (\([0-9]*\))/', ' <span class="count">$1</span></a>', $string); ?> </ul>
【抽出されるHTML】
<ul class="archive_list"> <li><a href=''>2018 <span class="count">(16)</spn></a></li> </ul>
セレクトボックスの初期値を「月を選択して下さい」とする場合
<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo attribute_escape(__('月を選択してください')); ?></option> <?php wp_get_archives (array( 'type' => 'monthly', 'format' => 'option', 'show_post_count' => '1' )); ?> </select>
<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">月を選択してください</option> <option value=''> 2018年11月 (1)</option> <option value=''> 2018年10月 (14)</option> <option value=''> 2018年9月 (1)</option> </select>
※こちらもtypeを「monthly」から「yearly」に変更すると年月アーカイブを出せます。
こちらもけっこうシンプルです。
カスタム投稿タイプが「product」の場合は「post_type」を指定して上げる以外は一緒です。
<?php $string = wp_get_archives(array( 'post_type' => 'product', 'show_post_count' => 1, 'echo' => 0 )); echo preg_replace('/<\/a> (\([0-9]*\))/', ' <span class="count">$1</span></a>', $string); ?>
年別リストだけ並んでいて、その2019年(5)とかのテキストをクリックすると、月別リストが出てくるあのタイプですね。
<div class="side_archive_menu"> <?php $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' 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){?> <?php } ?> <p class="toggle_btn"><?php echo $month->year; ?>年</p> <ul class="child"> <?php } ?> <li> <a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"> <?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; ?> </ul> </div> <!-- /.side_archive_menu -->
【抽出されるHTML】
<div class="side_archive_menu"> <p class="toggle_btn">2018年</p> <ul class="child"> <li><a href="">11月(1)</a></li> <li><a href="">10月(14)</a></li> <li><a href="">9月(1)</a></li> </ul> </div> <!-- /.side_archive_menu -->
年号を抽出して、その下に月別リストを出します。
あとは、CSSとjQueryでアコーディオンを入れます。
【CSS】
.child { display: none; }
※基本的なCSSしか入れてません。レイアウトは適正調整して下さい。
【jQuery】
$(".toggle_btn").on("click", function() { $(this).next().slideToggle(); $(this).toggleClass("active"); });