Home / archives / Beautifully formated archives by month separated by year
  • How to Beautifully formated archives by month separated by year


    Adding this snippet to the functions.php of your wordpress theme will display a beautifully formated formatted archives list of months separated by year. Don’t forget to place the second snippet within your wordpress theme in the location you want to display the archives list.

    wordpress snippet : PHP

    function 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');
        $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 );
                    /* translators: 1: month name, 2: 4-digit year */
                    $text = sprintf(__('%s'), $wp_locale->get_month($arcresult->month));
                    $year_text = sprintf('<li>%d</li>', $arcresult->year);
                    if ( $show_post_count )
                        $after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
                    $output .= ( $arcresult->year != $temp_year ) ? $year_text : '';
                    $output .= get_archives_link($url, $text, $format, $before, $after);
                    $temp_year = $arcresult->year;
        $output .= '</ul>';
        if ( $echo )
            echo $output;
            return $output;

    wordpress snippet : PHP


    ( WordPress codex functions, hooks, in this snippet. )

    date_format, month_link, locale, query, apply_filters, absint, get_month_link, get_option, __, _e, wp, wp_cache_set, wp_cache_get, wp_parse_args,
  • johnnyriss

    I know this is an old post. But is there any way to specify the category of the archive list? Preferably by passing the value from the wp_custom_archive tag. So that I could put several archive lists on a page. i want an archive list for category 9 and a separate archive list for category 4. So that the tag would be something like wp_custom_archive(‘9′) and wp_custom_archive(‘4′).

    Any help?

    • http://wpsnipp.com Kevin Chard

      hhhmmm Hi John, many archive plugins exist that might be a better solution when wanting to get this detailed with your archives.

  • http://www.facebook.com/dede.sahman Dede Sahman

    Dear Kevin,
    Hard to understand your script. Would you like to attach it with tabel in database MySql? May be it more clearly for me because I am new in PHP. Thanks

  • http://bestsexpositions.com/ Jennifer Allen

    Great solution, thanks :)

  • http://www.benpalmer.info/ Ben Palmer

    Exactly what i needed, this should be baked into wordpress core it’s so good

  • http://twitter.com/reap705 Oliver Gast

    Wow. That’s a great solution without a plugin. Works perfekt. Thanks for the snippet

  • http://twitter.com/Jonyfernandosc Jony Fernando Schulz

    Very bealtifully. Great. Thanks!

  • Marcos

    This is a very good example. Thanks, Now, it’s possible loading months of a specify category?

  • Nicole Holgate

    Awesome code. Exactly what I was looking for. Do you, perhaps know how to refine it to only pull in a custom post type? *waiting hopefully :)

    • http://wpsnipp.com Kevin Chard

      post_type is defined here, “WHERE post_type = ‘post'”

  • nicolabavaro

    Awesome code! Thanks a lot man!

  • nicolabavaro

    Awesome code! Thanks a lot man!

  • nicolabavaro

    Awesome code! Thanks a lot man!

    • http://wpsnipp.com Kevin Chard

      No problem glad I could help!