[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] カテゴリー・タグ・カスタムタクソノミーを外部から登録・編集する