[WordPress] 指定期間の日別アーカイブを取得する

公開

スポンサーリンク

WordPressで月別や日別のリストを取得するにはwp_get_archives()を使います。この関数は取得するリストの種類(月別や週別)やリスト数を指定することはできるのですが、期間を指定することはできません。

例えば、wp_get_archives( "type=daily&limit=5" )という風に使うと、下のように直近5日間のリストを出力してくれるわけです。

  • 2012年2月22日
  • 2012年2月21日
  • 2011年2月20日
  • 2011年2月19日
  • 2011年2月18日

ですが、2011年1月1日から31日までの日別アーカイブを出力したいとなると、そういう設定はないわけです。

先日、期間を指定して日別アーカイブを出力する必要ができたので、そういう関数を自作しましたの以下に残しておきます。といっても、wp_get_archives()を元にSQL文をちょこっといじっただけなのですが。

function duration_archives($args = '') {
	global $wpdb, $wp_locale;

	$defaults = array(
		'limit' => '',
		'format' => 'html', 'before' => '',
		'after' => '', 'show_post_count' => false,
		'echo' => 1
	);

	$r = wp_parse_args( $args, $defaults );
	extract( $r, EXTR_SKIP );
	
	if( !isset( $from ) || !isset( $to ) ){
		return false;
	}elseif( !preg_match( "/^\d{4}-\d{2}-\d{2}$/u" , $from ) || !preg_match( "/^\d{4}-\d{2}-\d{2}$/u" , $to ) ){
		return false;
	}else{
		$duration = " AND post_date >= '{$from} 00:00:00' AND post_date <= '{$to} 23:59:59'";
	}
	
	if ( '' != $limit ) {
		$limit = absint($limit);
		$limit = ' LIMIT '.$limit;
	}

	// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
	$archive_date_format_over_ride = 0;

	// options for daily archive (only if you over-ride the general date format)
	$archive_day_date_format = 'Y/m/d';

	if ( !$archive_date_format_over_ride ) {
		$archive_day_date_format = get_option('date_format');
	}

	//filters
	$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish' {$duration}", $r );
	$join = apply_filters( 'getarchives_join', '', $r );

	$output = '';

	$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC $limit";
	$key = md5($query);
	$cache = wp_cache_get( 'wp_get_archives' , 'general');
	if ( !isset( $cache[ $key ] ) ) {
		$arcresults = $wpdb->get_results($query);
		$cache[ $key ] = $arcresults;
		wp_cache_set( 'wp_get_archives', $cache, 'general' );
	} else {
		$arcresults = $cache[ $key ];
	}
	if ( $arcresults ) {
		$afterafter = $after;
		foreach ( (array) $arcresults as $arcresult ) {
			$url	= get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth);
			$date = sprintf('%1$d-%2$02d-%3$02d 00:00:00', $arcresult->year, $arcresult->month, $arcresult->dayofmonth);
			$text = mysql2date($archive_day_date_format, $date);
			if ($show_post_count)
				$after = ' ('.$arcresult->posts.')'.$afterafter;
			$output .= get_archives_link($url, $text, $format, $before, $after);
		}
	}
	
	if ( $echo )
		echo $output;
	else
		return $output;
}

使い方ですが、上のコードをfunction.phpにコピペし、日別アーカイブを出力したい場所にduration_archives( "from=2011-01-01&to=2011-01-31" )で、指定した期間の日別アーカイブリストを出力します。この場合は2011年1月1日から2011年1月31日までのリストを出力します。

  • 日別アーカイブしか出力できません。
  • fromとtoが指定されていない場合はfalseを返します。
  • 日付はYYYY-MM-DD形式で指定します。これ以外のパターンの場合falseを返します。
  • 指定した期間の記事がない場合はカラの文字列を返します。
  • typeをdailyに固定してある以外は、wp_get_archives()で設定できるパラメータはすべて残してあります。
  • なので、文字列で受け取りたい場合は引数にecho=0を付け加えます。
    => duration_archives( "from=2011-01-01&to=2011-01-31&echo=0" )
  • 投稿件数を表示したい場合はshow_post_count=1を追加します。
    => duration_archives( "from=2011-01-01&to=2011-01-31&show_post_count=1" )

スポンサーリンク


Comment