[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" )
スポンサーリンク
WordPressカテゴリーの投稿
- [WordPress] 記事が更新された回数を取得する
- [WordPress] ダッシュボードのウィジェットを表示オプションを使わずに非表示化する
- [WordPress] 関連記事をカテゴリーに基づきアイキャッチ画像つきで表示
- [WordPress] バックアッププラグインの特徴と機能比較
- [WordPress] タグ版wp_list_categories
- [WordPress] have_comments()がFALSEを返しコメントが表示されない現象
- [WordPress] 個別記事ページでカテゴリーを表示するときの目的別の方法
- [PHP] 文字長がnバイト以下になるまで末尾の文字を1字づつカット
- [WordPress] wp_insert_post()でhtmlタグが除去されるのを防ぐ
- [WordPress] カテゴリー・タグ・カスタムタクソノミーを外部から登録・編集する