Year and Month in Wordpress Archive List
Ok, found a very helpful post on stack exchange: here
Basically, add this to functions.php:
//List archives by year, then monthfunction wp_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 = '<ul>'; $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) $arcresults as $arcresult ) { $url = get_month_link( $arcresult->year, $arcresult->month ); $year_url = get_year_link($arcresult->year); /* 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; $year_output = get_archives_link($year_url, $year_text, $format, $before, $after); $output .= ( $arcresult->year != $temp_year ) ? $year_output : ''; $output .= get_archives_link($url, $text, $format, $before, $after); $temp_year = $arcresult->year; } } $output .= '</ul>'; if ( $echo ) echo $output; else return $output;}
And then call this function on the page:
<?php wp_custom_archive(); ?>
It will return a list exactly as needed, by year then month, with links to each!
<select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Month' ) ); ?></option> <?php wp_get_archives( array( 'type' => 'monthly', 'format' => 'option', 'show_post_count' => 1 ) ); ?></select>