見出し画像

【WordPress】投稿を月単位でページ分けする【コードコピペでOK】

こんにちは。マークアップエンジニアのヤナダ(@yanada_front)です。

WordPress サイトを制作するとき、
1ヶ月ごとにページを分けて、投稿を表示したい
場合があると思います。

今月投稿した記事一覧を1ページ目、
 先月投稿を2ページ目、先々月を3ページ目
」といった具合ですね。

この「月ごとにページを分ける機能」は、
どうやら WordPress の基本仕様には無いみたいです。
(もしあったら教えて下さい。)

実現するためには、結構しちめんどうな WpQuery を書く必要があります。
コピペで実装できるように、自作ソースを公開します。

ソースコード

表示する年月の切り替えに、URL の「GETパラメータ」を利用します。
まず、funtions.php に下記を記述して、GETパラメータ機能を有効にする必要があります。

/* 新しいパラメータの定義
   新着情報アーカイブページ GETクエリで用いる「newsyear」「newsmonth」
/*---------------------------------------------------------*/
function add_query_vars_filter( $vars ){
	$vars[] = "newsyear";
	$vars[] = "newsmonth";
	return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );

次に、投稿一覧を表示したいお好みのページ(category-**.php など)に
下記ソースを記述してください。
(category_name パラメータ等は、実際に表示したい内容に合わせて書き換えてください。)

<?php
$thisPageURL = get_permalink();
$thisYear = date('Y'); // 今年
$thisMonth = date('n'); // 今月
$newsyear = get_query_var('newsyear', $thisyear);
$newsmonth = get_query_var('newsmonth', $thisMonth);

$args = array(
 'post_type' => 'post',
 'category_name' => 'news', // 抽出したい任意のカテゴリを指定
 'year' => $newsyear,
 'monthnum' => $newsmonth,
 'posts_per_page' => -1,    // 該当する年月はすべて表示
 'paged' => get_query_var('paged')
);
$query = new WP_Query($args);
?>

<?php if ($query->have_posts()) : ?>
 <ul>
   <?php while ($query->have_posts()) : $query->the_post(); ?>
     <?php echo '<li><a href="' . get_permalink() . '">' . $post->post_title . '</a></li>'; ?>
   <?php endwhile; ?>
 </ul>
<?php else : ?>
 <?php echo $newsyear . '年' . $newsmonth . '月のニュース更新はありません。'; ?>
<?php endif; ?>

</div>

<!-- 以下、ページャー(ドロップダウンリスト) -->
<select name="archive" onChange="location.href=value">
<option selected>過去のニュース</option>

 <?php
  $year = $thisYear;

  // 最古の latest-news 投稿が2018年の場合
  while ($year >= 2018) {
   if ($year == $thisYear) {
     $month = $thisMonth;
   } else {
     $month = 12;
   }

   while ($month > 0) {
      echo '<option value="' . $thisPageURL . '?newsyear=' . $year . '&newsmonth=' .  $month . '">' . $year . '年' . $month . '月のニュースを見る</option>';

     $month--;
   }
   $year--;
  }
 ?>

</select>

<?php wp_reset_postdata(); ?>

やや面倒だったのが、ページャの実装です。
この例では、ドロップダウンリストとして実装しています。

スクリーンショット (356)

while文 のなかで、今月の月数 (3月なら '3' ) から1ずつ減らしていき、0になったら年数を1減らして(月は '12' に戻る)、最古の「投稿」があった年までループ処理をかけています。

そして、各ループにおいて、GETクエリをつけたURLを生成しています。

<option selected>過去のニュース</option>
<option value="https://hogehoge.com/test/?newsyear=2020&newsmonth=2">20202月のニュースを見る</option>
<option value="https://hogehoge.com/test/?newsyear=2020&newsmonth=1">20201月のニュースを見る</option>
<option value="https://hogehoge.com/test/?newsyear=2019&newsmonth=12">201912月のニュースを見る</option>
 ・
 ・
 ・
<option value="https://hogehoge.com/test/?newsyear=2018&newsmonth=1">20181月のニュースを見る</option>


なお、投稿開始が「1月ちょうどではない場合」(ex. 最後のページャを「2018年5月のニュ―スを見る」にしたい場合)は、while文の条件を多少変える必要があります。

while ($year > 2018 || ($year == 2018 && $month >= 5)) {
  // 処理
}


この note が役に立ったら、SNSでシェアして頂けますと有り難いです。

他にも、web制作のノウハウをまとめた note を投稿しています。マガジン「Yanada's Note」にまとめていますので、ぜひご覧ください。

この記事が気に入ったらサポートをしてみませんか?