Monthly Archives Idea

Charles Stricklin, WordPress Podcast guru, had an interesting idea for arranging monthly WordPress archives, which is basically to make an archives page like this:

2005 Feb Apr Jun Jul Aug Sep Oct Nov Dec
2006 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov
2007 Jan
2008 Jan Apr Jun Oct

Here’s how to do it just using the WordPress API (instead of direct database queries):

<?php
if ( ! $calendar = wp_cache_get('year_month_archive', 'archive') ) {
     $calendar = array();
     $year = date('Y');
     $mo_qry = new WP_Query();
     $yr_qry = new WP_Query();
     do {
          $yr_qry->query(array('year' => $year, 'showposts' => 1));
          if ( $yr_qry->have_posts() ) {
               for ( $m = 1; $m <= 12; $m++ ) {
                    $mo_qry->query(array('year' => $year, 'monthnum' => $m, 'showposts' => 1));
                    if ( $mo_qry->have_posts() ) {
                         $calendar[$year][$m] = array(date('M', mktime(1,1,1, $m, 1, $year)), get_month_link($year, $m));
                    } else {
                         $calendar[$year][$m] = array('','');
                    }
               }
          }
          $year = intval($year - 1);
     } while ( $yr_qry->have_posts() );
     ksort($calendar);
     wp_cache_set('year_month_archive', $calendar, 'archive');
}
?>
<table>
<?php foreach( $calendar as $year => $m ) : ?>
     <tr><th><?php echo $year; ?></th>
     <?php foreach( $m as $data ) : ?>
          <td><a href="<?php echo $data[1]; ?>"><?php echo $data[0]; ?></a></td>     
     <?php endforeach; ?>
     </tr>
<?php endforeach; ?>
</table>

3 Comments

  1. Posted December 8, 2008 at 2:58 pm | Permalink
    WP Cult

    That’s a real cool way to archive the archive’s.

  2. Posted December 11, 2008 at 9:52 am | Permalink
    LAM

    This is great. Thanks for the code.

  3. Kei
    Posted January 18, 2009 at 12:58 pm | Permalink
    Kei

    Oh, awesome. You really helped me out here. Thank you!

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*