Are you looking for a way to display a beautifully formatted archives list of months separated by year? While there’s probably a plugin for this, we have created a quick code snippet that you can use to display formatted archives by month separated by year in WordPress.
functionwp_custom_archive($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( ''!= $limit) {
$limit= absint($limit);
$limit= ' LIMIT '.$limit;
}
$archive_date_format_over_ride= 0;
$archive_day_date_format= 'Y/m/d';
$archive_week_start_date_format= 'Y/m/d';
$archive_week_end_date_format= 'Y/m/d';
if( !$archive_date_format_over_ride) {
$archive_day_date_format= get_option('date_format');
$archive_week_start_date_format= get_option('date_format');
$archive_week_end_date_format= get_option('date_format');
}
$where= apply_filters('customarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r);
$join= apply_filters('customarchives_join', "", $r);
$query= "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
$key= md5($query);
$cache= wp_cache_get( 'wp_custom_archive', 'general');
if( !isset( $cache[ $key] ) ) {
$arcresults= $wpdb->get_results($query);
$cache[ $key] = $arcresults;
wp_cache_set( 'wp_custom_archive', $cache, 'general');
} else{
$arcresults= $cache[ $key];
}
if( $arcresults) {
$afterafter= $after;
foreach( (array) $arcresultsas$arcresult) {
$url= get_month_link( $arcresult->year, $arcresult->month );
$text= sprintf(__('%s'), $wp_locale->get_month($arcresult->month));
$year_text= sprintf('
‘, $arcresult->year);
if( $show_post_count)
$after= ' ('.$arcresult->posts.')'. $afterafter;
$output.= ( $arcresult->year != $temp_year) ? $year_text: '';
$output.= get_archives_link($url, $text, $format, $before, $after);
$temp_year= $arcresult->year;
}
}
if( $echo)
echo$output;
else
return$output;
}
Add this snippet in your index.php file or any other template file where you want to display the formatted archives.