年月アーカイブで「前の月」と「次の月」のリンクを表示する【WordPress】

  • 投稿 : 2017-07-21
archive-previous-next01.jpg

原理

現在月が、2017/06月としたときに、単純に+1、-1するとダメです。というのは、その月に記事が1つもない場合があるからですね。
その辺も考慮して、WordpressのDBを直接参照して求めることにします。

カレント月が、2017/06月としたら、以下のSQLでわかります。

前の月

SELECT MONTH(post_date) AS month, YEAR(post_date) AS year FROM wp_posts WHERE post_date < '2017-06-01' AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1

次の月

SELECT MONTH(post_date) AS month, YEAR(post_date) AS year FROM wp_posts WHERE post_date > '2017-06-01' AND MONTH( post_date ) != MONTH( '2017-06-01' ) AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 1

archive-previous-next02.png

実際にphpAdminなどで上記のSQLを実行してみれば、期待通りのSQLかどうかはわかるかと思います。

PHPコード

//「前の月」取得関数
function get_previous_month($thisyear,$thismonth){
	global $wpdb;
	$previous = $wpdb->get_row(
"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date < '$thisyear-$thismonth-01' AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1");
	
	return $previous;


}
//「次の月」取得関数
function get_next_month($thisyear,$thismonth){
	global $wpdb;
	$next = $wpdb->get_row(
"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date > '$thisyear-$thismonth-01'
AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' )
AND post_type = 'post'
AND post_status = 'publish'
ORDER BY post_date ASC
LIMIT 1");


	return $next;
}

テーマのfunctions.phpに上記を追加します。
そうすると、「前の月」取得関数get_previous_month、「次の月」取得関数 get_next_monthが使えるようになります。

動作確認

<?php
$previous = get_previous_month(2017,6);
$next = get_next_month(2017,6);

echo $previous->year."/".$previous->month;
echo "<br/>";
echo $next->year."/".$next->month;

PHPコードが実行できるウジェットに上記を書いて、期待通りの動作することを確認すればOKかと思います。

PHP Code Widget — WordPress プラグイン

アーカイブの「前の月」「次の月」のリンクを表示する

<?php
if(is_month()){
    $this_year = intval(get_the_time('Y'));
    $this_month =intval(get_the_time('m'));

    $previous = get_previous_month($this_year,$this_month);
    $next = get_next_month($this_year,$this_month);

    if( $previous ) { $link_prev_month = get_month_link( $previous->year, $previous->month );}
    if( $next ){ $link_next_month = get_month_link( $next->year, $next->month );}

    echo '<ul class="archive-pagination">';
    if( $next ){ printf('<li class="next"><a href="%s">%s年%s月</a></li>',$link_next_month,$next->year,$next->month);}
    if( $previous ) { printf('<li class="previous"><a href="%s">%s年%s月</a></li>',$link_prev_month,$previous->year,$previous->month);}
    echo '</ul>';
}
?>

上記を表示させたいところにコピペしてください。

スタイルシート

.archive-pagination{
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flex;
    display: -o-flex;
    display: flex;
    justify-content: center;
    padding:0;
    list-style: none;
}
.archive-pagination li a{
    color: #fff;
    text-align: center;
    background-color: #0aaeda;
    border: 1px solid #93b8ca;

    padding: 4px 8px;
    text-decoration: none;
    margin: 0 10px;
    width: auto;
    width: calc(100% / 2);
    border-radius: 5px;
}
.archive-pagination li a:hover {
    background: #93b8ca;
}

.archive-pagination li.previous a:after{
    content: '>';
}
.archive-pagination li.next a:before{
    content: '<';
}

参考までに作成したCSSを載せておきます。

参考

前の月と次の月のリンク | V.J.Catkick@
アーカイブページに月毎のページ送りを設置する方法|船を買うぞ~!
Running Nerd » wordpressのMonthly Archiveで「前の月」「次の月」

上記を参考にしました。SQLは「DISTINCT 」は必要ないと思うので削除しています。

スポンサーリンク