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.
Instructions:
All you have to do is add this code to your theme’s functions.php file or in a site-specific plugin:
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; } // 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'; // options for weekly archive (only if you over-ride the general date format) $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'); } //filters $where= apply_filters('customarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r); $join= apply_filters('customarchives_join', "", $r); $output= '
-
- ‘
;
$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 ); /* translators: 1: month name, 2: 4-digit year */ $text= sprintf(__('%s'), $wp_locale->get_month($arcresult->month)); $year_text= sprintf('
- %d
‘, $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; } } $output.= ‘'
;
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.

