wordpressのMonthly Archiveで「前の月」「次の月」

WordPressの悪いところをO君とあげつらっていたのだが、これはできたほうがいいと思ったのでメモ。
Monthly Archiveにおいて、「前の月」「次の月」へのリンクを生成する。wp_get_archive();ではだめなのがダメなところ。
公式フォーラムでも7ヶ月ほど放置されてるし使えそうなプラグインも見つからないんで、general-template.phpのカレンダー生成部から該当部分を抜き出し整形。
具体的にはこのBlogのMontyly Archiveのようなナビゲーションを作るのが目的。エントリーが無い月は飛ばす。


下記コードは<&lt;にして<code>で包んだだけなので注意。

< ?php

global $wpdb, $m, $monthnum, $year, $timedifference, $wp_locale, $posts;

// Let's figure out when we are
if ( !empty($monthnum) && !empty($year) ) {
$thismonth = ''.zeroise(intval($monthnum), 2);
$thisyear = ''.intval($year);
} elseif ( !empty($w) ) {
// We need to get the month from MySQL
$thisyear = ''.intval(substr($m, 0, 4));
$d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
$thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')");
} elseif ( !empty($m) ) {
$calendar = substr($m, 0, 6);
$thisyear = ''.intval(substr($m, 0, 4));
if ( strlen($m) < 6 ) $thismonth = '01'; else $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2); } else { $thisyear = gmdate('Y', current_time('timestamp')); $thismonth = gmdate('m', current_time('timestamp')); } $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear); // Get the next and previous month and year with at least one post $previous = $wpdb->get_row("SELECT DISTINCT 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");
$next = $wpdb->get_row("SELECT DISTINCT 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");

if ( $previous ) {
echo '<a href="' . get_month_link($previous->year, $previous->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($previous->month),date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . '">前の月:' . sprintf(__('%1$s %2$d'), $wp_locale->get_month($previous->month),date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . 'の記事を見る</a><br />';
} else {
echo 'これより前の月にはエントリーがありません。<br />';
}

if ( $next ) {
echo '<a href="' . get_month_link($next->year, $next->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($next->month), date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))) . '">次の月:' . sprintf(__('%1$s %2$d'), $wp_locale->get_month($next->month), date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))) . 'の記事を見る</a><br />';
} else {
echo 'これより後の月にはエントリーがありません。<br />';
}

?>

でもやっぱこれはwp_get_archives()で指定できてしかるべきだよなあ。
なんでできないんだろ。

(補足)
プラグイン化してみたけど使いにくいので動作仕様を考え中
とりあえず今は、テンプレート内で
make_monthly_archive_link ();
と呼ぶとそこに入ります。(wp2.5日本語版でも動作確認済み)

“wordpressのMonthly Archiveで「前の月」「次の月」” への101件の返信

  1. プラグインも無いの? うーむ。
    拡張指向ありきのユーザコミュニティなんだろうと思う様にしていたが。

    あと、悪い所というか、拙い所なんだよね、俺が言いたかったのは。
    ああいう設計は仕事でやられると困るのです。

  2. あれ以上検索はしてないよ。
    フォーラムで放置されてたのは質問の解が自明過ぎたのか上記のように簡単すぎたからなのか既出だったからなのかただ単に見落とされていたのかは不明。

    まあMT4も試してみるといいよ。機能は豊富だよ。

  3. ピンバック: V.J.Catkick@