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
That’s a real cool way to archive the archive’s.
This is great. Thanks for the code.
Oh, awesome. You really helped me out here. Thank you!