WordPressで年度別アーカイブを作成

ウイジットがあらわれた
ウイジットがあらわれた

WordPressで年度別アーカイブを作成 光陽マーリンズのサイトを、MovableTypeからWordPressへ移行したのですが、記事を年度別に表示するにあたり、MovableTypeのようにMTタグで簡単に作れないのでプラグインを探したが見つからず。 ということで、ネットであれこれ調べてカスタマイズしてみた備忘録です。

まずは年度別アーカイブを作成

次のリンクを参考に、functions.phpに次のコードを追加。

function query_for_fiscal_year( $where ) {
	global $wpdb, $wp_query, $fiscal_year;
	if ( is_year() ) {
		$fiscal_year = (int)$wp_query->query_vars['year'];
		$next_year = $fiscal_year + 1;
		$where = "
AND ( ( YEAR($wpdb->posts.post_date) = '$fiscal_year' AND MONTH($wpdb->posts.post_date) BETWEEN '4' AND '12' )
OR ( YEAR($wpdb->posts.post_date) = '$next_year' AND MONTH($wpdb->posts.post_date) BETWEEN '1' AND '3') )
AND $wpdb->posts.post_type = 'post'
AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private')";
	}
	return $where;
}

add_action( 'posts_where', 'query_for_fiscal_year' );

次に年度別アーカイブリストを出力させるコード

次のリンクを参考に、functions.phpに次のコードを追加。

function my_get_archives_by_fiscal_year ( $args = '' ) {
    global $wpdb, $wp_locale;
 
    $defaults = array (
        'post_type' => 'post',
        'limit' => '',
        'format' => 'html',
        'before' => '',
        'after' => '',
        'show_post_count' => false,
        'echo' => 1
    );
 
    $r = wp_parse_args( $args, $defaults );
    extract ( $r, EXTR_SKIP );
 
    if ( '' != $limit ) {
        $limit = absint( $limit );
        $limit = ' LIMIT ' . $limit;
    }
 
    $output = '';
 
    $arcresults = (array) $wpdb->get_results(
        "SELECT YEAR(ADDDATE(post_date, INTERVAL -3 MONTH)) AS `year`, COUNT(ID) AS `posts`
        FROM $wpdb->posts
        WHERE post_type = '$post_type' AND post_status = 'publish'
        GROUP BY YEAR(ADDDATE(post_date, INTERVAL -3 MONTH))
        ORDER BY post_date DESC
        $limit"
    );
 
    if ( $arcresults ) {
        $afterafter = $after;
        foreach ( $arcresults as $arcresult ) {
            $url = get_year_link( $arcresult->year );
            $text = $arcresult->year . '年度';
            if ( $show_post_count )
                $after = ' (' . $arcresult->posts . ')' . $afterafter;
            $output .= get_archives_link( $url, $text, $format, $before, $after );
        }
    }
 
    if ( $echo )
        echo $output;
    else
        return $output;
}

ウイジットの作成

次のリンクを参考に、ウイジットを追加。

(1)fiscal-year.phpを作成

WordPress のテキストウィジェットで PHP コードを書けるようにするプラグインとしては、「PHP Code Widget」などがありますが、セキュリティの懸念があり、他の方法を探したところ次の方法が見つかりました。

まず、fiscal-year.phpを作成し、次のコードを記述してテーマフォルダにアップロード。

<ul>
<?php my_get_archives_by_fiscal_year();?>
</ul>
(2)functions.phpに次のコードを追加
add_filter( 'widget_text', function( $ret ) {
	$php_file = 'fiscal-year';
	if( strpos( $ret, '[' . $php_file . ']' ) !== false ) {
		add_shortcode( $php_file, function() use ( $php_file ) {
			get_template_part( $php_file );
		});
		ob_start();
		do_shortcode( '[' . $php_file . ']' );
		$ret = ob_get_clean();
	}
	return $ret;
}, 99 );

(3)テキストウィジェットに前述のショートコード [fiscal-year] を書いて保存。

テキストウイジット
テキストウイジット

こちらの記事も一緒に読まれてます。

WordPressとMovableType