原理
現在月が、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
実際に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 」は必要ないと思うので削除しています。
スポンサーリンク
コメントを残す