【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(); ?>
やや面倒だったのが、ページャの実装です。
この例では、ドロップダウンリストとして実装しています。
while文 のなかで、今月の月数 (3月なら '3' ) から1ずつ減らしていき、0になったら年数を1減らして(月は '12' に戻る)、最古の「投稿」があった年までループ処理をかけています。
そして、各ループにおいて、GETクエリをつけたURLを生成しています。
<option selected>過去のニュース</option>
<option value="https://hogehoge.com/test/?newsyear=2020&newsmonth=2">2020年2月のニュースを見る</option>
<option value="https://hogehoge.com/test/?newsyear=2020&newsmonth=1">2020年1月のニュースを見る</option>
<option value="https://hogehoge.com/test/?newsyear=2019&newsmonth=12">2019年12月のニュースを見る</option>
・
・
・
<option value="https://hogehoge.com/test/?newsyear=2018&newsmonth=1">2018年1月のニュースを見る</option>
なお、投稿開始が「1月ちょうどではない場合」(ex. 最後のページャを「2018年5月のニュ―スを見る」にしたい場合)は、while文の条件を多少変える必要があります。
while ($year > 2018 || ($year == 2018 && $month >= 5)) {
// 処理
}
この note が役に立ったら、SNSでシェアして頂けますと有り難いです。
他にも、web制作のノウハウをまとめた note を投稿しています。マガジン「Yanada's Note」にまとめていますので、ぜひご覧ください。
この記事が気に入ったらサポートをしてみませんか?