Year and Month in Wordpress Archive List Year and Month in Wordpress Archive List wordpress wordpress

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>


here's a simple mysql query, solved a similiar problem.

$query = 'SELECT DISTINCT MONTH(`post_date`) AS `month`, YEAR(`post_date`) AS `year` FROM `wp_posts` ORDER BY `post_date` ASC';$results = $wpdb->get_results($query);